From e7e7c4eafe43d8a0a5da7f2b610f7d4b0adc94e2 Mon Sep 17 00:00:00 2001 From: KemoNine Date: Wed, 20 Mar 2024 09:57:39 -0400 Subject: [PATCH] package updates / upgrades --- .../all-the-icons-autoloads.el | 43 +- .../all-the-icons-faces.el | 0 .../all-the-icons-pkg.el | 4 +- .../all-the-icons.el | 18 +- .../data/data-alltheicons.el | 0 .../data/data-faicons.el | 0 .../data/data-fileicons.el | 2 +- .../data/data-material.el | 0 .../data/data-octicons.el | 0 .../data/data-weathericons.el | 0 .../all-the-icons-dired-pkg.el | 2 - .../all-the-icons-dired-autoloads.el | 26 +- .../all-the-icons-dired-pkg.el | 15 + .../all-the-icons-dired.el | 18 +- code/elpa/archives/melpa/archive-contents | 2307 ++-- .../async-20240312.1716}/async-autoloads.el | 71 +- .../async-20240312.1716}/async-bytecomp.el | 2 +- .../async-pkg.el | 4 +- .../async.el | 34 +- .../dired-async.el | 45 +- .../smtpmail-async.el | 0 .../dash-20240103.1301}/dash-autoloads.el | 56 +- .../elpa/dash-20240103.1301}/dash-pkg.el | 4 +- .../dash.el | 2 +- .../dash.info | 4 +- .../dir | 0 .../dashboard-20230331.2304/dashboard-pkg.el | 12 - .../dashboard-widgets.el | 1399 --- .../elpa/dashboard-20230331.2304/dashboard.el | 472 - .../banners/1.txt | 0 .../banners/2.txt | 0 .../banners/3.txt | 0 .../banners/4.txt | 0 .../banners/emacs.png | Bin .../banners/logo.png | Bin .../dashboard-autoloads.el | 37 +- .../dashboard-pkg.el | 4 +- .../dashboard-widgets.el | 366 +- .../elpa/dashboard-20240319.915}/dashboard.el | 293 +- .../elpa/devdocs-20230220.2042/devdocs-pkg.el | 2 - .../devdocs-autoloads.el | 43 +- .../elpa/devdocs-20240301.1838/devdocs-pkg.el | 14 + .../devdocs.el | 34 +- .../devdocs-browser-autoloads.el | 70 - .../devdocs-browser-pkg.el | 2 - .../devdocs-browser.el | 808 -- .../devdocs-browser-autoloads.el | 52 +- .../devdocs-browser-pkg.el | 4 +- .../devdocs-browser.el | 23 +- .../dired-single-pkg.el | 2 - .../dired-single-autoloads.el | 39 +- .../dired-single-pkg.el | 6 + .../dired-single.el | 6 +- .../dockerfile-mode-pkg.el | 2 - .../dockerfile-mode-autoloads.el | 34 +- .../dockerfile-mode-pkg.el | 9 + .../dockerfile-mode.el | 16 +- .../elisp-refs-autoloads.el | 68 - .../elisp-refs-pkg.el | 2 - .../elisp-refs-20230309.1638/elisp-refs.el | 911 -- .../elisp-refs-autoloads.el | 37 +- .../elisp-refs-pkg.el | 4 +- .../elisp-refs.el | 2 +- code/elpa/f-20240308.906/f-autoloads.el | 28 + code/elpa/f-20240308.906/f-pkg.el | 16 + code/elpa/f-20240308.906/f-shortdoc.el | 438 + code/elpa/f-20240308.906/f.el | 799 ++ code/elpa/helm-20240320.541/.dir-locals.el | 9 + code/elpa/helm-20240320.541/emacs-helm.sh | 265 + code/elpa/helm-20240320.541/helm-adaptive.el | 284 + code/elpa/helm-20240320.541/helm-autoloads.el | 990 ++ code/elpa/helm-20240320.541/helm-bookmark.el | 846 ++ code/elpa/helm-20240320.541/helm-buffers.el | 1181 ++ code/elpa/helm-20240320.541/helm-color.el | 159 + code/elpa/helm-20240320.541/helm-command.el | 417 + code/elpa/helm-20240320.541/helm-dabbrev.el | 388 + code/elpa/helm-20240320.541/helm-easymenu.el | 84 + code/elpa/helm-20240320.541/helm-elisp.el | 1167 ++ code/elpa/helm-20240320.541/helm-epa.el | 258 + code/elpa/helm-20240320.541/helm-eshell.el | 494 + code/elpa/helm-20240320.541/helm-eval.el | 221 + code/elpa/helm-20240320.541/helm-external.el | 264 + code/elpa/helm-20240320.541/helm-fd.el | 144 + code/elpa/helm-20240320.541/helm-files.el | 7014 +++++++++++ code/elpa/helm-20240320.541/helm-find.el | 170 + code/elpa/helm-20240320.541/helm-font.el | 344 + code/elpa/helm-20240320.541/helm-for-files.el | 310 + .../helm-20240320.541/helm-global-bindings.el | 104 + code/elpa/helm-20240320.541/helm-grep.el | 1800 +++ code/elpa/helm-20240320.541/helm-help.el | 2552 ++++ code/elpa/helm-20240320.541/helm-id-utils.el | 125 + code/elpa/helm-20240320.541/helm-imenu.el | 542 + code/elpa/helm-20240320.541/helm-info.el | 315 + code/elpa/helm-20240320.541/helm-locate.el | 487 + code/elpa/helm-20240320.541/helm-man.el | 114 + code/elpa/helm-20240320.541/helm-misc.el | 393 + code/elpa/helm-20240320.541/helm-mode.el | 2804 +++++ code/elpa/helm-20240320.541/helm-net.el | 436 + code/elpa/helm-20240320.541/helm-occur.el | 894 ++ code/elpa/helm-20240320.541/helm-packages.el | 288 + code/elpa/helm-20240320.541/helm-pkg.el | 14 + code/elpa/helm-20240320.541/helm-regexp.el | 132 + code/elpa/helm-20240320.541/helm-ring.el | 642 + code/elpa/helm-20240320.541/helm-semantic.el | 233 + code/elpa/helm-20240320.541/helm-sys.el | 472 + code/elpa/helm-20240320.541/helm-tags.el | 337 + code/elpa/helm-20240320.541/helm-types.el | 337 + code/elpa/helm-20240320.541/helm-utils.el | 1151 ++ code/elpa/helm-20240320.541/helm-x-files.el | 126 + code/elpa/helm-20240320.541/helm.el | 52 + .../helm-core-autoloads.el | 250 + .../helm-core-20240316.1157/helm-core-pkg.el | 13 + .../elpa/helm-core-20240316.1157/helm-core.el | 8004 ++++++++++++ code/elpa/helm-core-20240316.1157/helm-lib.el | 2145 ++++ .../helm-multi-match.el | 410 + .../helm-core-20240316.1157/helm-source.el | 1312 ++ .../helm-ls-git-autoloads.el | 48 + .../helm-ls-git-pkg.el | 7 + .../helm-ls-git-20240315.1721/helm-ls-git.el | 2111 ++++ .../helm-org-autoloads.el | 55 + .../helm-org-20231022.620/helm-org-pkg.el | 13 + code/elpa/helm-org-20231022.620/helm-org.el | 538 + .../helpful-autoloads.el | 48 +- code/elpa/helpful-20231028.516/helpful-pkg.el | 18 + .../elpa/helpful-20231028.516}/helpful.el | 149 +- .../ido-completing-read+-autoloads.el | 106 + .../ido-completing-read+-pkg.el | 16 + .../ido-completing-read+.el | 1285 ++ .../json-mode-autoloads.el | 62 + .../json-mode-20240228.1443/json-mode-pkg.el | 14 + .../elpa/json-mode-20240228.1443/json-mode.el | 308 + .../lsp-actionscript.el | 135 + code/elpa/lsp-mode-20240319.1043/lsp-ada.el | 184 + .../lsp-mode-20240319.1043/lsp-angular.el | 103 + .../lsp-mode-20240319.1043/lsp-ansible.el | 258 + code/elpa/lsp-mode-20240319.1043/lsp-asm.el | 93 + code/elpa/lsp-mode-20240319.1043/lsp-astro.el | 50 + .../lsp-mode-20240319.1043/lsp-autotools.el | 78 + code/elpa/lsp-mode-20240319.1043/lsp-awk.el | 49 + code/elpa/lsp-mode-20240319.1043/lsp-bash.el | 91 + .../lsp-mode-20240319.1043/lsp-beancount.el | 64 + code/elpa/lsp-mode-20240319.1043/lsp-bufls.el | 69 + code/elpa/lsp-mode-20240319.1043/lsp-camel.el | 68 + .../elpa/lsp-mode-20240319.1043/lsp-clangd.el | 318 + .../lsp-mode-20240319.1043/lsp-clojure.el | 618 + code/elpa/lsp-mode-20240319.1043/lsp-cmake.el | 62 + code/elpa/lsp-mode-20240319.1043/lsp-cobol.el | 191 + .../lsp-mode-20240319.1043/lsp-completion.el | 820 ++ code/elpa/lsp-mode-20240319.1043/lsp-credo.el | 97 + .../lsp-mode-20240319.1043/lsp-crystal.el | 48 + .../elpa/lsp-mode-20240319.1043/lsp-csharp.el | 467 + code/elpa/lsp-mode-20240319.1043/lsp-css.el | 254 + .../lsp-mode-20240319.1043/lsp-cucumber.el | 66 + .../elpa/lsp-mode-20240319.1043/lsp-cypher.el | 53 + code/elpa/lsp-mode-20240319.1043/lsp-d.el | 41 + code/elpa/lsp-mode-20240319.1043/lsp-dhall.el | 43 + .../lsp-mode-20240319.1043/lsp-diagnostics.el | 370 + code/elpa/lsp-mode-20240319.1043/lsp-dired.el | 181 + .../lsp-mode-20240319.1043/lsp-dockerfile.el | 66 + code/elpa/lsp-mode-20240319.1043/lsp-dot.el | 57 + .../elpa/lsp-mode-20240319.1043/lsp-elixir.el | 214 + code/elpa/lsp-mode-20240319.1043/lsp-elm.el | 137 + code/elpa/lsp-mode-20240319.1043/lsp-emmet.el | 65 + .../elpa/lsp-mode-20240319.1043/lsp-erlang.el | 228 + .../elpa/lsp-mode-20240319.1043/lsp-eslint.el | 454 + .../lsp-mode-20240319.1043/lsp-fortran.el | 61 + .../elpa/lsp-mode-20240319.1043/lsp-fsharp.el | 313 + .../lsp-mode-20240319.1043/lsp-gdscript.el | 62 + code/elpa/lsp-mode-20240319.1043/lsp-gleam.el | 48 + code/elpa/lsp-mode-20240319.1043/lsp-glsl.el | 49 + code/elpa/lsp-mode-20240319.1043/lsp-go.el | 360 + .../lsp-golangci-lint.el | 168 + .../lsp-mode-20240319.1043/lsp-graphql.el | 74 + .../elpa/lsp-mode-20240319.1043/lsp-groovy.el | 66 + code/elpa/lsp-mode-20240319.1043/lsp-hack.el | 54 + code/elpa/lsp-mode-20240319.1043/lsp-haxe.el | 226 + .../lsp-mode-20240319.1043/lsp-headerline.el | 493 + code/elpa/lsp-mode-20240319.1043/lsp-html.el | 200 + code/elpa/lsp-mode-20240319.1043/lsp-hy.el | 51 + code/elpa/lsp-mode-20240319.1043/lsp-icons.el | 96 + code/elpa/lsp-mode-20240319.1043/lsp-ido.el | 142 + code/elpa/lsp-mode-20240319.1043/lsp-idris.el | 67 + code/elpa/lsp-mode-20240319.1043/lsp-iedit.el | 149 + .../lsp-mode-20240319.1043/lsp-javascript.el | 1034 ++ code/elpa/lsp-mode-20240319.1043/lsp-jq.el | 51 + code/elpa/lsp-mode-20240319.1043/lsp-json.el | 134 + .../lsp-mode-20240319.1043/lsp-jsonnet.el | 51 + .../elpa/lsp-mode-20240319.1043/lsp-kotlin.el | 350 + code/elpa/lsp-mode-20240319.1043/lsp-lens.el | 455 + code/elpa/lsp-mode-20240319.1043/lsp-lua.el | 701 ++ code/elpa/lsp-mode-20240319.1043/lsp-magik.el | 135 + .../lsp-mode-20240319.1043/lsp-markdown.el | 103 + .../lsp-mode-20240319.1043/lsp-marksman.el | 97 + code/elpa/lsp-mode-20240319.1043/lsp-mdx.el | 66 + code/elpa/lsp-mode-20240319.1043/lsp-mint.el | 48 + .../lsp-mode-autoloads.el | 947 ++ .../lsp-mode-20240319.1043/lsp-mode-pkg.el | 21 + code/elpa/lsp-mode-20240319.1043/lsp-mode.el | 9771 +++++++++++++++ .../lsp-mode-20240319.1043/lsp-modeline.el | 354 + code/elpa/lsp-mode-20240319.1043/lsp-mojo.el | 50 + code/elpa/lsp-mode-20240319.1043/lsp-move.el | 71 + code/elpa/lsp-mode-20240319.1043/lsp-nginx.el | 64 + code/elpa/lsp-mode-20240319.1043/lsp-nim.el | 103 + code/elpa/lsp-mode-20240319.1043/lsp-nix.el | 122 + .../lsp-mode-20240319.1043/lsp-nushell.el | 59 + code/elpa/lsp-mode-20240319.1043/lsp-ocaml.el | 135 + .../lsp-mode-20240319.1043/lsp-openscad.el | 102 + code/elpa/lsp-mode-20240319.1043/lsp-perl.el | 117 + .../lsp-perlnavigator.el | 197 + code/elpa/lsp-mode-20240319.1043/lsp-php.el | 464 + code/elpa/lsp-mode-20240319.1043/lsp-pls.el | 133 + .../elpa/lsp-mode-20240319.1043/lsp-prolog.el | 55 + .../lsp-mode-20240319.1043/lsp-protocol.el | 797 ++ .../lsp-mode-20240319.1043/lsp-purescript.el | 95 + code/elpa/lsp-mode-20240319.1043/lsp-pwsh.el | 361 + code/elpa/lsp-mode-20240319.1043/lsp-pyls.el | 504 + code/elpa/lsp-mode-20240319.1043/lsp-pylsp.el | 672 + code/elpa/lsp-mode-20240319.1043/lsp-r.el | 49 + .../elpa/lsp-mode-20240319.1043/lsp-racket.el | 77 + .../elpa/lsp-mode-20240319.1043/lsp-remark.el | 69 + code/elpa/lsp-mode-20240319.1043/lsp-rf.el | 147 + .../lsp-mode-20240319.1043/lsp-rpm-spec.el | 60 + .../lsp-mode-20240319.1043/lsp-rubocop.el | 66 + .../lsp-mode-20240319.1043/lsp-ruby-lsp.el | 56 + .../lsp-ruby-syntax-tree.el | 59 + .../lsp-mode-20240319.1043/lsp-ruff-lsp.el | 115 + code/elpa/lsp-mode-20240319.1043/lsp-rust.el | 1753 +++ .../lsp-semantic-tokens.el | 920 ++ .../lsp-mode-20240319.1043/lsp-semgrep.el | 234 + code/elpa/lsp-mode-20240319.1043/lsp-sml.el | 92 + .../lsp-mode-20240319.1043/lsp-solargraph.el | 171 + .../lsp-mode-20240319.1043/lsp-solidity.el | 61 + .../elpa/lsp-mode-20240319.1043/lsp-sorbet.el | 66 + code/elpa/lsp-mode-20240319.1043/lsp-sqls.el | 192 + code/elpa/lsp-mode-20240319.1043/lsp-steep.el | 73 + .../elpa/lsp-mode-20240319.1043/lsp-svelte.el | 307 + .../lsp-mode-20240319.1043/lsp-terraform.el | 457 + code/elpa/lsp-mode-20240319.1043/lsp-tex.el | 68 + code/elpa/lsp-mode-20240319.1043/lsp-tilt.el | 35 + code/elpa/lsp-mode-20240319.1043/lsp-toml.el | 171 + code/elpa/lsp-mode-20240319.1043/lsp-trunk.el | 88 + code/elpa/lsp-mode-20240319.1043/lsp-ttcn3.el | 51 + .../lsp-mode-20240319.1043/lsp-typeprof.el | 60 + code/elpa/lsp-mode-20240319.1043/lsp-v.el | 50 + code/elpa/lsp-mode-20240319.1043/lsp-vala.el | 51 + .../lsp-mode-20240319.1043/lsp-verilog.el | 213 + code/elpa/lsp-mode-20240319.1043/lsp-vetur.el | 353 + code/elpa/lsp-mode-20240319.1043/lsp-vhdl.el | 131 + .../lsp-mode-20240319.1043/lsp-vimscript.el | 75 + code/elpa/lsp-mode-20240319.1043/lsp-volar.el | 143 + code/elpa/lsp-mode-20240319.1043/lsp-wgsl.el | 204 + code/elpa/lsp-mode-20240319.1043/lsp-xml.el | 343 + code/elpa/lsp-mode-20240319.1043/lsp-yaml.el | 242 + code/elpa/lsp-mode-20240319.1043/lsp-zig.el | 345 + code/elpa/lsp-mode-20240319.1043/lsp.el | 8 + .../lua-mode-autoloads.el | 41 + .../lua-mode-20231023.947/lua-mode-pkg.el | 23 + code/elpa/lua-mode-20231023.947/lua-mode.el | 2291 ++++ .../markdown-mode-autoloads.el | 64 + .../markdown-mode-pkg.el | 14 + .../markdown-mode.el | 10384 ++++++++++++++++ code/elpa/modus-themes-20240317.1619/dir | 19 + .../doclicense.info | 489 + .../modus-operandi-deuteranopia-theme.el | 515 + .../modus-operandi-theme.el | 513 + .../modus-operandi-tinted-theme.el | 513 + .../modus-operandi-tritanopia-theme.el | 515 + .../modus-themes-autoloads.el | 60 + .../modus-themes-pkg.el | 14 + .../modus-themes.el | 4160 +++++++ .../modus-themes.info | 6409 ++++++++++ .../modus-vivendi-deuteranopia-theme.el | 515 + .../modus-vivendi-theme.el | 513 + .../modus-vivendi-tinted-theme.el | 513 + .../modus-vivendi-tritanopia-theme.el | 515 + .../theme-loaddefs.el | 63 + .../data/nerd-icons-data-codicon.el | 420 + .../data/nerd-icons-data-devicon.el | 224 + .../data/nerd-icons-data-faicon.el | 989 ++ .../data/nerd-icons-data-flicon.el | 148 + .../data/nerd-icons-data-ipsicon.el | 38 + .../data/nerd-icons-data-mdicon.el | 6913 ++++++++++ .../data/nerd-icons-data-octicon.el | 343 + .../data/nerd-icons-data-pomicon.el | 44 + .../data/nerd-icons-data-powerline.el | 74 + .../data/nerd-icons-data-sucicon.el | 233 + .../data/nerd-icons-data-wicon.el | 261 + .../nerd-icons-autoloads.el | 83 + .../nerd-icons-data.el | 44 + .../nerd-icons-faces.el | 229 + .../nerd-icons-20240319.833/nerd-icons-pkg.el | 14 + .../nerd-icons-20240319.833/nerd-icons.el | 1297 ++ .../persp-mode-20220909.836/persp-mode-pkg.el | 2 - .../persp-mode-autoloads.el | 44 +- .../persp-mode-pkg.el | 14 + .../persp-mode.el | 1438 ++- .../popup-20240101.830/popup-autoloads.el | 28 + code/elpa/popup-20240101.830/popup-pkg.el | 14 + code/elpa/popup-20240101.830/popup.el | 1459 +++ .../projectile-pkg.el | 2 - .../projectile-autoloads.el | 287 +- .../projectile-pkg.el | 14 + .../projectile.el | 196 +- .../completion/pycomplete.el | 0 .../completion/pycomplete.py | 0 .../python-mode-autoloads.el | 26 +- .../python-mode-pkg.el | 2 +- .../python-mode.el | 348 +- .../elpa/rust-mode-20240313.157/rust-cargo.el | 125 + .../rust-mode-20240313.157/rust-common.el | 20 + .../rust-mode-20240313.157/rust-compile.el | 92 + .../rust-mode-autoloads.el | 68 + .../rust-mode-20240313.157/rust-mode-pkg.el | 14 + .../rust-mode-treesitter.el | 25 + code/elpa/rust-mode-20240313.157/rust-mode.el | 87 + .../rust-mode-20240313.157/rust-playpen.el | 67 + .../rust-mode-20240313.157/rust-prog-mode.el | 1509 +++ .../rust-mode-20240313.157/rust-rustfmt.el | 378 + .../elpa/rust-mode-20240313.157/rust-utils.el | 122 + .../wfnames-autoloads.el | 35 + .../elpa/wfnames-20230924.1538/wfnames-pkg.el | 12 + code/elpa/wfnames-20230924.1538/wfnames.el | 345 + .../which-key-autoloads.el | 193 + .../which-key-20240312.2033/which-key-pkg.el | 11 + .../elpa/which-key-20240312.2033/which-key.el | 2800 +++++ code/elpa/with-editor-20240101.2226/dir | 18 + .../with-editor-autoloads.el | 105 + .../with-editor-pkg.el | 15 + .../with-editor-20240101.2226/with-editor.el | 984 ++ .../with-editor.info | 382 + .../yaml-mode-20230329.723/yaml-mode-pkg.el | 2 - .../yaml-mode-autoloads.el | 30 +- .../yaml-mode-20240317.1602/yaml-mode-pkg.el | 15 + .../yaml-mode.el | 8 +- code/init.el | 10 +- .../all-the-icons-autoloads.el | 43 +- .../all-the-icons-faces.el | 0 .../all-the-icons-pkg.el | 4 +- .../all-the-icons.el | 18 +- .../data/data-alltheicons.el | 0 .../data/data-faicons.el | 0 .../data/data-fileicons.el | 2 +- .../data/data-material.el | 0 .../data/data-octicons.el | 0 .../data/data-weathericons.el | 0 .../all-the-icons-dired-pkg.el | 2 - .../all-the-icons-dired-autoloads.el | 26 +- .../all-the-icons-dired-pkg.el | 15 + .../all-the-icons-dired.el | 18 +- org/elpa/archives/melpa/archive-contents | 372 +- .../async-20240312.1716}/async-autoloads.el | 71 +- .../async-20240312.1716}/async-bytecomp.el | 2 +- .../async-pkg.el | 4 +- .../async.el | 34 +- .../dired-async.el | 45 +- .../smtpmail-async.el | 0 .../dash-20240103.1301}/dash-autoloads.el | 56 +- .../elpa/dash-20240103.1301}/dash-pkg.el | 4 +- .../dash.el | 2 +- .../dash.info | 4 +- .../dir | 0 .../dashboard-20230726.2018/banners/1.txt | 8 - .../dashboard-20230726.2018/banners/2.txt | 6 - .../dashboard-20230726.2018/banners/3.txt | 8 - .../dashboard-20230726.2018/banners/4.txt | 17 - .../dashboard-20230726.2018/banners/emacs.png | Bin 43759 -> 0 bytes .../dashboard-20230726.2018/banners/logo.png | Bin 32305 -> 0 bytes .../dashboard-autoloads.el | 44 - .../dashboard-20240319.915}/banners/1.txt | 0 .../dashboard-20240319.915}/banners/2.txt | 0 .../dashboard-20240319.915}/banners/3.txt | 0 .../dashboard-20240319.915}/banners/4.txt | 0 .../dashboard-20240319.915}/banners/emacs.png | Bin .../dashboard-20240319.915}/banners/logo.png | Bin .../dashboard-autoloads.el | 37 +- .../dashboard-pkg.el | 4 +- .../dashboard-widgets.el | 366 +- .../elpa/dashboard-20240319.915}/dashboard.el | 293 +- org/elpa/devdocs-20230220.2042/devdocs-pkg.el | 2 - .../devdocs-autoloads.el | 43 +- org/elpa/devdocs-20240301.1838/devdocs-pkg.el | 14 + .../devdocs.el | 34 +- .../devdocs-browser-autoloads.el | 52 +- .../devdocs-browser-pkg.el | 4 +- .../devdocs-browser.el | 23 +- .../dired-single-autoloads.el | 73 - .../dired-single-pkg.el | 2 - .../dired-single-20220917.625/dired-single.el | 218 - .../dired-single-pkg.el | 2 - .../dired-single-autoloads.el | 39 +- .../dired-single-pkg.el | 6 + .../dired-single.el | 6 +- .../elisp-refs-pkg.el | 2 - .../elisp-refs-20230309.1638/elisp-refs.el | 911 -- .../elisp-refs-autoloads.el | 72 - .../elisp-refs-autoloads.el | 39 +- .../elisp-refs-pkg.el | 4 +- .../elisp-refs.el | 2 +- org/elpa/f-20240308.906/f-autoloads.el | 28 + org/elpa/f-20240308.906/f-pkg.el | 16 + org/elpa/f-20240308.906/f-shortdoc.el | 438 + org/elpa/f-20240308.906/f.el | 799 ++ org/elpa/helm-20240320.541/.dir-locals.el | 9 + org/elpa/helm-20240320.541/emacs-helm.sh | 265 + org/elpa/helm-20240320.541/helm-adaptive.el | 284 + org/elpa/helm-20240320.541/helm-autoloads.el | 990 ++ org/elpa/helm-20240320.541/helm-bookmark.el | 846 ++ org/elpa/helm-20240320.541/helm-buffers.el | 1181 ++ org/elpa/helm-20240320.541/helm-color.el | 159 + org/elpa/helm-20240320.541/helm-command.el | 417 + org/elpa/helm-20240320.541/helm-dabbrev.el | 388 + org/elpa/helm-20240320.541/helm-easymenu.el | 84 + org/elpa/helm-20240320.541/helm-elisp.el | 1167 ++ org/elpa/helm-20240320.541/helm-epa.el | 258 + org/elpa/helm-20240320.541/helm-eshell.el | 494 + org/elpa/helm-20240320.541/helm-eval.el | 221 + org/elpa/helm-20240320.541/helm-external.el | 264 + org/elpa/helm-20240320.541/helm-fd.el | 144 + org/elpa/helm-20240320.541/helm-files.el | 7014 +++++++++++ org/elpa/helm-20240320.541/helm-find.el | 170 + org/elpa/helm-20240320.541/helm-font.el | 344 + org/elpa/helm-20240320.541/helm-for-files.el | 310 + .../helm-20240320.541/helm-global-bindings.el | 104 + org/elpa/helm-20240320.541/helm-grep.el | 1800 +++ org/elpa/helm-20240320.541/helm-help.el | 2552 ++++ org/elpa/helm-20240320.541/helm-id-utils.el | 125 + org/elpa/helm-20240320.541/helm-imenu.el | 542 + org/elpa/helm-20240320.541/helm-info.el | 315 + org/elpa/helm-20240320.541/helm-locate.el | 487 + org/elpa/helm-20240320.541/helm-man.el | 114 + org/elpa/helm-20240320.541/helm-misc.el | 393 + org/elpa/helm-20240320.541/helm-mode.el | 2804 +++++ org/elpa/helm-20240320.541/helm-net.el | 436 + org/elpa/helm-20240320.541/helm-occur.el | 894 ++ org/elpa/helm-20240320.541/helm-packages.el | 288 + org/elpa/helm-20240320.541/helm-pkg.el | 14 + org/elpa/helm-20240320.541/helm-regexp.el | 132 + org/elpa/helm-20240320.541/helm-ring.el | 642 + org/elpa/helm-20240320.541/helm-semantic.el | 233 + org/elpa/helm-20240320.541/helm-sys.el | 472 + org/elpa/helm-20240320.541/helm-tags.el | 337 + org/elpa/helm-20240320.541/helm-types.el | 337 + org/elpa/helm-20240320.541/helm-utils.el | 1151 ++ org/elpa/helm-20240320.541/helm-x-files.el | 126 + org/elpa/helm-20240320.541/helm.el | 52 + .../helm-core-autoloads.el | 250 + .../helm-core-20240316.1157/helm-core-pkg.el | 13 + org/elpa/helm-core-20240316.1157/helm-core.el | 8004 ++++++++++++ org/elpa/helm-core-20240316.1157/helm-lib.el | 2145 ++++ .../helm-multi-match.el | 410 + .../helm-core-20240316.1157/helm-source.el | 1312 ++ .../helm-ls-git-autoloads.el | 48 + .../helm-ls-git-pkg.el | 7 + .../helm-ls-git-20240315.1721/helm-ls-git.el | 2111 ++++ .../helm-org-autoloads.el | 55 + .../helm-org-20231022.620/helm-org-pkg.el | 13 + org/elpa/helm-org-20231022.620/helm-org.el | 538 + org/elpa/helpful-20230323.414/helpful-pkg.el | 2 - .../helpful-20231028.516/helpful-autoloads.el | 66 + org/elpa/helpful-20231028.516/helpful-pkg.el | 18 + org/elpa/helpful-20231028.516/helpful.el | 3104 +++++ .../ido-completing-read+-autoloads.el | 106 + .../ido-completing-read+-pkg.el | 16 + .../ido-completing-read+.el | 1285 ++ .../log4e-20240123.1313/log4e-autoloads.el | 37 + org/elpa/log4e-20240123.1313/log4e-pkg.el | 12 + org/elpa/log4e-20240123.1313/log4e.el | 557 + .../markdown-mode-autoloads.el | 64 + .../markdown-mode-pkg.el | 14 + .../markdown-mode.el | 10384 ++++++++++++++++ org/elpa/modus-themes-20240317.1619/dir | 19 + .../doclicense.info | 489 + .../modus-operandi-deuteranopia-theme.el | 515 + .../modus-operandi-theme.el | 513 + .../modus-operandi-tinted-theme.el | 513 + .../modus-operandi-tritanopia-theme.el | 515 + .../modus-themes-autoloads.el | 60 + .../modus-themes-pkg.el | 14 + .../modus-themes.el | 4160 +++++++ .../modus-themes.info | 6409 ++++++++++ .../modus-vivendi-deuteranopia-theme.el | 515 + .../modus-vivendi-theme.el | 513 + .../modus-vivendi-tinted-theme.el | 513 + .../modus-vivendi-tritanopia-theme.el | 515 + .../theme-loaddefs.el | 63 + .../data/nerd-icons-data-codicon.el | 420 + .../data/nerd-icons-data-devicon.el | 224 + .../data/nerd-icons-data-faicon.el | 989 ++ .../data/nerd-icons-data-flicon.el | 148 + .../data/nerd-icons-data-ipsicon.el | 38 + .../data/nerd-icons-data-mdicon.el | 6913 ++++++++++ .../data/nerd-icons-data-octicon.el | 343 + .../data/nerd-icons-data-pomicon.el | 44 + .../data/nerd-icons-data-powerline.el | 74 + .../data/nerd-icons-data-sucicon.el | 233 + .../data/nerd-icons-data-wicon.el | 261 + .../nerd-icons-autoloads.el | 83 + .../nerd-icons-data.el | 44 + .../nerd-icons-faces.el | 229 + .../nerd-icons-20240319.833/nerd-icons-pkg.el | 14 + .../nerd-icons-20240319.833/nerd-icons.el | 1297 ++ .../org-alert-autoloads.el | 22 - .../org-alert-20220721.1721/org-alert-pkg.el | 2 - .../org-alert-autoloads.el | 28 + .../org-alert-20240122.1728/org-alert-pkg.el | 15 + .../org-alert.el | 64 +- .../org-hugo-auto-export-mode.el | 48 + .../ox-hugo-20240305.1923/ox-blackfriday.el | 1672 +++ .../ox-hugo-autoloads.el | 276 + .../ox-hugo-deprecated.el | 442 + .../ox-hugo-pandoc-cite.el | 415 + org/elpa/ox-hugo-20240305.1923/ox-hugo-pkg.el | 16 + org/elpa/ox-hugo-20240305.1923/ox-hugo.el | 5002 ++++++++ .../ox-pandoc-autoloads.el | 616 + .../ox-pandoc-20231222.1103/ox-pandoc-pkg.el | 18 + org/elpa/ox-pandoc-20231222.1103/ox-pandoc.el | 1984 +++ .../README | 152 +- .../build/Makefile | 0 .../build/server/.gitignore | 0 .../build/server/Makefile.am | 0 .../build/server/autobuild | 6 +- .../build/server/autogen.sh | 0 .../build/server/configure.ac | 0 .../build/server/epdfinfo.c | 141 +- .../build/server/epdfinfo.h | 0 .../build/server/poppler-versions | 0 .../build/server/synctex_parser.c | 0 .../build/server/synctex_parser.h | 0 .../build/server/synctex_parser_advanced.h | 0 .../build/server/synctex_parser_local.h | 0 .../build/server/synctex_parser_readme.txt | 0 .../build/server/synctex_parser_utils.c | 0 .../build/server/synctex_parser_utils.h | 0 .../build/server/synctex_parser_version.txt | 0 .../build/server/synctex_version.h | 0 .../build/server/test/.gitignore | 0 .../build/server/test/docker/.gitignore | 0 .../build/server/test/docker/lib/run-tests | 0 .../build/server/test/docker/lib/yes-or-enter | 0 .../docker/templates/Dockerfile.common.in | 0 .../templates/arch.Dockerfile.in.FAILING | 0 .../templates/centos.Dockerfile.in.FAILING | 0 .../docker/templates/debian-10.Dockerfile.in | 0 .../docker/templates/debian-11.Dockerfile.in | 0 .../docker/templates/debian-9.Dockerfile.in | 0 .../docker/templates/emacs-26.Dockerfile.in | 0 .../docker/templates/emacs-27.Dockerfile.in | 0 .../docker/templates/emacs-28.Dockerfile.in | 0 .../docker/templates/emacs-29.Dockerfile.in | 0 .../docker/templates/fedora-34.Dockerfile.in | 0 .../docker/templates/fedora-35.Dockerfile.in | 0 .../docker/templates/fedora-36.Dockerfile.in | 0 .../templates/freebsd.Dockerfile.in.FAILING | 0 .../templates/gentoo.Dockerfile.in.FAILING | 0 .../templates/macos.Dockerfile.in.FAILING | 0 .../templates/msys2.Dockerfile.in.FAILING | 0 .../templates/nixos.Dockerfile.in.FAILING | 0 .../templates/openbsd.Dockerfile.in.FAILING | 0 .../templates/opensuse.Dockerfile.in.FAILING | 0 .../docker/templates/ubuntu-18.Dockerfile.in | 0 .../docker/templates/ubuntu-20.Dockerfile.in | 0 .../docker/templates/ubuntu-22.Dockerfile.in | 0 .../templates/void.Dockerfile.in.FAILING | 0 .../pdf-annot.el | 37 +- .../pdf-cache.el | 0 .../pdf-dev.el | 0 .../pdf-history.el | 0 .../pdf-info.el | 0 .../pdf-isearch.el | 0 .../pdf-links.el | 0 .../pdf-loader.el | 2 +- .../pdf-macs.el | 0 .../pdf-misc.el | 13 + .../pdf-occur.el | 0 .../pdf-outline.el | 14 +- .../pdf-sync.el | 0 .../pdf-tools-autoloads.el | 298 +- .../pdf-tools-pkg.el | 6 +- .../pdf-tools.el | 6 +- .../pdf-util.el | 0 .../pdf-view.el | 54 +- .../pdf-virtual.el | 0 .../persp-mode-autoloads.el | 69 + .../persp-mode-pkg.el | 14 + .../persp-mode-20231010.1804/persp-mode.el | 4219 +++++++ .../popup-20240101.830/popup-autoloads.el | 28 + org/elpa/popup-20240101.830/popup-pkg.el | 14 + org/elpa/popup-20240101.830/popup.el | 1459 +++ .../tablist-autoloads.el | 37 +- .../tablist-filter.el | 0 .../tablist-pkg.el | 6 +- .../tablist.el | 10 +- .../wfnames-autoloads.el | 35 + org/elpa/wfnames-20230924.1538/wfnames-pkg.el | 12 + org/elpa/wfnames-20230924.1538/wfnames.el | 345 + .../which-key-autoloads.el | 193 + .../which-key-20240312.2033/which-key-pkg.el | 11 + org/elpa/which-key-20240312.2033/which-key.el | 2800 +++++ org/init.el | 5 +- 599 files changed, 243089 insertions(+), 9131 deletions(-) rename code/elpa/{all-the-icons-20230615.2016 => all-the-icons-20240108.559}/all-the-icons-autoloads.el (75%) rename code/elpa/{all-the-icons-20230615.2016 => all-the-icons-20240108.559}/all-the-icons-faces.el (100%) rename {org/elpa/all-the-icons-20230615.2016 => code/elpa/all-the-icons-20240108.559}/all-the-icons-pkg.el (69%) rename code/elpa/{all-the-icons-20230615.2016 => all-the-icons-20240108.559}/all-the-icons.el (98%) rename code/elpa/{all-the-icons-20230615.2016 => all-the-icons-20240108.559}/data/data-alltheicons.el (100%) rename code/elpa/{all-the-icons-20230615.2016 => all-the-icons-20240108.559}/data/data-faicons.el (100%) rename {org/elpa/all-the-icons-20230615.2016 => code/elpa/all-the-icons-20240108.559}/data/data-fileicons.el (99%) rename code/elpa/{all-the-icons-20230615.2016 => all-the-icons-20240108.559}/data/data-material.el (100%) rename code/elpa/{all-the-icons-20230615.2016 => all-the-icons-20240108.559}/data/data-octicons.el (100%) rename code/elpa/{all-the-icons-20230615.2016 => all-the-icons-20240108.559}/data/data-weathericons.el (100%) delete mode 100644 code/elpa/all-the-icons-dired-20220929.1135/all-the-icons-dired-pkg.el rename code/elpa/{all-the-icons-dired-20220929.1135 => all-the-icons-dired-20231207.1324}/all-the-icons-dired-autoloads.el (71%) create mode 100644 code/elpa/all-the-icons-dired-20231207.1324/all-the-icons-dired-pkg.el rename code/elpa/{all-the-icons-dired-20220929.1135 => all-the-icons-dired-20231207.1324}/all-the-icons-dired.el (91%) rename {org/elpa/async-20230528.622 => code/elpa/async-20240312.1716}/async-autoloads.el (85%) rename {org/elpa/async-20230528.622 => code/elpa/async-20240312.1716}/async-bytecomp.el (99%) rename code/elpa/{async-20230528.622 => async-20240312.1716}/async-pkg.el (69%) rename code/elpa/{async-20230528.622 => async-20240312.1716}/async.el (94%) rename code/elpa/{async-20230528.622 => async-20240312.1716}/dired-async.el (91%) rename code/elpa/{async-20230528.622 => async-20240312.1716}/smtpmail-async.el (100%) rename {org/elpa/dash-20230714.723 => code/elpa/dash-20240103.1301}/dash-autoloads.el (84%) rename {org/elpa/dash-20230714.723 => code/elpa/dash-20240103.1301}/dash-pkg.el (69%) rename code/elpa/{dash-20230714.723 => dash-20240103.1301}/dash.el (99%) rename code/elpa/{dash-20230714.723 => dash-20240103.1301}/dash.info (99%) rename code/elpa/{dash-20230714.723 => dash-20240103.1301}/dir (100%) delete mode 100644 code/elpa/dashboard-20230331.2304/dashboard-pkg.el delete mode 100644 code/elpa/dashboard-20230331.2304/dashboard-widgets.el delete mode 100644 code/elpa/dashboard-20230331.2304/dashboard.el rename code/elpa/{dashboard-20230331.2304 => dashboard-20240319.915}/banners/1.txt (100%) rename code/elpa/{dashboard-20230331.2304 => dashboard-20240319.915}/banners/2.txt (100%) rename code/elpa/{dashboard-20230331.2304 => dashboard-20240319.915}/banners/3.txt (100%) rename code/elpa/{dashboard-20230331.2304 => dashboard-20240319.915}/banners/4.txt (100%) rename code/elpa/{dashboard-20230331.2304 => dashboard-20240319.915}/banners/emacs.png (100%) rename code/elpa/{dashboard-20230331.2304 => dashboard-20240319.915}/banners/logo.png (100%) rename code/elpa/{dashboard-20230331.2304 => dashboard-20240319.915}/dashboard-autoloads.el (50%) rename code/elpa/{dashboard-20230726.2018 => dashboard-20240319.915}/dashboard-pkg.el (71%) rename code/elpa/{dashboard-20230726.2018 => dashboard-20240319.915}/dashboard-widgets.el (88%) rename {org/elpa/dashboard-20230726.2018 => code/elpa/dashboard-20240319.915}/dashboard.el (68%) delete mode 100644 code/elpa/devdocs-20230220.2042/devdocs-pkg.el rename code/elpa/{devdocs-20230220.2042 => devdocs-20240301.1838}/devdocs-autoloads.el (60%) create mode 100644 code/elpa/devdocs-20240301.1838/devdocs-pkg.el rename code/elpa/{devdocs-20230220.2042 => devdocs-20240301.1838}/devdocs.el (96%) delete mode 100644 code/elpa/devdocs-browser-20230112.1554/devdocs-browser-autoloads.el delete mode 100644 code/elpa/devdocs-browser-20230112.1554/devdocs-browser-pkg.el delete mode 100644 code/elpa/devdocs-browser-20230112.1554/devdocs-browser.el rename {org/elpa/devdocs-browser-20230423.444 => code/elpa/devdocs-browser-20231231.1455}/devdocs-browser-autoloads.el (67%) rename {org/elpa/devdocs-browser-20230423.444 => code/elpa/devdocs-browser-20231231.1455}/devdocs-browser-pkg.el (66%) rename code/elpa/{devdocs-browser-20230423.444 => devdocs-browser-20231231.1455}/devdocs-browser.el (96%) delete mode 100644 code/elpa/dired-single-20230306.626/dired-single-pkg.el rename code/elpa/{dired-single-20230306.626 => dired-single-20240131.1148}/dired-single-autoloads.el (78%) create mode 100644 code/elpa/dired-single-20240131.1148/dired-single-pkg.el rename code/elpa/{dired-single-20230306.626 => dired-single-20240131.1148}/dired-single.el (97%) delete mode 100644 code/elpa/dockerfile-mode-20220822.2021/dockerfile-mode-pkg.el rename code/elpa/{dockerfile-mode-20220822.2021 => dockerfile-mode-20240318.24}/dockerfile-mode-autoloads.el (73%) create mode 100644 code/elpa/dockerfile-mode-20240318.24/dockerfile-mode-pkg.el rename code/elpa/{dockerfile-mode-20220822.2021 => dockerfile-mode-20240318.24}/dockerfile-mode.el (95%) delete mode 100644 code/elpa/elisp-refs-20230309.1638/elisp-refs-autoloads.el delete mode 100644 code/elpa/elisp-refs-20230309.1638/elisp-refs-pkg.el delete mode 100644 code/elpa/elisp-refs-20230309.1638/elisp-refs.el rename {org/elpa/elisp-refs-20230309.1638 => code/elpa/elisp-refs-20230920.201}/elisp-refs-autoloads.el (72%) rename code/elpa/{elisp-refs-20230419.405 => elisp-refs-20230920.201}/elisp-refs-pkg.el (70%) rename code/elpa/{elisp-refs-20230419.405 => elisp-refs-20230920.201}/elisp-refs.el (98%) create mode 100644 code/elpa/f-20240308.906/f-autoloads.el create mode 100644 code/elpa/f-20240308.906/f-pkg.el create mode 100644 code/elpa/f-20240308.906/f-shortdoc.el create mode 100644 code/elpa/f-20240308.906/f.el create mode 100644 code/elpa/helm-20240320.541/.dir-locals.el create mode 100644 code/elpa/helm-20240320.541/emacs-helm.sh create mode 100644 code/elpa/helm-20240320.541/helm-adaptive.el create mode 100644 code/elpa/helm-20240320.541/helm-autoloads.el create mode 100644 code/elpa/helm-20240320.541/helm-bookmark.el create mode 100644 code/elpa/helm-20240320.541/helm-buffers.el create mode 100644 code/elpa/helm-20240320.541/helm-color.el create mode 100644 code/elpa/helm-20240320.541/helm-command.el create mode 100644 code/elpa/helm-20240320.541/helm-dabbrev.el create mode 100644 code/elpa/helm-20240320.541/helm-easymenu.el create mode 100644 code/elpa/helm-20240320.541/helm-elisp.el create mode 100644 code/elpa/helm-20240320.541/helm-epa.el create mode 100644 code/elpa/helm-20240320.541/helm-eshell.el create mode 100644 code/elpa/helm-20240320.541/helm-eval.el create mode 100644 code/elpa/helm-20240320.541/helm-external.el create mode 100644 code/elpa/helm-20240320.541/helm-fd.el create mode 100644 code/elpa/helm-20240320.541/helm-files.el create mode 100644 code/elpa/helm-20240320.541/helm-find.el create mode 100644 code/elpa/helm-20240320.541/helm-font.el create mode 100644 code/elpa/helm-20240320.541/helm-for-files.el create mode 100644 code/elpa/helm-20240320.541/helm-global-bindings.el create mode 100644 code/elpa/helm-20240320.541/helm-grep.el create mode 100644 code/elpa/helm-20240320.541/helm-help.el create mode 100644 code/elpa/helm-20240320.541/helm-id-utils.el create mode 100644 code/elpa/helm-20240320.541/helm-imenu.el create mode 100644 code/elpa/helm-20240320.541/helm-info.el create mode 100644 code/elpa/helm-20240320.541/helm-locate.el create mode 100644 code/elpa/helm-20240320.541/helm-man.el create mode 100644 code/elpa/helm-20240320.541/helm-misc.el create mode 100644 code/elpa/helm-20240320.541/helm-mode.el create mode 100644 code/elpa/helm-20240320.541/helm-net.el create mode 100644 code/elpa/helm-20240320.541/helm-occur.el create mode 100644 code/elpa/helm-20240320.541/helm-packages.el create mode 100644 code/elpa/helm-20240320.541/helm-pkg.el create mode 100644 code/elpa/helm-20240320.541/helm-regexp.el create mode 100644 code/elpa/helm-20240320.541/helm-ring.el create mode 100644 code/elpa/helm-20240320.541/helm-semantic.el create mode 100644 code/elpa/helm-20240320.541/helm-sys.el create mode 100644 code/elpa/helm-20240320.541/helm-tags.el create mode 100644 code/elpa/helm-20240320.541/helm-types.el create mode 100644 code/elpa/helm-20240320.541/helm-utils.el create mode 100644 code/elpa/helm-20240320.541/helm-x-files.el create mode 100644 code/elpa/helm-20240320.541/helm.el create mode 100644 code/elpa/helm-core-20240316.1157/helm-core-autoloads.el create mode 100644 code/elpa/helm-core-20240316.1157/helm-core-pkg.el create mode 100644 code/elpa/helm-core-20240316.1157/helm-core.el create mode 100644 code/elpa/helm-core-20240316.1157/helm-lib.el create mode 100644 code/elpa/helm-core-20240316.1157/helm-multi-match.el create mode 100644 code/elpa/helm-core-20240316.1157/helm-source.el create mode 100644 code/elpa/helm-ls-git-20240315.1721/helm-ls-git-autoloads.el create mode 100644 code/elpa/helm-ls-git-20240315.1721/helm-ls-git-pkg.el create mode 100644 code/elpa/helm-ls-git-20240315.1721/helm-ls-git.el create mode 100644 code/elpa/helm-org-20231022.620/helm-org-autoloads.el create mode 100644 code/elpa/helm-org-20231022.620/helm-org-pkg.el create mode 100644 code/elpa/helm-org-20231022.620/helm-org.el rename {org/elpa/helpful-20230323.414 => code/elpa/helpful-20231028.516}/helpful-autoloads.el (62%) create mode 100644 code/elpa/helpful-20231028.516/helpful-pkg.el rename {org/elpa/helpful-20230323.414 => code/elpa/helpful-20231028.516}/helpful.el (95%) create mode 100644 code/elpa/ido-completing-read+-20240130.30/ido-completing-read+-autoloads.el create mode 100644 code/elpa/ido-completing-read+-20240130.30/ido-completing-read+-pkg.el create mode 100644 code/elpa/ido-completing-read+-20240130.30/ido-completing-read+.el create mode 100644 code/elpa/json-mode-20240228.1443/json-mode-autoloads.el create mode 100644 code/elpa/json-mode-20240228.1443/json-mode-pkg.el create mode 100644 code/elpa/json-mode-20240228.1443/json-mode.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-actionscript.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-ada.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-angular.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-ansible.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-asm.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-astro.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-autotools.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-awk.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-bash.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-beancount.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-bufls.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-camel.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-clangd.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-clojure.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-cmake.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-cobol.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-completion.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-credo.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-crystal.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-csharp.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-css.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-cucumber.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-cypher.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-d.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-dhall.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-diagnostics.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-dired.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-dockerfile.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-dot.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-elixir.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-elm.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-emmet.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-erlang.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-eslint.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-fortran.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-fsharp.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-gdscript.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-gleam.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-glsl.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-go.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-golangci-lint.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-graphql.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-groovy.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-hack.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-haxe.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-headerline.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-html.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-hy.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-icons.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-ido.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-idris.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-iedit.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-javascript.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-jq.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-json.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-jsonnet.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-kotlin.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-lens.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-lua.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-magik.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-markdown.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-marksman.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-mdx.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-mint.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-mode-autoloads.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-mode-pkg.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-mode.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-modeline.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-mojo.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-move.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-nginx.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-nim.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-nix.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-nushell.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-ocaml.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-openscad.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-perl.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-perlnavigator.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-php.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-pls.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-prolog.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-protocol.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-purescript.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-pwsh.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-pyls.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-pylsp.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-r.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-racket.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-remark.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-rf.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-rpm-spec.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-rubocop.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-ruby-lsp.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-ruby-syntax-tree.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-ruff-lsp.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-rust.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-semantic-tokens.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-semgrep.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-sml.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-solargraph.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-solidity.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-sorbet.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-sqls.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-steep.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-svelte.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-terraform.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-tex.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-tilt.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-toml.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-trunk.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-ttcn3.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-typeprof.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-v.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-vala.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-verilog.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-vetur.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-vhdl.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-vimscript.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-volar.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-wgsl.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-xml.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-yaml.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp-zig.el create mode 100644 code/elpa/lsp-mode-20240319.1043/lsp.el create mode 100644 code/elpa/lua-mode-20231023.947/lua-mode-autoloads.el create mode 100644 code/elpa/lua-mode-20231023.947/lua-mode-pkg.el create mode 100644 code/elpa/lua-mode-20231023.947/lua-mode.el create mode 100644 code/elpa/markdown-mode-20240318.1307/markdown-mode-autoloads.el create mode 100644 code/elpa/markdown-mode-20240318.1307/markdown-mode-pkg.el create mode 100644 code/elpa/markdown-mode-20240318.1307/markdown-mode.el create mode 100644 code/elpa/modus-themes-20240317.1619/dir create mode 100644 code/elpa/modus-themes-20240317.1619/doclicense.info create mode 100644 code/elpa/modus-themes-20240317.1619/modus-operandi-deuteranopia-theme.el create mode 100644 code/elpa/modus-themes-20240317.1619/modus-operandi-theme.el create mode 100644 code/elpa/modus-themes-20240317.1619/modus-operandi-tinted-theme.el create mode 100644 code/elpa/modus-themes-20240317.1619/modus-operandi-tritanopia-theme.el create mode 100644 code/elpa/modus-themes-20240317.1619/modus-themes-autoloads.el create mode 100644 code/elpa/modus-themes-20240317.1619/modus-themes-pkg.el create mode 100644 code/elpa/modus-themes-20240317.1619/modus-themes.el create mode 100644 code/elpa/modus-themes-20240317.1619/modus-themes.info create mode 100644 code/elpa/modus-themes-20240317.1619/modus-vivendi-deuteranopia-theme.el create mode 100644 code/elpa/modus-themes-20240317.1619/modus-vivendi-theme.el create mode 100644 code/elpa/modus-themes-20240317.1619/modus-vivendi-tinted-theme.el create mode 100644 code/elpa/modus-themes-20240317.1619/modus-vivendi-tritanopia-theme.el create mode 100644 code/elpa/modus-themes-20240317.1619/theme-loaddefs.el create mode 100644 code/elpa/nerd-icons-20240319.833/data/nerd-icons-data-codicon.el create mode 100644 code/elpa/nerd-icons-20240319.833/data/nerd-icons-data-devicon.el create mode 100644 code/elpa/nerd-icons-20240319.833/data/nerd-icons-data-faicon.el create mode 100644 code/elpa/nerd-icons-20240319.833/data/nerd-icons-data-flicon.el create mode 100644 code/elpa/nerd-icons-20240319.833/data/nerd-icons-data-ipsicon.el create mode 100644 code/elpa/nerd-icons-20240319.833/data/nerd-icons-data-mdicon.el create mode 100644 code/elpa/nerd-icons-20240319.833/data/nerd-icons-data-octicon.el create mode 100644 code/elpa/nerd-icons-20240319.833/data/nerd-icons-data-pomicon.el create mode 100644 code/elpa/nerd-icons-20240319.833/data/nerd-icons-data-powerline.el create mode 100644 code/elpa/nerd-icons-20240319.833/data/nerd-icons-data-sucicon.el create mode 100644 code/elpa/nerd-icons-20240319.833/data/nerd-icons-data-wicon.el create mode 100644 code/elpa/nerd-icons-20240319.833/nerd-icons-autoloads.el create mode 100644 code/elpa/nerd-icons-20240319.833/nerd-icons-data.el create mode 100644 code/elpa/nerd-icons-20240319.833/nerd-icons-faces.el create mode 100644 code/elpa/nerd-icons-20240319.833/nerd-icons-pkg.el create mode 100644 code/elpa/nerd-icons-20240319.833/nerd-icons.el delete mode 100644 code/elpa/persp-mode-20220909.836/persp-mode-pkg.el rename code/elpa/{persp-mode-20220909.836 => persp-mode-20231010.1804}/persp-mode-autoloads.el (60%) create mode 100644 code/elpa/persp-mode-20231010.1804/persp-mode-pkg.el rename code/elpa/{persp-mode-20220909.836 => persp-mode-20231010.1804}/persp-mode.el (82%) create mode 100644 code/elpa/popup-20240101.830/popup-autoloads.el create mode 100644 code/elpa/popup-20240101.830/popup-pkg.el create mode 100644 code/elpa/popup-20240101.830/popup.el delete mode 100644 code/elpa/projectile-20230317.1101/projectile-pkg.el rename code/elpa/{projectile-20230317.1101 => projectile-20240212.1100}/projectile-autoloads.el (84%) create mode 100644 code/elpa/projectile-20240212.1100/projectile-pkg.el rename code/elpa/{projectile-20230317.1101 => projectile-20240212.1100}/projectile.el (97%) rename code/elpa/{python-mode-20230209.731 => python-mode-20231218.645}/completion/pycomplete.el (100%) rename code/elpa/{python-mode-20230209.731 => python-mode-20231218.645}/completion/pycomplete.py (100%) rename code/elpa/{python-mode-20230209.731 => python-mode-20231218.645}/python-mode-autoloads.el (52%) rename code/elpa/{python-mode-20230209.731 => python-mode-20231218.645}/python-mode-pkg.el (74%) rename code/elpa/{python-mode-20230209.731 => python-mode-20231218.645}/python-mode.el (99%) create mode 100644 code/elpa/rust-mode-20240313.157/rust-cargo.el create mode 100644 code/elpa/rust-mode-20240313.157/rust-common.el create mode 100644 code/elpa/rust-mode-20240313.157/rust-compile.el create mode 100644 code/elpa/rust-mode-20240313.157/rust-mode-autoloads.el create mode 100644 code/elpa/rust-mode-20240313.157/rust-mode-pkg.el create mode 100644 code/elpa/rust-mode-20240313.157/rust-mode-treesitter.el create mode 100644 code/elpa/rust-mode-20240313.157/rust-mode.el create mode 100644 code/elpa/rust-mode-20240313.157/rust-playpen.el create mode 100644 code/elpa/rust-mode-20240313.157/rust-prog-mode.el create mode 100644 code/elpa/rust-mode-20240313.157/rust-rustfmt.el create mode 100644 code/elpa/rust-mode-20240313.157/rust-utils.el create mode 100644 code/elpa/wfnames-20230924.1538/wfnames-autoloads.el create mode 100644 code/elpa/wfnames-20230924.1538/wfnames-pkg.el create mode 100644 code/elpa/wfnames-20230924.1538/wfnames.el create mode 100644 code/elpa/which-key-20240312.2033/which-key-autoloads.el create mode 100644 code/elpa/which-key-20240312.2033/which-key-pkg.el create mode 100644 code/elpa/which-key-20240312.2033/which-key.el create mode 100644 code/elpa/with-editor-20240101.2226/dir create mode 100644 code/elpa/with-editor-20240101.2226/with-editor-autoloads.el create mode 100644 code/elpa/with-editor-20240101.2226/with-editor-pkg.el create mode 100644 code/elpa/with-editor-20240101.2226/with-editor.el create mode 100644 code/elpa/with-editor-20240101.2226/with-editor.info delete mode 100644 code/elpa/yaml-mode-20230329.723/yaml-mode-pkg.el rename code/elpa/{yaml-mode-20230329.723 => yaml-mode-20240317.1602}/yaml-mode-autoloads.el (60%) create mode 100644 code/elpa/yaml-mode-20240317.1602/yaml-mode-pkg.el rename code/elpa/{yaml-mode-20230329.723 => yaml-mode-20240317.1602}/yaml-mode.el (98%) rename org/elpa/{all-the-icons-20230615.2016 => all-the-icons-20240108.559}/all-the-icons-autoloads.el (75%) rename org/elpa/{all-the-icons-20230615.2016 => all-the-icons-20240108.559}/all-the-icons-faces.el (100%) rename {code/elpa/all-the-icons-20230615.2016 => org/elpa/all-the-icons-20240108.559}/all-the-icons-pkg.el (69%) rename org/elpa/{all-the-icons-20230615.2016 => all-the-icons-20240108.559}/all-the-icons.el (98%) rename org/elpa/{all-the-icons-20230615.2016 => all-the-icons-20240108.559}/data/data-alltheicons.el (100%) rename org/elpa/{all-the-icons-20230615.2016 => all-the-icons-20240108.559}/data/data-faicons.el (100%) rename {code/elpa/all-the-icons-20230615.2016 => org/elpa/all-the-icons-20240108.559}/data/data-fileicons.el (99%) rename org/elpa/{all-the-icons-20230615.2016 => all-the-icons-20240108.559}/data/data-material.el (100%) rename org/elpa/{all-the-icons-20230615.2016 => all-the-icons-20240108.559}/data/data-octicons.el (100%) rename org/elpa/{all-the-icons-20230615.2016 => all-the-icons-20240108.559}/data/data-weathericons.el (100%) delete mode 100644 org/elpa/all-the-icons-dired-20220929.1135/all-the-icons-dired-pkg.el rename org/elpa/{all-the-icons-dired-20220929.1135 => all-the-icons-dired-20231207.1324}/all-the-icons-dired-autoloads.el (71%) create mode 100644 org/elpa/all-the-icons-dired-20231207.1324/all-the-icons-dired-pkg.el rename org/elpa/{all-the-icons-dired-20220929.1135 => all-the-icons-dired-20231207.1324}/all-the-icons-dired.el (91%) rename {code/elpa/async-20230528.622 => org/elpa/async-20240312.1716}/async-autoloads.el (85%) rename {code/elpa/async-20230528.622 => org/elpa/async-20240312.1716}/async-bytecomp.el (99%) rename org/elpa/{async-20230528.622 => async-20240312.1716}/async-pkg.el (69%) rename org/elpa/{async-20230528.622 => async-20240312.1716}/async.el (94%) rename org/elpa/{async-20230528.622 => async-20240312.1716}/dired-async.el (91%) rename org/elpa/{async-20230528.622 => async-20240312.1716}/smtpmail-async.el (100%) rename {code/elpa/dash-20230714.723 => org/elpa/dash-20240103.1301}/dash-autoloads.el (84%) rename {code/elpa/dash-20230714.723 => org/elpa/dash-20240103.1301}/dash-pkg.el (69%) rename org/elpa/{dash-20230714.723 => dash-20240103.1301}/dash.el (99%) rename org/elpa/{dash-20230714.723 => dash-20240103.1301}/dash.info (99%) rename org/elpa/{dash-20230714.723 => dash-20240103.1301}/dir (100%) delete mode 100644 org/elpa/dashboard-20230726.2018/banners/1.txt delete mode 100644 org/elpa/dashboard-20230726.2018/banners/2.txt delete mode 100644 org/elpa/dashboard-20230726.2018/banners/3.txt delete mode 100644 org/elpa/dashboard-20230726.2018/banners/4.txt delete mode 100644 org/elpa/dashboard-20230726.2018/banners/emacs.png delete mode 100644 org/elpa/dashboard-20230726.2018/banners/logo.png delete mode 100644 org/elpa/dashboard-20230726.2018/dashboard-autoloads.el rename {code/elpa/dashboard-20230726.2018 => org/elpa/dashboard-20240319.915}/banners/1.txt (100%) rename {code/elpa/dashboard-20230726.2018 => org/elpa/dashboard-20240319.915}/banners/2.txt (100%) rename {code/elpa/dashboard-20230726.2018 => org/elpa/dashboard-20240319.915}/banners/3.txt (100%) rename {code/elpa/dashboard-20230726.2018 => org/elpa/dashboard-20240319.915}/banners/4.txt (100%) rename {code/elpa/dashboard-20230726.2018 => org/elpa/dashboard-20240319.915}/banners/emacs.png (100%) rename {code/elpa/dashboard-20230726.2018 => org/elpa/dashboard-20240319.915}/banners/logo.png (100%) rename {code/elpa/dashboard-20230726.2018 => org/elpa/dashboard-20240319.915}/dashboard-autoloads.el (50%) rename org/elpa/{dashboard-20230726.2018 => dashboard-20240319.915}/dashboard-pkg.el (71%) rename org/elpa/{dashboard-20230726.2018 => dashboard-20240319.915}/dashboard-widgets.el (88%) rename {code/elpa/dashboard-20230726.2018 => org/elpa/dashboard-20240319.915}/dashboard.el (68%) delete mode 100644 org/elpa/devdocs-20230220.2042/devdocs-pkg.el rename org/elpa/{devdocs-20230220.2042 => devdocs-20240301.1838}/devdocs-autoloads.el (60%) create mode 100644 org/elpa/devdocs-20240301.1838/devdocs-pkg.el rename org/elpa/{devdocs-20230220.2042 => devdocs-20240301.1838}/devdocs.el (96%) rename {code/elpa/devdocs-browser-20230423.444 => org/elpa/devdocs-browser-20231231.1455}/devdocs-browser-autoloads.el (67%) rename {code/elpa/devdocs-browser-20230423.444 => org/elpa/devdocs-browser-20231231.1455}/devdocs-browser-pkg.el (66%) rename org/elpa/{devdocs-browser-20230423.444 => devdocs-browser-20231231.1455}/devdocs-browser.el (96%) delete mode 100644 org/elpa/dired-single-20220917.625/dired-single-autoloads.el delete mode 100644 org/elpa/dired-single-20220917.625/dired-single-pkg.el delete mode 100644 org/elpa/dired-single-20220917.625/dired-single.el delete mode 100644 org/elpa/dired-single-20230306.626/dired-single-pkg.el rename org/elpa/{dired-single-20230306.626 => dired-single-20240131.1148}/dired-single-autoloads.el (78%) create mode 100644 org/elpa/dired-single-20240131.1148/dired-single-pkg.el rename org/elpa/{dired-single-20230306.626 => dired-single-20240131.1148}/dired-single.el (97%) delete mode 100644 org/elpa/elisp-refs-20230309.1638/elisp-refs-pkg.el delete mode 100644 org/elpa/elisp-refs-20230309.1638/elisp-refs.el delete mode 100644 org/elpa/elisp-refs-20230419.405/elisp-refs-autoloads.el rename {code/elpa/elisp-refs-20230419.405 => org/elpa/elisp-refs-20230920.201}/elisp-refs-autoloads.el (72%) rename org/elpa/{elisp-refs-20230419.405 => elisp-refs-20230920.201}/elisp-refs-pkg.el (70%) rename org/elpa/{elisp-refs-20230419.405 => elisp-refs-20230920.201}/elisp-refs.el (98%) create mode 100644 org/elpa/f-20240308.906/f-autoloads.el create mode 100644 org/elpa/f-20240308.906/f-pkg.el create mode 100644 org/elpa/f-20240308.906/f-shortdoc.el create mode 100644 org/elpa/f-20240308.906/f.el create mode 100644 org/elpa/helm-20240320.541/.dir-locals.el create mode 100644 org/elpa/helm-20240320.541/emacs-helm.sh create mode 100644 org/elpa/helm-20240320.541/helm-adaptive.el create mode 100644 org/elpa/helm-20240320.541/helm-autoloads.el create mode 100644 org/elpa/helm-20240320.541/helm-bookmark.el create mode 100644 org/elpa/helm-20240320.541/helm-buffers.el create mode 100644 org/elpa/helm-20240320.541/helm-color.el create mode 100644 org/elpa/helm-20240320.541/helm-command.el create mode 100644 org/elpa/helm-20240320.541/helm-dabbrev.el create mode 100644 org/elpa/helm-20240320.541/helm-easymenu.el create mode 100644 org/elpa/helm-20240320.541/helm-elisp.el create mode 100644 org/elpa/helm-20240320.541/helm-epa.el create mode 100644 org/elpa/helm-20240320.541/helm-eshell.el create mode 100644 org/elpa/helm-20240320.541/helm-eval.el create mode 100644 org/elpa/helm-20240320.541/helm-external.el create mode 100644 org/elpa/helm-20240320.541/helm-fd.el create mode 100644 org/elpa/helm-20240320.541/helm-files.el create mode 100644 org/elpa/helm-20240320.541/helm-find.el create mode 100644 org/elpa/helm-20240320.541/helm-font.el create mode 100644 org/elpa/helm-20240320.541/helm-for-files.el create mode 100644 org/elpa/helm-20240320.541/helm-global-bindings.el create mode 100644 org/elpa/helm-20240320.541/helm-grep.el create mode 100644 org/elpa/helm-20240320.541/helm-help.el create mode 100644 org/elpa/helm-20240320.541/helm-id-utils.el create mode 100644 org/elpa/helm-20240320.541/helm-imenu.el create mode 100644 org/elpa/helm-20240320.541/helm-info.el create mode 100644 org/elpa/helm-20240320.541/helm-locate.el create mode 100644 org/elpa/helm-20240320.541/helm-man.el create mode 100644 org/elpa/helm-20240320.541/helm-misc.el create mode 100644 org/elpa/helm-20240320.541/helm-mode.el create mode 100644 org/elpa/helm-20240320.541/helm-net.el create mode 100644 org/elpa/helm-20240320.541/helm-occur.el create mode 100644 org/elpa/helm-20240320.541/helm-packages.el create mode 100644 org/elpa/helm-20240320.541/helm-pkg.el create mode 100644 org/elpa/helm-20240320.541/helm-regexp.el create mode 100644 org/elpa/helm-20240320.541/helm-ring.el create mode 100644 org/elpa/helm-20240320.541/helm-semantic.el create mode 100644 org/elpa/helm-20240320.541/helm-sys.el create mode 100644 org/elpa/helm-20240320.541/helm-tags.el create mode 100644 org/elpa/helm-20240320.541/helm-types.el create mode 100644 org/elpa/helm-20240320.541/helm-utils.el create mode 100644 org/elpa/helm-20240320.541/helm-x-files.el create mode 100644 org/elpa/helm-20240320.541/helm.el create mode 100644 org/elpa/helm-core-20240316.1157/helm-core-autoloads.el create mode 100644 org/elpa/helm-core-20240316.1157/helm-core-pkg.el create mode 100644 org/elpa/helm-core-20240316.1157/helm-core.el create mode 100644 org/elpa/helm-core-20240316.1157/helm-lib.el create mode 100644 org/elpa/helm-core-20240316.1157/helm-multi-match.el create mode 100644 org/elpa/helm-core-20240316.1157/helm-source.el create mode 100644 org/elpa/helm-ls-git-20240315.1721/helm-ls-git-autoloads.el create mode 100644 org/elpa/helm-ls-git-20240315.1721/helm-ls-git-pkg.el create mode 100644 org/elpa/helm-ls-git-20240315.1721/helm-ls-git.el create mode 100644 org/elpa/helm-org-20231022.620/helm-org-autoloads.el create mode 100644 org/elpa/helm-org-20231022.620/helm-org-pkg.el create mode 100644 org/elpa/helm-org-20231022.620/helm-org.el delete mode 100644 org/elpa/helpful-20230323.414/helpful-pkg.el create mode 100644 org/elpa/helpful-20231028.516/helpful-autoloads.el create mode 100644 org/elpa/helpful-20231028.516/helpful-pkg.el create mode 100644 org/elpa/helpful-20231028.516/helpful.el create mode 100644 org/elpa/ido-completing-read+-20240130.30/ido-completing-read+-autoloads.el create mode 100644 org/elpa/ido-completing-read+-20240130.30/ido-completing-read+-pkg.el create mode 100644 org/elpa/ido-completing-read+-20240130.30/ido-completing-read+.el create mode 100644 org/elpa/log4e-20240123.1313/log4e-autoloads.el create mode 100644 org/elpa/log4e-20240123.1313/log4e-pkg.el create mode 100644 org/elpa/log4e-20240123.1313/log4e.el create mode 100644 org/elpa/markdown-mode-20240318.1307/markdown-mode-autoloads.el create mode 100644 org/elpa/markdown-mode-20240318.1307/markdown-mode-pkg.el create mode 100644 org/elpa/markdown-mode-20240318.1307/markdown-mode.el create mode 100644 org/elpa/modus-themes-20240317.1619/dir create mode 100644 org/elpa/modus-themes-20240317.1619/doclicense.info create mode 100644 org/elpa/modus-themes-20240317.1619/modus-operandi-deuteranopia-theme.el create mode 100644 org/elpa/modus-themes-20240317.1619/modus-operandi-theme.el create mode 100644 org/elpa/modus-themes-20240317.1619/modus-operandi-tinted-theme.el create mode 100644 org/elpa/modus-themes-20240317.1619/modus-operandi-tritanopia-theme.el create mode 100644 org/elpa/modus-themes-20240317.1619/modus-themes-autoloads.el create mode 100644 org/elpa/modus-themes-20240317.1619/modus-themes-pkg.el create mode 100644 org/elpa/modus-themes-20240317.1619/modus-themes.el create mode 100644 org/elpa/modus-themes-20240317.1619/modus-themes.info create mode 100644 org/elpa/modus-themes-20240317.1619/modus-vivendi-deuteranopia-theme.el create mode 100644 org/elpa/modus-themes-20240317.1619/modus-vivendi-theme.el create mode 100644 org/elpa/modus-themes-20240317.1619/modus-vivendi-tinted-theme.el create mode 100644 org/elpa/modus-themes-20240317.1619/modus-vivendi-tritanopia-theme.el create mode 100644 org/elpa/modus-themes-20240317.1619/theme-loaddefs.el create mode 100644 org/elpa/nerd-icons-20240319.833/data/nerd-icons-data-codicon.el create mode 100644 org/elpa/nerd-icons-20240319.833/data/nerd-icons-data-devicon.el create mode 100644 org/elpa/nerd-icons-20240319.833/data/nerd-icons-data-faicon.el create mode 100644 org/elpa/nerd-icons-20240319.833/data/nerd-icons-data-flicon.el create mode 100644 org/elpa/nerd-icons-20240319.833/data/nerd-icons-data-ipsicon.el create mode 100644 org/elpa/nerd-icons-20240319.833/data/nerd-icons-data-mdicon.el create mode 100644 org/elpa/nerd-icons-20240319.833/data/nerd-icons-data-octicon.el create mode 100644 org/elpa/nerd-icons-20240319.833/data/nerd-icons-data-pomicon.el create mode 100644 org/elpa/nerd-icons-20240319.833/data/nerd-icons-data-powerline.el create mode 100644 org/elpa/nerd-icons-20240319.833/data/nerd-icons-data-sucicon.el create mode 100644 org/elpa/nerd-icons-20240319.833/data/nerd-icons-data-wicon.el create mode 100644 org/elpa/nerd-icons-20240319.833/nerd-icons-autoloads.el create mode 100644 org/elpa/nerd-icons-20240319.833/nerd-icons-data.el create mode 100644 org/elpa/nerd-icons-20240319.833/nerd-icons-faces.el create mode 100644 org/elpa/nerd-icons-20240319.833/nerd-icons-pkg.el create mode 100644 org/elpa/nerd-icons-20240319.833/nerd-icons.el delete mode 100644 org/elpa/org-alert-20220721.1721/org-alert-autoloads.el delete mode 100644 org/elpa/org-alert-20220721.1721/org-alert-pkg.el create mode 100644 org/elpa/org-alert-20240122.1728/org-alert-autoloads.el create mode 100644 org/elpa/org-alert-20240122.1728/org-alert-pkg.el rename org/elpa/{org-alert-20220721.1721 => org-alert-20240122.1728}/org-alert.el (76%) create mode 100644 org/elpa/ox-hugo-20240305.1923/org-hugo-auto-export-mode.el create mode 100644 org/elpa/ox-hugo-20240305.1923/ox-blackfriday.el create mode 100644 org/elpa/ox-hugo-20240305.1923/ox-hugo-autoloads.el create mode 100644 org/elpa/ox-hugo-20240305.1923/ox-hugo-deprecated.el create mode 100644 org/elpa/ox-hugo-20240305.1923/ox-hugo-pandoc-cite.el create mode 100644 org/elpa/ox-hugo-20240305.1923/ox-hugo-pkg.el create mode 100644 org/elpa/ox-hugo-20240305.1923/ox-hugo.el create mode 100644 org/elpa/ox-pandoc-20231222.1103/ox-pandoc-autoloads.el create mode 100644 org/elpa/ox-pandoc-20231222.1103/ox-pandoc-pkg.el create mode 100644 org/elpa/ox-pandoc-20231222.1103/ox-pandoc.el rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/README (87%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/Makefile (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/.gitignore (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/Makefile.am (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/autobuild (99%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/autogen.sh (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/configure.ac (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/epdfinfo.c (96%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/epdfinfo.h (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/poppler-versions (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/synctex_parser.c (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/synctex_parser.h (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/synctex_parser_advanced.h (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/synctex_parser_local.h (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/synctex_parser_readme.txt (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/synctex_parser_utils.c (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/synctex_parser_utils.h (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/synctex_parser_version.txt (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/synctex_version.h (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/test/.gitignore (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/test/docker/.gitignore (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/test/docker/lib/run-tests (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/test/docker/lib/yes-or-enter (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/test/docker/templates/Dockerfile.common.in (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/test/docker/templates/arch.Dockerfile.in.FAILING (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/test/docker/templates/centos.Dockerfile.in.FAILING (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/test/docker/templates/debian-10.Dockerfile.in (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/test/docker/templates/debian-11.Dockerfile.in (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/test/docker/templates/debian-9.Dockerfile.in (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/test/docker/templates/emacs-26.Dockerfile.in (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/test/docker/templates/emacs-27.Dockerfile.in (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/test/docker/templates/emacs-28.Dockerfile.in (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/test/docker/templates/emacs-29.Dockerfile.in (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/test/docker/templates/fedora-34.Dockerfile.in (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/test/docker/templates/fedora-35.Dockerfile.in (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/test/docker/templates/fedora-36.Dockerfile.in (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/test/docker/templates/freebsd.Dockerfile.in.FAILING (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/test/docker/templates/gentoo.Dockerfile.in.FAILING (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/test/docker/templates/macos.Dockerfile.in.FAILING (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/test/docker/templates/msys2.Dockerfile.in.FAILING (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/test/docker/templates/nixos.Dockerfile.in.FAILING (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/test/docker/templates/openbsd.Dockerfile.in.FAILING (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/test/docker/templates/opensuse.Dockerfile.in.FAILING (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/test/docker/templates/ubuntu-18.Dockerfile.in (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/test/docker/templates/ubuntu-20.Dockerfile.in (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/test/docker/templates/ubuntu-22.Dockerfile.in (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/build/server/test/docker/templates/void.Dockerfile.in.FAILING (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/pdf-annot.el (98%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/pdf-cache.el (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/pdf-dev.el (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/pdf-history.el (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/pdf-info.el (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/pdf-isearch.el (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/pdf-links.el (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/pdf-loader.el (98%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/pdf-macs.el (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/pdf-misc.el (95%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/pdf-occur.el (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/pdf-outline.el (98%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/pdf-sync.el (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/pdf-tools-autoloads.el (87%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/pdf-tools-pkg.el (62%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/pdf-tools.el (99%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/pdf-util.el (100%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/pdf-view.el (97%) rename org/elpa/{pdf-tools-20230404.327 => pdf-tools-20240317.848}/pdf-virtual.el (100%) create mode 100644 org/elpa/persp-mode-20231010.1804/persp-mode-autoloads.el create mode 100644 org/elpa/persp-mode-20231010.1804/persp-mode-pkg.el create mode 100644 org/elpa/persp-mode-20231010.1804/persp-mode.el create mode 100644 org/elpa/popup-20240101.830/popup-autoloads.el create mode 100644 org/elpa/popup-20240101.830/popup-pkg.el create mode 100644 org/elpa/popup-20240101.830/popup.el rename org/elpa/{tablist-20200427.2205 => tablist-20231019.1126}/tablist-autoloads.el (64%) rename org/elpa/{tablist-20200427.2205 => tablist-20231019.1126}/tablist-filter.el (100%) rename org/elpa/{tablist-20200427.2205 => tablist-20231019.1126}/tablist-pkg.el (54%) rename org/elpa/{tablist-20200427.2205 => tablist-20231019.1126}/tablist.el (99%) create mode 100644 org/elpa/wfnames-20230924.1538/wfnames-autoloads.el create mode 100644 org/elpa/wfnames-20230924.1538/wfnames-pkg.el create mode 100644 org/elpa/wfnames-20230924.1538/wfnames.el create mode 100644 org/elpa/which-key-20240312.2033/which-key-autoloads.el create mode 100644 org/elpa/which-key-20240312.2033/which-key-pkg.el create mode 100644 org/elpa/which-key-20240312.2033/which-key.el diff --git a/code/elpa/all-the-icons-20230615.2016/all-the-icons-autoloads.el b/code/elpa/all-the-icons-20240108.559/all-the-icons-autoloads.el similarity index 75% rename from code/elpa/all-the-icons-20230615.2016/all-the-icons-autoloads.el rename to code/elpa/all-the-icons-20240108.559/all-the-icons-autoloads.el index 911b864..94db3ae 100644 --- a/code/elpa/all-the-icons-20230615.2016/all-the-icons-autoloads.el +++ b/code/elpa/all-the-icons-20240108.559/all-the-icons-autoloads.el @@ -1,12 +1,14 @@ -;;; all-the-icons-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- -;; +;;; all-the-icons-autoloads.el --- automatically extracted autoloads (do not edit) -*- lexical-binding: t -*- +;; Generated by the `loaddefs-generate' function. + +;; This file is part of GNU Emacs. + ;;; Code: -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) +(add-to-list 'load-path (or (and load-file-name (directory-file-name (file-name-directory load-file-name))) (car load-path))) + -;;;### (autoloads nil "all-the-icons" "all-the-icons.el" (0 0 0 0)) ;;; Generated autoloads from all-the-icons.el (autoload 'all-the-icons-icon-for-dir "all-the-icons" "\ @@ -17,24 +19,21 @@ inserting functions. Note: You want chevron, please use `all-the-icons-icon-for-dir-with-chevron'. -\(fn DIR &rest ARG-OVERRIDES)" nil nil) - +(fn DIR &rest ARG-OVERRIDES)") (autoload 'all-the-icons-icon-for-file "all-the-icons" "\ Get the formatted icon for FILE. ARG-OVERRIDES should be a plist containining `:height', `:v-adjust' or `:face' properties like in the normal icon inserting functions. -\(fn FILE &rest ARG-OVERRIDES)" nil nil) - +(fn FILE &rest ARG-OVERRIDES)") (autoload 'all-the-icons-icon-for-mode "all-the-icons" "\ Get the formatted icon for MODE. ARG-OVERRIDES should be a plist containining `:height', `:v-adjust' or `:face' properties like in the normal icon inserting functions. -\(fn MODE &rest ARG-OVERRIDES)" nil nil) - +(fn MODE &rest ARG-OVERRIDES)") (autoload 'all-the-icons-icon-for-url "all-the-icons" "\ Get the formatted icon for URL. If an icon for URL isn't found in `all-the-icons-url-alist', a globe is used. @@ -42,34 +41,30 @@ ARG-OVERRIDES should be a plist containining `:height', `:v-adjust' or `:face' properties like in the normal icon inserting functions. -\(fn URL &rest ARG-OVERRIDES)" nil nil) - +(fn URL &rest ARG-OVERRIDES)") (autoload 'all-the-icons-install-fonts "all-the-icons" "\ Helper function to download and install the latests fonts based on OS. When PFX is non-nil, ignore the prompt and just install -\(fn &optional PFX)" t nil) - +(fn &optional PFX)" t) (autoload 'all-the-icons-insert "all-the-icons" "\ Interactive icon insertion function. When Prefix ARG is non-nil, insert the propertized icon. When FAMILY is non-nil, limit the candidates to the icon set matching it. -\(fn &optional ARG FAMILY)" t nil) - +(fn &optional ARG FAMILY)" t) (register-definition-prefixes "all-the-icons" '("all-the-icons-")) - -;;;*** -;;;### (autoloads nil nil ("all-the-icons-faces.el" "all-the-icons-pkg.el") -;;;;;; (0 0 0 0)) +;;; End of scraped data + +(provide 'all-the-icons-autoloads) -;;;*** - ;; Local Variables: ;; version-control: never ;; no-byte-compile: t ;; no-update-autoloads: t -;; coding: utf-8 +;; no-native-compile: t +;; coding: utf-8-emacs-unix ;; End: + ;;; all-the-icons-autoloads.el ends here diff --git a/code/elpa/all-the-icons-20230615.2016/all-the-icons-faces.el b/code/elpa/all-the-icons-20240108.559/all-the-icons-faces.el similarity index 100% rename from code/elpa/all-the-icons-20230615.2016/all-the-icons-faces.el rename to code/elpa/all-the-icons-20240108.559/all-the-icons-faces.el diff --git a/org/elpa/all-the-icons-20230615.2016/all-the-icons-pkg.el b/code/elpa/all-the-icons-20240108.559/all-the-icons-pkg.el similarity index 69% rename from org/elpa/all-the-icons-20230615.2016/all-the-icons-pkg.el rename to code/elpa/all-the-icons-20240108.559/all-the-icons-pkg.el index a469640..5a1b0cc 100644 --- a/org/elpa/all-the-icons-20230615.2016/all-the-icons-pkg.el +++ b/code/elpa/all-the-icons-20240108.559/all-the-icons-pkg.el @@ -1,6 +1,6 @@ -(define-package "all-the-icons" "20230615.2016" "A library for inserting Developer icons" +(define-package "all-the-icons" "20240108.559" "A library for inserting Developer icons" '((emacs "24.3")) - :commit "f491f39c21336d354e85bdb4cca281e0a0c2f880" :authors + :commit "ee414384938ccf2ce93c77d717b85dc5538a257d" :authors '(("Dominic Charlesworth" . "dgc336@gmail.com")) :maintainers '(("Dominic Charlesworth" . "dgc336@gmail.com")) diff --git a/code/elpa/all-the-icons-20230615.2016/all-the-icons.el b/code/elpa/all-the-icons-20240108.559/all-the-icons.el similarity index 98% rename from code/elpa/all-the-icons-20230615.2016/all-the-icons.el rename to code/elpa/all-the-icons-20240108.559/all-the-icons.el index 64cb0fd..93f8bc8 100644 --- a/code/elpa/all-the-icons-20230615.2016/all-the-icons.el +++ b/code/elpa/all-the-icons-20240108.559/all-the-icons.el @@ -210,6 +210,8 @@ ("rd" all-the-icons-fileicon "R" :face all-the-icons-lblue) ("rdx" all-the-icons-fileicon "R" :face all-the-icons-lblue) ("rsx" all-the-icons-fileicon "R" :face all-the-icons-lblue) + ("beancount" all-the-icons-faicon "credit-card" :face all-the-icons-lgreen) + ("ledger" all-the-icons-faicon "credit-card" :face all-the-icons-lgreen) ("svelte" all-the-icons-fileicon "svelte" :v-adjust 0.0 :face all-the-icons-red) ("gql" all-the-icons-fileicon "graphql" :face all-the-icons-dpink) ("graphql" all-the-icons-fileicon "graphql" :face all-the-icons-dpink) @@ -584,6 +586,7 @@ for performance sake.") (erc-mode all-the-icons-faicon "commenting-o" :height 1.0 :v-adjust 0.0) (inferior-emacs-lisp-mode all-the-icons-fileicon "elisp" :height 1.0 :v-adjust -0.1 :face all-the-icons-lblue) (dired-mode all-the-icons-octicon "file-directory" :v-adjust 0.0) + (wdired-mode all-the-icons-octicon "file-directory" :v-adjust 0.0 :face all-the-icons-dcyan) (lisp-interaction-mode all-the-icons-fileicon "lisp" :v-adjust -0.1 :face all-the-icons-orange) (sly-mrepl-mode all-the-icons-fileicon "clisp" :v-adjust -0.1 :face all-the-icons-orange) (slime-repl-mode all-the-icons-fileicon "clisp" :v-adjust -0.1 :face all-the-icons-orange) @@ -593,6 +596,7 @@ for performance sake.") (typescript-tsx-mode all-the-icons-fileicon "tsx" :v-adjust -0.1 :face all-the-icons-cyan-alt) (tsx-ts-mode all-the-icons-fileicon "tsx" :v-adjust -0.1 :face all-the-icons-cyan-alt) (js-mode all-the-icons-alltheicon "javascript" :v-adjust -0.1 :face all-the-icons-yellow) + (js-ts-mode all-the-icons-alltheicon "javascript" :v-adjust -0.1 :face all-the-icons-yellow) (js-jsx-mode all-the-icons-alltheicon "javascript" :v-adjust -0.1 :face all-the-icons-yellow) (js2-mode all-the-icons-alltheicon "javascript" :v-adjust -0.1 :face all-the-icons-yellow) (js3-mode all-the-icons-alltheicon "javascript" :v-adjust -0.1 :face all-the-icons-yellow) @@ -644,6 +648,7 @@ for performance sake.") (rspec-compilation-mode all-the-icons-alltheicon "ruby-alt" :face all-the-icons-red) (rake-compilation-mode all-the-icons-alltheicon "ruby-alt" :face all-the-icons-red) (sh-mode all-the-icons-alltheicon "terminal" :face all-the-icons-purple) + (bash-ts-mode all-the-icons-alltheicon "terminal" :face all-the-icons-purple) (shell-mode all-the-icons-alltheicon "terminal" :face all-the-icons-purple) (fish-mode all-the-icons-alltheicon "terminal" :face all-the-icons-lpink) (nginx-mode all-the-icons-fileicon "nginx" :height 0.9 :face all-the-icons-dgreen) @@ -669,6 +674,7 @@ for performance sake.") (java-ts-mode all-the-icons-alltheicon "java" :height 1.0 :face all-the-icons-purple) (go-mode all-the-icons-fileicon "go" :height 1.0 :face all-the-icons-blue) (go-ts-mode all-the-icons-fileicon "go" :height 1.0 :face all-the-icons-blue) + (go-mod-ts-mode all-the-icons-fileicon "config-go" :height 1.0 :face all-the-icons-blue-alt) (go-dot-mod-mode all-the-icons-fileicon "config-go" :height 1.0 :face all-the-icons-blue-alt) (go-dot-work-mode all-the-icons-fileicon "config-go" :height 1.0 :face all-the-icons-blue-alt) (graphql-mode all-the-icons-fileicon "graphql" :face all-the-icons-dpink) @@ -752,6 +758,9 @@ for performance sake.") (hy-mode all-the-icons-fileicon "hy" :face all-the-icons-blue) (glsl-mode all-the-icons-fileicon "vertex-shader" :face all-the-icons-green) (zig-mode all-the-icons-fileicon "zig" :face all-the-icons-orange) + (exwm-mode all-the-icons-octicon "browser" :v-adjust 0.2 :face all-the-icons-purple) + (beancount-mode all-the-icons-faicon "credit-card" :face all-the-icons-lgreen) + (ledger-mode all-the-icons-faicon "credit-card" :face all-the-icons-lgreen) (odin-mode all-the-icons-fileicon "odin" :height 1.1 :face all-the-icons-lblue) (pdf-view-mode all-the-icons-octicon "file-pdf" :v-adjust 0.0 :face all-the-icons-dred) (spacemacs-buffer-mode all-the-icons-fileicon "elisp" :height 1.0 :v-adjust -0.1 :face all-the-icons-purple) @@ -767,7 +776,8 @@ for performance sake.") (magik-session-mode all-the-icons-alltheicon "terminal" :face all-the-icons-blue) (magik-cb-mode all-the-icons-faicon "book" :face all-the-icons-blue) (meson-mode all-the-icons-fileicon "meson" :face all-the-icons-purple) - (man-common all-the-icons-fileicon "man-page" :face all-the-icons-blue))) + (man-common all-the-icons-fileicon "man-page" :face all-the-icons-blue) + (ess-r-mode all-the-icons-fileicon "R" :face all-the-icons-lblue))) (defvar all-the-icons-url-alist '( @@ -880,8 +890,8 @@ for performance sake.") (eq major-mode auto-mode))) (defun all-the-icons-match-to-alist (file alist) - "Match FILE against an entry in ALIST using `string-match'." - (cdr (cl-find-if (lambda (it) (string-match (car it) file)) alist))) + "Match FILE against an entry in ALIST using `string-match-p'." + (cdr (cl-find-if (lambda (it) (string-match-p (car it) file)) alist))) (defun all-the-icons-dir-is-submodule (dir) "Checker whether or not DIR is a git submodule." @@ -1042,7 +1052,7 @@ inserting functions." (defun all-the-icons-icon-family-for-file (file) "Get the icons font family for FILE." (let* ((ext (file-name-extension file)) - (icon (or (all-the-icons-match-to-alist file all-the-icons-regexp-icon-alist) + (icon (or (all-the-icons-match-to-alist file all-the-icons-regexp-icon-alist) (and ext (cdr (assoc (downcase ext) all-the-icons-extension-icon-alist))) diff --git a/code/elpa/all-the-icons-20230615.2016/data/data-alltheicons.el b/code/elpa/all-the-icons-20240108.559/data/data-alltheicons.el similarity index 100% rename from code/elpa/all-the-icons-20230615.2016/data/data-alltheicons.el rename to code/elpa/all-the-icons-20240108.559/data/data-alltheicons.el diff --git a/code/elpa/all-the-icons-20230615.2016/data/data-faicons.el b/code/elpa/all-the-icons-20240108.559/data/data-faicons.el similarity index 100% rename from code/elpa/all-the-icons-20230615.2016/data/data-faicons.el rename to code/elpa/all-the-icons-20240108.559/data/data-faicons.el diff --git a/org/elpa/all-the-icons-20230615.2016/data/data-fileicons.el b/code/elpa/all-the-icons-20240108.559/data/data-fileicons.el similarity index 99% rename from org/elpa/all-the-icons-20230615.2016/data/data-fileicons.el rename to code/elpa/all-the-icons-20240108.559/data/data-fileicons.el index e7879e2..bbeda49 100644 --- a/org/elpa/all-the-icons-20230615.2016/data/data-fileicons.el +++ b/code/elpa/all-the-icons-20240108.559/data/data-fileicons.el @@ -312,7 +312,7 @@ ( "objective-j" . "\xe99e" ) ( "ocaml" . "\xe91a" ) ( "octave" . "\xea33" ) - ( "odin" . "\eb36" ) + ( "odin" . "\xeb36" ) ( "onenote" . "\xe9eb" ) ( "ooc" . "\xe9cb" ) ( "opa" . "\x2601" ) diff --git a/code/elpa/all-the-icons-20230615.2016/data/data-material.el b/code/elpa/all-the-icons-20240108.559/data/data-material.el similarity index 100% rename from code/elpa/all-the-icons-20230615.2016/data/data-material.el rename to code/elpa/all-the-icons-20240108.559/data/data-material.el diff --git a/code/elpa/all-the-icons-20230615.2016/data/data-octicons.el b/code/elpa/all-the-icons-20240108.559/data/data-octicons.el similarity index 100% rename from code/elpa/all-the-icons-20230615.2016/data/data-octicons.el rename to code/elpa/all-the-icons-20240108.559/data/data-octicons.el diff --git a/code/elpa/all-the-icons-20230615.2016/data/data-weathericons.el b/code/elpa/all-the-icons-20240108.559/data/data-weathericons.el similarity index 100% rename from code/elpa/all-the-icons-20230615.2016/data/data-weathericons.el rename to code/elpa/all-the-icons-20240108.559/data/data-weathericons.el diff --git a/code/elpa/all-the-icons-dired-20220929.1135/all-the-icons-dired-pkg.el b/code/elpa/all-the-icons-dired-20220929.1135/all-the-icons-dired-pkg.el deleted file mode 100644 index 2ca73e9..0000000 --- a/code/elpa/all-the-icons-dired-20220929.1135/all-the-icons-dired-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; Generated package description from all-the-icons-dired.el -*- no-byte-compile: t -*- -(define-package "all-the-icons-dired" "20220929.1135" "Shows icons for each file in dired mode" '((emacs "26.1") (all-the-icons "2.2.0")) :commit "bcaed35bb3ad7fc46007f16e0d670beb82bb613e" :authors '(("jtbm37")) :maintainer '("Jimmy Yuen Ho Wong" . "wyuenho@gmail.com") :keywords '("files" "icons" "dired") :url "https://github.com/wyuenho/all-the-icons-dired") diff --git a/code/elpa/all-the-icons-dired-20220929.1135/all-the-icons-dired-autoloads.el b/code/elpa/all-the-icons-dired-20231207.1324/all-the-icons-dired-autoloads.el similarity index 71% rename from code/elpa/all-the-icons-dired-20220929.1135/all-the-icons-dired-autoloads.el rename to code/elpa/all-the-icons-dired-20231207.1324/all-the-icons-dired-autoloads.el index 6a36f80..2f13e63 100644 --- a/code/elpa/all-the-icons-dired-20220929.1135/all-the-icons-dired-autoloads.el +++ b/code/elpa/all-the-icons-dired-20231207.1324/all-the-icons-dired-autoloads.el @@ -1,13 +1,14 @@ -;;; all-the-icons-dired-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- -;; +;;; all-the-icons-dired-autoloads.el --- automatically extracted autoloads (do not edit) -*- lexical-binding: t -*- +;; Generated by the `loaddefs-generate' function. + +;; This file is part of GNU Emacs. + ;;; Code: -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) +(add-to-list 'load-path (or (and load-file-name (directory-file-name (file-name-directory load-file-name))) (car load-path))) + -;;;### (autoloads nil "all-the-icons-dired" "all-the-icons-dired.el" -;;;;;; (0 0 0 0)) ;;; Generated autoloads from all-the-icons-dired.el (autoload 'all-the-icons-dired-mode "all-the-icons-dired" "\ @@ -28,16 +29,19 @@ evaluate `all-the-icons-dired-mode'. The mode's hook is called both when the mode is enabled and when it is disabled. -\(fn &optional ARG)" t nil) - +(fn &optional ARG)" t) (register-definition-prefixes "all-the-icons-dired" '("all-the-icons-dired-")) - -;;;*** +;;; End of scraped data + +(provide 'all-the-icons-dired-autoloads) + ;; Local Variables: ;; version-control: never ;; no-byte-compile: t ;; no-update-autoloads: t -;; coding: utf-8 +;; no-native-compile: t +;; coding: utf-8-emacs-unix ;; End: + ;;; all-the-icons-dired-autoloads.el ends here diff --git a/code/elpa/all-the-icons-dired-20231207.1324/all-the-icons-dired-pkg.el b/code/elpa/all-the-icons-dired-20231207.1324/all-the-icons-dired-pkg.el new file mode 100644 index 0000000..d75b695 --- /dev/null +++ b/code/elpa/all-the-icons-dired-20231207.1324/all-the-icons-dired-pkg.el @@ -0,0 +1,15 @@ +(define-package "all-the-icons-dired" "20231207.1324" "Shows icons for each file in dired mode" + '((emacs "26.1") + (all-the-icons "2.2.0")) + :commit "e157f0668f22ed586aebe0a2c0186ab07702986c" :authors + '(("jtbm37")) + :maintainers + '(("Jimmy Yuen Ho Wong" . "wyuenho@gmail.com")) + :maintainer + '("Jimmy Yuen Ho Wong" . "wyuenho@gmail.com") + :keywords + '("files" "icons" "dired") + :url "https://github.com/wyuenho/all-the-icons-dired") +;; Local Variables: +;; no-byte-compile: t +;; End: diff --git a/code/elpa/all-the-icons-dired-20220929.1135/all-the-icons-dired.el b/code/elpa/all-the-icons-dired-20231207.1324/all-the-icons-dired.el similarity index 91% rename from code/elpa/all-the-icons-dired-20220929.1135/all-the-icons-dired.el rename to code/elpa/all-the-icons-dired-20231207.1324/all-the-icons-dired.el index 93227a8..ba000de 100644 --- a/code/elpa/all-the-icons-dired-20220929.1135/all-the-icons-dired.el +++ b/code/elpa/all-the-icons-dired-20231207.1324/all-the-icons-dired.el @@ -6,8 +6,6 @@ ;; Author: jtbm37 ;; Maintainer: Jimmy Yuen Ho Wong ;; Version: 2.0 -;; Package-Version: 20220929.1135 -;; Package-Commit: bcaed35bb3ad7fc46007f16e0d670beb82bb613e ;; Keywords: files icons dired ;; Package-Requires: ((emacs "26.1") (all-the-icons "2.2.0")) ;; URL: https://github.com/wyuenho/all-the-icons-dired @@ -43,13 +41,18 @@ (require 'jit-lock) (require 'font-core) (require 'font-lock) +(require 'map) (defface all-the-icons-dired-dir-face - '((((background dark)) :foreground "white") - (((background light)) :foreground "black")) + '((t (:inherit dired-directory))) "Face for the directory icon." :group 'all-the-icons-faces) +(defcustom all-the-icons-dired-lighter " all-the-icons-dired-mode" + "Lighter of all-the-icons-dired-mode" + :group 'all-the-icons + :type 'string) + (defcustom all-the-icons-dired-v-adjust 0.01 "The default vertical adjustment of the icon in the Dired buffer." :group 'all-the-icons @@ -78,14 +81,15 @@ "Propertize POS with icon." (let* ((file (dired-get-filename 'relative 'noerror)) (icon (all-the-icons-dired--icon file)) - (image (get-text-property 0 'display icon))) + (image (copy-sequence (get-text-property 0 'display icon))) + (props (map-delete (copy-sequence (text-properties-at 0 icon)) 'display))) (if (or (not (eq (car image) 'image)) (member file '("." ".."))) (put-text-property (1- pos) pos 'display (if (member file '("." "..")) " " (concat " " icon " "))) (setf (image-property image :margin) (cons (/ (window-text-width nil t) (window-text-width)) 0)) - (put-text-property (1- pos) pos 'display image)))) + (add-text-properties (1- pos) pos (append props `(display ,image) ))))) (defun all-the-icons-dired--fontify-region (start end &optional loudly) "Add icons using text properties from START to END. @@ -128,7 +132,7 @@ START, END and the optional argument LOUDLY is passed to ;;;###autoload (define-minor-mode all-the-icons-dired-mode "Display all-the-icons icon for each file in a Dired buffer." - :lighter " all-the-icons-dired-mode" + :lighter all-the-icons-dired-lighter (when (derived-mode-p 'dired-mode) (if all-the-icons-dired-mode (all-the-icons-dired--setup) diff --git a/code/elpa/archives/melpa/archive-contents b/code/elpa/archives/melpa/archive-contents index bfbe370..12947b3 100644 --- a/code/elpa/archives/melpa/archive-contents +++ b/code/elpa/archives/melpa/archive-contents @@ -4,11 +4,11 @@ (0xc . [(20201025 2105) ((emacs (24 4)) (s (1 11 0))) "Base conversion made easy" tar ((:commit . "5bd6c0c901d03d1f24a3ddcf3a62d3b6d2428c80") (:authors ("Adam Niederer" . "adam.niederer@gmail.com")) (:maintainers ("Adam Niederer" . "adam.niederer@gmail.com")) (:maintainer "Adam Niederer" . "adam.niederer@gmail.com") (:keywords "base" "conversion") (:url . "http://github.com/AdamNiederer/0xc"))]) (2048-game . [(20230809 356) ((emacs (24 3))) "play 2048 in Emacs" tar ((:commit . "8175ca5191175183b9522141dcb55d30673d2323") (:authors ("Zachary Kanfer" . "zkanfer@gmail.com")) (:maintainers ("Zachary Kanfer" . "zkanfer@gmail.com")) (:maintainer "Zachary Kanfer" . "zkanfer@gmail.com") (:url . "https://hg.sr.ht/~zck/game-2048"))]) (2bit . [(20200926 1418) ((emacs (24 3))) "Library for reading data from 2bit files" tar ((:commit . "69b4ec1d6d2ad95c9e59dacb43224abbec7a8989") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainers ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:keywords "files" "data") (:url . "https://github.com/davep/2bit.el"))]) - (4clojure . [(20210102 459) ((request (0 2 0))) "Open and evaluate 4clojure.com questions." tar ((:commit . "6f494d3905284ccdd57aae3d8ac16fc7ab431596") (:authors ("Joshua Hoff")) (:maintainers ("Sasha Kovar" . "sasha-git@arcocene.org")) (:maintainer "Sasha Kovar" . "sasha-git@arcocene.org") (:keywords "languages" "data") (:url . "https://github.com/abend/4clojure.el"))]) (750words . [(20220625 1407) ((emacs (24 4))) "Emacs integration and Org exporter for 750words.com" tar ((:commit . "43eee19428fc8f5a133192398510d7313eb33d97") (:authors ("Diego Zamboni ")) (:maintainers ("Diego Zamboni" . "diego@zzamboni.org")) (:maintainer "Diego Zamboni" . "diego@zzamboni.org") (:keywords "files" "org" "writing") (:url . "https://github.com/zzamboni/750words-client"))]) - (@ . [(20181225 1438) ((emacs (24 3))) "multiple-inheritance prototype-based objects DSL" tar ((:commit . "0a6189f8be42dbbc5d9358cbd447d471236135a2") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainers ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/at-el"))]) + (@ . [(20240121 1413) ((emacs (24 3))) "multiple-inheritance prototype-based objects DSL" tar ((:commit . "a6ba21d9eb9b311b441312057430d10e5c7bc661") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainers ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/at-el"))]) (a . [(20210929 1510) ((emacs (25))) "Associative data structure functions" tar ((:commit . "9ad2d18252b729174fe22ed0b2b7670c88f60c31") (:authors ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainers ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainer "Arne Brasseur" . "arne@arnebrasseur.net") (:keywords "lisp") (:url . "https://github.com/plexus/a.el"))]) (aa-edit-mode . [(20170119 320) ((emacs (24 3)) (navi2ch (2 0 0))) "Major mode for editing AA(S_JIS Art) and .mlt file" tar ((:commit . "1dd801225b7ad3c23ad09698f5e77f0df7012a65") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "wp" "text" "shiftjis" "mlt" "yaruo"))]) + (aangit . [(20231106 2115) ((emacs (29 1)) (transient (0 4)) (s (1 13))) "Quickly scaffold new Angular apps with Aangit" tar ((:commit . "7527a366c542cb7b09672597876e83f429ca6b46") (:authors ("Steven Edwards" . "steven@stephenwithav.io")) (:maintainers ("Steven Edwards" . "steven@stephenwithav.io")) (:maintainer "Steven Edwards" . "steven@stephenwithav.io") (:keywords "angular" "tools") (:url . "https://github.com/stephenwithav/aangit"))]) (aas . [(20230303 2214) ((emacs (26 3))) "Snippet expansions mid-typing" tar ((:commit . "ddc2b7a58a2234477006af348b30e970f73bc2c1") (:authors ("Yoav Marco" . "yoavm448@gmail.com")) (:maintainers ("Yoav Marco" . "yoavm448@gmail.com")) (:maintainer "Yoav Marco" . "yoavm448@gmail.com") (:keywords "abbrev" "tools") (:url . "https://github.com/ymarco/auto-activating-snippets"))]) (abc-mode . [(20220713 1359) nil "Major mode for editing abc music files" tar ((:commit . "45193b67508861cf77da7e76b71711855c002caa") (:authors ("Matthew K. Junker" . "junker@alum.mit.edu")) (:maintainers ("Matthew K. Junker" . "junker@alum.mit.edu")) (:maintainer "Matthew K. Junker" . "junker@alum.mit.edu") (:keywords "local" "docs"))]) (abgaben . [(20171119 646) ((pdf-tools (0 80)) (f (0 19 0)) (s (1 11 0))) "review and correct assignments received by mail" tar ((:commit . "966bfcfdd3b2e288576ffe363d676ad282902090") (:authors ("Arne Köhn" . "arne@chark.eu")) (:maintainers ("Arne Köhn" . "arne@chark.eu")) (:maintainer "Arne Köhn" . "arne@chark.eu") (:keywords "mail" "outlines" "convenience") (:url . "http://arne.chark.eu/"))]) @@ -39,15 +39,15 @@ (ac-math . [(20141116 2127) ((auto-complete (1 4)) (math-symbol-lists (1 0))) "Auto-complete sources for input of mathematical symbols and latex tags" tar ((:commit . "89478063dead68894f0d27687b63896633048c6f") (:authors ("Vitalie Spinu")) (:maintainers ("Vitalie Spinu")) (:maintainer "Vitalie Spinu") (:keywords "latex" "auto-complete" "unicode" "symbols") (:url . "https://github.com/vitoshka/ac-math"))]) (ac-mozc . [(20150227 1619) ((cl-lib (0 5)) (auto-complete (1 4)) (mozc (0))) "auto-complete sources for Japanese input using Mozc" tar ((:commit . "4c6c8be4701010d9362184437c0f783e0335c631") (:authors ("igjit" . "igjit1@gmail.com")) (:maintainers ("igjit" . "igjit1@gmail.com")) (:maintainer "igjit" . "igjit1@gmail.com") (:url . "https://github.com/igjit/ac-mozc"))]) (ac-octave . [(20180406 334) ((auto-complete (1 4 0))) "An auto-complete source for Octave" tar ((:commit . "fe0f931f2024f43de3c4fff4b1ace672413adeae") (:authors ("coldnew" . "coldnew.tw@gmail.com")) (:maintainers ("coldnew" . "coldnew.tw@gmail.com")) (:maintainer "coldnew" . "coldnew.tw@gmail.com") (:keywords "octave" "auto-complete" "completion") (:url . "https://github.com/coldnew/ac-octave"))]) - (ac-php . [(20230529 1404) ((ac-php-core (2 0)) (auto-complete (1 4 0)) (yasnippet (0 8 0))) "Auto Completion source for PHP." tar ((:commit . "7b89fbf25360cc146aee9b2b2ca60f3462b21078") (:authors ("jim" . "xcwenn@qq.com")) (:maintainers ("jim")) (:maintainer "jim") (:keywords "completion" "convenience" "intellisense") (:url . "https://github.com/xcwen/ac-php"))]) - (ac-php-core . [(20230529 1404) ((emacs (24 4)) (dash (1)) (php-mode (1)) (s (1)) (f (0 17 0)) (popup (0 5 0)) (xcscope (1 0))) "The core library of the ac-php" tar ((:commit . "7b89fbf25360cc146aee9b2b2ca60f3462b21078") (:authors ("jim" . "xcwenn@qq.com") ("Serghei Iakovlev" . "sadhooklay@gmail.com")) (:maintainers ("jim")) (:maintainer "jim") (:keywords "completion" "convenience" "intellisense") (:url . "https://github.com/xcwen/ac-php"))]) + (ac-php . [(20240222 320) ((ac-php-core (2 0)) (auto-complete (1 4 0)) (yasnippet (0 8 0))) "Auto Completion source for PHP." tar ((:commit . "d4378a857aa1c60b34d86557aa10238785d1ac66") (:authors ("jim" . "xcwenn@qq.com")) (:maintainers ("jim")) (:maintainer "jim") (:keywords "completion" "convenience" "intellisense") (:url . "https://github.com/xcwen/ac-php"))]) + (ac-php-core . [(20240314 549) ((emacs (24 4)) (dash (1)) (php-mode (1)) (s (1)) (f (0 17 0)) (popup (0 5 0)) (xcscope (1 0))) "The core library of the ac-php" tar ((:commit . "c1ad22c9b9354f038310ca380497e5db635fca26") (:authors ("jim" . "xcwenn@qq.com") ("Serghei Iakovlev" . "sadhooklay@gmail.com")) (:maintainers ("jim")) (:maintainer "jim") (:keywords "completion" "convenience" "intellisense") (:url . "https://github.com/xcwen/ac-php"))]) (ac-racer . [(20170114 809) ((emacs (24 3)) (auto-complete (1 5 0)) (racer (0 0 2))) "auto-complete source of racer" tar ((:commit . "4408c2d652dec0432e20c05e001db8222d778c6b") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-ac-racer"))]) (ac-rtags . [(20191222 920) ((auto-complete (1 4 0)) (rtags (2 10))) "auto-complete back-end for RTags" tar ((:commit . "595055b5316a7c92ba1d638f324f98842a0f41a5") (:authors ("Jan Erik Hanssen" . "jhanssen@gmail.com") ("Anders Bakken" . "agbakken@gmail.com")) (:maintainers ("Jan Erik Hanssen" . "jhanssen@gmail.com")) (:maintainer "Jan Erik Hanssen" . "jhanssen@gmail.com") (:url . "https://github.com/Andersbakken/rtags"))]) (ac-skk . [(20141230 119) ((auto-complete (1 3 1)) (ddskk (16 0 50)) (tinysegmenter (0)) (cl-lib (0 5))) "auto-complete-mode source for DDSKK a.k.a Japanese input method" tar ((:commit . "d25a265930430d080329789fb253d786c01dfa24") (:authors ("lugecy ")) (:maintainers ("myuhe")) (:maintainer "myuhe") (:keywords "convenience" "auto-complete") (:url . "https://github.com/myuhe/ac-skk.el"))]) (ac-slime . [(20171027 2100) ((auto-complete (1 4)) (slime (2 9)) (cl-lib (0 5))) "An auto-complete source using slime completions" tar ((:commit . "a91f664510d3da24b02e87e4aa59d049483a6529") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/ac-slime"))]) (ac-sly . [(20170728 1027) ((sly (1 0 0 -3)) (auto-complete (1 4)) (cl-lib (0 5))) "An auto-complete source using sly completions" tar ((:commit . "bf69c687c4ecf1994349d20c182e9b567399912e") (:authors ("Damian T. Dobroczy\\'nski" . "qoocku@gmail.com")) (:maintainers ("Damian T. Dobroczy\\'nski" . "qoocku@gmail.com")) (:maintainer "Damian T. Dobroczy\\'nski" . "qoocku@gmail.com") (:url . "https://github.com/qoocku/ac-sly"))]) (academic-phrases . [(20180723 1021) ((dash (2 12 0)) (s (1 12 0)) (ht (2 0)) (emacs (24))) "Bypass that mental block when writing your papers." tar ((:commit . "25d9cf67feac6359cb213f061735e2679c84187f") (:authors ("Nasser Alshammari" . "designernasser@gmail.com")) (:maintainers ("Nasser Alshammari" . "designernasser@gmail.com")) (:maintainer "Nasser Alshammari" . "designernasser@gmail.com") (:keywords "academic" "convenience" "papers" "writing" "wp") (:url . "https://github.com/nashamri/academic-phrases"))]) - (accent . [(20220202 1312) ((emacs (24 3)) (popup (0 5 8))) "Popup for accented characters (diacritics)" tar ((:commit . "fba79570247411804af34e8b4bedad73ee75fac0") (:authors ("Elia Scotto" . "eliascotto94@gmail.com")) (:maintainers ("Elia Scotto" . "eliascotto94@gmail.com")) (:maintainer "Elia Scotto" . "eliascotto94@gmail.com") (:keywords "i18n") (:url . "https://github.com/elias94/accent"))]) + (accent . [(20240130 1109) ((emacs (24 3)) (popup (0 5 8))) "Popup for accented characters (diacritics)" tar ((:commit . "9b02a73f3a73cc4aef73c1f2c54a2b6168b0d301") (:authors ("Elia Scotto" . "eliascotto94@gmail.com")) (:maintainers ("Elia Scotto" . "eliascotto94@gmail.com")) (:maintainer "Elia Scotto" . "eliascotto94@gmail.com") (:keywords "i18n") (:url . "https://github.com/elias94/accent"))]) (ace-flyspell . [(20170309 509) ((avy (0 4 0))) "Jump to and correct spelling errors using `ace-jump-mode' and flyspell" tar ((:commit . "538d4f8508d305262ba0228dfe7c819fb65b53c9") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainers ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions") (:url . "https://github.com/cute-jumper/ace-flyspell"))]) (ace-isearch . [(20220809 1748) ((emacs (24))) "A seamless bridge between isearch, ace-jump-mode, avy, helm-swoop and swiper" tar ((:commit . "a24bfc626100f183dbad016bd7723eb12e238534") (:authors ("Akira Tamamori")) (:maintainers ("Akira Tamamori")) (:maintainer "Akira Tamamori") (:url . "https://github.com/tam17aki/ace-isearch"))]) (ace-jump-buffer . [(20171031 1550) ((avy (0 4 0)) (dash (2 4 0))) "fast buffer switching extension to `avy'" tar ((:commit . "ae5be0415c823f7bb66833aa4af2180d4cf99cef") (:authors ("Justin Talbott" . "justin@waymondo.com")) (:maintainers ("Justin Talbott" . "justin@waymondo.com")) (:maintainer "Justin Talbott" . "justin@waymondo.com") (:url . "https://github.com/waymondo/ace-jump-buffer"))]) @@ -63,33 +63,36 @@ (ack-menu . [(20150504 2022) ((mag-menu (0 1 0))) "A menu-based front-end for ack" tar ((:commit . "f77be93a4697926ecf3195a355eb69580f695f4d") (:authors ("Steven Thomas") ("Nikolaj Schumacher")) (:maintainers ("Steven Thomas")) (:maintainer "Steven Thomas") (:keywords "tools" "matching" "convenience") (:url . "https://github.com/chumpage/ack-menu"))]) (acme-theme . [(20210430 302) nil "A color theme based on Acme & Sam from Plan 9" tar ((:commit . "ae8788b5851ea353fbb80ab586a3bbd5dc8e91aa") (:authors ("Ian Y.E. Pan")) (:maintainers ("Ian Y.E. Pan")) (:maintainer "Ian Y.E. Pan") (:url . "https://github.com/ianpan870102/acme-emacs-theme"))]) (actionscript-mode . [(20180527 1701) nil "A simple mode for editing Actionscript 3 files" tar ((:commit . "65abd58e198458a8e46748c5962c41d80d60c4ea") (:authors ("Austin Haas")) (:maintainers ("Austin Haas")) (:maintainer "Austin Haas") (:keywords "language" "modes"))]) - (activity-watch-mode . [(20230731 802) ((emacs (25)) (request (0)) (json (0)) (cl-lib (0))) "Automatic time tracking extension." tar ((:commit . "63eb19a10e4262c529f1b205ef61d69055350f49") (:authors ("Gabor Torok , Alan Hamlett" . "alan@wakatime.com")) (:maintainers ("Paul d'Hubert" . "paul.dhubert@ya.ru")) (:maintainer "Paul d'Hubert" . "paul.dhubert@ya.ru") (:keywords "calendar" "comm") (:url . "https://github.com/pauldub/activity-watch-mode"))]) - (ada-ts-mode . [(20230814 1220) ((emacs (29 1))) "Major mode for Ada using Tree-sitter" tar ((:commit . "4fbfc5bac2aebe6c10ba27165a1d85b85ebe5f93") (:authors ("Troy Brown" . "brownts@troybrown.dev")) (:maintainers ("Troy Brown" . "brownts@troybrown.dev")) (:maintainer "Troy Brown" . "brownts@troybrown.dev") (:keywords "ada" "languages" "tree-sitter") (:url . "https://github.com/brownts/ada-ts-mode"))]) + (activity-watch-mode . [(20240313 754) ((emacs (25)) (request (0)) (json (0)) (cl-lib (0))) "Automatic time tracking extension." tar ((:commit . "19aed6ca81a3b1e549f47867c924d180d8536791") (:authors ("Gabor Torok , Alan Hamlett" . "alan@wakatime.com")) (:maintainers ("Paul d'Hubert" . "paul.dhubert@ya.ru")) (:maintainer "Paul d'Hubert" . "paul.dhubert@ya.ru") (:keywords "calendar" "comm") (:url . "https://github.com/pauldub/activity-watch-mode"))]) + (ada-ts-mode . [(20240304 455) ((emacs (29 1))) "Major mode for Ada using Tree-sitter" tar ((:commit . "ffc9635e2ead737a7a200352b3d869435f7cbd31") (:authors ("Troy Brown" . "brownts@troybrown.dev")) (:maintainers ("Troy Brown" . "brownts@troybrown.dev")) (:maintainer "Troy Brown" . "brownts@troybrown.dev") (:keywords "ada" "languages" "tree-sitter") (:url . "https://github.com/brownts/ada-ts-mode"))]) (adafruit-wisdom . [(20200217 306) ((emacs (25 1)) (request (0 3 1))) "Get/display adafruit.com quotes" tar ((:commit . "c4ae0db35d0be94f0e9c50977758224d7e00234a") (:authors ("Neil Okamoto" . "neil.okamoto+melpa@gmail.com")) (:maintainers ("Neil Okamoto" . "neil.okamoto+melpa@gmail.com")) (:maintainer "Neil Okamoto" . "neil.okamoto+melpa@gmail.com") (:keywords "games") (:url . "https://github.com/gonewest818/adafruit-wisdom.el"))]) (add-hooks . [(20171217 123) nil "Functions for setting multiple hooks" tar ((:commit . "1845137703461fc44bd77cf24014ba58f19c369d") (:authors ("Nick McCurdy" . "nick@nickmccurdy.com")) (:maintainers ("Nick McCurdy" . "nick@nickmccurdy.com")) (:maintainer "Nick McCurdy" . "nick@nickmccurdy.com") (:keywords "lisp") (:url . "https://github.com/nickmccurdy/add-hooks"))]) (add-node-modules-path . [(20230307 655) ((s (1 12 0))) "Add node_modules to your exec-path" tar ((:commit . "841e93dfed50448da66c89a977c9182bb18796a1") (:authors ("Neri Marschik" . "marschik_neri@cyberagent.co.jp")) (:maintainers ("Neri Marschik" . "marschik_neri@cyberagent.co.jp")) (:maintainer "Neri Marschik" . "marschik_neri@cyberagent.co.jp") (:keywords "javascript" "node" "node_modules" "eslint") (:url . "https://github.com/codesuki/add-node-modules-path"))]) - (addressbook-bookmark . [(20230602 1034) ((emacs (24))) "An address book based on Standard Emacs bookmarks." tar ((:commit . "f4b839b20c16c53e609705506cad1ef68bff4378") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainers ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://github.com/thierryvolpiatto/addressbook-bookmark"))]) - (ado-mode . [(20221023 1422) ((emacs (25 1))) "Major mode for editing Stata-related files" tar ((:commit . "5610074e29ce08631c5210f1873938c3bcd9cbde") (:authors ("Bill Rising" . "brising@alum.mit.edu")) (:maintainers ("Bill Rising" . "brising@alum.mit.edu")) (:maintainer "Bill Rising" . "brising@alum.mit.edu") (:keywords "tools" "languages" "files" "convenience" "stata" "mata" "ado") (:url . "https://github.com/louabill/ado-mode"))]) - (adoc-mode . [(20230803 2350) ((emacs (26))) "a major-mode for editing AsciiDoc files" tar ((:commit . "26d189ef5486453503d7f0296258aa5883d27a29") (:authors ("Florian Kaufmann" . "sensorflo@gmail.com")) (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev") (:keywords "docs" "wp") (:url . "https://github.com/bbatsov/adoc-mode"))]) - (adwaita-dark-theme . [(20230215 2027) ((emacs (27 1))) "A dark color scheme inspired by Adwaita" tar ((:commit . "4792fed63a44a2337832644db909c1663100605e") (:authors ("Jessie Hildebrandt ")) (:maintainers ("Jessie Hildebrandt ")) (:maintainer "Jessie Hildebrandt ") (:keywords "mode-line" "faces") (:url . "https://gitlab.com/jessieh/adwaita-dark-theme"))]) + (addressbook-bookmark . [(20240304 602) ((emacs (24))) "An address book based on Standard Emacs bookmarks." tar ((:commit . "2e76708a3dc73953c1e0f66e26918690b79424d0") (:authors ("Thierry Volpiatto" . "thievol@posteo.net")) (:maintainers ("Thierry Volpiatto" . "thievol@posteo.net")) (:maintainer "Thierry Volpiatto" . "thievol@posteo.net") (:url . "https://github.com/thierryvolpiatto/addressbook-bookmark"))]) + (ado-mode . [(20240103 1856) ((emacs (25 1))) "Major mode for editing Stata-related files" tar ((:commit . "dc63bf47819b3e1f2656ec5c78b2fe57244e9c0d") (:authors ("Bill Rising" . "brising@alum.mit.edu")) (:maintainers ("Bill Rising" . "brising@alum.mit.edu")) (:maintainer "Bill Rising" . "brising@alum.mit.edu") (:keywords "tools" "languages" "files" "convenience" "stata" "mata" "ado") (:url . "https://github.com/louabill/ado-mode"))]) + (adoc-mode . [(20240218 1035) ((emacs (26))) "a major-mode for editing AsciiDoc files" tar ((:commit . "2c2eb8043623aa99d35aacbad2ee39188bf1bad3") (:authors ("Florian Kaufmann" . "sensorflo@gmail.com")) (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev") (:keywords "docs" "wp") (:url . "https://github.com/bbatsov/adoc-mode"))]) + (adwaita-dark-theme . [(20231209 1033) ((emacs (27 1))) "A dark color scheme inspired by Adwaita" tar ((:commit . "04fed0ef795bfe2482998c5b6f87c37c13fe8c50") (:authors ("Jessie Hildebrandt ")) (:maintainers ("Jessie Hildebrandt ")) (:maintainer "Jessie Hildebrandt ") (:keywords "mode-line" "faces") (:url . "https://gitlab.com/jessieh/adwaita-dark-theme"))]) (aes . [(20211204 2348) ((emacs (26 1))) "Implementation of AES" tar ((:commit . "c9cd12d6c1dbc18603eb4703276132cea59d5c78") (:authors ("Markus Sauermann" . "emacs-aes@sauermann-consulting.de")) (:maintainers ("Markus Sauermann" . "emacs-aes@sauermann-consulting.de")) (:maintainer "Markus Sauermann" . "emacs-aes@sauermann-consulting.de") (:keywords "data" "tools") (:url . "https://github.com/Sauermann/emacs-aes"))]) - (affe . [(20230411 441) ((emacs (27 1)) (consult (0 33))) "Asynchronous Fuzzy Finder for Emacs" tar ((:commit . "ae3169ac4bbd64520d165b4ce4806b7a34b972dc") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainers ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:keywords "matching" "files" "completion") (:url . "https://github.com/minad/affe"))]) + (affe . [(20240102 331) ((emacs (27 1)) (consult (1 0))) "Asynchronous Fuzzy Finder for Emacs" tar ((:commit . "1fd5732afa5d68b120fd2e949702b1abde0466d7") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainers ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:keywords "matching" "files" "completion") (:url . "https://github.com/minad/affe"))]) + (afterglow . [(20240312 953) ((emacs (26 1))) "Temporary Highlighting after Function Calls" tar ((:commit . "d90fcf4e5c8ac6f5bae2eb01dea32558b2b18fba") (:authors ("Ernest M. van der Linden " . "hello@ernestoz.com")) (:maintainers ("Ernest M. van der Linden " . "hello@ernestoz.com")) (:maintainer "Ernest M. van der Linden " . "hello@ernestoz.com") (:keywords "highlight" "line" "convenience" "evil") (:url . "https://github.com/ernstvanderlinden/emacs-afterglow"))]) (afternoon-theme . [(20140104 1859) ((emacs (24 1))) "Dark color theme with a deep blue background" tar ((:commit . "89b1d778a1f8b385775c122f2bd1c62f0fbf931a") (:authors ("Ozan Sener" . "ozan@ozansener.com")) (:maintainers ("Ozan Sener" . "ozan@ozansener.com")) (:maintainer "Ozan Sener" . "ozan@ozansener.com") (:keywords "themes") (:url . "http://github.com/osener/emacs-afternoon-theme"))]) (ag . [(20201031 2202) ((dash (2 8 0)) (s (1 9 0)) (cl-lib (0 5))) "A front-end for ag ('the silver searcher'), the C ack replacement." tar ((:commit . "ed7e32064f92f1315cecbfc43f120bbc7508672c") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:url . "https://github.com/Wilfred/ag.el"))]) (agda-editor-tactics . [(20211024 2357) ((s (1 12 0)) (dash (2 16 0)) (emacs (27 1)) (org (9 1))) "An editor tactic to produce Σ-types from Agda records" tar ((:commit . "06e374516cb2ab17018985f3dc4fccdc4acefd08") (:authors ("Musa Al-hassy" . "alhassy@gmail.com")) (:maintainers ("Musa Al-hassy" . "alhassy@gmail.com")) (:maintainer "Musa Al-hassy" . "alhassy@gmail.com") (:keywords "abbrev" "convenience" "languages" "agda" "tools") (:url . "https://github.com/alhassy/next-700-module-systems"))]) (age . [(20230115 1155) ((emacs (28 1))) "The Age Encryption Library" tar ((:commit . "9e82487234c53e0fab2314aeab6479e62c68f0c7") (:authors ("Daiki Ueno" . "ueno@unixuser.org") ("Bas Alberts" . "bas@anti.computer")) (:maintainers ("Bas Alberts" . "bas@anti.computer")) (:maintainer "Bas Alberts" . "bas@anti.computer") (:keywords "data") (:url . "https://github.com/anticomputer/age.el"))]) - (aggressive-fill-paragraph . [(20180910 816) ((dash (2 10 0))) "A mode to automatically keep paragraphs filled" tar ((:commit . "39eb7ac73976d4d4044ef3d750c3ade967d036e1") (:authors ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainers ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainer "David Shepherd" . "davidshepherd7@gmail.com") (:keywords "fill-paragraph" "automatic" "comments") (:url . "https://github.com/davidshepherd7/aggressive-fill-paragraph-mode"))]) + (agenix . [(20231016 614) ((emacs (27 1))) "Decrypt and encrypt agenix secrets" tar ((:commit . "c3afc8d109dc19bfe2f97ce47184ca748dbe4816") (:authors ("Tomasz Maciosowski" . "t4ccer@gmail.com")) (:maintainers ("Tomasz Maciosowski" . "t4ccer@gmail.com")) (:maintainer "Tomasz Maciosowski" . "t4ccer@gmail.com") (:url . "https://github.com/t4ccer/agenix.el"))]) + (aggressive-fill-paragraph . [(20240213 2320) ((dash (2 10 0))) "A mode to automatically keep paragraphs filled" tar ((:commit . "60e4eb5c57d4408e811d12c6b6491b8c89dfa695") (:authors ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainers ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainer "David Shepherd" . "davidshepherd7@gmail.com") (:keywords "fill-paragraph" "automatic" "comments") (:url . "https://github.com/davidshepherd7/aggressive-fill-paragraph-mode"))]) (aggressive-indent . [(20230112 1300) ((emacs (24 3))) "Minor mode to aggressively keep your code always indented" tar ((:commit . "a437a45868f94b77362c6b913c5ee8e67b273c42") (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainers ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") (:keywords "indent" "lisp" "maint" "tools") (:url . "https://github.com/Malabarba/aggressive-indent-mode"))]) (agtags . [(20221026 904) ((emacs (25))) "A frontend to GNU Global" tar ((:commit . "e8e04ece2f32d65b084974597bfe8077da3ddba0") (:authors ("Vietor Liu" . "vietor.liu@gmail.com")) (:maintainers ("Vietor Liu" . "vietor.liu@gmail.com")) (:maintainer "Vietor Liu" . "vietor.liu@gmail.com") (:keywords "tools" "convenience") (:url . "https://github.com/vietor/agtags"))]) (ah . [(20220730 1058) ((emacs (25 1))) "Additional hooks" tar ((:commit . "8e12223f0f423e7fa882cc049a25af6db755902d") (:authors ("Takaaki ISHIKAWA ")) (:maintainers ("Takaaki ISHIKAWA ")) (:maintainer "Takaaki ISHIKAWA ") (:keywords "convenience") (:url . "https://github.com/takaxp/ah"))]) - (ahg . [(20221013 916) nil "Alberto's Emacs interface for Mercurial (Hg)" tar ((:commit . "8f0dc52dedcf20e1662c964c6577cfb737381505") (:authors ("Alberto Griggio" . "agriggio@users.sourceforge.net")) (:maintainers ("Alberto Griggio" . "agriggio@users.sourceforge.net")) (:maintainer "Alberto Griggio" . "agriggio@users.sourceforge.net") (:url . "https://bitbucket.org/agriggio/ahg"))]) + (ahg . [(20230904 701) nil "Alberto's Emacs interface for Mercurial (Hg)" tar ((:commit . "6a8dd876d767b50431db2c695a8c21d5df9944e2") (:authors ("Alberto Griggio" . "agriggio@users.sourceforge.net")) (:maintainers ("Alberto Griggio" . "agriggio@users.sourceforge.net")) (:maintainer "Alberto Griggio" . "agriggio@users.sourceforge.net") (:url . "https://bitbucket.org/agriggio/ahg"))]) (ahk-mode . [(20200412 1832) ((emacs (24 3))) "Major mode for editing AHK (AutoHotkey and AutoHotkey_L)" tar ((:commit . "729007b5f22a49f5187ff47fca18c0d674e73047") (:authors ("Rich Alesi")) (:maintainers ("Rich Alesi")) (:maintainer "Rich Alesi") (:keywords "ahk" "autohotkey" "hotkey" "keyboard shortcut" "automation") (:url . "https://github.com/ralesi/ahk-mode"))]) (ahungry-theme . [(20180131 328) ((emacs (24))) "Ahungry color theme for Emacs. Make sure to (load-theme 'ahungry)." tar ((:commit . "a038d91ec593d1f1b19ca66a0576d59bbc24c523") (:authors ("Matthew Carter" . "m@ahungry.com")) (:maintainers ("Matthew Carter" . "m@ahungry.com")) (:maintainer "Matthew Carter" . "m@ahungry.com") (:keywords "ahungry" "palette" "color" "theme" "emacs" "color-theme" "deftheme") (:url . "https://github.com/ahungry/color-theme-ahungry"))]) + (aiken-mode . [(20230920 1210) ((emacs (26 1))) "Major mode for Aiken" tar ((:commit . "1af54e4df02eb52cf62034acbe1c6dd54776d843") (:authors ("Sebastian Nagel" . "sebastian.nagel@ncoding.at")) (:maintainers ("Sebastian Nagel" . "sebastian.nagel@ncoding.at")) (:maintainer "Sebastian Nagel" . "sebastian.nagel@ncoding.at") (:keywords "languages" "aiken") (:url . "https://github.com/aiken-lang/aiken-mode"))]) (aio . [(20200610 1904) ((emacs (26 1))) "async/await for Emacs Lisp" tar ((:commit . "da93523e235529fa97d6f251319d9e1d6fc24a41") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainers ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/emacs-aio"))]) (airline-themes . [(20211214 1749) ((powerline (2 3))) "vim-airline themes for emacs powerline" tar ((:commit . "6bd102e49a7d87af1a72eb86e953991ff7bc954e") (:authors ("Anthony DiGirolamo" . "anthony.digirolamo@gmail.com")) (:maintainers ("Anthony DiGirolamo" . "anthony.digirolamo@gmail.com")) (:maintainer "Anthony DiGirolamo" . "anthony.digirolamo@gmail.com") (:keywords "evil" "mode-line" "powerline" "airline" "themes") (:url . "http://github.com/AnthonyDiGirolamo/airline-themes"))]) (airplay . [(20130212 1226) ((request (20130110 2144)) (simple-httpd (1 4 1)) (deferred (0 3 1))) "Airplay bindings to Emacs" tar ((:commit . "46fad71d293a3e18551cf464fe6c6208a7a32d9d") (:authors ("Wataru MIYAGUNI" . "gonngo@gmail.com")) (:maintainers ("Wataru MIYAGUNI" . "gonngo@gmail.com")) (:maintainer "Wataru MIYAGUNI" . "gonngo@gmail.com") (:keywords "appletv" "airplay") (:url . "https://github.com/gongo/airplay-el"))]) - (alan-mode . [(20230216 857) ((flycheck (32)) (emacs (25 1)) (s (1 12))) "Major mode for editing Alan files" tar ((:commit . "723cf8e8d7e00c1498935553c46f459aa1d26135") (:authors ("Paul van Dam" . "pvandam@kjerner.com")) (:maintainers ("Paul van Dam" . "pvandam@kjerner.com")) (:maintainer "Paul van Dam" . "pvandam@kjerner.com") (:keywords "alan" "languages") (:url . "https://github.com/Kjerner/AlanForEmacs"))]) - (alarm-clock . [(20230711 2139) ((emacs (24 4))) "Alarm Clock" tar ((:commit . "93affc8a66e0b62e55635ac4a7373a1b6659825e") (:authors ("Steve Lemuel" . "wlemuel@hotmail.com")) (:maintainers ("Steve Lemuel" . "wlemuel@hotmail.com")) (:maintainer "Steve Lemuel" . "wlemuel@hotmail.com") (:keywords "calendar" "tools" "convenience") (:url . "https://github.com/wlemuel/alarm-clock"))]) + (alan-mode . [(20240309 650) ((flycheck (32)) (emacs (25 1)) (s (1 12))) "Major mode for editing Alan files" tar ((:commit . "df6c82f1a37a4bd6f18cb463c3f7ab7d087b91ab") (:authors ("Paul van Dam" . "pvandam@kjerner.com")) (:maintainers ("Paul van Dam" . "pvandam@kjerner.com")) (:maintainer "Paul van Dam" . "pvandam@kjerner.com") (:keywords "alan" "languages") (:url . "https://github.com/Kjerner/AlanForEmacs"))]) + (alarm-clock . [(20240114 344) ((emacs (24 4))) "Alarm Clock" tar ((:commit . "f924d0e75eb7ce29055bdc1a1e644bb1dcabda09") (:authors ("Steve Lemuel" . "wlemuel@hotmail.com")) (:maintainers ("Steve Lemuel" . "wlemuel@hotmail.com")) (:maintainer "Steve Lemuel" . "wlemuel@hotmail.com") (:keywords "calendar" "tools" "convenience") (:url . "https://github.com/wlemuel/alarm-clock"))]) (alchemist . [(20180312 1304) ((elixir-mode (2 2 5)) (dash (2 11 0)) (emacs (24 4)) (company (0 8 0)) (pkg-info (0 4)) (s (1 11 0))) "Elixir tooling integration into Emacs" tar ((:commit . "6f99367511ae209f8fe2c990779764bbb4ccb6ed") (:authors ("Samuel Tonini" . "tonini.samuel@gmail.com")) (:maintainers ("Samuel Tonini" . "tonini.samuel@gmail.com")) (:maintainer "Samuel Tonini" . "tonini.samuel@gmail.com") (:keywords "languages" "elixir" "elixirc" "mix" "hex" "alchemist") (:url . "http://www.github.com/tonini/alchemist.el"))]) (alda-mode . [(20230406 1927) ((emacs (24 0))) "An Alda major mode" tar ((:commit . "580f6e94c93aead91406d00a42ccf9040a898cb8") (:authors ("Jay Kamat" . "jaygkamat@gmail.com")) (:maintainers ("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")) (:maintainers ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:keywords "color" "theme") (:url . "https://github.com/alezost/alect-themes"))]) @@ -99,27 +102,28 @@ (alert-toast . [(20220312 229) ((emacs (25 1)) (alert (1 2)) (f (0 20 0)) (s (1 12 0))) "Windows 10 toast notifications" tar ((:commit . "96c88c93c1084de681700f655223142ee0eb944a") (:authors ("Grzegorz Kowzan" . "grzegorz@kowzan.eu")) (:maintainers ("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" tar ((:commit . "ebcf0a912e836579a3a9d386e22c1c4bef7fba17") (:url . "https://github.com/gstamp/align-cljlet"))]) (all-ext . [(20200315 1443) ((emacs (24 4)) (all (1 0))) "M-x all with helm-swoop/anything/multiple-cursors/line-number" tar ((:commit . "c865c62506af2c9edc7705a7c24dc8b70d5d4de2") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "matching" "all" "search" "replace" "anything" "helm" "helm-swoop" "occur") (:url . "https://github.com/rubikitch/all-ext"))]) - (all-the-icons . [(20230615 2016) ((emacs (24 3))) "A library for inserting Developer icons" tar ((:commit . "f491f39c21336d354e85bdb4cca281e0a0c2f880") (:authors ("Dominic Charlesworth" . "dgc336@gmail.com")) (:maintainers ("Dominic Charlesworth" . "dgc336@gmail.com")) (:maintainer "Dominic Charlesworth" . "dgc336@gmail.com") (:keywords "convenient" "lisp") (:url . "https://github.com/domtronn/all-the-icons.el"))]) - (all-the-icons-completion . [(20230617 1206) ((emacs (26 1)) (all-the-icons (5 0))) "Add icons to completion candidates" tar ((:commit . "8eb3e410d63f5d0657b41829e7898793e81f31c0") (:authors ("Itai Y. Efrat ")) (:maintainers ("Itai Y. Efrat" . "itai3397@gmail.com")) (:maintainer "Itai Y. Efrat" . "itai3397@gmail.com") (:keywords "convenient" "lisp") (:url . "https://github.com/iyefrat/all-the-icons-completion"))]) - (all-the-icons-dired . [(20220929 1135) ((emacs (26 1)) (all-the-icons (2 2 0))) "Shows icons for each file in dired mode" tar ((:commit . "bcaed35bb3ad7fc46007f16e0d670beb82bb613e") (:authors ("jtbm37")) (:maintainers ("Jimmy Yuen Ho Wong" . "wyuenho@gmail.com")) (:maintainer "Jimmy Yuen Ho Wong" . "wyuenho@gmail.com") (:keywords "files" "icons" "dired") (:url . "https://github.com/wyuenho/all-the-icons-dired"))]) + (all-the-icons . [(20240108 559) ((emacs (24 3))) "A library for inserting Developer icons" tar ((:commit . "ee414384938ccf2ce93c77d717b85dc5538a257d") (:authors ("Dominic Charlesworth" . "dgc336@gmail.com")) (:maintainers ("Dominic Charlesworth" . "dgc336@gmail.com")) (:maintainer "Dominic Charlesworth" . "dgc336@gmail.com") (:keywords "convenient" "lisp") (:url . "https://github.com/domtronn/all-the-icons.el"))]) + (all-the-icons-completion . [(20240128 2048) ((emacs (26 1)) (all-the-icons (5 0))) "Add icons to completion candidates" tar ((:commit . "4c8bcad8033f5d0868ce82ea3807c6cd46c4a198") (:authors ("Itai Y. Efrat ")) (:maintainers ("Itai Y. Efrat" . "itai3397@gmail.com")) (:maintainer "Itai Y. Efrat" . "itai3397@gmail.com") (:keywords "convenient" "lisp") (:url . "https://github.com/iyefrat/all-the-icons-completion"))]) + (all-the-icons-dired . [(20231207 1324) ((emacs (26 1)) (all-the-icons (2 2 0))) "Shows icons for each file in dired mode" tar ((:commit . "e157f0668f22ed586aebe0a2c0186ab07702986c") (:authors ("jtbm37")) (:maintainers ("Jimmy Yuen Ho Wong" . "wyuenho@gmail.com")) (:maintainer "Jimmy Yuen Ho Wong" . "wyuenho@gmail.com") (:keywords "files" "icons" "dired") (:url . "https://github.com/wyuenho/all-the-icons-dired"))]) (all-the-icons-gnus . [(20180511 654) ((emacs (24 4)) (dash (2 12 0)) (all-the-icons (3 1 0))) "Shows icons for in Gnus" tar ((:commit . "27f78996da0725943bcfb2d18038e6f7bddfa9c7") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainers ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "mail" "tools"))]) (all-the-icons-ibuffer . [(20230503 1625) ((emacs (24 4)) (all-the-icons (2 2 0))) "Display icons for all buffers in ibuffer" tar ((:commit . "400860b2990529bd3a915e4d0a55fbc6d128a3ba") (:authors ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainers ("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" tar ((:commit . "babea626db20773de4c408acb2788e2b9c8277e3") (:authors ("asok")) (:maintainers ("asok")) (:maintainer "asok") (:keywords "faces"))]) (all-the-icons-ivy-rich . [(20230420 1234) ((emacs (25 1)) (ivy-rich (0 1 0)) (all-the-icons (2 2 0))) "Better experience with icons for ivy" tar ((:commit . "c098cc85123a401b0ab8f2afd3a25853e61d7d28") (:authors ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainers ("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-nerd-fonts . [(20240210 1127) ((emacs (28 1)) (all-the-icons (5 0)) (nerd-icons (0 0 1))) "Nerd font integration for all-the-icons" tar ((:commit . "67a9cc9de2d2d4516cbfb752879b1355234cb42a") (:authors ("Mohsin Kaleem" . "mohkale@gmail.com")) (:maintainers ("Mohsin Kaleem" . "mohkale@gmail.com")) (:maintainer "Mohsin Kaleem" . "mohkale@gmail.com") (:keywords "convenience" "lisp") (:url . "https://github.com/mohkale/all-the-icons-nerd-fonts"))]) (almost-mono-themes . [(20220422 1714) ((emacs (24))) "Almost monochromatic color themes" tar ((:commit . "0641bf565c113caef8d5c2a93f38cff32ebb62b7") (:authors ("John Olsson" . "john@cryon.se")) (:maintainers ("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." tar ((:commit . "1bdb99e433acd38685f05408562746cfbf2bc820") (:authors ("R.W. van 't Veer")) (:maintainers ("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" tar ((:commit . "36dbcbeb69525cd21caeb4c267421b69fa2fffcb") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("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"))]) + (alt-codes . [(20240101 927) ((emacs (26 1))) "Insert alt codes using meta key" tar ((:commit . "47072beb416aa9d7d702230b1aff87436c81bd22") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("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"))]) (amd-mode . [(20180111 1402) ((emacs (25)) (projectile (20161008 47)) (s (1 9 0)) (f (0 16 2)) (seq (2 16)) (makey (0 3)) (js2-mode (20140114)) (js2-refactor (0 6 1))) "Minor mode for handling JavaScript AMD module requirements." tar ((:commit . "01fd19e0d635ccaf8e812364d8720733f2e84126") (:authors ("Nicolas Petton" . "petton.nicolas@gmail.com")) (:maintainers ("Nicolas Petton" . "petton.nicolas@gmail.com")) (:maintainer "Nicolas Petton" . "petton.nicolas@gmail.com") (:keywords "javascript" "amd" "projectile"))]) (ameba . [(20200103 1454) ((emacs (24 4))) "An interface to Crystal Ameba linter" tar ((:commit . "0c4925ae0e998818326adcb47ed27ddf9761c7dc") (:authors ("Vitalii Elenhaupt")) (:maintainers ("Vitalii Elenhaupt")) (:maintainer "Vitalii Elenhaupt") (:keywords "convenience") (:url . "https://github.com/crystal-ameba/ameba.el"))]) (ample-regexps . [(20200508 1021) nil "ample regular expressions for Emacs" tar ((:commit . "153969ce547afe410b8986f01c9ed4087c9cd20b") (:authors ("immerrr" . "immerrr@gmail.com")) (:maintainers ("immerrr" . "immerrr@gmail.com")) (:maintainer "immerrr" . "immerrr@gmail.com") (:keywords "regexps" "extensions" "tools"))]) (ample-theme . [(20180207 1745) nil "Calm Dark Theme for Emacs" tar ((:commit . "366698400c555211c2082962a5d74f3dd79a78c8") (:authors ("Jordon Biondo" . "jordonbiondo@gmail.com")) (:maintainers ("Jordon Biondo" . "jordonbiondo@gmail.com")) (:maintainer "Jordon Biondo" . "jordonbiondo@gmail.com") (:keywords "theme" "dark") (:url . "https://github.com/jordonbiondo/ample-theme"))]) (ample-zen-theme . [(20150119 2154) nil "AmpleZen Theme for Emacs 24" tar ((:commit . "b277bb7abd4b6624e8d59f02474b79af50a007bd") (:authors ("Michael Wall")) (:maintainers ("Michael Wall")) (:maintainer "Michael Wall") (:keywords "theme" "dark" "emacs 24") (:url . "https://github.com/mjwall/ample-zen"))]) (amread-mode . [(20230409 1018) ((emacs (24 3)) (cl-lib (0 6 1)) (pyim (5 2 8)) (hydra (0 15 0))) "A minor mode helper user speed-reading" tar ((:commit . "b8622ae7b05f27d6f84c4e5d724bc79163ba9ce3") (:keywords "wp") (:url . "https://repo.or.cz/amread-mode.git"))]) - (amsreftex . [(20220115 1838) ((emacs (25 1))) "Add amsrefs bibliography support for reftex" tar ((:commit . "facf47b82572e3f62bd8d9b8d4f4d5258f6c8a38") (:authors ("Fran Burstall" . "fran.burstall@gmail.com")) (:maintainers ("Fran Burstall" . "fran.burstall@gmail.com")) (:maintainer "Fran Burstall" . "fran.burstall@gmail.com") (:keywords "tex") (:url . "https://github.com/franburstall/amsreftex"))]) + (amsreftex . [(20240210 1109) ((emacs (25 1))) "Add amsrefs bibliography support for reftex" tar ((:commit . "d64705a7a252be2554b717a38252d8999b0c1504") (:authors ("Fran Burstall" . "fran.burstall@gmail.com")) (:maintainers ("Fran Burstall" . "fran.burstall@gmail.com")) (:maintainer "Fran Burstall" . "fran.burstall@gmail.com") (:keywords "tex") (:url . "https://github.com/franburstall/amsreftex"))]) (amx . [(20230413 1210) ((emacs (24 4)) (s (0))) "Alternative M-x with extra features." tar ((:commit . "1c2428d21e9d2ee8bee944b572a39ca8c91ca13b") (:authors ("Ryan C. Thompson" . "rct@thompsonclan.org") ("Cornelius Mika" . "cornelius.mika@gmail.com")) (:maintainers ("Ryan C. Thompson" . "rct@thompsonclan.org")) (:maintainer "Ryan C. Thompson" . "rct@thompsonclan.org") (:keywords "convenience" "usability" "completion") (:url . "http://github.com/DarwinAwardWinner/amx/"))]) - (anaconda-mode . [(20230821 2131) ((emacs (25 1)) (pythonic (0 1 0)) (dash (2 6 0)) (s (1 9)) (f (0 16 2))) "Code navigation, documentation lookup and completion for Python" tar ((:commit . "9dbd65b034cef519c01f63703399ae59651f85ca") (:authors ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainers ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainer "Artem Malyshev" . "proofit404@gmail.com") (:keywords "convenience" "anaconda") (:url . "https://github.com/proofit404/anaconda-mode"))]) + (anaconda-mode . [(20231123 1806) ((emacs (25 1)) (pythonic (0 1 0)) (dash (2 6 0)) (s (1 9)) (f (0 16 2))) "Code navigation, documentation lookup and completion for Python" tar ((:commit . "92a6295622df7fae563d6b599e2dc8640e940ddf") (:authors ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainers ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainer "Artem Malyshev" . "proofit404@gmail.com") (:keywords "convenience" "anaconda") (:url . "https://github.com/proofit404/anaconda-mode"))]) (anakondo . [(20210221 1727) ((emacs (26 3))) "Adds clj-kondo based Clojure[Script] editing facilities" tar ((:commit . "16b0ba14d94a5d7e55655efc9e1d6d069a9306f2") (:authors ("Didier A." . "didibus@users.noreply.github.com")) (:maintainers ("Didier A." . "didibus@users.noreply.github.com")) (:maintainer "Didier A." . "didibus@users.noreply.github.com") (:keywords "clojure" "clojurescript" "cljc" "clj-kondo" "completion" "languages" "tools") (:url . "https://github.com/didibus/anakondo"))]) - (anaphora . [(20180618 2200) nil "anaphoric macros providing implicit temp variables" tar ((:commit . "3b2da3f759b244975852e79721c4a2dbad3905cf") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "extensions") (:url . "http://github.com/rolandwalker/anaphora"))]) + (anaphora . [(20240120 1744) nil "anaphoric macros providing implicit temp variables" tar ((:commit . "a755afa7db7f3fa515f8dd2c0518113be0b027f6") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "extensions") (:url . "http://github.com/rolandwalker/anaphora"))]) (ancient-one-dark-theme . [(20211030 1358) ((emacs (24 1))) "A color theme based off uetchy's Ancient One Dark Theme" tar ((:commit . "a0eaa8bce0ffc25d1469af48a74e80f820bab0ab") (:authors ("Daniils Petrovs")) (:maintainers ("Daniils Petrovs")) (:maintainer "Daniils Petrovs") (:url . "https://github.com/DaniruKun/ancient-one-dark-emacs-theme"))]) (android-env . [(20220810 1449) ((emacs (24 3)) (s (1 12 0))) "Helper functions for working in android" tar ((:commit . "d2890f1156ed184314adbfcf01cdceb6ea79b10d") (:authors ("Fernando Jascovich")) (:maintainers ("Fernando Jascovich")) (:maintainer "Fernando Jascovich") (:keywords "android" "gradle" "java" "tools" "convenience") (:url . "https://github.com/fernando-jascovich/android-env.el"))]) (android-mode . [(20190903 811) nil "Minor mode for Android application development" tar ((:commit . "d5332e339a1f5e30559a53feffb8442ca79265d6") (:authors ("R.W. van 't Veer")) (:maintainers ("R.W. van 't Veer")) (:maintainer "R.W. van 't Veer") (:keywords "tools" "processes") (:url . "https://github.com/remvee/android-mode"))]) @@ -132,12 +136,12 @@ (anki-mode . [(20201223 719) ((emacs (24 4)) (dash (2 12 0)) (markdown-mode (2 2)) (s (1 11 0)) (request (0 3 0))) "A major mode for creating anki cards" tar ((:commit . "7cde5a68c9d0ef3811b0bd480274ea79909d2ddc") (:authors ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainers ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainer "David Shepherd" . "davidshepherd7@gmail.com") (:keywords "tools") (:url . "https://github.com/davidshepherd7/anki-mode"))]) (anki-vocabulary . [(20200103 325) ((emacs (24 4)) (s (1 0)) (youdao-dictionary (0 4)) (anki-connect (1 0)) (s (1 10))) "Help you to create vocabulary cards in Anki" tar ((:commit . "863fe0219577f996ab126f1b7902db3c2cc59b2b") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "lisp" "anki" "translator" "chinese") (:url . "https://github.com/lujun9972/anki-vocabulary.el"))]) (annalist . [(20190929 207) ((emacs (24 4)) (cl-lib (0 5))) "Record and display information such as keybindings" tar ((:commit . "08df07e4530953a2c0b1aa553adcab37b7b614b0") (:authors ("Fox Kiester" . "noct@posteo.net")) (:maintainers ("Fox Kiester" . "noct@posteo.net")) (:maintainer "Fox Kiester" . "noct@posteo.net") (:keywords "convenience" "tools" "keybindings" "org") (:url . "https://github.com/noctuid/annalist.el"))]) - (annotate . [(20230709 1507) nil "annotate files without changing them" tar ((:commit . "dd2760d1725f48ffc5542ad88466a3807c95df05") (:authors ("Bastian Bechtold")) (:maintainers ("Bastian Bechtold , cage" . "cage-dev@twistfold.it")) (:maintainer "Bastian Bechtold , cage" . "cage-dev@twistfold.it") (:url . "https://github.com/bastibe/annotate.el"))]) + (annotate . [(20231102 1334) nil "annotate files without changing them" tar ((:commit . "dfe0d7c9905ac31716a35b37766ed6166c1f18d9") (:authors ("Bastian Bechtold")) (:maintainers ("Bastian Bechtold , cage" . "cage-dev@twistfold.it")) (:maintainer "Bastian Bechtold , cage" . "cage-dev@twistfold.it") (:url . "https://github.com/bastibe/annotate.el"))]) (annotate-depth . [(20160520 2040) nil "Annotate buffer if indentation depth is beyond threshold." tar ((:commit . "fcb24fa36287250e40d195590c4ca4a8a696277b") (:authors ("Morten Slot Kristensen ")) (:maintainers ("Morten Slot Kristensen ")) (:maintainer "Morten Slot Kristensen ") (:keywords "convenience") (:url . "https://github.com/netromdk/annotate-depth"))]) (annotation . [(20200914 644) nil "Functions for annotating text with faces and help bubbles" tar ((:commit . "aa5e3a127bf17a8c80d947f3c286758a36dadc36") (:url . "https://github.com/agda/agda"))]) (annoying-arrows-mode . [(20161024 646) ((cl-lib (0 5))) "Ring the bell if using arrows too much" tar ((:commit . "3c42e9807d7696da2da2a21b63beebf9cdb3f5dc") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainers ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))]) (ansi . [(20230306 1823) ((emacs (24 1)) (cl-lib (0 6))) "Turn string into ansi strings" tar ((:commit . "c79806eacdf96e061abf5334f4c3364a995705d4") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainers ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:keywords "terminals" "color" "ansi") (:url . "http://github.com/rejeep/ansi"))]) - (ansible . [(20220114 45) ((s (1 9 0)) (f (0 16 2))) "Ansible minor mode" tar ((:commit . "d89ac0ee57742cca0f0e0a3453d9dcc521575690") (:authors ("k1LoW (Kenichirou Oyama), ")) (:maintainers ("k1LoW (Kenichirou Oyama), ")) (:maintainer "k1LoW (Kenichirou Oyama), ") (:url . "https://github.com/k1LoW/emacs-ansible"))]) + (ansible . [(20240212 325) ((s (1 9 0)) (f (0 16 2))) "Ansible minor mode" tar ((:commit . "1d7de8d3ddac980715eebd87ee66859f8665b101") (:authors ("k1LoW (Kenichirou Oyama), ")) (:maintainers ("k1LoW (Kenichirou Oyama), ")) (:maintainer "k1LoW (Kenichirou Oyama), ") (:url . "https://github.com/k1LoW/emacs-ansible"))]) (ansible-doc . [(20160924 824) ((emacs (24 3))) "Ansible documentation Minor Mode" tar ((:commit . "bc8128a85a79b14f4a121105d87a5eddc33975ad") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn")) (:maintainers ("Sebastian Wiesner" . "swiesner@lunaryorn")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn") (:keywords "tools" "help") (:url . "https://github.com/lunaryorn/ansible-doc.el"))]) (ansible-vault . [(20211119 1459) ((emacs (24 3))) "Minor mode for editing ansible vault files" tar ((:commit . "9b3d82ee49d484a494f2d88927b37fcd6245d51e") (:maintainers ("Zachary Elliott" . "contact@zell.io")) (:maintainer "Zachary Elliott" . "contact@zell.io") (:keywords "ansible" "ansible-vault" "tools") (:url . "http://github.com/zellio/ansible-vault-mode"))]) (ansilove . [(20230210 1338) ((emacs (26 1))) "Display buffers as PNG images using ansilove" tar ((:commit . "abd64819dc67e1ababd38d39c7c7f6a2459987c0") (:authors ("Maciej Barć" . "xgqt@riseup.net")) (:maintainers ("Maciej Barć" . "xgqt@riseup.net")) (:maintainer "Maciej Barć" . "xgqt@riseup.net") (:keywords "multimedia") (:url . "https://gitlab.com/xgqt/emacs-ansilove/"))]) @@ -146,19 +150,20 @@ (anx-api . [(20140208 1514) nil "Interact with the AppNexus API from Emacs." tar ((:commit . "b2411ebc966ac32c3ffc61bc22bf183834df0fa0") (:authors ("Rich Loveland")) (:maintainers ("Rich Loveland")) (:maintainer "Rich Loveland") (:keywords "convenience" "json" "rest" "api" "appnexus"))]) (anybar . [(20160816 1421) nil "Control AnyBar from Emacs" tar ((:commit . "7a0743e0d31bcb36ab1bb2e351f3e7139c422ac5") (:authors ("Christopher Shea" . "cmshea@gmail.com")) (:maintainers ("Christopher Shea" . "cmshea@gmail.com")) (:maintainer "Christopher Shea" . "cmshea@gmail.com") (:keywords "anybar"))]) (anyins . [(20131229 1041) nil "Insert content at multiple places from shell command or kill-ring" tar ((:commit . "cd5e3c1abd471c8a67aafc42c4c985a2796f4b9f") (:authors ("Anthony HAMON" . "hamon.anth@gmail.com")) (:maintainers ("Anthony HAMON" . "hamon.anth@gmail.com")) (:maintainer "Anthony HAMON" . "hamon.anth@gmail.com") (:keywords "insert" "rectangular") (:url . "http://github.com/antham/anyins"))]) - (anzu . [(20211002 2255) ((emacs (25 1))) "Show number of matches in mode-line while searching" tar ((:commit . "14e4483a5e708097870b22ac56ea693ec1d893bf") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Neil Okamoto" . "neil.okamoto+melpa@gmail.com")) (:maintainer "Neil Okamoto" . "neil.okamoto+melpa@gmail.com") (:url . "https://github.com/emacsorphanage/anzu"))]) + (anzu . [(20240202 447) ((emacs (25 1))) "Show number of matches in mode-line while searching" tar ((:commit . "26fb50b429ee968eb944b0615dd0aed1dd66172c") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Neil Okamoto" . "neil.okamoto+melpa@gmail.com")) (:maintainer "Neil Okamoto" . "neil.okamoto+melpa@gmail.com") (:url . "https://github.com/emacsorphanage/anzu"))]) (aozora-view . [(20140310 1317) nil "Aozora Bunko text Emacs viewer." tar ((:commit . "b0390616d19e45f15f9a2f5d5688274831e721fd") (:authors ("KAWABATA, Taichi ")) (:maintainers ("KAWABATA, Taichi ")) (:maintainer "KAWABATA, Taichi ") (:keywords "text") (:url . "https://github.com/kawabata/aozora-view"))]) (apache-mode . [(20210519 1931) nil "Major mode for editing Apache httpd configuration files" tar ((:commit . "f2c11aac2f5fc598123e04f4604bea248689a117") (:authors ("Karl Chen" . "quarl@nospam.quarl.org")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (: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 . [(20230826 1605) ((emacs (26))) "Reformat buffer stably" tar ((:commit . "108176abe501c90507f977c5fc857863c3bcf6eb") (:authors ("Radian LLC" . "contact+apheleia@radian.codes")) (:maintainers ("Radian LLC" . "contact+apheleia@radian.codes")) (:maintainer "Radian LLC" . "contact+apheleia@radian.codes") (:keywords "tools") (:url . "https://github.com/radian-software/apheleia"))]) + (apel . [(20221214 1337) ((emacs (24 5))) "A Portable Emacs Library provides support for portable Emacs Lisp programs" tar ((:commit . "1a6fd3bab2cc6b0a450c2d801f77a1c9da0f72fb"))]) + (apheleia . [(20240302 2127) ((emacs (27))) "Reformat buffer stably" tar ((:commit . "2fec5692e424cd24e7450d63bbe58f75eafb7417") (:authors ("Radian LLC" . "contact+apheleia@radian.codes")) (:maintainers ("Radian LLC" . "contact+apheleia@radian.codes")) (:maintainer "Radian LLC" . "contact+apheleia@radian.codes") (:keywords "tools") (:url . "https://github.com/radian-software/apheleia"))]) (apib-mode . [(20200101 1017) ((markdown-mode (2 1))) "Major mode for API Blueprint files" tar ((:commit . "c6dd05201f6eb9295736d8668a79a7510d11159e") (:authors ("Vilibald Wanča" . "vilibald@wvi.cz")) (:maintainers ("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" tar ((:commit . "e4c9c57d6620a788ec8a715ff1bb50542edea3a6") (:authors ("Sean Allred" . "code@seanallred.com")) (:maintainers ("Sean Allred" . "code@seanallred.com")) (:maintainer "Sean Allred" . "code@seanallred.com") (:keywords "tools" "maint" "convenience") (:url . "https://github.com/vermiculus/apiwrap.el"))]) - (apparmor-mode . [(20230209 2325) ((emacs (26 1))) "Major mode for editing AppArmor policy files" tar ((:commit . "3b641de4e34fb4a0594a461254f1454973b6b7aa") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainers ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com") (:url . "https://github.com/alexmurray/apparmor-mode"))]) + (app-monochrome-themes . [(20240303 1628) ((emacs (24 4))) "Low contrast monochrome themes" tar ((:commit . "84de8c0424cd51feaf758cc636d9864e7311864c") (:authors ("Aleksandr Petrosyan" . "appetrosan3@gmail.com")) (:maintainers ("Aleksandr Petrosyan" . "appetrosan3@gmail.com")) (:maintainer "Aleksandr Petrosyan" . "appetrosan3@gmail.com") (:url . "https://github.com/Greybeard-Entertainment/app-monochrome"))]) + (apparmor-mode . [(20240211 2243) ((emacs (26 1))) "Major mode for editing AppArmor policy files" tar ((:commit . "05a67cba7508cf63bed22763a8949e55a7bf6786") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainers ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com") (:url . "https://github.com/alexmurray/apparmor-mode"))]) (apples-mode . [(20110121 418) nil "Major mode for editing and executing AppleScript code" tar ((:commit . "83a9ab0d6ba82496e2f7df386909b1a55701fccb") (:authors ("tequilasunset" . "tequilasunset.mac@gmail.com")) (:maintainers ("tequilasunset" . "tequilasunset.mac@gmail.com")) (:maintainer "tequilasunset" . "tequilasunset.mac@gmail.com") (:keywords "applescript" "languages"))]) (applescript-mode . [(20210802 1715) ((emacs (24 3))) "major mode for editing AppleScript source" tar ((:commit . "00c141bbff46c89a96598b605dee05dd1d89f624") (:authors ("sakito" . "sakito@users.sourceforge.jp")) (:maintainers ("sakito" . "sakito@users.sourceforge.jp")) (:maintainer "sakito" . "sakito@users.sourceforge.jp") (:keywords "languages" "tools") (:url . "https://github.com/emacsorphanage/applescript-mode"))]) (aproject . [(20220410 541) nil "Basic project framework for Emacs" tar ((:commit . "13e176ee69851403bec6471c5cceed17b7912b6f") (:authors ("Vietor Liu" . "vietor.liu@gmail.com")) (:maintainers ("Vietor Liu" . "vietor.liu@gmail.com")) (:maintainer "Vietor Liu" . "vietor.liu@gmail.com") (:keywords "environment" "project") (:url . "https://github.com/vietor/aproject"))]) - (apropospriate-theme . [(20230507 545) nil "A colorful, low-contrast, light & dark theme set for Emacs with a fun name." tar ((:commit . "9fd52d4b0dec6e805097e7f216db47dc37bc3abc") (:authors ("Justin Talbott" . "justin@waymondo.com")) (:maintainer "Justin Talbott" . "justin@waymondo.com") (:url . "http://github.com/waymondo/apropospriate-theme"))]) + (apropospriate-theme . [(20230925 114) nil "A colorful, low-contrast, light & dark theme set for Emacs with a fun name." tar ((:commit . "ac2e16d23528dbc4efe1844f54366b9392d20ae6") (:authors ("Justin Talbott" . "justin@waymondo.com")) (:maintainer "Justin Talbott" . "justin@waymondo.com") (:url . "http://github.com/waymondo/apropospriate-theme"))]) (apt-sources-list . [(20180527 1241) ((emacs (24 4))) "Mode for editing APT source.list files" tar ((:commit . "44112833b3fa7f4d7e43708e5996782e22bb2fa3") (:authors ("Dr. Rafael Sepúlveda" . "drs@gnulinux.org.mx")) (:maintainers ("Joe Wreschnig" . "joe.wreschnig@gmail.com")) (:maintainer "Joe Wreschnig" . "joe.wreschnig@gmail.com") (:url . "https://git.korewanetadesu.com/apt-sources-list.git"))]) (aqi . [(20230530 1204) ((emacs (25 1)) (request (0 3)) (let-alist (0 0))) "Air quality data from the World Air Quality Index" tar ((:commit . "cbff3c6ce691a3a1d2f5636384e29d43f0e1d236") (:authors ("nik gaffney" . "nik@fo.am")) (:maintainers ("nik gaffney" . "nik@fo.am")) (:maintainer "nik gaffney" . "nik@fo.am") (:keywords "air quality" "aqi" "pollution" "weather" "data") (:url . "https://github.com/zzkt/aqi"))]) (arch-packer . [(20170730 1321) ((emacs (25 1)) (s (1 11 0)) (async (1 9 2)) (dash (2 12 0))) "Arch Linux package management frontend" tar ((:commit . "940e96f7d357c6570b675a0f942181c787f1bfd7") (:authors ("Fritz Stelzer" . "brotzeitmacher@gmail.com")) (:maintainers ("Fritz Stelzer" . "brotzeitmacher@gmail.com")) (:maintainer "Fritz Stelzer" . "brotzeitmacher@gmail.com") (:url . "https://github.com/brotzeitmacher/arch-packer"))]) @@ -173,23 +178,24 @@ (artbollocks-mode . [(20170524 422) nil "Improve your writing (especially about art)" tar ((:commit . "4a907e470bf345b88c3802c1241ce2b8cf4123ee") (:authors ("Rob Myers , Sacha Chua" . "sacha@sachachua.com")) (:maintainers ("Rob Myers , Sacha Chua" . "sacha@sachachua.com")) (:maintainer "Rob Myers , Sacha Chua" . "sacha@sachachua.com") (:url . "https://github.com/sachac/artbollocks-mode"))]) (arview . [(20160419 2109) nil "extract and view archives in the temporary directory" tar ((:commit . "5437b4221b64b238c273a651d4792c577dba6d45") (:authors ("Andrey Fainer" . "fandrey@gmx.com")) (:maintainers ("Andrey Fainer" . "fandrey@gmx.com")) (:maintainer "Andrey Fainer" . "fandrey@gmx.com") (:keywords "files") (:url . "https://github.com/afainer/arview"))]) (arxiv-citation . [(20230713 627) ((emacs (25 1)) (dash (2 19 1)) (s (1 12 0))) "Utility functions for dealing with arXiv papers" tar ((:commit . "04de0dae1121fb92c30b393449c6f8d6d940dbed") (:authors ("Tony Zorman" . "soliditsallgood@mailbox.org")) (:maintainers ("Tony Zorman" . "soliditsallgood@mailbox.org")) (:maintainer "Tony Zorman" . "soliditsallgood@mailbox.org") (:keywords "convenience") (:url . "https://gitlab.com/slotThe/arXiv-citation"))]) - (arxiv-mode . [(20230121 842) ((emacs (27 1)) (hydra (0))) "Read and search for articles on arXiv.org" tar ((:commit . "06000ceb5a12b0f95bc7e89de03685f7ada4e8c3") (:authors ("Alex Chen (fizban007)" . "fizban007@gmail.com") ("Simon Lin (Simon-Lin)" . "n.sibetz@gmail.com")) (:maintainers ("Alex Chen (fizban007)" . "fizban007@gmail.com")) (:maintainer "Alex Chen (fizban007)" . "fizban007@gmail.com") (:keywords "bib" "convenience" "hypermedia") (:url . "https://github.com/fizban007/arxiv-mode"))]) - (ascii-table . [(20221230 1244) ((emacs (24 3))) "Interactive ASCII table" tar ((:commit . "c71f54b85edc6bd42abdc79dd82248958c8a24f9") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "help" "tools") (:url . "https://github.com/lassik/emacs-ascii-table"))]) + (arxiv-mode . [(20240111 2203) ((emacs (27 1)) (hydra (0))) "Read and search for articles on arXiv.org" tar ((:commit . "f629ec64f8bbac0cadb472c6741f8f33d49e9160") (:authors ("Alex Chen (fizban007)" . "fizban007@gmail.com") ("Simon Lin (Simon-Lin)" . "n.sibetz@gmail.com")) (:maintainers ("Alex Chen (fizban007)" . "fizban007@gmail.com")) (:maintainer "Alex Chen (fizban007)" . "fizban007@gmail.com") (:keywords "bib" "convenience" "hypermedia") (:url . "https://github.com/fizban007/arxiv-mode"))]) + (ascii-table . [(20231215 1527) ((emacs (24 3))) "Interactive ASCII table" tar ((:commit . "dc3c91feff6282303b66816bdcee9e031558ff77") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "help" "tools") (:url . "https://github.com/lassik/emacs-ascii-table"))]) (asilea . [(20150105 1525) ((emacs (24)) (cl-lib (0 5))) "Find best compiler options using simulated annealing" tar ((:commit . "2aab1cc63b64ef08d12e84fd7ba5c94065f6039f") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainers ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com") (:url . "https://github.com/Fanael/asilea"))]) - (asm-blox . [(20221220 1716) ((emacs (26 1)) (yaml (0 5 1))) "Programming game involving WAT" tar ((:commit . "5517efb1e186139197a2d348b7339a72dd379af8") (:authors ("Zachary Romero")) (:maintainers ("Zachary Romero")) (:maintainer "Zachary Romero") (:keywords "games") (:url . "https://github.com/zkry/asm-blox"))]) + (asm-blox . [(20240106 1930) ((emacs (26 1)) (yaml (0 5 1))) "Programming game involving WAT" tar ((:commit . "6731d8e4f78d0b43ec9b90d8184c1d86d725ac7c") (:authors ("Zachary Romero")) (:maintainers ("Zachary Romero")) (:maintainer "Zachary Romero") (:keywords "games") (:url . "https://github.com/zkry/asm-blox"))]) (asn1-mode . [(20170729 226) ((emacs (24 3)) (s (1 10 0))) "ASN.1/GDMO mode for GNU Emacs" tar ((:commit . "d5d4a8259daf708411699bcea85d322f18beb972") (:authors ("Taichi Kawabata ")) (:maintainers ("Taichi Kawabata ")) (:maintainer "Taichi Kawabata ") (:keywords "languages" "processes" "tools") (:url . "https://github.com/kawabata/asn1-mode/"))]) - (assess . [(20220719 1904) ((emacs (24 4)) (m-buffer (0 15))) "Test support functions" tar ((:commit . "44083d94feb45d3636f7ee6c55e0ef6bbb32b938") (:authors ("Phillip Lord" . "phillip.lord@russet.org.uk")) (:maintainers ("Phillip Lord" . "phillip.lord@russet.org.uk")) (:maintainer "Phillip Lord" . "phillip.lord@russet.org.uk"))]) + (assess . [(20240303 1454) ((emacs (24 4)) (m-buffer (0 15))) "Test support functions" tar ((:commit . "cadeb24a5d8261fad4bdfdc09e7d571cc395a6ca") (:authors ("Phillip Lord" . "phillip.lord@russet.org.uk")) (:maintainers ("Phillip Lord" . "phillip.lord@russet.org.uk")) (:maintainer "Phillip Lord" . "phillip.lord@russet.org.uk"))]) (astro-ts-mode . [(20230802 437) ((emacs (29))) "Major mode for editing Astro templates" tar ((:commit . "207e5da093aa8141b9dd2f5e98afd8952832b4b0") (:authors ("Ruby Iris Juric" . "ruby@srxl.me")) (:maintainers ("Ruby Iris Juric" . "ruby@srxl.me")) (:maintainer "Ruby Iris Juric" . "ruby@srxl.me") (:keywords "languages") (:url . "https://github.com/Sorixelle/astro-ts-mode"))]) (astyle . [(20200328 616) ((emacs (24 4)) (reformatter (0 3))) "Astyle formatter functions" tar ((:commit . "04ff2941f08c4b731fe6a18ee1697436d1ca1cc0") (:authors ("Petter Storvik")) (:maintainers ("Petter Storvik")) (:maintainer "Petter Storvik") (:keywords "astyle" "c" "c++" "cpp" "reformatter") (:url . "https://github.com/storvik/emacs-astyle"))]) (asx . [(20191024 1100) ((emacs (26 1))) "Ask StackExchange/StackOverflow" tar ((:commit . "5ca12cc51bb02b5926adf9a7976ba9ca08a1ea21") (:authors ("Alex Ragone" . "ragonedk@gmail.com")) (:maintainers ("Alex Ragone" . "ragonedk@gmail.com")) (:maintainer "Alex Ragone" . "ragonedk@gmail.com") (:keywords "convenience") (:url . "https://github.com/ragone/asx"))]) - (async . [(20230528 622) ((emacs (24 4))) "Asynchronous processing in Emacs" tar ((:commit . "3ae74c0a4ba223ba373e0cb636c385e08d8838be") (:authors ("John Wiegley" . "jwiegley@gmail.com")) (:maintainers ("Thierry Volpiatto" . "thievol@posteo.net")) (:maintainer "Thierry Volpiatto" . "thievol@posteo.net") (:keywords "async") (:url . "https://github.com/jwiegley/emacs-async"))]) + (async . [(20240312 1716) ((emacs (24 4))) "Asynchronous processing in Emacs" tar ((:commit . "a368df08d34ae0c0a36fc3e90b1ecda252915257") (:authors ("John Wiegley" . "jwiegley@gmail.com")) (:maintainers ("Thierry Volpiatto" . "thievol@posteo.net")) (:maintainer "Thierry Volpiatto" . "thievol@posteo.net") (:keywords "async") (:url . "https://github.com/jwiegley/emacs-async"))]) (async-await . [(20220827 437) ((emacs (25 1)) (promise (1 1)) (iter2 (0 9 10))) "Async/Await" tar ((:commit . "e0d15e8057ed7520100bc50c5552278292ebcb07") (:authors ("chuntaro" . "chuntaro@sakura-games.jp")) (:maintainers ("chuntaro" . "chuntaro@sakura-games.jp")) (:maintainer "chuntaro" . "chuntaro@sakura-games.jp") (:keywords "async" "await" "convenience") (:url . "https://github.com/chuntaro/emacs-async-await"))]) (async-backup . [(20220131 1438) ((emacs (24 4))) "Backup on each save without freezing Emacs" tar ((:commit . "6ddb39fe77d66cdef48b87cb0d0554ad7d132308") (:authors ("contrapunctus" . "xmpp:contrapunctus@jabjab.de")) (:maintainers ("contrapunctus" . "xmpp:contrapunctus@jabjab.de")) (:maintainer "contrapunctus" . "xmpp:contrapunctus@jabjab.de") (:keywords "files") (:url . "https://tildegit.org/contrapunctus/async-backup"))]) (async-job-queue . [(20230427 2122) ((async (1 4)) (emacs (25 1)) (queue (0 2))) "Dispatch queue of async jobs to a fixed number of slots" tar ((:commit . "eeafcce7f960305666b2a51aec55cc6333f6af1b") (:authors ("Onnie Winebarger")) (:maintainers ("Onnie Winebarger")) (:maintainer "Onnie Winebarger") (:keywords "extensions" "lisp") (:url . "https://github.com/owinebar/emacs-async-job-queue"))]) (async-status . [(20230821 204) ((emacs (28 1)) (svg-lib (0 2 7)) (posframe (1 4 2))) "A package for indicator support" tar ((:commit . "d2f5becc9850c26aa71fb581f9fc389eac740f52") (:authors ("Jason Kim" . "sukbeom.kim@gmail.com")) (:maintainers ("Jason Kim" . "sukbeom.kim@gmail.com")) (:maintainer "Jason Kim" . "sukbeom.kim@gmail.com") (:keywords "tools" "async") (:url . "https://github.com/seokbeomkim/async-status"))]) + (asyncloop . [(20240219 1742) ((emacs (28))) "Non-blocking series of functions" tar ((:commit . "8bc72f51c52c108ece0655625dedc10b9fe1cb8d") (:authors ("Martin Edström" . "meedstrom91@gmail.com")) (:maintainers ("Martin Edström" . "meedstrom91@gmail.com")) (:maintainer "Martin Edström" . "meedstrom91@gmail.com") (:keywords "tools") (:url . "https://github.com/meedstrom/asyncloop"))]) (atcoder-tools . [(20200109 1236) ((emacs (26)) (f (0 20)) (s (1 12))) "An atcoder-tools client" tar ((:commit . "cfe61ed18ea9b3b1bfb6f9e7d80a47599680cd1f") (:authors ("Seong Yong-ju" . "sei40kr@gmail.com")) (:maintainers ("Seong Yong-ju" . "sei40kr@gmail.com")) (:maintainer "Seong Yong-ju" . "sei40kr@gmail.com") (:keywords "extensions" "tools") (:url . "https://github.com/sei40kr/atcoder-tools"))]) - (atl-long-lines . [(20220704 644) ((emacs (24 3))) "Turn off truncate-lines when the line is long" tar ((:commit . "4b4abd242e9a8203dc70130b4ca65f809bd41ab7") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "truncate" "lines" "auto" "long") (:url . "https://github.com/jcs-elpa/atl-long-lines"))]) - (atl-markup . [(20220704 644) ((emacs (24 3))) "Automatically truncate lines for markup languages" tar ((:commit . "8604cd6b0a2473595988d47f41623d2cd06d0a7b") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "automatic" "truncate" "visual" "lines") (:url . "https://github.com/jcs-elpa/atl-markup"))]) + (atl-long-lines . [(20240101 929) ((emacs (24 3))) "Turn off truncate-lines when the line is long" tar ((:commit . "82cdd4edefba2d5b1d491bf3fcc487385819d713") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "truncate" "lines" "auto" "long") (:url . "https://github.com/jcs-elpa/atl-long-lines"))]) + (atl-markup . [(20240101 933) ((emacs (24 3))) "Automatically truncate lines for markup languages" tar ((:commit . "b616343ffe17060d521b214b8e90f5da1e880934") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "automatic" "truncate" "visual" "lines") (:url . "https://github.com/jcs-elpa/atl-markup"))]) (atom-dark-theme . [(20220114 1902) nil "An Emacs port of the Atom Dark theme from Atom.io." tar ((:commit . "2b3c7ad42bbcab3214a131f8957b92e717b36ad3") (:authors ("Jeremy Whitlock" . "jwhitlock@apache.org")) (:maintainers ("Jeremy Whitlock" . "jwhitlock@apache.org")) (:maintainer "Jeremy Whitlock" . "jwhitlock@apache.org") (:keywords "themes" "atom" "dark") (:url . "https://github.com/whitlockjc/atom-dark-theme-emacs"))]) (atom-one-dark-theme . [(20210128 1640) nil "Atom One Dark color theme" tar ((:commit . "b34b62e85593812b55ee552a1cb0eecfb04767bb") (:authors ("Jonathan Chu" . "me@jonathanchu.is")) (:maintainers ("Jonathan Chu" . "me@jonathanchu.is")) (:maintainer "Jonathan Chu" . "me@jonathanchu.is") (:url . "https://github.com/jonathanchu/atom-one-dark-theme"))]) (atomic-chrome . [(20230304 112) ((emacs (24 4)) (let-alist (1 0 4)) (websocket (1 4))) "Edit Chrome text area with Emacs using Atomic Chrome" tar ((:commit . "f1b077be7e414f457191d72dcf5eedb4371f9309") (:authors ("alpha22jp" . "alpha22jp@gmail.com")) (:maintainers ("alpha22jp" . "alpha22jp@gmail.com")) (:maintainer "alpha22jp" . "alpha22jp@gmail.com") (:keywords "chrome" "edit" "textarea") (:url . "https://github.com/alpha22jp/atomic-chrome"))]) @@ -203,13 +209,13 @@ (aurora-config-mode . [(20180216 2302) nil "Major mode for Apache Aurora configuration files" tar ((:commit . "8273ec7937a21b469b9dbb6c11714255b890f410") (:authors ("Berk D. Demir" . "bdd@mindcast.org")) (:maintainers ("Berk D. Demir" . "bdd@mindcast.org")) (:maintainer "Berk D. Demir" . "bdd@mindcast.org") (:keywords "languages" "configuration") (:url . "https://github.com/bdd/aurora-config.el"))]) (auth-source-1password . [(20230529 1349) ((emacs (24 4))) "1password integration for auth-source" tar ((:commit . "7bb8ad3507c58cc642b2ebbd7e57a91efab80e14") (:authors ("Dominick LoBraico" . "auth-source-1password@lobrai.co")) (:maintainers ("Dominick LoBraico" . "auth-source-1password@lobrai.co")) (:maintainer "Dominick LoBraico" . "auth-source-1password@lobrai.co") (:url . "https://github.com/dlobraico"))]) (auth-source-gopass . [(20230109 1213) ((emacs (24 4))) "Gopass integration for auth-source" tar ((:commit . "6f7f0cc0d682f66d11f7fac4fa5c1e79904232da") (:authors ("Markus M. May" . "mmay@javafreedom.org")) (:maintainers ("Markus M. May" . "mmay@javafreedom.org")) (:maintainer "Markus M. May" . "mmay@javafreedom.org") (:url . "https://github.com/"))]) - (auth-source-keytar . [(20221231 1654) ((emacs (24 4)) (keytar (0 1 2)) (s (1 12 0))) "Integrate auth-source with keytar" tar ((:commit . "8fcd935ee131174a1ed7f132614257411ed441bc") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "keytar" "password" "credential" "secret" "security") (:url . "https://github.com/emacs-grammarly/auth-source-keytar"))]) + (auth-source-keytar . [(20240101 846) ((emacs (24 4)) (keytar (0 1 2)) (s (1 12 0))) "Integrate auth-source with keytar" tar ((:commit . "6c3389a30a0d998857ff6861b4c05bce5a07be82") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "keytar" "password" "credential" "secret" "security") (:url . "https://github.com/emacs-grammarly/auth-source-keytar"))]) (auth-source-kwallet . [(20210605 1032) ((emacs (24 4))) "KWallet integration for auth-source" tar ((:commit . "57335d80876a526adb63a5ab57b83f55e8d79953") (:authors ("Ekaterina Vaartis" . "vaartis@kotobank.ch")) (:maintainers ("Ekaterina Vaartis" . "vaartis@kotobank.ch")) (:maintainer "Ekaterina Vaartis" . "vaartis@kotobank.ch") (:url . "https://github.com/vaartis/auth-source-kwallet"))]) (auth-source-xoauth2 . [(20220804 2219) ((emacs (26 1))) "Integrate auth-source with XOAUTH2" tar ((:commit . "99a03f8ce835412943d311b2746e77fcf5a1b500") (:authors ("Cesar Crusius" . "ccrusius@google.com")) (:maintainers ("Cesar Crusius" . "ccrusius@google.com")) (:maintainer "Cesar Crusius" . "ccrusius@google.com") (:url . "https://github.com/ccrusius/auth-source-xoauth2"))]) (auto-async-byte-compile . [(20160916 454) nil "Automatically byte-compile when saved" tar ((:commit . "8681e74ddb8481789c5dbb3cafabb327db4c4484") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "lisp" "convenience") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/auto-async-byte-compile.el"))]) (auto-auto-indent . [(20131106 1903) ((es-lib (0 1)) (cl-lib (1 0))) "Indents code as you type" tar ((:commit . "0139378577f936d34b20276af6f022fb457af490") (:authors ("sabof")) (:maintainers ("sabof")) (:maintainer "sabof") (:url . "https://github.com/sabof/auto-auto-indent"))]) - (auto-compile . [(20230825 2030) ((emacs (25 1))) "Automatically compile Emacs Lisp libraries" tar ((:commit . "113db4d7f546b2829fed23e2c9bcb4fdac63ff57") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "compile" "convenience" "lisp") (:url . "https://github.com/emacscollective/auto-compile"))]) - (auto-complete . [(20221231 1633) ((popup (0 5 0)) (cl-lib (0 5))) "Auto Completion for GNU Emacs" tar ((:commit . "59c11c453bfa0794302848a004d1be3b1684f17b") (:authors ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainer "Jen-Chieh Shen" . "jcs090218@gmail.com") (:keywords "completion" "convenience") (:url . "https://github.com/auto-complete/auto-complete"))]) + (auto-compile . [(20240311 1746) ((emacs (26 1))) "Automatically compile Emacs Lisp libraries" tar ((:commit . "e8477c583ca1614ff543439a5ca638e4110ba5b4") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "compile" "convenience" "lisp") (:url . "https://github.com/emacscollective/auto-compile"))]) + (auto-complete . [(20240101 831) ((popup (0 5 0)) (cl-lib (0 5))) "Auto Completion for GNU Emacs" tar ((:commit . "2afcea4bb7ba4e9573a7ad888dc6ab7bca5f7b03") (:authors ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainer "Jen-Chieh Shen" . "jcs090218@gmail.com") (:keywords "completion" "convenience") (:url . "https://github.com/auto-complete/auto-complete"))]) (auto-complete-auctex . [(20140223 1758) ((yasnippet (0 6 1)) (auto-complete (1 4))) "auto-completion for auctex" tar ((:commit . "855633f668bcc4b9408396742a7cb84e0c4a2f77") (:authors ("Christopher Monsanto" . "chris@monsan.to")) (:maintainers ("Christopher Monsanto" . "chris@monsan.to")) (:maintainer "Christopher Monsanto" . "chris@monsan.to"))]) (auto-complete-c-headers . [(20150912 323) ((auto-complete (1 4))) "An auto-complete source for C/C++ header files" tar ((:commit . "52fef720c6f274ad8de52bef39a343421006c511") (:authors ("Masafumi Oyamada" . "stillpedant@gmail.com")) (:maintainers ("Masafumi Oyamada" . "stillpedant@gmail.com")) (:maintainer "Masafumi Oyamada" . "stillpedant@gmail.com") (:keywords "c"))]) (auto-complete-chunk . [(20140225 946) ((auto-complete (1 4))) "Auto-completion for dot.separated.words." tar ((:commit . "a9aa77ffb84a1037984a7ce4dda25074272f13fe") (:authors ("ARAKAKI, Takafumi")) (:maintainers ("ARAKAKI, Takafumi")) (:maintainer "ARAKAKI, Takafumi") (:url . "https://github.com/tkf/auto-complete-chunk"))]) @@ -221,26 +227,27 @@ (auto-complete-pcmp . [(20140303 255) ((auto-complete (1 4 0)) (log4e (0 2 0)) (yaxception (0 1))) "Provide auto-complete sources using pcomplete results" tar ((:commit . "2595d3dab1ef3549271ca922f212928e9d830eec") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "completion") (:url . "https://github.com/aki2o/auto-complete-pcmp"))]) (auto-complete-rst . [(20140225 944) ((auto-complete (1 4))) "Auto-complete extension for ReST and Sphinx" tar ((:commit . "4803ce41a96224e6fa54e6741a5b5f40ebed7351") (:authors ("ARAKAKI, Takafumi")) (:maintainers ("ARAKAKI, Takafumi")) (:maintainer "ARAKAKI, Takafumi") (:url . "https://github.com/tkf/auto-complete-rst"))]) (auto-complete-sage . [(20160514 751) ((auto-complete (1 5 1)) (sage-shell-mode (0 1 0))) "An auto-complete source for sage-shell-mode." tar ((:commit . "51b8e3905196d266e1f8aa47881189833151b398") (:authors ("Sho Takemori" . "stakemorii@gmail.com")) (:maintainers ("Sho Takemori" . "stakemorii@gmail.com")) (:maintainer "Sho Takemori" . "stakemorii@gmail.com") (:keywords "sage" "math" "auto-complete") (:url . "https://github.com/stakemori/auto-complete-sage"))]) - (auto-dark . [(20230702 319) ((emacs (24 4))) "Automatically sets the dark-mode theme based on macOS/Linux/Windows status" tar ((:commit . "af19a779c6df1e371d26e4092e6a2113ad1f44cd") (:authors ("Rahul M. Juliato") ("Tim Harper ") ("Vincent Zhang" . "seagle0128@gmail.com") ("Jonathan Arnett" . "jonathan.arnett@protonmail.com")) (:maintainers ("Rahul M. Juliato")) (:maintainer "Rahul M. Juliato") (:keywords "macos" "windows" "linux" "themes" "tools" "faces") (:url . "https://github.com/LionyxML/auto-dark-emacs"))]) + (auto-dark . [(20240226 1939) ((emacs (24 4))) "Automatically sets the dark-mode theme based on macOS/Linux/Windows status" tar ((:commit . "f45ac0c6710f3899a792b34f1fa2f317e953f4d1") (:authors ("Rahul M. Juliato") ("Tim Harper ") ("Vincent Zhang" . "seagle0128@gmail.com") ("Jonathan Arnett" . "jonathan.arnett@protonmail.com")) (:maintainers ("Rahul M. Juliato")) (:maintainer "Rahul M. Juliato") (:keywords "macos" "windows" "linux" "themes" "tools" "faces") (:url . "https://github.com/LionyxML/auto-dark-emacs"))]) (auto-dictionary . [(20150410 1610) nil "automatic dictionary switcher for flyspell" tar ((:commit . "b364e08009fe0062cf0927d8a0582fad5a12b8e7") (:authors ("Nikolaj Schumacher ")) (:maintainers ("Nikolaj Schumacher ")) (:maintainer "Nikolaj Schumacher ") (:keywords "wp") (:url . "http://nschum.de/src/emacs/auto-dictionary/"))]) (auto-dim-other-buffers . [(20220209 2101) nil "Makes windows without focus less prominent" tar ((:commit . "33b5f88b799a17947c266b04ad59462c5aeb4ed7") (:authors ("Michal Nazarewicz" . "mina86@mina86.com")) (:maintainers ("Michal Nazarewicz" . "mina86@mina86.com")) (:maintainer "Michal Nazarewicz" . "mina86@mina86.com") (:url . "https://github.com/mina86/auto-dim-other-buffers.el"))]) - (auto-highlight-symbol . [(20221231 1631) ((emacs (26 1)) (ht (2 3))) "Automatic highlighting current symbol minor mode" tar ((:commit . "ece5e2c722efa5c9ea32a809b484afc222ebebe5") (:authors ("Mitsuo Saito" . "arch320@NOSPAM.gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "highlight" "face" "match" "convenience") (:url . "http://github.com/jcs-elpa/auto-highlight-symbol"))]) + (auto-highlight-symbol . [(20240101 905) ((emacs (26 1)) (ht (2 3))) "Automatic highlighting current symbol minor mode" tar ((:commit . "6194af718b758e10a0401104760b9d9cf96735db") (:authors ("Mitsuo Saito" . "arch320@NOSPAM.gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "highlight" "face" "match" "convenience") (:url . "http://github.com/jcs-elpa/auto-highlight-symbol"))]) (auto-indent-mode . [(20211029 11) nil "Auto indent Minor mode" tar ((:commit . "664006b67329a8e27330541547f8c2187dab947c") (:authors ("Matthew L. Fidler, Le Wang & Others")) (:maintainers ("Matthew L. Fidler")) (:maintainer "Matthew L. Fidler") (:keywords "auto" "indentation") (:url . "https://github.com/mlf176f2/auto-indent-mode.el/"))]) (auto-minor-mode . [(20180527 1123) ((emacs (24 4))) "Enable minor modes by file name and contents" tar ((:commit . "c62f4e04c7b73835c399f0348bea0ade2720bcbb") (:authors ("Joe Wreschnig" . "joe.wreschnig@gmail.com")) (:maintainers ("Joe Wreschnig" . "joe.wreschnig@gmail.com")) (:maintainer "Joe Wreschnig" . "joe.wreschnig@gmail.com") (:keywords "convenience") (:url . "https://github.com/joewreschnig/auto-minor-mode"))]) (auto-org-md . [(20180213 2343) ((emacs (24 4))) "export a markdown file automatically when you save an org-file" tar ((:commit . "9318338bdb7fe8bd698d88f3af89b2d6413efdd2") (:authors ("jamcha" . "jamcha.aa@gmail.com")) (:maintainers ("jamcha" . "jamcha.aa@gmail.com")) (:maintainer "jamcha" . "jamcha.aa@gmail.com") (:keywords "org" "markdown") (:url . "https://github.com/jamcha-aa/auto-org-md"))]) (auto-package-update . [(20211108 2025) ((emacs (24 4)) (dash (2 1 0))) "Automatically update Emacs packages." tar ((:commit . "ad95435fefe2bb501d1d787b08272f9c1b7df488") (:authors ("Renan Ranelli")) (:maintainers ("Renan Ranelli")) (:maintainer "Renan Ranelli") (:keywords "package" "update") (:url . "http://github.com/rranelli/auto-package-update.el"))]) (auto-pause . [(20160426 1216) ((emacs (24 4))) "Run processes which will be paused when Emacs is idle" tar ((:commit . "a4d778de774ca3895542cb559a953e0d98657338") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "convenience" "menu") (:url . "https://github.com/lujun9972/auto-pause"))]) (auto-read-only . [(20200827 1754) ((emacs (25 1)) (cl-lib (0 5))) "Automatically make the buffer to read-only" tar ((:commit . "db209bf5b7f76f4c3dc4d0892fc6a24430779f29") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "files" "convenience") (:url . "https://github.com/zonuexe/auto-read-only.el"))]) - (auto-rename-tag . [(20220704 639) ((emacs (24 4))) "Automatically rename paired HTML/XML tag" tar ((:commit . "58ef595757350f4d8c1cea30d6902b26afaf8743") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "auto-complete" "html" "rename" "tag" "xml") (:url . "https://github.com/jcs-elpa/auto-rename-tag"))]) + (auto-rename-tag . [(20240120 1011) ((emacs (24 4))) "Automatically rename paired HTML/XML tag" tar ((:commit . "288c708e5c88113a5c8c5c44361f1d3c3e334a2e") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "auto-complete" "html" "rename" "tag" "xml") (:url . "https://github.com/emacs-vs/auto-rename-tag"))]) (auto-save-buffers-enhanced . [(20161109 710) nil "Automatically save buffers in a decent way" tar ((:commit . "461e8c816c1b7c650be5f209078b381fe55da8c6") (:authors ("Kentaro Kuribayashi" . "kentarok@gmail.com")) (:maintainers ("Kentaro Kuribayashi" . "kentarok@gmail.com")) (:maintainer "Kentaro Kuribayashi" . "kentarok@gmail.com"))]) (auto-shell-command . [(20180817 1502) ((deferred (20130312)) (popwin (20130329))) "Run the shell command asynchronously that you specified when you save the file." tar ((:commit . "a8f9213e3c773b5687b81881240e6e648f2f56ba") (:authors ("ongaeshi")) (:maintainers ("ongaeshi")) (:maintainer "ongaeshi") (:keywords "shell" "save" "async" "deferred" "auto"))]) - (auto-sudoedit . [(20230323 650) ((emacs (26 1)) (f (0 19 0))) "Auto sudo edit by tramp" tar ((:commit . "7ee72f31e762e225595e330c6108f3a69dbb0187") (:authors ("ncaq" . "ncaq@ncaq.net")) (:maintainers ("ncaq" . "ncaq@ncaq.net")) (:maintainer "ncaq" . "ncaq@ncaq.net") (:url . "https://github.com/ncaq/auto-sudoedit"))]) - (auto-virtualenv . [(20220712 1612) ((cl-lib (0 5)) (pyvenv (1 9)) (s (1 10 0))) "Auto activate python virtualenvs" tar ((:commit . "1e58a878984dbd2c91b4f128ded03fd954336907") (:authors ("Marcwebbie" . "marcwebbie@gmail.com")) (:maintainers ("Marcwebbie" . "marcwebbie@gmail.com")) (:maintainer "Marcwebbie" . "marcwebbie@gmail.com") (:keywords "python" "virtualenv" "tools") (:url . "http://github.com/marcwebbie/auto-virtualenv"))]) + (auto-sort-mode . [(20230827 2124) ((emacs (24 1))) "Automatically sort lines between two delimiters" tar ((:commit . "3ffa4e2a76a6dda949fdfd200f623a17c4796559") (:authors ("Rob Weir" . "rweir@ertius.org")) (:maintainers ("Rob Weir" . "rweir@ertius.org")) (:maintainer "Rob Weir" . "rweir@ertius.org") (:keywords "sorting" "sort" "matching" "tools") (:url . "https://github.com/rweir/auto-sort-mode"))]) + (auto-sudoedit . [(20230907 724) ((emacs (26 1)) (f (0 19 0))) "Auto sudo edit by tramp" tar ((:commit . "1caa127db200f86d1cfdeaae4410a673f0ae11e0") (:authors ("ncaq" . "ncaq@ncaq.net")) (:maintainers ("ncaq" . "ncaq@ncaq.net")) (:maintainer "ncaq" . "ncaq@ncaq.net") (:url . "https://github.com/ncaq/auto-sudoedit"))]) + (auto-virtualenv . [(20240115 1548) ((cl-lib (0 5)) (pyvenv (1 9)) (s (1 10 0))) "Auto activate python virtualenvs" tar ((:commit . "5771eb59fc2f589aa3066297ff3bbeeae474d846") (:authors ("Marcwebbie" . "marcwebbie@gmail.com")) (:maintainers ("Marcwebbie" . "marcwebbie@gmail.com")) (:maintainer "Marcwebbie" . "marcwebbie@gmail.com") (:keywords "python" "virtualenv" "tools") (:url . "http://github.com/marcwebbie/auto-virtualenv"))]) (auto-virtualenvwrapper . [(20230317 1313) ((cl-lib (1 0)) (s (1 13 0)) (virtualenvwrapper (0))) "Lightweight auto activate python virtualenvs" tar ((:commit . "8cc2616af46d7e26c1d9ecea5fffd8974e5b1acb") (:authors ("Marcwebbie" . "marcwebbie@gmail.com") ("Robert Zaremba" . "robert-zaremba@scale-it.pl")) (:maintainers ("Marcwebbie" . "marcwebbie@gmail.com")) (:maintainer "Marcwebbie" . "marcwebbie@gmail.com") (:keywords "python" "virtualenv" "tools"))]) (auto-yasnippet . [(20230208 331) ((yasnippet (0 14 0)) (emacs (25 1))) "Quickly create disposable yasnippets" tar ((:commit . "6a9e406d0d7f9dfd6dff7647f358cb05a0b1637e") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com") ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainers ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com") (:url . "https://github.com/abo-abo/auto-yasnippet"))]) (autobookmarks . [(20220509 1712) ((dash (2 10 0)) (cl-lib (0 5))) "Save recently visited files and buffers" tar ((:commit . "8acd6f182181e23257e01c1b5cf90b872507a74d") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "files"))]) - (autobuild . [(20230729 2356) ((emacs (26 1)) (selcand (0 0 1))) "Define and execute build rules and compilation pipelines" tar ((:commit . "0f4cf8eec86806c59743fce2c5ed7e63db060cd2") (:authors ("Ernesto Alfonso")) (:maintainers (nil . "(concat \"erjoalgo\" \"@\" \"gmail\" \".com\")")) (:maintainer nil . "(concat \"erjoalgo\" \"@\" \"gmail\" \".com\")") (:keywords "compile" "build" "pipeline" "autobuild" "extensions" "processes" "tools") (:url . "https://github.com/erjoalgo/autobuild"))]) - (autodisass-java-bytecode . [(20211005 1920) nil "Automatically disassemble Java bytecode" tar ((:commit . "9eaddd63645e64825b2d07805999c5a645248c53") (:authors ("George Balatsouras ")) (:maintainer "George Balatsouras ") (:keywords "convenience" "data" "files"))]) + (autobuild . [(20230906 1629) ((emacs (26 1)) (selcand (0 0 1))) "Define and execute build rules and compilation pipelines" tar ((:commit . "593a5138ded2793bdc0ff5681bf7af2e2a50ca67") (:authors ("Ernesto Alfonso")) (:maintainers (nil . "(concat \"erjoalgo\" \"@\" \"gmail\" \".com\")")) (:maintainer nil . "(concat \"erjoalgo\" \"@\" \"gmail\" \".com\")") (:keywords "compile" "build" "pipeline" "autobuild" "extensions" "processes" "tools") (:url . "https://github.com/erjoalgo/autobuild"))]) + (autodisass-java-bytecode . [(20230907 1729) nil "Automatically disassemble Java bytecode" tar ((:commit . "02788145f5c70e9004c4eba5acffbb584fe7de37") (:authors ("George Balatsouras ")) (:maintainer "George Balatsouras ") (:keywords "convenience" "data" "files"))]) (autodisass-llvm-bitcode . [(20150411 125) nil "Automatically disassemble LLVM bitcode" tar ((:commit . "14bb1bfe2be3b04d6e0c87a7a9d1e88ce15506d0") (:authors ("George Balatsouras ")) (:maintainer "George Balatsouras ") (:keywords "convenience" "data" "files"))]) (autoscratch . [(20230612 719) ((emacs (24 1))) "Automatically switch scratch buffer mode" tar ((:commit . "c5cf26b41f86aeb9f8bc64da2fe484ece807ac19") (:authors ("T.v.Dein" . "tlinden@cpan.org")) (:maintainers ("T.v.Dein" . "tlinden@cpan.org")) (:maintainer "T.v.Dein" . "tlinden@cpan.org") (:keywords "convenience" "buffer" "scrach") (:url . "https://github.com/tlinden/autoscratch"))]) (autotetris-mode . [(20141114 1646) ((cl-lib (0 5))) "automatically play tetris" tar ((:commit . "7d348d33829bc89ddbd2b4d5cfe5073c3b0cbaaa") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainers ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/autotetris-mode"))]) @@ -249,11 +256,12 @@ (avandu . [(20221106 834) nil "Gateway to Tiny Tiny RSS" tar ((:commit . "f064cd62f878d945cc2f202cda9a1a82b39d9e22") (:authors ("Tom Willemse" . "tom@ryuslash.org")) (:maintainers ("Tom Willemse" . "tom@ryuslash.org")) (:maintainer "Tom Willemse" . "tom@ryuslash.org") (:keywords "net"))]) (avk-emacs-themes . [(20230825 922) nil "Collection of avk themes" tar ((:commit . "abe6fd059e0a7e8fcf2eb95b16c3dfac5620b1e7") (:authors ("Alex V. Koval" . "alex@koval.kharkov.ua")) (:maintainer "Alex V. Koval" . "alex@koval.kharkov.ua") (:keywords "theme") (:url . "https://github.com/avkoval/avk-emacs-themes"))]) (avy . [(20230420 404) ((emacs (24 1)) (cl-lib (0 5))) "Jump to arbitrary positions in visible text and select text quickly." tar ((:commit . "be612110cb116a38b8603df367942e2bb3d9bdbe") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "point" "location") (:url . "https://github.com/abo-abo/avy"))]) - (avy-embark-collect . [(20230130 1454) ((emacs (25 1)) (embark (0 9)) (avy (0 5))) "Use avy to jump to Embark Collect entries" tar ((:commit . "784ce24a1ad37459041418182af49565cad4974b") (:authors ("Omar Antolín Camarena" . "omar@matem.unam.mx")) (:maintainers ("Omar Antolín Camarena" . "omar@matem.unam.mx")) (:maintainer "Omar Antolín Camarena" . "omar@matem.unam.mx") (:keywords "convenience") (:url . "https://github.com/oantolin/embark"))]) + (avy-embark-collect . [(20231208 459) ((emacs (25 1)) (embark (0 9)) (avy (0 5))) "Use avy to jump to Embark Collect entries" tar ((:commit . "47b0c75d4bf4f72a7af839667c877c80bd493cdb") (:authors ("Omar Antolín Camarena" . "omar@matem.unam.mx")) (:maintainers ("Omar Antolín Camarena" . "omar@matem.unam.mx")) (:maintainer "Omar Antolín Camarena" . "omar@matem.unam.mx") (:keywords "convenience") (:url . "https://github.com/oantolin/embark"))]) (avy-flycheck . [(20160720 1500) ((emacs (24 1)) (flycheck (0 14)) (seq (1 11)) (avy (0 4 0))) "Jump to and fix syntax errors using `flycheck' with `avy' interface" tar ((:commit . "5522f3bbbed1801d9278ed696ec0cbba38352985") (:authors ("Xu Ma" . "magicdirac@gmail.com")) (:maintainers ("Xu Ma" . "magicdirac@gmail.com")) (:maintainer "Xu Ma" . "magicdirac@gmail.com") (:keywords "tools" "convenience" "avy" "flycheck") (:url . "https://github.com/magicdirac/avy-flycheck"))]) (avy-menu . [(20230606 1519) ((emacs (24 4)) (avy (0 4 0))) "Library providing avy-powered popup menu" tar ((:commit . "e79d892afd974105a6b24e8985fef0c9a1b10b4c") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainers ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:keywords "convenience") (:url . "https://github.com/mrkkrp/avy-menu"))]) (avy-migemo . [(20180716 1455) ((emacs (24 4)) (avy (0 4 0)) (migemo (1 9))) "avy with migemo" tar ((:commit . "922a6dd82c0bfa316b0fbb56a9d4dd4ffa5707e7") (:authors ("momomo5717")) (:maintainers ("momomo5717")) (:maintainer "momomo5717") (:keywords "avy" "migemo") (:url . "https://github.com/momomo5717/avy-migemo"))]) (avy-zap . [(20190801 329) ((avy (0 2 0))) "Zap to char using `avy'" tar ((:commit . "7c8d1f40e43d03e2f6c1696bfa547526528ce8cb") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainers ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions") (:url . "https://github.com/cute-jumper/avy-zap"))]) + (awk-ts-mode . [(20231130 12) ((emacs (29 1))) "Major mode for awk using tree-sitter" tar ((:commit . "9cd2b2ad05d85e05be9da7275077697223d79878") (:authors ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainers ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainer "Noah Peart" . "noah.v.peart@gmail.com") (:keywords "awk" "languages" "tree-sitter") (:url . "https://github.com/nverno/awk-ts-mode"))]) (awk-yasnippets . [(20230515 1756) ((emacs (26 3)) (yasnippet (0 8 0))) "Yasnippets for AWK" tar ((:commit . "12e8e0b49878099bda5d3e4915cc3c738c87b95c") (:authors ("Adriano Martinez")) (:maintainers ("Adriano Martinez" . "uberkael@gmail.com")) (:maintainer "Adriano Martinez" . "uberkael@gmail.com") (:keywords "extensions") (:url . "https://github.com/uberkael/awk-yasnippets"))]) (aws-ec2 . [(20221011 538) ((emacs (24 4)) (dash (2 12 1)) (tblui (0 1 0))) "Manage AWS EC2 instances" tar ((:commit . "7b500097ac3c2addbe1644f78595dc2ea4eb87c4") (:authors ("Yuki Inoue ")) (:maintainers ("Yuki Inoue ")) (:maintainer "Yuki Inoue ") (:url . "https://github.com/Yuki-Inoue/aws.el"))]) (aws-snippets . [(20191203 1553) ((yasnippet (0 8 0))) "Yasnippets for AWS" tar ((:commit . "557d19a0bc486e0fddb597b2be5087769d9bd47e") (:keywords "snippets"))]) @@ -266,7 +274,7 @@ (babel-repl . [(20160504 2201) ((emacs (24))) "Run babel REPL" tar ((:commit . "0faa2f6518a2b46236f116ca1736a314f7d9c034") (:authors ("Hung Phan")) (:maintainers ("Hung Phan")) (:maintainer "Hung Phan") (:keywords "babel" "javascript" "es6") (:url . "https://github.com/hung-phan/babel-repl/"))]) (back-button . [(20220827 1733) ((nav-flash (1 0 0)) (smartrep (0 0 3)) (list-utils (0 4 2)) (persistent-soft (0 8 8)) (pcache (0 2 3))) "Visual navigation through mark rings" tar ((:commit . "f8783c98a7fefc1d0419959c1b462c7dcadce5a8") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "convenience" "navigation" "interface") (:url . "http://github.com/rolandwalker/back-button"))]) (backlight . [(20210513 129) ((emacs (24 3))) "backlight brightness adjustment on GNU/Linux" tar ((:commit . "b6826a60440d8bf440618e3cdafb40158de920e6") (:authors ("Michael Schuldt" . "mbschuldt@gmail.com")) (:maintainers ("Michael Schuldt" . "mbschuldt@gmail.com")) (:maintainer "Michael Schuldt" . "mbschuldt@gmail.com") (:keywords "hardware") (:url . "https://github.com/mschuldt/backlight.el"))]) - (backline . [(20230514 1800) ((emacs (25 1)) (compat (29 1 4 1)) (outline-minor-faces (0 1 2))) "Preserve appearance of outline headings" tar ((:commit . "f1d9e1cd5cba6362b152b5f4227d1714918fba59") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "outlines") (:url . "https://github.com/tarsius/backline"))]) + (backline . [(20240306 1822) ((emacs (25 1)) (compat (29 1 4 1)) (outline-minor-faces (0 1 2))) "Preserve appearance of outline headings" tar ((:commit . "1bbfc53a92fbae5a2b4afa34584a008dc9337c3e") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "outlines") (:url . "https://github.com/tarsius/backline"))]) (backup-each-save . [(20180227 557) nil "backup each savepoint of a file" tar ((:commit . "3c414b9d6b278911c95c5b8b71819e6af6f8a02a") (:authors ("Benjamin Rutt" . "brutt@bloomington.in.us")) (:maintainers ("Conor Nash" . "conor@nashcobusinessservicesllc.com")) (:maintainer "Conor Nash" . "conor@nashcobusinessservicesllc.com"))]) (backup-walker . [(20130720 1516) nil "quickly traverse all backups of a file" tar ((:commit . "934a4128c122972ac32bb9952addf279a60a94da") (:authors ("Le Wang")) (:maintainers ("Le Wang")) (:maintainer "Le Wang") (:keywords "backup") (:url . "https://github.com/lewang/backup-walker"))]) (backward-forward . [(20161229 550) ((emacs (24 5))) "navigation backwards and forwards across marks" tar ((:commit . "58489957a62a0da25dfb5df902624d2548d800b4") (:authors ("Currell Berry" . "currellberry@gmail.com")) (:maintainers ("Currell Berry" . "currellberry@gmail.com")) (:maintainer "Currell Berry" . "currellberry@gmail.com") (:keywords "navigation" "convenience" "backward" "forward") (:url . "https://gitlab.com/vancan1ty/emacs-backward-forward/tree/master"))]) @@ -279,18 +287,19 @@ (bap-mode . [(20200128 1354) nil "Major-mode for BAP's IR" tar ((:commit . "8969679f60db0aa918d35f40d959c0a9c723b111") (:authors ("Thomas Barabosch ")) (:maintainers ("Thomas Barabosch" . "thomas.barabosch@fkie.fraunhofer.de")) (:maintainer "Thomas Barabosch" . "thomas.barabosch@fkie.fraunhofer.de") (:keywords "languages") (:url . "https://github.com/fkie-cad/bap-mode"))]) (bar-cursor . [(20201204 2244) nil "package used to switch block cursor to a bar" tar ((:commit . "78f195b6db63459033c4f1c7e7add5d82f3ce424") (:authors ("Joe Casadonte" . "emacs@northbound-train.com")) (:maintainers ("Andrew Johnson" . "andrew@andrewjamesjohnson.com")) (:maintainer "Andrew Johnson" . "andrew@andrewjamesjohnson.com") (:keywords "files") (:url . "https://github.com/ajsquared/bar-cursor"))]) (bart-mode . [(20190601 1004) ((emacs (24 3))) "Real time BART departures info." tar ((:commit . "f70b6c42452e47c0c6b3ebd4c90e555a9bedeec7") (:authors ("Michael Schuldt" . "mbschuldt@gmail.com")) (:maintainers ("Michael Schuldt" . "mbschuldt@gmail.com")) (:maintainer "Michael Schuldt" . "mbschuldt@gmail.com") (:keywords "convenience" "transit") (:url . "https://github.com/mschuldt/bart-mode"))]) - (base16-theme . [(20230716 215) nil "Collection of themes built on combinations of 16 base colors" tar ((:commit . "f7d41a7605dff1db3ff930cb0aa15e7de76f0523") (:authors ("Kaleb Elwert" . "belak@coded.io") ("Neil Bhakta")) (:maintainer "Kaleb Elwert" . "belak@coded.io") (:url . "https://github.com/tinted-theming/base16-emacs"))]) + (base16-theme . [(20240218 58) nil "Collection of themes built on combinations of 16 base colors" tar ((:commit . "c24d84b6c4794d1fc92429b6c70009434a137fe4") (:authors ("Kaleb Elwert" . "belak@coded.io") ("Neil Bhakta")) (:maintainer "Kaleb Elwert" . "belak@coded.io") (:url . "https://github.com/tinted-theming/base16-emacs"))]) + (base32 . [(20240227 1821) ((emacs (27 1))) "Base32 support" tar ((:commit . "927257e97a602b6979a75028e8417bf1499582d4") (:authors ("Vivek Das Mohapatra" . "vivek@etla.org")) (:maintainers ("Vivek Das Mohapatra" . "vivek@etla.org")) (:maintainer "Vivek Das Mohapatra" . "vivek@etla.org") (:keywords "tools") (:url . "https://gitlab.com/fledermaus/totp.el"))]) (bash-completion . [(20230612 1103) ((emacs (25 3))) "Bash completion for the shell buffer" tar ((:commit . "f1daac0386c24cbe8a244a62c7588cc6847b07ae") (:authors ("Stephane Zermatten" . "szermatt@gmx.net")) (:maintainers ("Stephane Zermatten" . "szermatt@gmail.com")) (:maintainer "Stephane Zermatten" . "szermatt@gmail.com") (:keywords "convenience" "unix") (:url . "http://github.com/szermatt/emacs-bash-completion"))]) (basic-c-compile . [(20170302 1112) ((cl-lib (0 5)) (f (0 19 0))) "Quickly create a Makefile, compile and run C." tar ((:commit . "335e96e19647ad7245fb68cf7e68cf86c5023d23") (:authors ("Nick Spain" . "nicholas.spain96@gmail.com")) (:maintainers ("Nick Spain" . "nicholas.spain96@gmail.com")) (:maintainer "Nick Spain" . "nicholas.spain96@gmail.com") (:keywords "c" "makefile" "compilation" "convenience") (:url . "https://github.com/nick96/basic-c-compile"))]) (basic-ide . [(20230118 1040) ((emacs (25)) (basic-mode (0 4 2)) (company (0 9 12)) (flycheck (0 22)) (dash (2 12 0)) (f (0 17 0))) "BASIC IDE c64" tar ((:commit . "e33036f838e61b647927165e81be5d5b855e0518") (:authors ("Fermin MF" . "fmfs@posteo.net")) (:maintainers ("Fermin MF" . "fmfs@posteo.net")) (:maintainer "Fermin MF" . "fmfs@posteo.net") (:keywords "languages" "basic") (:url . "https://gitlab.com/sasanidas/emacs-c64-basic-ide"))]) - (basic-mode . [(20230826 1326) ((seq (2 20)) (emacs (25 1))) "Major mode for editing BASIC code" tar ((:commit . "be6924991b8eaeb14df0bf198a73ae8ac51df17c") (:authors ("Johan Dykstrom")) (:maintainers ("Johan Dykstrom")) (:maintainer "Johan Dykstrom") (:keywords "basic" "languages") (:url . "https://github.com/dykstrom/basic-mode"))]) + (basic-mode . [(20231125 1617) ((seq (2 20)) (emacs (25 1))) "Major mode for editing BASIC code" tar ((:commit . "1dc1a635d6d80668c8a583b974205e49ff0fc3ce") (:authors ("Johan Dykstrom")) (:maintainers ("Johan Dykstrom")) (:maintainer "Johan Dykstrom") (:keywords "basic" "languages") (:url . "https://github.com/dykstrom/basic-mode"))]) (basic-theme . [(20160817 827) ((emacs (24))) "Minimalistic light color theme" tar ((:commit . "9d0fd5f56898a5237c1de3363ad416aeab7f880e") (:authors ("Felix Geller" . "fgeller@gmail.com")) (:maintainers ("Felix Geller" . "fgeller@gmail.com")) (:maintainer "Felix Geller" . "fgeller@gmail.com") (:keywords "theme" "basic" "minimal" "colors") (:url . "http://github.com/fgeller/basic-theme.el"))]) (bats-mode . [(20230325 7) nil "Emacs mode for editing and running Bats tests" tar ((:commit . "fa88930b1baba101ae6474f289a239a236a7d19f") (:authors ("Doug MacEachern")) (:maintainers ("Doug MacEachern")) (:maintainer "Doug MacEachern") (:keywords "bats" "tests") (:url . "https://github.com/dougm/bats-mode"))]) (battery-notifier . [(20220705 2030) ((alert (1 3))) "Notify when battery capacity is low" tar ((:commit . "b7301d3633afff78609afd45dcf78268f98d52d3") (:authors ("Jason Johnson" . "jason@fullsteamlabs.com")) (:maintainers ("Jason Johnson" . "jason@fullsteamlabs.com")) (:maintainer "Jason Johnson" . "jason@fullsteamlabs.com") (:keywords "hardware" "battery") (:url . "https://github.com/jasonmj/battery-notifier"))]) (battle-haxe . [(20210219 354) ((emacs (25)) (company (0 9 9)) (helm (3 0)) (async (1 9 3)) (cl-lib (0 5)) (dash (2 18 0)) (s (1 10 0)) (f (0 19 0))) "A Haxe development system, with code completion and more" tar ((:commit . "2f32c81dcecfc68fd410cb9d2aca303d6e3028c7") (:authors ("Alon Tzarafi " . "alontzarafi@gmail.com")) (:maintainers ("Alon Tzarafi " . "alontzarafi@gmail.com")) (:maintainer "Alon Tzarafi " . "alontzarafi@gmail.com") (:keywords "programming" "languages" "completion") (:url . "https://github.com/AlonTzarafi/battle-haxe"))]) - (bazel . [(20230510 2235) ((emacs (27 1))) "Bazel support for Emacs" tar ((:commit . "d334a5d9c00def0995a36fe89f3bb8d4595409ad") (:keywords "build tools" "languages") (:url . "https://github.com/bazelbuild/emacs-bazel-mode"))]) - (bbcode-mode . [(20190304 2122) ((emacs (24)) (cl-lib (0 5))) "Major mode for phpBB posts (BBCode markup)" tar ((:commit . "e16619c80ea21154b4a4ccc2e13d0077e97c9caf") (:authors ("Eric James Michael Ritz" . "lobbyjones@gmail.com")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "bbcode" "languages") (:url . "https://github.com/lassik/emacs-bbcode-mode"))]) - (bbdb . [(20220706 433) ((emacs (24)) (cl-lib (0 5))) "Big Brother DataBase" tar ((:commit . "1b121e94871f5d931c75793257db732ba82fdddb") (:maintainers ("Roland Winkler" . "winkler@gnu.org")) (:maintainer "Roland Winkler" . "winkler@gnu.org"))]) + (bazel . [(20230919 1445) ((emacs (28 1))) "Bazel support for Emacs" tar ((:commit . "769b30dc18282564d614d7044195b5a0c1a0a5f3") (:keywords "build tools" "languages") (:url . "https://github.com/bazelbuild/emacs-bazel-mode"))]) + (bbcode-mode . [(20231215 1539) ((emacs (24)) (cl-lib (0 5))) "Major mode for phpBB posts (BBCode markup)" tar ((:commit . "109962f1070a5e6943c2e32c1eb84ce4debfb8f8") (:authors ("Eric James Michael Ritz" . "lobbyjones@gmail.com")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "bbcode" "languages") (:url . "https://github.com/lassik/emacs-bbcode-mode"))]) + (bbdb . [(20231122 1326) ((emacs (24)) (cl-lib (0 5))) "Big Brother DataBase" tar ((:commit . "53e8ba04c47b3542db75b68f9663941daf2e6ca4") (:maintainers ("Roland Winkler" . "winkler@gnu.org")) (:maintainer "Roland Winkler" . "winkler@gnu.org"))]) (bbdb- . [(20140221 2354) ((bbdb (20140123 1541)) (log4e (0 2 0)) (yaxception (0 1))) "provide interface for more easily search/choice than BBDB." tar ((:commit . "2839e84c894de2513af41053e80a277a1b483d22") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "bbdb" "news" "mail") (:url . "https://github.com/aki2o/bbdb-"))]) (bbdb-csv-import . [(20140802 1142) ((pcsv (1 3 3)) (dash (2 5 0)) (bbdb (20140412 1949))) "import csv to bbdb version 3+" tar ((:commit . "7739d10ebe1787a72aa74085e9baedd0f4988b00") (:authors ("Ian Kelling" . "ian@iankelling.org")) (:maintainers ("Ian Kelling" . "ian@iankelling.org")) (:maintainer "Ian Kelling" . "ian@iankelling.org") (:keywords "csv" "util" "bbdb") (:url . "https://gitlab.com/iankelling/bbdb-csv-import"))]) (bbdb-ext . [(20151220 2013) ((bbdb (2 36))) "Extra commands for BBDB" tar ((:commit . "fee97b1b3faa83edaea00fbc5ad3cbca5e791a55") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainers ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com") (:keywords "extensions") (:url . "https://github.com/vapniks/bbdb-ext"))]) @@ -303,9 +312,9 @@ (bech32 . [(20221210 1154) ((emacs (26 1))) "Bech32 library" tar ((:commit . "badbf267fa488df1cb87809ed234ebd67786f2f8") (:authors ("Oscar Najera ")) (:maintainers ("Oscar Najera" . "hi@oscarnajera.com")) (:maintainer "Oscar Najera" . "hi@oscarnajera.com") (:url . "https://github.com/Titan-C/cardano.el"))]) (beef-mode . [(20221227 203) ((emacs (24 3))) "A major mode for the Beef programming language" tar ((:commit . "20906b41630d74eba56504fbb9fabb79562e0d6e") (:authors ("XXIV")) (:maintainers ("XXIV")) (:maintainer "XXIV") (:keywords "files" "beef") (:url . "https://github.com/thechampagne/beef-mode"))]) (beeminder . [(20201227 2024) ((emacs (24 3)) (seq (2 16)) (org (7))) "Emacs interface for Beeminder" tar ((:commit . "161d9c94c594614a01cb08219693d9e000af4f69") (:authors ("Phil Newton" . "phil@sodaware.net")) (:maintainers ("Phil Newton" . "phil@sodaware.net")) (:maintainer "Phil Newton" . "phil@sodaware.net") (:keywords "tools" "beeminder") (:url . "http://www.philnewton.net/code/beeminder-el/"))]) - (beginend . [(20230303 754) ((emacs (25 3))) "Redefine M-< and M-> for some modes" tar ((:commit . "61f1eb22718fcd9796b47a98702d161ff323a532") (:url . "https://github.com/DamienCassou/beginend"))]) + (beginend . [(20230902 1458) ((emacs (25 3))) "Redefine M-< and M-> for some modes" tar ((:commit . "2d3536971b7cca597ba3404c30b5d1ce9d56f1fe") (:url . "https://github.com/DamienCassou/beginend"))]) (belarus-holidays . [(20190102 1343) nil "Belarus holidays whith transfers" tar ((:commit . "35a18273e19edc3b4c761030ffbd11116483b83e") (:authors ("Yauhen Makei" . "yauhen.makei@gmail.com")) (:maintainers ("Yauhen Makei" . "yauhen.makei@gmail.com")) (:maintainer "Yauhen Makei" . "yauhen.makei@gmail.com") (:url . "http://bitbucket.org/EugeneMakei/belarus-holidays.el"))]) - (benchmark-init . [(20220414 1612) ((emacs (24 3))) "Benchmarks for require and load calls" tar ((:commit . "02435560415bbadbcf5051fb7042880549170e7e") (:authors ("Steve Purcell")) (:maintainers ("David Holm" . "dholmster@gmail.com")) (:maintainer "David Holm" . "dholmster@gmail.com") (:keywords "convenience" "benchmark") (:url . "https://github.com/dholm/benchmark-init-el"))]) + (benchmark-init . [(20240304 1510) ((emacs (24 3))) "Benchmarks for require and load calls" tar ((:commit . "9a92d1f98fce8bbba27292273885a554ca3ab0c0") (:authors ("Steve Purcell")) (:maintainers ("David Holm" . "dholmster@gmail.com")) (:maintainer "David Holm" . "dholmster@gmail.com") (:keywords "convenience" "benchmark") (:url . "https://github.com/dholm/benchmark-init-el"))]) (benchstat . [(20171014 312) nil "proper benchmarking made simple" tar ((:commit . "fee86f521f22ef0f99564903d63e2023b591fc7f") (:authors ("Iskander Sharipov" . "quasilyte@gmail.com")) (:maintainers ("Iskander Sharipov" . "quasilyte@gmail.com")) (:maintainer "Iskander Sharipov" . "quasilyte@gmail.com") (:keywords "lisp") (:url . "https://github.com/Quasilyte/benchstat.el"))]) (bencode . [(20190317 2010) ((emacs (24 4))) "Bencode encoding / decoding" tar ((:commit . "b5fe9c9d4b9b5ea61cedd77987ca46eb8154bd16") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainers ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/emacs-bencode"))]) (bencoding . [(20200331 1102) ((emacs (25 1))) "Bencoding decoding and encoding" tar ((:commit . "409836f2cf4883826600de42519ee9cffeb48a11") (:authors ("Xu Chunyang")) (:maintainers ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:keywords "tools") (:url . "https://github.com/xuchunyang/bencoding.el"))]) @@ -313,7 +322,7 @@ (bert . [(20131117 1014) nil "BERT serialization library for Emacs" tar ((:commit . "a3eec6980a725aa4abd2019e4c00246450260490") (:authors ("Oleksandr Manzyuk" . "manzyuk@gmail.com")) (:maintainers ("Oleksandr Manzyuk" . "manzyuk@gmail.com")) (:maintainer "Oleksandr Manzyuk" . "manzyuk@gmail.com") (:keywords "comm" "data"))]) (better-defaults . [(20230611 432) ((emacs (25 1))) "Fixing weird quirks and poor defaults" tar ((:commit . "7d0e56b3a7f84bea6ee2dd9fda09da9df335f89e") (:authors ("Phil Hagelberg")) (:maintainers ("Phil Hagelberg")) (:maintainer "Phil Hagelberg") (:keywords "convenience") (:url . "https://github.com/technomancy/better-defaults"))]) (better-jumper . [(20220110 118) ((emacs (25 1))) "configurable jump list" tar ((:commit . "205e7a539d1611dbe50f003ddf52890360f87597") (:authors ("Bryan Gilbert ")) (:maintainers ("Bryan Gilbert" . "bryan@bryan.sh")) (:maintainer "Bryan Gilbert" . "bryan@bryan.sh") (:keywords "convenience" "jump" "history" "evil") (:url . "https://github.com/gilbertw1/better-jumper"))]) - (better-scroll . [(20221020 430) ((emacs (24 3))) "Improve user experience when scrolling window" tar ((:commit . "e7b3196f437f690028aeea414aaf71ca3779c175") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "scrolling" "scroll" "window" "better" "improvement") (:url . "https://github.com/jcs-elpa/better-scroll"))]) + (better-scroll . [(20240101 927) ((emacs (24 3))) "Improve user experience when scrolling window" tar ((:commit . "faded1bd681f3c48337e7165adcabde194c73b2b") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "scrolling" "scroll" "window" "better" "improvement") (:url . "https://github.com/jcs-elpa/better-scroll"))]) (better-shell . [(20191025 1737) ((emacs (24 4))) "Better shell management" tar ((:commit . "70c787b981caeef8c5f8012b170eb7b9f167cd13") (:authors ("Russell Black" . "killdash9@github")) (:maintainers ("Russell Black" . "killdash9@github")) (:maintainer "Russell Black" . "killdash9@github") (:keywords "convenience") (:url . "https://github.com/killdash9/better-shell"))]) (bf-mode . [(20130403 1442) nil "Browse file persistently on dired" tar ((:commit . "7cc4d09aed64d9db6be95646f5f5067de68f8895") (:authors ("isojin")) (:maintainers ("myuhe ")) (:maintainer "myuhe ") (:keywords "convenience") (:url . "https://github.com/emacs-jp/bf-mode"))]) (bfbuilder . [(20210228 1740) ((cl-lib (0 3)) (emacs (24 4))) "A brainfuck development environment with interactive debugger" tar ((:commit . "689f320a9a1326cdeff43b8538e0d739f8519c4b") (:authors ("zk_phi")) (:maintainers ("zk_phi")) (:maintainer "zk_phi") (:url . "http://zk-phi.gitub.io/"))]) @@ -321,35 +330,35 @@ (biblio . [(20230202 1721) ((emacs (24 3)) (biblio-core (0 2))) "Browse and import bibliographic references from CrossRef, arXiv, DBLP, HAL, Dissemin, and doi.org" tar ((:commit . "ee52f6cda82ea6fbc3b400e7b12132595cc0374c") (:authors ("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) (:maintainer "Clément Pit-Claudel" . "clement.pitclaudel@live.com") (:keywords "bib" "tex" "convenience" "hypermedia") (:url . "https://github.com/cpitclaudel/biblio.el"))]) (biblio-bibsonomy . [(20190105 1200) ((emacs (24 4)) (biblio-core (0 2))) "Lookup bibliographic entries from Bibsonomy" tar ((:commit . "fbdb3ecfcd88c179a2358d7967f7ecafef725835") (:authors ("Andreas Jansson and contributors")) (:maintainers ("Andreas Jansson and contributors")) (:maintainer "Andreas Jansson and contributors") (:keywords "bib" "tex" "bibsonomy") (:url . "http://github.com/andreasjansson/biblio-bibsonomy/"))]) (biblio-core . [(20230202 1721) ((emacs (24 3)) (let-alist (1 0 4)) (seq (1 11)) (dash (2 12 1))) "A framework for looking up and displaying bibliographic entries" tar ((:commit . "ee52f6cda82ea6fbc3b400e7b12132595cc0374c") (:authors ("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) (:maintainers ("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) (:maintainer "Clément Pit-Claudel" . "clement.pitclaudel@live.com") (:keywords "bib" "tex" "convenience" "hypermedia") (:url . "https://github.com/cpitclaudel/biblio.el"))]) + (biblio-gbooks . [(20240102 2034) ((emacs (24 4)) (biblio-core (0 2)) (let-alist (1 0 6)) (seq (2 24)) (compat (29 1 4 2))) "Google Books backend for biblio.el" tar ((:commit . "991f214b8af23f168462a0006cf4d6216fbd7371") (:authors ("Joshua Rasband and contributors")) (:maintainers ("Joshua Rasband and contributors")) (:maintainer "Joshua Rasband and contributors") (:keywords "bib" "tex") (:url . "http://github.com/jrasband/biblio-gbooks"))]) (bibliothek . [(20190124 1828) ((emacs (24 4)) (pdf-tools (0 70)) (a (0 1 0 -3 4))) "Managing a digital library of PDFs" tar ((:commit . "b19b37be332bada6b18d4d895edf6ce78ab420c4") (:authors ("Göktuğ Kayaalp" . "self@gkayaalp.com")) (:maintainers ("Göktuğ Kayaalp" . "self@gkayaalp.com")) (:maintainer "Göktuğ Kayaalp" . "self@gkayaalp.com") (:keywords "tools") (:url . "https://dev.gkayaalp.com/elisp/index.html#bibliothek-el"))]) (bibretrieve . [(20191124 1855) ((auctex (11 87)) (emacs (24 3))) "Retrieve BibTeX entries from the internet" tar ((:commit . "81dc8e0db3629cc180eafb2bc34b60dcd8980316") (:authors ("Antonio Sartori")) (:maintainers ("Pavel Zorin-Kranich" . "pzorin@uni-bonn.de")) (:maintainer "Pavel Zorin-Kranich" . "pzorin@uni-bonn.de") (:keywords "bibtex" "bibliography" "mathscinet" "arxiv" "zbmath") (:url . "https://github.com/pzorin/bibretrieve"))]) (bibslurp . [(20151202 2346) ((s (1 6 0)) (dash (1 5 0))) "retrieve BibTeX entries from NASA ADS" tar ((:commit . "aeba96368f2a06959e4fe945375ce2a54d34b189") (:keywords "bibliography" "nasa ads") (:url . "https://github.com/mkmcc/bibslurp"))]) - (bibtex-capf . [(20230226 2331) ((emacs (27 1)) (parsebib (3 0)) (org (9 5))) "Completion at point for bibtex --- *- lexical-binding: t -*-" tar ((:commit . "7635fec3bc565acafbb6e1bff1cc711844f869ce") (:authors ("Colin McLear")) (:maintainers ("Colin McLear")) (:maintainer "Colin McLear") (:keywords "bibtex" "convenience") (:url . "https://github.com/mclear-tools/bibtex-capf"))]) - (bibtex-completion . [(20230717 959) ((parsebib (1 0)) (s (1 9 0)) (dash (2 6 0)) (f (0 16 2)) (cl-lib (0 5)) (biblio (0 2)) (emacs (26 1))) "A BibTeX backend for completion frameworks" tar ((:commit . "ef07adfeda1e25d891875cb9a11983d5e26fc36d") (:authors ("Titus von der Malsburg" . "malsburg@posteo.de") ("Justin Burkett" . "justin@burkett.cc")) (:maintainers ("Titus von der Malsburg" . "malsburg@posteo.de")) (:maintainer "Titus von der Malsburg" . "malsburg@posteo.de") (:url . "https://github.com/tmalsburg/helm-bibtex"))]) + (bibtex-capf . [(20240122 1558) ((emacs (27 1)) (parsebib (3 0)) (org (9 5))) "Completion at point for bibtex" tar ((:commit . "31826efefcbbdebdb700a06b5070df0f06ce2291") (:authors ("Colin McLear")) (:maintainers ("Colin McLear")) (:maintainer "Colin McLear") (:keywords "bibtex" "convenience") (:url . "https://github.com/mclear-tools/bibtex-capf"))]) + (bibtex-completion . [(20240220 1216) ((parsebib (1 0)) (s (1 9 0)) (dash (2 6 0)) (f (0 16 2)) (cl-lib (0 5)) (biblio (0 2)) (emacs (26 1))) "A BibTeX backend for completion frameworks" tar ((:commit . "8b71b4f5ce62eeaf18067f57faaddc06449fbe1c") (:authors ("Titus von der Malsburg" . "malsburg@posteo.de") ("Justin Burkett" . "justin@burkett.cc")) (:maintainers ("Titus von der Malsburg" . "malsburg@posteo.de")) (:maintainer "Titus von der Malsburg" . "malsburg@posteo.de") (:url . "https://github.com/tmalsburg/helm-bibtex"))]) (bibtex-utils . [(20190703 2117) nil "Provides utilities for extending BibTeX mode" tar ((:commit . "26a8f0909b6adbf545a2b5e57ce7f779bf7a65af") (:authors ("Tyler Smith" . "tyler@plantarum.ca")) (:maintainers ("Tyler Smith" . "tyler@plantarum.ca")) (:maintainer "Tyler Smith" . "tyler@plantarum.ca") (:keywords "bibtex") (:url . "https://github.com/plantarum/bibtex-utils"))]) - (bicycle . [(20230515 943) ((emacs (25 1)) (compat (29 1 4 1))) "Cycle outline and code visibility" tar ((:commit . "dfc0c874d66d671cbb15149db27134e4ff4f54b8") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "outlines") (:url . "https://github.com/tarsius/bicycle"))]) + (bicycle . [(20240101 2211) ((emacs (25 1)) (compat (29 1 4 1))) "Cycle outline and code visibility" tar ((:commit . "998e39095481ced3844efaa8f8f0c5343641df9e") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "outlines") (:url . "https://github.com/tarsius/bicycle"))]) (bifocal . [(20200325 539) ((emacs (24 4))) "Split-screen scrolling for comint-mode buffers" tar ((:commit . "773a6dde790c4a240e643a9071e4c7bce09d40de") (:keywords "frames" "processes") (:url . "https://github.com/riscy/bifocal-mode"))]) (binclock . [(20170802 1116) ((cl-lib (0 5))) "Display the current time using a binary clock." tar ((:commit . "87042230d7f3fe3e9a77fae0dbab7d8f7e7794ad") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainers ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:keywords "games" "time" "display") (:url . "https://github.com/davep/binclock.el"))]) - (bind . [(20230827 1429) ((emacs (25 1))) "Bind commands to keys" tar ((:commit . "8e5ab488f0529565af5ba62bc047ac4b149ce945") (:authors ("repelliuss ")) (:maintainers ("repelliuss" . "repelliuss@gmail.com")) (:maintainer "repelliuss" . "repelliuss@gmail.com") (:url . "https://github.com/repelliuss/bind"))]) + (bind . [(20231001 2051) ((emacs (25 1))) "Bind commands to keys" tar ((:commit . "4c1698a7c1c9f3d45559c3be871d87d76a1cbe00") (:authors ("repelliuss ")) (:maintainers ("repelliuss" . "repelliuss@gmail.com")) (:maintainer "repelliuss" . "repelliuss@gmail.com") (:url . "https://github.com/repelliuss/bind"))]) (bind-chord . [(20221117 1610) ((emacs (24 3)) (bind-key (1 0)) (key-chord (0 6))) "key-chord binding helper for use-package-chords" tar ((:commit . "9090080b15486c3e337be254226efe7e5fde4c99") (:authors ("Justin Talbott" . "justin@waymondo.com")) (:maintainers ("Justin Talbott" . "justin@waymondo.com")) (:maintainer "Justin Talbott" . "justin@waymondo.com") (:keywords "convenience" "tools" "extensions") (:url . "https://github.com/jwiegley/use-package"))]) (bind-key . [(20230203 2004) ((emacs (24 3))) "A simple way to manage personal keybindings" tar ((:commit . "77945e002f11440eae72d8730d3de218163d551e") (:authors ("John Wiegley" . "johnw@newartisans.com")) (:maintainers ("John Wiegley" . "johnw@newartisans.com")) (:maintainer "John Wiegley" . "johnw@newartisans.com") (:keywords "keys" "keybinding" "config" "dotemacs" "extensions") (:url . "https://github.com/jwiegley/use-package"))]) - (bind-map . [(20220108 228) ((emacs (24 3))) "Bind personal keymaps in multiple locations" tar ((:commit . "510a24138d8de3b8df0783f1ac493a551fc9bd74") (:authors ("Justin Burkett" . "justin@burkett.cc")) (:maintainers ("Justin Burkett" . "justin@burkett.cc")) (:maintainer "Justin Burkett" . "justin@burkett.cc") (:url . "https://github.com/justbur/emacs-bind-map"))]) + (bind-map . [(20240308 2050) ((emacs (24 3))) "Bind personal keymaps in multiple locations" tar ((:commit . "d7b0e42b78f708669ec368ebbd1f503094ceee22") (:authors ("Justin Burkett" . "justin@burkett.cc")) (:maintainers ("Justin Burkett" . "justin@burkett.cc")) (:maintainer "Justin Burkett" . "justin@burkett.cc") (:url . "https://github.com/justbur/emacs-bind-map"))]) (binder . [(20230729 350) ((emacs (24 4)) (seq (2 20))) "Global minor mode to facilitate multi-file writing projects" tar ((:commit . "859d89c00e21c83565ed2b45f8d7527b45b1292c") (:authors ("Paul W. Rankin" . "pwr@bydasein.com")) (:maintainers ("Paul W. Rankin" . "pwr@bydasein.com")) (:maintainer "Paul W. Rankin" . "pwr@bydasein.com") (:keywords "files" "outlines" "wp" "text") (:url . "https://github.com/rnkn/binder"))]) (bing-dict . [(20200216 110) nil "Minimalists' English-Chinese Bing dictionary" tar ((:commit . "1d581aaa9622b34f8fb83af5579fa252aa24cfef") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainers ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions") (:url . "https://github.com/cute-jumper/bing-dict.el"))]) - (binky . [(20230829 1408) ((emacs (26 3))) "Jump between points like a rabbit" tar ((:commit . "1201002d665b74fc2e8121933acf7dc4102cbcbd") (:authors ("liuyinz" . "liuyinz95@gmail.com")) (:maintainers ("liuyinz" . "liuyinz95@gmail.com")) (:maintainer "liuyinz" . "liuyinz95@gmail.com") (:keywords "convenience") (:url . "https://github.com/liuyinz/binky-mode"))]) - (biome . [(20230819 1424) ((emacs (27 1)) (transient (0 3 7)) (ct (0 2)) (request (0 3 3)) (compat (29 1 4 1))) "Bountiful Interface to Open Meteo for Emacs" tar ((:commit . "fc52a2b7ac1a08050499c5eb378d012cd26d0856") (:authors ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainers ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainer "Korytov Pavel" . "thexcloud@gmail.com") (:url . "https://github.com/SqrtMinusOne/biome"))]) + (binky . [(20240107 2156) ((emacs (26 3))) "Jump between points like a rabbit" tar ((:commit . "9c0d99b345dc310a31a187c52d092965a26de70a") (:authors ("liuyinz" . "liuyinz95@gmail.com")) (:maintainers ("liuyinz" . "liuyinz95@gmail.com")) (:maintainer "liuyinz" . "liuyinz95@gmail.com") (:keywords "convenience") (:url . "https://github.com/liuyinz/binky-mode"))]) + (biome . [(20240311 2154) ((emacs (27 1)) (transient (0 3 7)) (ct (0 2)) (request (0 3 3)) (compat (29 1 4 1))) "Bountiful Interface to Open Meteo for Emacs" tar ((:commit . "d393ddbb70f1f27632c7ec63fe96e0179b708714") (:authors ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainers ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainer "Korytov Pavel" . "thexcloud@gmail.com") (:url . "https://github.com/SqrtMinusOne/biome"))]) (birds-of-paradise-plus-theme . [(20130419 2129) nil "A brown/orange light-on-dark theme for Emacs 24 (deftheme)." tar ((:commit . "bb9f9d4ef7f7872a388ec4eee1253069adcadb6f") (:authors ("Jim Myhrberg" . "contact@jimeh.me")) (:maintainers ("Jim Myhrberg" . "contact@jimeh.me")) (:maintainer "Jim Myhrberg" . "contact@jimeh.me") (:keywords "themes") (:url . "https://github.com/jimeh/birds-of-paradise-plus-theme.el"))]) (bison-mode . [(20210527 717) nil "Major mode for editing bison, yacc and lex files." tar ((:commit . "4f2e20394a475931409618c1635e9c9f1cf07d9c") (:authors ("Eric Beuscher" . "beuscher@eecs.tulane.edu")) (:maintainers ("Eric Beuscher" . "beuscher@eecs.tulane.edu")) (:maintainer "Eric Beuscher" . "beuscher@eecs.tulane.edu") (:keywords "bison-mode" "yacc-mode"))]) (bitbake . [(20220509 1236) ((emacs (24 1)) (dash (2 6 0)) (mmm-mode (0 5 4)) (s (1 10 0))) "Running bitbake from emacs" tar ((:commit . "434b088ab8715731d62978264cb934e34c75c4b3") (:authors ("Damien Merenne")) (:maintainers ("Damien Merenne")) (:maintainer "Damien Merenne") (:keywords "convenience") (:url . "https://github.com/canatella/bitbake-el"))]) - (bitbucket . [(20170405 446) ((emacs (24)) (request (0 1 0)) (s (1 9 0))) "Bitbucket API wrapper" tar ((:commit . "db001a9d936e6b5c3cc5d5ec22794e234e0d162d") (:authors ("2017 Tjaart van der Walt" . "tjaart@tjaart.co.za")) (:maintainers ("2017 Tjaart van der Walt" . "tjaart@tjaart.co.za")) (:maintainer "2017 Tjaart van der Walt" . "tjaart@tjaart.co.za") (:keywords "bitbucket") (:url . "http://github.com/tjaartvdwalt/bitbucket.el/"))]) (bitlbee . [(20151203 0) nil "Help get Bitlbee (http://www.bitlbee.org) up and running." tar ((:commit . "f3342da46b0864ae8db4e82b553d9e617b090534"))]) (bitpack . [(20230417 2032) ((emacs (24 3))) "Bit packing functions" tar ((:commit . "38d000646b81ce52fcb90a0747059a15264e112b") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainers ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:keywords "c" "comm") (:url . "https://github.com/skeeto/bitpack"))]) (blackboard-bold-mode . [(20160813 206) ((cl-lib (0 5))) "Easily insert Unicode mathematical double-struck characters" tar ((:commit . "5299cb064ba71baa3e331b8560bf8dd38cbbc4ed") (:authors ("Grant Rettke" . "gcr@wisdomandwonder.com")) (:maintainers (nil . "")) (:maintainer nil . "") (:keywords "unicode" "double struck" "blackboard bold" "math" "mathematical") (:url . "https://github.com/grettke/blackboard-bold-mode"))]) (blackboard-theme . [(20161216 656) ((emacs (24))) "TextMate Blackboard Theme" tar ((:commit . "d8b984f2541bb86eb4363a2b4c94631e49843d4a") (:authors ("Dong Zheng")) (:maintainers ("Dong Zheng")) (:maintainer "Dong Zheng") (:url . "https://github.com/don9z/blackboard-theme"))]) - (blacken . [(20230821 1738) ((emacs (25 2))) "Reformat python buffers using the \"black\" formatter" tar ((:commit . "15084b386561cd3672e9fc8cdce4647b60693111") (:authors ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainers ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainer "Artem Malyshev" . "proofit404@gmail.com") (:keywords "convenience" "blacken") (:url . "https://github.com/proofit404/blacken"))]) + (blacken . [(20231129 654) ((emacs (25 2))) "Reformat python buffers using the \"black\" formatter" tar ((:commit . "a43695f9cb412df93ac8d38b55ab1515e86e217e") (:authors ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainers ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainer "Artem Malyshev" . "proofit404@gmail.com") (:keywords "convenience" "blacken") (:url . "https://github.com/proofit404/blacken"))]) (blackjack . [(20230821 41) ((emacs (26 2))) "The game of Blackjack" tar ((:commit . "7f9072630a159b59a146346b5dae24ab8fb5f290") (:authors ("Greg Donald" . "gdonald@gmail.com")) (:maintainers ("Greg Donald" . "gdonald@gmail.com")) (:maintainer "Greg Donald" . "gdonald@gmail.com") (:keywords "card" "game" "games" "blackjack" "21") (:url . "https://github.com/gdonald/blackjack-el"))]) (blackout . [(20220509 2350) ((emacs (26))) "Better mode lighter overriding" tar ((:commit . "7707211370f03f03a2f74df15f42ac24a1e99300") (:authors ("Radian LLC" . "contact+blackout@radian.codes")) (:maintainers ("Radian LLC" . "contact+blackout@radian.codes")) (:maintainer "Radian LLC" . "contact+blackout@radian.codes") (:keywords "extensions") (:url . "https://github.com/radian-software/blackout"))]) - (blamer . [(20230519 2152) ((emacs (27 1)) (posframe (1 1 7))) "Show git blame info about current line" tar ((:commit . "ab00e6a3ea482c342d918add9c20bfd3fa740aaa") (:authors ("Artur Yaroshenko" . "artawower@protonmail.com")) (:maintainers ("Artur Yaroshenko" . "artawower@protonmail.com")) (:maintainer "Artur Yaroshenko" . "artawower@protonmail.com") (:url . "https://github.com/artawower/blamer.el"))]) + (blamer . [(20240301 2002) ((emacs (27 1)) (posframe (1 1 7)) (async (1 9 8))) "Show git blame info about current line" tar ((:commit . "39077eb4438a804e413e01fa94a2d1e31e984a75") (:authors ("Artur Yaroshenko" . "artawower@protonmail.com")) (:maintainers ("Artur Yaroshenko" . "artawower@protonmail.com")) (:maintainer "Artur Yaroshenko" . "artawower@protonmail.com") (:url . "https://github.com/artawower/blamer.el"))]) (blgrep . [(20150401 1416) ((clmemo (20140321 715))) "Block grep" tar ((:commit . "605beda210610a5829750a987f5fcebea97af546") (:authors ("Masayuki Ataka" . "masayuki.ataka@gmail.com")) (:maintainers ("Masayuki Ataka" . "masayuki.ataka@gmail.com")) (:maintainer "Masayuki Ataka" . "masayuki.ataka@gmail.com") (:keywords "tools" "convenience"))]) (blimp . [(20180903 2240) ((emacs (25)) (eimp (1 4 0))) "Bustling Image Manipulation Package" tar ((:commit . "b048b037129b68674b99310bcc08fb96d44fdbb4") (:authors ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainers ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainer "Sebastian Wålinder" . "s.walinder@gmail.com") (:keywords "multimedia" "unix") (:url . "https://github.com/walseb/blimp"))]) (bliss-theme . [(20170808 1307) ((emacs (24 0))) "an Emacs 24 theme based on Bliss (tmTheme)" tar ((:commit . "c3cf6d8a666ab26909b7da158f9e94df71a5fbbf") (:authors ("Jason Milkins")) (:maintainers ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/tmtheme-to-deftheme"))]) @@ -360,42 +369,44 @@ (blog-admin . [(20170923 1409) ((ctable (0 1 1)) (s (1 10 0)) (f (0 17 3)) (names (20151201 0)) (cl-lib (0 5))) "Blog admin for emacs with hexo/org-page supported" tar ((:commit . "b5f2e1dad7d68ec903619f7280bb0bcb7e398a1e") (:authors (nil . "code.falling@gmail.com")) (:maintainers (nil . "code.falling@gmail.com")) (:maintainer nil . "code.falling@gmail.com") (:keywords "tools" "blog" "org" "hexo" "org-page"))]) (blog-minimal . [(20181021 849) ((ht (1 5)) (simple-httpd (1 4 6)) (mustache (0 22)) (s (1 11 0)) (org (9 0 3))) "a simple static site generator based on org mode" tar ((:commit . "a634a2db0b80cb445ef0b072d1a1482ced91f9ad") (:authors ("Thank Fly" . "thiefuniverses@gmail.com")) (:maintainers ("Thank Fly" . "thiefuniverses@gmail.com")) (:maintainer "Thank Fly" . "thiefuniverses@gmail.com") (:keywords "tools") (:url . "https://github.com/thiefuniverse/blog-minimal"))]) (blox . [(20220521 807) ((emacs (25 1))) "Interaction with Roblox tooling" tar ((:commit . "9ebebb65fb38b5570ba8dfbb5ec835633c06b67d") (:authors ("Kenneth Loeffler" . "kenloef@gmail.com")) (:maintainers ("Kenneth Loeffler" . "kenloef@gmail.com")) (:maintainer "Kenneth Loeffler" . "kenloef@gmail.com") (:keywords "roblox" "rojo" "tools") (:url . "https://github.com/kennethloeffler/blox"))]) - (bluesound . [(20230328 1430) ((emacs (26 1))) "Play, pause, resume music on a Bluesound player" tar ((:commit . "f6a43dbe8b5a3d4541170717571c793ae3313c98") (:authors ("R.W. van 't Veer")) (:maintainers ("R.W. van 't Veer")) (:maintainer "R.W. van 't Veer") (:keywords "convenience" "multimedia") (:url . "https://git.sr.ht/~rwv/bluesound-el/"))]) - (bm . [(20210421 1351) nil "Visible bookmarks in buffer." tar ((:commit . "da9735f8b3f833a21b39a7bbfa7f563ba96429f3") (:authors ("Jo Odland ")) (:maintainers ("Jo Odland ")) (:maintainer "Jo Odland ") (:keywords "bookmark" "highlight" "faces" "persistent") (:url . "https://github.com/joodland/bm"))]) + (bluesound . [(20231124 1347) ((emacs (26 1))) "Play, pause, resume music on a Bluesound player" tar ((:commit . "92f6ebacfa20e89ccd10d27bdb84c74b6413cc68") (:authors ("R.W. van 't Veer")) (:maintainers ("R.W. van 't Veer")) (:maintainer "R.W. van 't Veer") (:keywords "convenience" "multimedia") (:url . "https://git.sr.ht/~rwv/bluesound-el/"))]) + (bm . [(20231008 2005) nil "Visible bookmarks in buffer." tar ((:commit . "1351e2e15a7666e614c94b41414c8f024dc10a50") (:authors ("Jo Odland ")) (:maintainers ("Jo Odland ")) (:maintainer "Jo Odland ") (:keywords "bookmark" "highlight" "faces" "persistent") (:url . "https://github.com/joodland/bm"))]) (bmx-mode . [(20210319 620) ((emacs (25 1)) (cl-lib (0 5)) (company (0 9 4)) (dash (2 13 0)) (s (1 12 0))) "Batch Mode eXtras" tar ((:commit . "6f008707efe0bb5646f0c1b0d6f57f0a8800e200") (:authors ("Jostein Kjønigsen" . "jostein@gmail.com")) (:maintainers ("Jostein Kjønigsen" . "jostein@gmail.com")) (:maintainer "Jostein Kjønigsen" . "jostein@gmail.com") (:keywords "c" "convenience" "tools") (:url . "http://github.com/josteink/bmx-mode"))]) (bnf-mode . [(20221205 1451) ((cl-lib (0 5)) (emacs (25 1))) "Major mode for editing BNF grammars." tar ((:commit . "dcdb422e219b29d53a9385e19083441c57f0beb3") (:authors ("Serghei Iakovlev" . "egrep@protonmail.ch")) (:maintainers ("Serghei Iakovlev" . "egrep@protonmail.ch")) (:maintainer "Serghei Iakovlev" . "egrep@protonmail.ch") (:keywords "languages") (:url . "https://github.com/sergeyklay/bnf-mode"))]) (bnfc . [(20160605 1927) ((emacs (24 3))) "Define context-free grammars for the BNFC tool" tar ((:commit . "1b58df1dd0cb9b81900632fb2843a03b94f56fdb") (:authors ("Jacob Mitchell" . "jmitchell@member.fsf.org")) (:maintainers ("Jacob Mitchell" . "jmitchell@member.fsf.org")) (:maintainer "Jacob Mitchell" . "jmitchell@member.fsf.org") (:keywords "languages" "tools") (:url . "https://github.com/jmitchell/bnfc-mode"))]) (boa-ide . [(20230813 2036) ((boa-mode (1 4 4)) (emacs (28 1)) (json-snatcher (1 0)) (json-mode (0 2)) (project (0 8 1))) "Mode for boa language files" tar ((:commit . "e1f960ada937be747ea2ec302bea155092e5c06b") (:authors ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainers ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainer "Samuel W. Flint" . "swflint@flintfam.org") (:keywords "languages") (:url . "https://github.com/boalang/syntax-highlight"))]) (boa-mode . [(20230730 2216) ((emacs (26 1))) "Mode for boa language files" tar ((:commit . "892f2a33ef95db9f19b45deb8309652534f91efd") (:authors ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainers ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainer "Samuel W. Flint" . "swflint@flintfam.org") (:keywords "languages") (:url . "https://github.com/boalang/syntax-highlight"))]) - (bog . [(20230521 2122) ((cl-lib (0 5))) "Extensions for research notes in Org mode" tar ((:commit . "6bea27368b0010e04fb7c7894064251940eb21b0") (:authors ("Kyle Meyer" . "kyle@kyleam.com")) (:maintainers ("Kyle Meyer" . "kyle@kyleam.com")) (:maintainer "Kyle Meyer" . "kyle@kyleam.com") (:keywords "bib" "outlines") (:url . "https://github.com/kyleam/bog"))]) + (bog . [(20240215 27) ((cl-lib (0 5))) "Extensions for research notes in Org mode" tar ((:commit . "c8e7c8cb54b1787cc3d9383f0514eb76cadd4002") (:authors ("Kyle Meyer" . "kyle@kyleam.com")) (:maintainers ("Kyle Meyer" . "kyle@kyleam.com")) (:maintainer "Kyle Meyer" . "kyle@kyleam.com") (:keywords "bib" "outlines") (:url . "https://github.com/kyleam/bog"))]) (bolt-mode . [(20180310 810) ((emacs (24 3))) "Editing support for Bolt language" tar ((:commit . "85a5a752bfbebb4aed884326c25db64c000e9934") (:authors ("Mikhail Pontus" . "mpontus@gmail.com")) (:maintainers ("Mikhail Pontus" . "mpontus@gmail.com")) (:maintainer "Mikhail Pontus" . "mpontus@gmail.com") (:keywords "languages") (:url . "https://github.com/mpontus/bolt-mode"))]) (bongo . [(20201002 1020) ((cl-lib (0 5)) (emacs (24 1))) "play music with Emacs" tar ((:commit . "9e9629090262bba6d0003dabe5a375e47a4477f1"))]) (bonjourmadame . [(20170919 1134) nil "Say \"Hello ma'am!\"" tar ((:commit . "d3df185fce78aefa689fded8e56a654f0fde4ac0"))]) (boogie-friends . [(20221115 658) ((cl-lib (0 5)) (dash (2 10 0)) (flycheck (0 23)) (yasnippet (0 9 0 1)) (company (0 8 12))) "A collection of programming modes for Boogie, Dafny, and Z3 (SMTLIB v2)." tar ((:commit . "5b32e4859823ed7f5e70fd5d2eac5d813a8e3e51") (:authors ("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) (:maintainer "Clément Pit-Claudel" . "clement.pitclaudel@live.com") (:keywords "convenience" "languages") (:url . "https://github.com/boogie-org/boogie-friends/"))]) + (bookmark-frecency . [(20231126 1320) ((emacs (27 1))) "Sort bookmarks by frecency" tar ((:commit . "b969969865eae11b84bd3b0bc54cc5cacdcefaa8") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainers ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:keywords "convenience") (:url . "https://github.com/akirak/bookmark-frecency.el"))]) (bookmark-in-project . [(20230604 757) ((emacs (27 1))) "Bookmark access within a project" tar ((:commit . "b3255afd8bddd0e6705fa2556205bf1c1192fc37") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:keywords "convenience") (:url . "https://codeberg.org/ideasman42/emacs-bookmark-in-project"))]) - (bookmark-view . [(20220403 2204) ((emacs (27 1))) "Bookmark views" tar ((:commit . "0d40ac67f53b7fa75fe65c38a5ef65701ce4c3da") (:authors ("Daniel Mendler")) (:maintainers ("Daniel Mendler")) (:maintainer "Daniel Mendler") (:url . "https://github.com/minad/bookmark-view"))]) + (bookmark-view . [(20240102 334) ((emacs (27 1))) "Bookmark views" tar ((:commit . "2d16b2f88a106e57c58ad2af1f7166a847996512") (:authors ("Daniel Mendler")) (:maintainers ("Daniel Mendler")) (:maintainer "Daniel Mendler") (:url . "https://github.com/minad/bookmark-view"))]) (bool-flip . [(20161215 1539) ((emacs (24 3))) "flip the boolean under the point" tar ((:commit . "0f7cc9b387429239fb929896511727d4e49a795b") (:authors ("Michael Brandt" . "michaelbrandt5@gmail.com")) (:maintainers ("Michael Brandt" . "michaelbrandt5@gmail.com")) (:maintainer "Michael Brandt" . "michaelbrandt5@gmail.com") (:keywords "boolean" "convenience" "usability") (:url . "http://github.com/michaeljb/bool-flip/"))]) - (boon . [(20230815 905) ((emacs (26 1)) (dash (2 12 0)) (expand-region (0 10 0)) (multiple-cursors (1 3 0))) "Ergonomic Command Mode for Emacs." tar ((:commit . "ea3b39b6920959d8cb87698087912ab1ab9f90b3"))]) - (borg . [(20230717 1325) ((emacs (27 1)) (epkg (3 3 3)) (magit (3 3 0))) "Assimilate Emacs packages as Git submodules" tar ((:commit . "e29d9839390c0f9e6c375acb4374430cf5595fdf") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "tools") (:url . "https://github.com/emacscollective/borg"))]) + (boon . [(20240314 920) ((emacs (26 1)) (dash (2 12 0)) (expand-region (0 10 0)) (multiple-cursors (1 3 0))) "Ergonomic Command Mode for Emacs." tar ((:commit . "9e006726be9ac508e0bb0393393abce06f7493f4"))]) + (borg . [(20240319 1534) ((emacs (27 1)) (epkg (3 3 3)) (magit (3 3 0))) "Assimilate Emacs packages as Git submodules" tar ((:commit . "1172842728fbade6fe8ea42f5b4d7999e39204e7") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "tools") (:url . "https://github.com/emacscollective/borg"))]) (borland-blue-theme . [(20160117 1321) ((emacs (24 1))) "Blue/yellow theme based on old DOS Borland/Turbo C IDE" tar ((:commit . "db74eefebbc89d3c62575f8f50b319e87b4a3470") (:authors ("Alexey Veretennikov ")) (:maintainers ("Alexey Veretennikov ")) (:maintainer "Alexey Veretennikov ") (:keywords "themes") (:url . "http://github.com/fourier/borland-blue-theme"))]) (boron-theme . [(20170808 1308) ((emacs (24 0))) "an Emacs 24 theme based on Boron (tmTheme)" tar ((:commit . "87ae1a765e07429fec25d2f29b004f84b52d2e0a") (:authors ("Jason Milkins")) (:maintainers ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/tmtheme-to-deftheme"))]) - (boxes . [(20230326 1932) ((emacs (24 3))) "ASCII boxes unlimited!" tar ((:commit . "77d02890a749a30bc228c848ec1d4bc9b09ac6c0") (:authors ("Jason L. Shiffer" . "jshiffer@zerotao.com")) (:maintainers ("Jason L. Shiffer" . "jshiffer@zerotao.com")) (:maintainer "Jason L. Shiffer" . "jshiffer@zerotao.com") (:keywords "extensions") (:url . "https://boxes.thomasjensen.com"))]) - (boxquote . [(20220919 714) ((cl-lib (0 5))) "Quote text with a semi-box." tar ((:commit . "fe676396fa7e4372e01bf2c3d9a62e8d53615d46") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainers ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:keywords "quoting") (:url . "https://github.com/davep/boxquote.el"))]) + (boxes . [(20240217 1143) ((emacs (24 3))) "ASCII boxes unlimited!" tar ((:commit . "75dfd61801b3ec23ec30c88640ea31bbca5b36b9") (:authors ("Jason L. Shiffer" . "jshiffer@zerotao.com")) (:maintainers ("Jason L. Shiffer" . "jshiffer@zerotao.com")) (:maintainer "Jason L. Shiffer" . "jshiffer@zerotao.com") (:keywords "extensions") (:url . "https://boxes.thomasjensen.com"))]) + (boxquote . [(20231216 852) ((cl-lib (0 5))) "Quote text with a semi-box" tar ((:commit . "8d6c307ab3b783c5042065d0ae54961adb506484") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainers ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:keywords "quoting") (:url . "https://github.com/davep/boxquote.el"))]) (bpe . [(20141228 2205) ((emacs (24 1))) "Blog from Org mode to Blogger" tar ((:commit . "7b5b25f83506e6c9f4075d3803fa32404943a189") (:authors ("Yuta Yamada ")) (:maintainers ("Yuta Yamada ")) (:maintainer "Yuta Yamada ") (:keywords "blogger" "blog") (:url . "https://github.com/yuutayamada/bpe"))]) (bpftrace-mode . [(20190608 2201) ((emacs (24 0))) "Major mode for editing bpftrace script files" tar ((:commit . "587b39ea7a1d786df5c04796d51bf2a5a4eda0d7") (:authors ("Jay Kamat" . "jaygkamat@gmail.com")) (:maintainers ("Jay Kamat" . "jaygkamat@gmail.com")) (:maintainer "Jay Kamat" . "jaygkamat@gmail.com") (:keywords "highlight" "c") (:url . "http://gitlab.com/jgkamat/bpftrace-mode"))]) (bpr . [(20180220 1844) ((emacs (24))) "Background Process Runner" tar ((:commit . "af84a83dea09d86e77d87ac30604f2c5b4bf4117") (:authors ("Ilya Babanov" . "ilya-babanov@ya.ru")) (:maintainers ("Ilya Babanov" . "ilya-babanov@ya.ru")) (:maintainer "Ilya Babanov" . "ilya-babanov@ya.ru") (:keywords "background" "async" "process" "management") (:url . "https://github.com/ilya-babanov/emacs-bpr"))]) - (bqn-mode . [(20230718 141) ((emacs (26 1))) "Emacs mode for BQN" tar ((:commit . "cd7a9956a03bafbc4beff96246cad94779b953d1") (:authors ("Marshall Lochbaum" . "mwlochbaum@gmail.com")) (:maintainers ("Marshall Lochbaum" . "mwlochbaum@gmail.com")) (:maintainer "Marshall Lochbaum" . "mwlochbaum@gmail.com") (:url . "https://github.com/museoa/bqn-mode"))]) + (bqn-mode . [(20231217 1203) ((emacs (26 1))) "Emacs mode for BQN" tar ((:commit . "23fd9db096ab3a5c5fbd034e721b8a7d27d1d6b7") (:authors ("Marshall Lochbaum" . "mwlochbaum@gmail.com")) (:maintainers ("Marshall Lochbaum" . "mwlochbaum@gmail.com")) (:maintainer "Marshall Lochbaum" . "mwlochbaum@gmail.com") (:url . "https://github.com/museoa/bqn-mode"))]) (bracketed-paste . [(20160407 2348) ((emacs (24 3))) "bracketed paste mode support within emacs -nw" tar ((:commit . "843ce3bbb63d560face889e13a57a2f7543957d5") (:authors ("Takeshi Banse" . "takebi@laafc.net")) (:maintainers ("Takeshi Banse" . "takebi@laafc.net")) (:maintainer "Takeshi Banse" . "takebi@laafc.net") (:keywords "terminals"))]) (brainfuck-mode . [(20150113 842) ((langdoc (20130601 1450))) "Brainfuck mode for Emacs" tar ((:commit . "36e69552bb3b97a4f888d362c59845651bd0d492") (:authors ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainers ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainer "Tomoya Tanjo" . "ttanjo@gmail.com") (:keywords "brainfuck" "langdoc") (:url . "https://github.com/tom-tan/brainfuck-mode/"))]) (brazilian-holidays . [(20220828 2348) ((emacs (26))) "Brazilian holidays" tar ((:commit . "03206ea673df49c91a8f924db799620713d86240") (:authors ("Jaguaraquem A. Reinaldo" . "jaguar.adler@gmail.com")) (:maintainers ("Jaguaraquem A. Reinaldo" . "jaguar.adler@gmail.com")) (:maintainer "Jaguaraquem A. Reinaldo" . "jaguar.adler@gmail.com") (:keywords "calendar" "holidays" "brazilian") (:url . "https://github.com/jadler/brazilian-holidays"))]) - (brec-mode . [(20230406 1547) ((emacs (24 3))) "A major mode for editing Breccian text" tar ((:commit . "a1d519bd592d34c05f3fbaa2c209249969823fb6") (:authors ("Michael Allan" . "mike@reluk.ca")) (:maintainers ("Michael Allan" . "mike@reluk.ca")) (:maintainer "Michael Allan" . "mike@reluk.ca") (:keywords "outlines" "wp") (:url . "http://reluk.ca/project/Breccia/Emacs/"))]) + (brec-mode . [(20240319 707) ((emacs (24 3))) "A major mode for editing Breccian text" tar ((:commit . "8e344e7df829d7715f2c6341ccafce9f24cd1cb2") (:authors ("Michael Allan" . "mike@reluk.ca")) (:maintainers ("Michael Allan" . "mike@reluk.ca")) (:maintainer "Michael Allan" . "mike@reluk.ca") (:keywords "outlines" "wp") (:url . "http://reluk.ca/project/Breccia/Emacs/"))]) (brf . [(20230803 2022) ((fringe-helper (0 1 1)) (emacs (24 3))) "Brf-mode provides features from the legendary editor Brief" tar ((:commit . "8875f5fcd173e220bbfa6bf9f8f09d721a29cd50") (:authors ("Mike Woolley" . "mike@bulsara.com")) (:maintainers ("Mike Woolley" . "mike@bulsara.com")) (:maintainer "Mike Woolley" . "mike@bulsara.com") (:keywords "brief" "crisp" "emulations") (:url . "https://bitbucket.org/MikeWoolley/brf-mode"))]) (brightscript-mode . [(20220906 827) ((emacs (26 3))) "Major mode for editing Brightscript files" tar ((:commit . "025d6f5a70752c62a28d4f86c053a283b3898a49") (:authors ("Daniel Mircea" . "daniel@viseztrance.com")) (:maintainers (nil . "daniel@viseztrance.com")) (:maintainer nil . "daniel@viseztrance.com") (:keywords "languages") (:url . "https://github.com/viseztrance/brightscript-mode"))]) + (bril-mode . [(20240315 1157) ((emacs (27 1))) "Major mode for Bril text format" tar ((:commit . "da61316385e31973c462a1e8a3213327b34df3ff") (:authors ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainers ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainer "Noah Peart" . "noah.v.peart@gmail.com") (:keywords "languages" "bril") (:url . "https://github.com/nverno/bril-mode"))]) (broadcast . [(20151205 212) ((emacs (24 4))) "Links buffers together for simultaneous editing." tar ((:commit . "f6f9cd2e0e3f8c31d6b8e7446c27eb0e50b25f16") (:authors ("Russell Black" . "killdash9@github")) (:maintainers ("Russell Black" . "killdash9@github")) (:maintainer "Russell Black" . "killdash9@github") (:keywords "convenience" "frames" "link" "cursors") (:url . "https://github.com/killdash9/broadcast.el"))]) (browse-at-remote . [(20230223 554) ((f (0 20 0)) (s (1 9 0)) (cl-lib (0 5))) "Open github/gitlab/bitbucket/stash/gist/phab/sourcehut page from Emacs" tar ((:commit . "1c2a565bb7275bf78f23d471e32dd8c696523b8c") (:authors ("Rustem Muslimov" . "r.muslimov@gmail.com")) (:maintainers ("Rustem Muslimov" . "r.muslimov@gmail.com")) (:maintainer "Rustem Muslimov" . "r.muslimov@gmail.com") (:keywords "github" "gitlab" "bitbucket" "gist" "stash" "phabricator" "sourcehut" "pagure") (:url . "https://github.com/rmuslimov/browse-at-remote"))]) - (browse-kill-ring . [(20220410 1509) nil "interactively insert items from kill-ring" tar ((:commit . "6e06736a8245a8cdf436f6585c71439239219836") (:authors ("Colin Walters" . "walters@verbum.org")) (:maintainers ("browse-kill-ring" . "browse-kill-ring@tonotdo.com")) (:maintainer "browse-kill-ring" . "browse-kill-ring@tonotdo.com") (:keywords "convenience") (:url . "https://github.com/browse-kill-ring/browse-kill-ring"))]) + (browse-kill-ring . [(20231104 1450) nil "interactively insert items from kill-ring" tar ((:commit . "03cc18c08a549568edb6bc710c307c19bc507ef3") (:authors ("Colin Walters" . "walters@verbum.org")) (:maintainers ("browse-kill-ring" . "browse-kill-ring@tonotdo.com")) (:maintainer "browse-kill-ring" . "browse-kill-ring@tonotdo.com") (:keywords "convenience") (:url . "https://github.com/browse-kill-ring/browse-kill-ring"))]) (browse-url-dwim . [(20140731 1922) ((string-utils (0 3 2))) "Context-sensitive external browse URL or Internet search" tar ((:commit . "11f1c53126619c7ef1bb5f5d6914ce0b3cce0e30") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "hypermedia") (:url . "http://github.com/rolandwalker/browse-url-dwim"))]) - (brutalist-theme . [(20220507 909) nil "Brutalist theme" tar ((:commit . "bee6cb25819007e20cde2782a6fcb577028dd038") (:authors ("Gergely Nagy")) (:maintainers ("Gergely Nagy")) (:maintainer "Gergely Nagy") (:url . "https://git.madhouse-project.org/algernon/brutalist-theme.el"))]) + (brutalist-theme . [(20231120 721) nil "Brutalist theme" tar ((:commit . "c387f3f0aaae147270c61dcd3140fb4eb20965ad") (:authors ("Gergely Nagy")) (:maintainers ("Gergely Nagy")) (:maintainer "Gergely Nagy") (:url . "https://git.madhouse-project.org/algernon/brutalist-theme.el"))]) (bshell . [(20230805 1646) ((emacs (26)) (buffer-manage (1 1))) "Manage and track multiple inferior shells" tar ((:commit . "57f3409168ec9649508e3ee30d0d2de8f81b960e") (:authors ("Paul Landes")) (:maintainers ("Paul Landes")) (:maintainer "Paul Landes") (:keywords "unix" "interactive" "shell" "management") (:url . "https://github.com/plandes/bshell"))]) (btc-ticker . [(20220409 1647) ((json (1 2)) (request (0 2 0))) "Shows latest bitcoin price" tar ((:commit . "2ed18ac6338d5fe98c578f0875840af07f0bc42a") (:authors ("Jorge Niedbalski R." . "jnr@metaklass.org")) (:maintainers ("Jorge Niedbalski R." . "jnr@metaklass.org")) (:maintainer "Jorge Niedbalski R." . "jnr@metaklass.org") (:keywords "news"))]) (bts . [(20151109 1333) ((widget-mvc (0 0 2)) (log4e (0 3 0)) (yaxception (0 3 3)) (dash (2 9 0)) (s (1 9 0)) (pos-tip (0 4 5))) "A unified UI for various bug tracking systems" tar ((:commit . "df42d58a36447697f93b56e69f5e700b2baef1f9") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "convenience") (:url . "https://github.com/aki2o/emacs-bts"))]) @@ -403,18 +414,18 @@ (bubbleberry-theme . [(20141017 944) ((emacs (24 1))) "A theme based on LightTable for Emacs24" tar ((:commit . "22e9adf4586414024e4592972022ec297321b320") (:authors ("Jason Milkins" . "jasonm23@gmail.com") ("Gaurav Giri github.com/grvgr")) (:maintainers ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com") (:url . "https://github.com/jasonm23/emacs-bubbleberry-theme"))]) (buckwalter . [(20191119 1950) nil "Write arabic using Buckwalter transliteration" tar ((:commit . "1ef6f210f38c0686bc5b445b9704190f168f30ea") (:authors ("Joe HAKIM RAHME" . "joehakimrahme@gmail.com")) (:maintainers ("Joe HAKIM RAHME" . "joehakimrahme@gmail.com")) (:maintainer "Joe HAKIM RAHME" . "joehakimrahme@gmail.com") (:keywords "arabic" "transliteration" "i18n") (:url . "https://github.com/joehakimrahme/buckwalter-arabic"))]) (buffer-buttons . [(20150106 1439) nil "Define, save, and load code-safe buttons in files for emacs" tar ((:commit . "2feb8494fa7863b98256bc85da670d74a3a8a975") (:authors ("Ryan Pavlik" . "rpavlik@gmail.com")) (:maintainers ("Ryan Pavlik" . "rpavlik@gmail.com")) (:maintainer "Ryan Pavlik" . "rpavlik@gmail.com") (:url . "https://github.com/rpav/buffer-buttons"))]) - (buffer-env . [(20221110 2137) ((emacs (27 1)) (compat (28 1))) "Buffer-local process environments" tar ((:commit . "1817692a5a7751601e8a96d905dc94bfa6b1d485") (:authors ("Augusto Stoffel" . "arstoffel@gmail.com")) (:maintainers ("Augusto Stoffel" . "arstoffel@gmail.com")) (:maintainer "Augusto Stoffel" . "arstoffel@gmail.com") (:keywords "processes" "tools") (:url . "https://github.com/astoff/buffer-env"))]) + (buffer-env . [(20240313 1812) ((emacs (27 1)) (compat (29 1))) "Buffer-local process environments" tar ((:commit . "6d70dc4db21821b67ee2b5438f00866dbb8ac01a") (:authors ("Augusto Stoffel" . "arstoffel@gmail.com")) (:maintainers ("Augusto Stoffel" . "arstoffel@gmail.com")) (:maintainer "Augusto Stoffel" . "arstoffel@gmail.com") (:keywords "processes" "tools") (:url . "https://github.com/astoff/buffer-env"))]) (buffer-flip . [(20220718 10) ((cl-lib (0 5))) "Cycle through buffers like Alt-Tab in Windows" tar ((:commit . "dda0cbcd202cdadf322942f9637a11ed92525756") (:authors ("Russell Black" . "killdash9@github")) (:maintainers ("Russell Black" . "killdash9@github")) (:maintainer "Russell Black" . "killdash9@github") (:keywords "convenience") (:url . "https://github.com/killdash9/buffer-flip.el"))]) (buffer-manage . [(20211122 1957) ((emacs (26 1)) (choice-program (0 13)) (dash (2 17 0))) "Manage buffers" tar ((:commit . "819bbfd9ae2f028361f484bc3b60d751623a2df5") (:authors ("Paul Landes")) (:maintainers ("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" tar ((:commit . "e7800b3ab1bd76ee475ef35507ec51ecd5a3f065") (:keywords "convenience") (:url . "https://github.com/lukhas/buffer-move/"))]) - (buffer-name-relative . [(20230625 347) ((emacs (28 1))) "Relative buffer names" tar ((:commit . "6c1e98f761344b2d2d51f38d587161f71ca0e750") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:keywords "convenience") (:url . "https://codeberg.com/ideasman42/emacs-buffer-name-relative"))]) + (buffer-name-relative . [(20240204 1219) ((emacs (28 1))) "Relative buffer names" tar ((:commit . "b1e878e97df0cd02348e1aed95738c0c3a32f148") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:keywords "convenience") (:url . "https://codeberg.org/ideasman42/emacs-buffer-name-relative"))]) (buffer-ring . [(20220120 124) ((emacs (25 1)) (dynaring (0 3)) (s (1 12 0)) (ht (2 0))) "Rings and tori for buffer navigation" tar ((:commit . "177d67238c4d126a0270585e21c0f03ae750ca2a") (:authors ("Mike Mattie" . "codermattie@gmail.com") ("Sid Kasivajhula" . "sid@countvajhula.com")) (:maintainers ("Sid Kasivajhula" . "sid@countvajhula.com")) (:maintainer "Sid Kasivajhula" . "sid@countvajhula.com") (:url . "https://github.com/countvajhula/buffer-ring"))]) (buffer-sets . [(20230319 1822) ((cl-lib (0 5))) "Sets of Buffers for Buffer Management" tar ((:commit . "951e894ef96d533324f7f24c2a0def45ae89d558") (:authors ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainers ("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" tar ((:commit . "32e1f23817b9c6caedb53e5359baad29e99eaa2b") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("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" tar ((:commit . "b32c67c8a5d724257d759f4c903d0dedc32246ef") (:authors ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainers ("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" tar ((:commit . "b6b2118f59b8152fa02bd0b09d65a1f8ade4141b") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("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"))]) + (buffer-wrap . [(20240101 935) ((emacs (24 4))) "Wrap the beginning and the end of buffer" tar ((:commit . "c2d12ef25ffac4827dc598d81fac75cb865663b6") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("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"))]) (bufferbin . [(20230706 110) ((emacs (26 1))) "Quick mouse access to buffers" tar ((:commit . "ee4bf49cc69573f690e2e9f36f03c20b322c1730") (:authors ("Ryan Walsh" . "blueridge-data@github")) (:maintainers ("Ryan Walsh" . "blueridge-data@github")) (:maintainer "Ryan Walsh" . "blueridge-data@github") (:url . "https://github.com/blueridge-data/bufferbin"))]) - (bufler . [(20230830 518) ((emacs (26 3)) (dash (2 18)) (f (0 17)) (pretty-hydra (0 2 2)) (magit-section (0 1)) (map (2 1))) "Group buffers into workspaces with programmable rules" tar ((:commit . "06d67144778f80a19db58aef1495ba18bbbba147") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "convenience") (:url . "https://github.com/alphapapa/bufler.el"))]) + (bufler . [(20240312 552) ((emacs (26 3)) (burly (0 4 -1)) (dash (2 18)) (f (0 17)) (pretty-hydra (0 2 2)) (magit-section (0 1)) (map (2 1))) "Group buffers into workspaces with programmable rules" tar ((:commit . "ef3b28bbdcb1e813a1d5b06a91d09774998967c5") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "convenience") (:url . "https://github.com/alphapapa/bufler.el"))]) (bufshow . [(20130726 1838) ((emacs (24 1))) "A simple presentation tool for Emacs." tar ((:commit . "42d7fb74c3f914e127d5447c63d209bf19f5d517") (:authors ("Peter Jones" . "pjones@pmade.com")) (:maintainers ("Peter Jones" . "pjones@pmade.com")) (:maintainer "Peter Jones" . "pjones@pmade.com") (:url . "https://github.com/pjones/bufshow"))]) (bug-reference-github . [(20200206 2158) nil "Set `bug-reference-url-format' in Github repos" tar ((:commit . "4e848472a5be464a3bc10a3c917322d1e344951a") (:authors ("Arne Jørgensen" . "arne@arnested.dk")) (:maintainers ("Arne Jørgensen" . "arne@arnested.dk")) (:maintainer "Arne Jørgensen" . "arne@arnested.dk") (:keywords "programming" "tools") (:url . "https://github.com/arnested/bug-reference-github"))]) (bui . [(20210108 1141) ((emacs (24 3)) (dash (2 11 0))) "Buffer interface library" tar ((:commit . "ab62fcefc3c7ddf5e5d64c18045148a3c297592d") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainers ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:keywords "tools") (:url . "https://github.com/alezost/bui.el"))]) @@ -422,17 +433,17 @@ (build-helper . [(20161009 1755) ((projectile (0 9 0))) "Utilities to help build code" tar ((:commit . "d1962858734253eca791721ccf62d1c4a10719f5") (:authors ("Afonso Bordado" . "afonsobordado@az8.co")) (:maintainers ("Afonso Bordado" . "afonsobordado@az8.co")) (:maintainer "Afonso Bordado" . "afonsobordado@az8.co") (:keywords "convenience") (:url . "http://github.com/afonso360/build-helper"))]) (build-status . [(20190807 1231) ((cl-lib (0 5))) "Mode line build status indicator" tar ((:commit . "1a1d2473aa62f2fdda47d8bfeb9fe352d2579b48") (:authors ("Skye Shaw" . "skye.shaw@gmail.com")) (:maintainers ("Skye Shaw" . "skye.shaw@gmail.com")) (:maintainer "Skye Shaw" . "skye.shaw@gmail.com") (:keywords "mode-line" "ci" "circleci" "travis-ci") (:url . "http://github.com/sshaw/build-status"))]) (bundler . [(20200129 1338) ((inf-ruby (2 1)) (cl-lib (0 5))) "Interact with Bundler from Emacs" tar ((:commit . "43efb6be4ed118b06d787ce7fbcffd68a31732a7") (:authors ("Tobias Svensson" . "tob@tobiassvensson.co.uk")) (:maintainers ("Tobias Svensson" . "tob@tobiassvensson.co.uk")) (:maintainer "Tobias Svensson" . "tob@tobiassvensson.co.uk") (:keywords "bundler" "ruby") (:url . "http://github.com/endofunky/bundler.el"))]) - (burly . [(20221024 2019) ((emacs (27 1)) (map (2 1))) "Save and restore frame/window configurations with buffers" tar ((:commit . "f570fa87ee72a451f535cfb038d81798a01a7e20") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "convenience") (:url . "https://github.com/alphapapa/burly.el"))]) + (burly . [(20231218 1045) ((emacs (27 1)) (map (2 1))) "Save and restore frame/window configurations with buffers" tar ((:commit . "6626df0c2054cb0662bf113ba4cbad641b588d0f") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "convenience") (:url . "https://github.com/alphapapa/burly.el"))]) (burnt-toast . [(20201113 814) ((emacs (25 1)) (dash (2 10)) (alert (1 2))) "Elisp integration with the BurntToast PowerShell module" tar ((:commit . "e9cf41928b7b502fdfa43718c35a24e503db32e2") (:authors ("Sam Cedarbaum" . "scedarbaum@gmail.com")) (:maintainers ("Sam Cedarbaum" . "scedarbaum@gmail.com")) (:maintainer "Sam Cedarbaum" . "scedarbaum@gmail.com") (:keywords "alert" "notifications" "powershell" "comm") (:url . "https://github.com/cedarbaum/burnt-toast.el"))]) (bury-successful-compilation . [(20181106 403) nil "Bury the *compilation* buffer after successful compilation" tar ((:commit . "674644c844184605a1bb4f9487a60f7a780a6fe7") (:authors ("Eric Crosson" . "esc@ericcrosson.com")) (:maintainers ("Eric Crosson" . "esc@ericcrosson.com")) (:maintainer "Eric Crosson" . "esc@ericcrosson.com") (:keywords "compilation"))]) (buster-mode . [(20140928 1213) nil "Minor mode to speed up development when writing tests with Buster.js" tar ((:commit . "de6958ef8369400922618b8d1e99abfa91b97ac5") (:keywords "buster" "testing" "javascript"))]) (buster-snippets . [(20151125 1010) ((yasnippet (0 8 0))) "Yasnippets for the Buster javascript testing framework" tar ((:commit . "bb8769dae132659858e74d52f3f4e8790399423a") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainers ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:keywords "snippets"))]) (busybee-theme . [(20170719 928) nil "port of vim's mustang theme" tar ((:commit . "66b2315b030582d0ebee605cf455d386d8c30fcd") (:authors ("martin haesler")) (:maintainers ("martin haesler")) (:maintainer "martin haesler") (:url . "http://github.com/mswift42/busybee-theme"))]) (butler . [(20210928 230) ((deferred (0 3 2)) (json (1 2)) (emacs (24))) "Emacs client for Jenkins" tar ((:commit . "10943ccdf2030187b2f7bd97337d78acb7fd31c9") (:authors ("Ashton Kemerling" . "ashtonkemerling@gmail.com")) (:maintainer "Ashton Kemerling" . "ashtonkemerling@gmail.com") (:keywords "jenkins" "hudson" "ci") (:url . "http://www.github.com/AshtonKem/Butler.git"))]) - (buttercup . [(20230418 819) ((emacs (24 3))) "Behavior-Driven Emacs Lisp Testing" tar ((:commit . "30c703d215b075aaede936a2c424f65b5f7b6391") (:authors ("Jorgen Schaefer" . "contact@jorgenschaefer.de")) (:maintainers ("Ola Nilsson" . "ola.nilsson@gmail.com")) (:maintainer "Ola Nilsson" . "ola.nilsson@gmail.com") (:url . "https://github.com/jorgenschaefer/emacs-buttercup"))]) + (buttercup . [(20240315 629) ((emacs (24 4))) "Behavior-Driven Emacs Lisp Testing" tar ((:commit . "2cb6d0cc1af23fd5a0c02a3339c14b5e811eb904") (:authors ("Jorgen Schaefer" . "contact@jorgenschaefer.de")) (:maintainers ("Ola Nilsson" . "ola.nilsson@gmail.com")) (:maintainer "Ola Nilsson" . "ola.nilsson@gmail.com") (:url . "https://github.com/jorgenschaefer/emacs-buttercup"))]) (buttercup-junit . [(20190802 2258) ((emacs (24 3)) (buttercup (1 15))) "JUnit reporting for Buttercup" tar ((:commit . "6bc28b6b0f36fb71b0915c9e45963c840c64a8df") (:authors ("Ola Nilsson" . "ola.nilsson@gmail.com")) (:maintainers ("Ola Nilsson" . "ola.nilsson@gmail.com")) (:maintainer "Ola Nilsson" . "ola.nilsson@gmail.com") (:keywords "tools" "test" "unittest" "buttercup" "ci") (:url . "https://bitbucket.org/olanilsson/buttercup-junit"))]) (button-lock . [(20230304 2212) nil "Clickable text defined by regular expression" tar ((:commit . "1f7a89ca05b6167af7d1337ad23a5d923486caac") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "mouse" "button" "hypermedia" "extensions") (:url . "http://github.com/rolandwalker/button-lock"))]) - (buttons . [(20230628 2340) ((emacs (24 1)) (cl-lib (0 3))) "Define and visualize hierarchies of keymaps" tar ((:commit . "ae97996cc52bf0523f5b6626db14987c3b56b3e2") (:authors ("Ernesto Alfonso")) (:maintainers (nil . "(concat \"erjoalgo\" \"@\" \"gmail\" \".com\")")) (:maintainer nil . "(concat \"erjoalgo\" \"@\" \"gmail\" \".com\")") (:keywords "lisp" "extensions" "convenience" "tools") (:url . "http://github.com/erjoalgo/emacs-buttons"))]) + (buttons . [(20230906 1631) ((emacs (24 1)) (cl-lib (0 3))) "Define and visualize hierarchies of keymaps" tar ((:commit . "6fd4a9b3f8b9d2344a316b0fd6576d90f53f5acb") (:authors ("Ernesto Alfonso")) (:maintainers (nil . "(concat \"erjoalgo\" \"@\" \"gmail\" \".com\")")) (:maintainer nil . "(concat \"erjoalgo\" \"@\" \"gmail\" \".com\")") (:keywords "lisp" "extensions" "convenience" "tools") (:url . "http://github.com/erjoalgo/emacs-buttons"))]) (c-c-combo . [(20151224 255) nil "Make stuff happen when you reach a target wpm" tar ((:commit . "a261a833499a7fdc29610863b3aafc74818770ba") (:authors ("Diego Berrocal" . "cestdiego@gmail.com")) (:maintainers ("Diego Berrocal" . "cestdiego@gmail.com")) (:maintainer "Diego Berrocal" . "cestdiego@gmail.com") (:url . "https://www.github.com/CestDiego/c-c-combo.el"))]) (c-eldoc . [(20201004 2347) nil "helpful description of the arguments to C functions" tar ((:commit . "f4ede1f37f6de583376669735326367d84a0a917") (:authors ("Nathaniel Flath" . "flat0103@gmail.com")) (:maintainers ("Nathaniel Flath" . "flat0103@gmail.com")) (:maintainer "Nathaniel Flath" . "flat0103@gmail.com") (:url . "http://github.com/nflath/c-eldoc"))]) (c-eval . [(20210611 705) ((emacs (24 5))) "Compile and run one-off C code snippets" tar ((:commit . "fd129bfcb75475ac6820cc33862bd8efb8097fae") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "c" "languages") (:url . "https://github.com/lassik/emacs-c-eval"))]) @@ -454,45 +465,46 @@ (calfw-howm . [(20170704 4) nil "calendar view for howm" tar ((:commit . "bcfc0c546c3c58e1f635a9a29efdf56c9421a3ce") (:authors ("SAKURAI Masashi ")) (:maintainers ("SAKURAI Masashi ")) (:maintainer "SAKURAI Masashi ") (:keywords "calendar"))]) (calfw-ical . [(20170411 220) nil "calendar view for ical format" tar ((:commit . "c538d3746449b4f0e16b16aad3073d4f7379d805") (:authors ("SAKURAI Masashi ")) (:maintainers ("SAKURAI Masashi ")) (:maintainer "SAKURAI Masashi ") (:keywords "calendar"))]) (calfw-org . [(20170411 220) nil "calendar view for org-agenda" tar ((:commit . "c538d3746449b4f0e16b16aad3073d4f7379d805") (:authors ("SAKURAI Masashi ")) (:maintainers ("SAKURAI Masashi ")) (:maintainer "SAKURAI Masashi ") (:keywords "calendar" "org"))]) - (calibredb . [(20230809 927) ((emacs (25 1)) (org (9 3)) (transient (0 1 0)) (s (1 12 0)) (dash (2 17 0)) (request (0 3 3)) (esxml (0 3 7))) "Yet another calibre client" tar ((:commit . "588039aeb471c0bdabea36dab5e1c37441d38fed") (:authors ("Damon Chan" . "elecming@gmail.com")) (:maintainers ("Damon Chan" . "elecming@gmail.com")) (:maintainer "Damon Chan" . "elecming@gmail.com") (:keywords "tools") (:url . "https://github.com/chenyanming/calibredb.el"))]) + (calibredb . [(20231107 302) ((emacs (25 1)) (org (9 3)) (transient (0 1 0)) (s (1 12 0)) (dash (2 17 0)) (request (0 3 3)) (esxml (0 3 7))) "Yet another calibre client" tar ((:commit . "124c916f203511c64d03fac28d303dfb102a6ead") (:authors ("Damon Chan" . "elecming@gmail.com")) (:maintainers ("Damon Chan" . "elecming@gmail.com")) (:maintainer "Damon Chan" . "elecming@gmail.com") (:keywords "tools") (:url . "https://github.com/chenyanming/calibredb.el"))]) (call-graph . [(20230222 525) ((emacs (25 1)) (hierarchy (0 7 0)) (tree-mode (1 0 0)) (ivy (0 10 0)) (beacon (1 3 4))) "Generate call graph for c/c++ functions" tar ((:commit . "5fd5f3aad35e3561c253870e4d7fa34353b70b7b") (:authors ("Huming Chen" . "chenhuming@gmail.com")) (:maintainers ("Huming Chen" . "chenhuming@gmail.com")) (:maintainer "Huming Chen" . "chenhuming@gmail.com") (:keywords "programming" "convenience") (:url . "https://github.com/beacoder/call-graph"))]) (calmer-forest-theme . [(20230302 2149) nil "Darkish theme with green/orange tint" tar ((:commit . "09fc50730ea386d3589863f8809e02e5bdd459cf") (:authors ("Artur Hefczyc, created 2003-04-18") ("David Caldwell" . "david@porkrind.org")) (:maintainers ("Artur Hefczyc, created 2003-04-18")) (:maintainer "Artur Hefczyc, created 2003-04-18") (:url . "https://github.com/caldwell/calmer-forest-theme"))]) (camcorder . [(20190317 2138) ((emacs (24)) (names (20150000)) (cl-lib (0 5))) "Record screencasts in gif or other formats." tar ((:commit . "b11ca61491a27681bb3131b72b51c105fd996bed") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainers ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com") (:keywords "multimedia" "screencast") (:url . "http://github.com/Bruce-Connor/camcorder.el"))]) - (caml . [(20230129 1145) ((emacs (24 3))) "Caml mode for GNU Emacs" tar ((:commit . "959a5a27bfdbaa43a9ff99be136d62e0798f5e01") (:authors ("Jacques Garrigue" . "garrigue@kurims.kyoto-u.ac.jp") ("Ian T Zimmerman" . "itz@rahul.net") ("Damien Doligez" . "damien.doligez@inria.fr")) (:maintainers ("Christophe Troestler" . "Christophe.Troestler@umons.ac.be")) (:maintainer "Christophe Troestler" . "Christophe.Troestler@umons.ac.be") (:keywords "ocaml") (:url . "https://github.com/ocaml/caml-mode"))]) + (caml . [(20231011 328) ((emacs (24 4))) "Caml mode for GNU Emacs" tar ((:commit . "47defafa2b08fb680e89bfee9cb9ce82bd9e3bcf") (:authors ("Jacques Garrigue" . "garrigue@kurims.kyoto-u.ac.jp") ("Ian T Zimmerman" . "itz@rahul.net") ("Damien Doligez" . "damien.doligez@inria.fr")) (:maintainers ("Christophe Troestler" . "Christophe.Troestler@umons.ac.be")) (:maintainer "Christophe Troestler" . "Christophe.Troestler@umons.ac.be") (:keywords "ocaml") (:url . "https://github.com/ocaml/caml-mode"))]) (cangjie . [(20230219 1150) ((emacs (24 4)) (s (1 12 0)) (dash (2 14 1)) (f (0 2 0))) "Retrieve cangjie code for han characters" tar ((:commit . "d6882e15f47fdde37e9f739dde604d77d25f11db") (:keywords "convenience" "writing") (:url . "https://github.com/kisaragi-hiu/cangjie.el"))]) - (cape . [(20230820 1609) ((emacs (27 1)) (compat (29 1 4 2))) "Completion At Point Extensions" tar ((:commit . "4645762f1acfa7203f587e5757d60483e7c04e4a") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainers ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:keywords "abbrev" "convenience" "matching" "completion" "wp") (:url . "https://github.com/minad/cape"))]) + (cape . [(20240315 542) ((emacs (27 1)) (compat (29 1 4 4))) "Completion At Point Extensions" tar ((:commit . "a397a0c92de38277b7f835fa999fac400a764908") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainers ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:keywords "abbrev" "convenience" "matching" "completion" "text") (:url . "https://github.com/minad/cape"))]) (capnp-mode . [(20210707 2310) nil "Major mode for editing Capn' Proto Files" tar ((:commit . "f7fccad7d737f77896211bec1173117497634143") (:authors ("Brian Taylor" . "el.wubo@gmail.com")) (:maintainers ("Brian Taylor" . "el.wubo@gmail.com")) (:maintainer "Brian Taylor" . "el.wubo@gmail.com") (:url . "https://github.com/capnproto/capnproto"))]) (capture . [(20130828 1644) nil "screencasting with \"avconv\" or \"ffmpeg\"" tar ((:commit . "9140c207b48b3520a2f06674b3e1bee2fc92b80c") (:authors ("Sergey Pashinin ")) (:maintainers ("Sergey Pashinin ")) (:maintainer "Sergey Pashinin "))]) (carbon-now-sh . [(20220701 332) ((emacs (24 4))) "https://carbon.now.sh integration." tar ((:commit . "e66f2e43e288f35ad9075f5fc84d59ad348efc88") (:authors ("Vitalii Elenhaupt")) (:maintainers ("Vitalii Elenhaupt")) (:maintainer "Vitalii Elenhaupt") (:keywords "convenience") (:url . "https://github.com/veelenga/carbon-now-sh.el"))]) (cardano-tx . [(20230606 1150) ((emacs (27 1)) (f (0 20 0)) (yasnippet (0 14 0)) (yaml-mode (0 0 15)) (yaml (0 1 0)) (helm (3 6 2)) (cbor (0 2 5)) (bech32 (0 2 1)) (readable-numbers (0 1 0)) (emacsql (3 0 0)) (emacsql-sqlite (3 1 1))) "Cardano transaction editor" tar ((:commit . "cf85424b305e8f89debb756dc67eebc84639f711") (:authors ("Oscar Najera ")) (:maintainers ("Oscar Najera" . "hi@oscarnajera.com")) (:maintainer "Oscar Najera" . "hi@oscarnajera.com") (:url . "https://github.com/Titan-C/cardano.el"))]) (cardano-wallet . [(20230606 1150) ((emacs (27 1)) (yaml (0 1 0)) (dash (2 19 0)) (yaml-mode (0 0 15)) (readable-numbers (0 1 0)) (cardano-tx (0 1 2))) "Interact with cardano wallet" tar ((:commit . "cf85424b305e8f89debb756dc67eebc84639f711") (:authors ("Oscar Najera ")) (:maintainers ("Oscar Najera" . "hi@oscarnajera.com")) (:maintainer "Oscar Najera" . "hi@oscarnajera.com") (:url . "https://github.com/Titan-C/cardano.el"))]) - (cargo . [(20230125 1253) ((emacs (24 3)) (markdown-mode (2 4))) "Emacs Minor Mode for Cargo, Rust's Package Manager." tar ((:commit . "225fdb846c702a193e58a98c1585bb3586a9aa86") (:authors ("Kevin W. van Rooijen")) (:maintainers ("Kevin W. van Rooijen")) (:maintainer "Kevin W. van Rooijen") (:keywords "tools"))]) - (cargo-mode . [(20230213 401) ((emacs (25 1))) "Cargo Major Mode. Cargo is the Rust package manager" tar ((:commit . "6e128f08692aae5723122e039e8871a57141e868") (:authors ("Ayrat Badykov" . "ayratin555@gmail.com")) (:maintainers ("Ayrat Badykov" . "ayratin555@gmail.com")) (:maintainer "Ayrat Badykov" . "ayratin555@gmail.com") (:keywords "tools") (:url . "https://github.com/ayrat555/cargo-mode"))]) + (cargo . [(20231229 915) ((emacs (24 3)) (markdown-mode (2 4))) "Emacs Minor Mode for Cargo, Rust's Package Manager." tar ((:commit . "7f8466063381eed05d4e222ce822b1dd44e3bf17") (:authors ("Kevin W. van Rooijen")) (:maintainers ("Kevin W. van Rooijen")) (:maintainer "Kevin W. van Rooijen") (:keywords "tools"))]) + (cargo-mode . [(20240116 1949) ((emacs (25 1))) "Cargo Major Mode. Cargo is the Rust package manager" tar ((:commit . "c2df42d18afe2fbc3fde0be3e8b2abeecb3b00c8") (:authors ("Ayrat Badykov" . "ayratin555@gmail.com")) (:maintainers ("Ayrat Badykov" . "ayratin555@gmail.com")) (:maintainer "Ayrat Badykov" . "ayratin555@gmail.com") (:keywords "tools") (:url . "https://github.com/ayrat555/cargo-mode"))]) (cargo-transient . [(20230512 131) ((emacs (28 1))) "A transient UI for Cargo, Rust's package manager" tar ((:commit . "34d63dfb99ee9a6068dadd6390763c9735c17a85") (:authors ("Peter Stuart" . "peter@peterstuart.org")) (:maintainers ("Peter Stuart" . "peter@peterstuart.org")) (:maintainer "Peter Stuart" . "peter@peterstuart.org") (:url . "https://github.com/peterstuart/cargo-transient"))]) (caroline-theme . [(20160318 520) ((emacs (24))) "A trip down to New Orleans..." tar ((:commit . "222fd483db304509f9e422dc82883d808e023ceb") (:authors ("Jack Killilea" . "jaaacckz1@gmail.com")) (:maintainers ("Jack Killilea" . "jaaacckz1@gmail.com")) (:maintainer "Jack Killilea" . "jaaacckz1@gmail.com") (:url . "https://github.com/xjackk/carolines-theme"))]) (cascading-dir-locals . [(20211013 1955) ((emacs (26 1))) "Apply all (!) .dir-locals.el from root to current directory" tar ((:commit . "345d4b70e837d45ee84014684127e7399932d5e6") (:authors ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainers ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainer "Fritz Grabo" . "hello@fritzgrabo.com") (:keywords "convenience") (:url . "https://github.com/fritzgrabo/cascading-dir-locals"))]) (caseformat . [(20160115 1615) ((emacs (24)) (cl-lib (0 5)) (dash (2 12 1)) (s (1 10 0))) "Format based letter case converter" tar ((:commit . "e4961889309408b3425da9b69c16ddfadd17a674") (:authors ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainers ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainer "Hiroki YAMAKAWA" . "s06139@gmail.com") (:keywords "convenience") (:url . "https://github.com/HKey/caseformat"))]) - (caser . [(20230828 402) ((emacs (29 1))) "Change text casing from camelCase to dash-case to snake_case" tar ((:commit . "3d55de4dd2e4be5f2641a4c2388e8ea84c9d5b14") (:url . "https://hg.sr.ht/~zck/caser.el"))]) + (caser . [(20230901 526) ((emacs (29 1))) "Change text casing from camelCase to dash-case to snake_case" tar ((:commit . "4df467dc50a09bf5a0c6cc0ce8b2720cbf5c3879") (:url . "https://hg.sr.ht/~zck/caser.el"))]) (cask-mode . [(20160410 1449) ((emacs (24 3))) "major mode for editing Cask files" tar ((:commit . "c97755267b7215f02df7b0c16b4210c04aee6566") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))]) (cask-package-toolset . [(20170921 2256) ((emacs (24)) (cl-lib (0 3)) (s (1 6 1)) (dash (1 8 0)) (f (0 10 0)) (commander (0 2 0)) (ansi (0 1 0)) (shut-up (0 1 0))) "Toolsettize your package" tar ((:commit . "2c74cd827e88c7f8360581a841e45f0b794510e7") (:authors ("Adrien Becchis" . "adriean.khisbe@live.fr")) (:maintainers ("Adrien Becchis" . "adriean.khisbe@live.fr")) (:maintainer "Adrien Becchis" . "adriean.khisbe@live.fr") (:keywords "convenience" "tools") (:url . "http://github.com/AdrieanKhisbe/cask-package-toolset.el"))]) (caskxy . [(20140513 1539) ((log4e (0 2 0)) (yaxception (0 1))) "Control Cask in Emacs" tar ((:commit . "279f3ab79bd77fe69cb3148a79896b9bf118a9b3") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "convenience") (:url . "https://github.com/aki2o/caskxy"))]) (catmacs . [(20170826 1157) ((emacs (24))) "Simple CAT interface for Yaesu Transceivers." tar ((:commit . "6ea9ee195661fe95355413856476c45dcc8e24e8") (:authors ("Frank Singleton" . "b17flyboy@gmail.com")) (:maintainers ("Frank Singleton" . "b17flyboy@gmail.com")) (:maintainer "Frank Singleton" . "b17flyboy@gmail.com") (:keywords "comm" "hardware") (:url . "https://bitbucket.org/pymaximus/catmacs"))]) - (catppuccin-theme . [(20230812 31) ((emacs (25 1))) "Catppuccin for Emacs - 🍄 Soothing pastel theme for Emacs" tar ((:commit . "7bd297677be5fbcffbbcbacbb1b47a0866b22339") (:authors ("nyxkrage")) (:maintainers ("Carsten Kragelund" . "carsten@kragelund.me")) (:maintainer "Carsten Kragelund" . "carsten@kragelund.me") (:url . "https://github.com/catppuccin/emacs"))]) + (catppuccin-theme . [(20231213 1318) ((emacs (25 1))) "Catppuccin for Emacs - 🍄 Soothing pastel theme for Emacs" tar ((:commit . "1e9bdb0c19bf13c27a32b1adeabcace45fcbfd15") (:authors ("nyxkrage")) (:maintainers ("Carsten Kragelund" . "carsten@kragelund.me")) (:maintainer "Carsten Kragelund" . "carsten@kragelund.me") (:url . "https://github.com/catppuccin/emacs"))]) (cats . [(20230407 1316) ((emacs (26 1))) "Monads for Elisp" tar ((:commit . "7fc70db0eeb2c33ffba5c13c4cdc0f31c7b95537") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:url . "https://github.com/Fuco1/emacs-cats"))]) (cbm . [(20171116 1240) ((cl-lib (0 5))) "Switch to similar buffers." tar ((:commit . "5b41c936ba9f6d170309a85ffebc9939c1050b31") (:authors ("Lukas Fürmetz" . "fuermetz@mailbox.org")) (:maintainers ("Lukas Fürmetz" . "fuermetz@mailbox.org")) (:maintainer "Lukas Fürmetz" . "fuermetz@mailbox.org") (:keywords "buffers") (:url . "http://github.com/akermu/cbm.el"))]) (cbor . [(20230810 1653) ((emacs (25 1))) "CBOR utilities" tar ((:commit . "ba624ad3f8b726bee1d8dcb0a2a9e2b658bb4c9b") (:authors ("Oscar Najera ")) (:maintainers ("Oscar Najera" . "hi@oscarnajera.com")) (:maintainer "Oscar Najera" . "hi@oscarnajera.com") (:url . "https://github.com/Titan-C/cardano.el"))]) - (cc-cedict . [(20210814 819) ((emacs (26 1))) "Interface to CC-CEDICT (a Chinese-English dictionary)" tar ((:commit . "03fbe7d1589d36f627ef9fe7b86f9fe6f623cbb3") (:authors ("Xu Chunyang")) (:maintainers ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:url . "https://github.com/xuchunyang/cc-cedict.el"))]) + (cc-cedict . [(20231209 1109) ((emacs (26 1))) "Interface to CC-CEDICT (a Chinese-English dictionary)" tar ((:commit . "0c124beae160d5ff9be927bfb5e1a5fd8d50817a") (:authors ("Xu Chunyang")) (:maintainers ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:url . "https://github.com/xuchunyang/cc-cedict.el"))]) + (cc-isearch-menu . [(20240320 532) ((emacs (29 1))) "A Transient menu for isearch" tar ((:commit . "4ffb8c42b84a2b3c1773d285980b46110920928e") (:authors ("Charles Choi" . "kickingvegas@gmail.com")) (:maintainers ("Charles Choi" . "kickingvegas@gmail.com")) (:maintainer "Charles Choi" . "kickingvegas@gmail.com") (:keywords "wp") (:url . "https://github.com/kickingvegas/cc-isearch-menu"))]) (ccc . [(20210501 820) nil "buffer local cursor color control library" tar ((:commit . "36fb9f7e527f975d333887fd0cca4d611ae1ab23") (:authors ("Masatake YAMATO" . "masata-y@is.aist-nara.ac.jp")) (:maintainers ("SKK Development Team")) (:maintainer "SKK Development Team") (:keywords "cursor") (:url . "https://github.com/skk-dev/ddskk"))]) - (ccls . [(20230815 731) ((emacs (27 1)) (lsp-mode (6 3 1)) (dash (2 14 1))) "ccls client for lsp-mode" tar ((:commit . "47f8caa374f38eba7d557f61aac000164387a33f") (:authors ("Tobias Pisani, Fangrui Song")) (:maintainers ("Tobias Pisani, Fangrui Song")) (:maintainer "Tobias Pisani, Fangrui Song") (:keywords "languages" "lsp" "c++") (:url . "https://github.com/MaskRay/emacs-ccls"))]) + (ccls . [(20240124 1050) ((emacs (27 1)) (lsp-mode (6 3 1)) (dash (2 14 1))) "ccls client for lsp-mode" tar ((:commit . "9b4a47e0418de8cc2fc93317e27cbdde75286df1") (:authors ("Tobias Pisani, Fangrui Song")) (:maintainers ("Tobias Pisani, Fangrui Song")) (:maintainer "Tobias Pisani, Fangrui Song") (:keywords "languages" "lsp" "c++") (:url . "https://github.com/MaskRay/emacs-ccls"))]) (cd-compile . [(20141108 1957) nil "run compile in a specific directory" tar ((:commit . "10284ccae86afda4a37b09ba90acd1e2efedec9f") (:authors ("Jamie Nicol" . "jamie@thenicols.net")) (:maintainers ("Jamie Nicol" . "jamie@thenicols.net")) (:maintainer "Jamie Nicol" . "jamie@thenicols.net"))]) (cdb . [(20230318 2152) nil "constant database (cdb) reader for Emacs Lisp" tar ((:commit . "3820fa6bb0d53132aafb611a643c1e41e444052b") (:authors ("Yusuke Shinyama ")) (:maintainers ("SKK Development Team")) (:maintainer "SKK Development Team") (:keywords "cdb") (:url . "https://github.com/skk-dev/ddskk"))]) - (cdlatex . [(20230823 631) nil "Fast input methods for LaTeX environments and math" tar ((:commit . "9177058889e2dc985737006bf019d94d63074f13") (:authors ("Carsten Dominik" . "carsten.dominik@gmail.com")) (:maintainers ("Carsten Dominik" . "carsten.dominik@gmail.com")) (:maintainer "Carsten Dominik" . "carsten.dominik@gmail.com") (:keywords "tex"))]) + (cdlatex . [(20231118 645) nil "Fast input methods for LaTeX environments and math" tar ((:commit . "33770dec73138909714711b05a63e79da5a19ccd") (:authors ("Carsten Dominik" . "carsten.dominik@gmail.com")) (:maintainers ("Carsten Dominik" . "carsten.dominik@gmail.com")) (:maintainer "Carsten Dominik" . "carsten.dominik@gmail.com") (:keywords "tex"))]) (cdnjs . [(20161031 1522) ((dash (2 13 0)) (deferred (0 4)) (f (0 17 2)) (pkg-info (0 5))) "A front end for http://cdnjs.com" tar ((:commit . "ce19880d3ec3d81e6c665d0b1dfea99cc7a3f908") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainers ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com") (:keywords "tools") (:url . "https://github.com/yasuyk/cdnjs.el"))]) (cedit . [(20200816 526) nil "paredit-like commands for c-like languages" tar ((:commit . "cb38316903e6cfa8b8c978defa7e1dafcd4e0c12") (:authors ("zk_phi")) (:maintainers ("zk_phi")) (:maintainer "zk_phi") (:url . "http://zk-phi.gitub.io/"))]) (celery . [(20170225 924) ((emacs (24)) (dash-functional (2 11 0)) (s (1 9 0)) (deferred (0 3 2))) "a minor mode to draw stats from celery and more?" tar ((:commit . "b3378dd81e5a717432123fb13d70201da5dc841a") (:authors ("ardumont" . "eniotna.t@gmail.com")) (:maintainers ("ardumont" . "eniotna.t@gmail.com")) (:maintainer "ardumont" . "eniotna.t@gmail.com") (:keywords "celery" "convenience") (:url . "https://github.com/ardumont/emacs-celery"))]) (celestial-mode-line . [(20230323 737) ((emacs (24))) "Show lunar phase and sunrise/-set time in modeline" tar ((:commit . "90056322d6664e2e2b593912e4d5e68f1468cafc") (:authors ("Peter" . "craven@gmx.net")) (:maintainers ("Peter" . "craven@gmx.net")) (:maintainer "Peter" . "craven@gmx.net") (:keywords "extensions") (:url . "https://github.com/ecraven/celestial-mode-line"))]) (centaur-tabs . [(20230607 1501) ((emacs (24 4)) (powerline (2 4)) (cl-lib (0 5))) "Aesthetic, modern looking customizable tabs plugin" tar ((:commit . "0bb1aa18d475319df85f192dce3327802866c3c3") (:authors ("Emmanuel Bustos" . "ema2159@gmail.com")) (:maintainers ("Emmanuel Bustos" . "ema2159@gmail.com")) (:maintainer "Emmanuel Bustos" . "ema2159@gmail.com") (:url . "https://github.com/ema2159/centaur-tabs"))]) - (centered-cursor-mode . [(20200507 1529) nil "cursor stays vertically centered" tar ((:commit . "e9ee518d314ef7fb105a1e0cdc33dbb4dfe9d9e4") (:authors ("André Riemann" . "andre.riemann@web.de")) (:maintainers ("André Riemann" . "andre.riemann@web.de")) (:maintainer "André Riemann" . "andre.riemann@web.de") (:keywords "convenience") (:url . "https://github.com/andre-r/centered-cursor-mode.el"))]) + (centered-cursor-mode . [(20230914 1358) nil "cursor stays vertically centered" tar ((:commit . "67ef719e685407dbc455c7430765e4e685fd95a9") (:authors ("André Riemann" . "andre.riemann@web.de")) (:maintainers ("André Riemann" . "andre.riemann@web.de")) (:maintainer "André Riemann" . "andre.riemann@web.de") (:keywords "convenience") (:url . "https://github.com/andre-r/centered-cursor-mode.el"))]) (centered-window . [(20220125 804) ((emacs (24 4))) "Center the text when there's only one window" tar ((:commit . "80965f6c6afe8d918481433984b493de72af5399") (:authors ("Anler Hernández Peral" . "inbox+emacs@anler.me")) (:maintainers ("Anler Hernández Peral" . "inbox+emacs@anler.me")) (:maintainer "Anler Hernández Peral" . "inbox+emacs@anler.me") (:keywords "faces" "windows") (:url . "https://github.com/anler/centered-window-mode"))]) (centimacro . [(20201225 1132) nil "Assign multiple macros as global key bindings" tar ((:commit . "0149877584b333c4f1953f0767f0cae23881b0df") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "macros") (:url . "https://github.com/abo-abo/centimacro"))]) (cerbere . [(20181113 1641) ((pkg-info (0 5))) "Unit testing in Emacs for several programming languages" tar ((:commit . "bb18d932b16541105d41a668dbf6fc4e833a6dc2") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainers ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "python" "go" "php" "phpunit" "elisp" "ert" "tests" "tdd") (:url . "https://github.com/nlamirault/cerbere"))]) @@ -502,18 +514,19 @@ (cfengine-code-style . [(20171111 1027) nil "C code style for CFEngine project." tar ((:commit . "92a25872a6d1de00c5bfc2b9455ccb0082bf6569") (:authors ("Mikhail Gusarov" . "mikhail.gusarov@cfengine.com")) (:maintainers ("Mikhail Gusarov" . "mikhail.gusarov@cfengine.com")) (:maintainer "Mikhail Gusarov" . "mikhail.gusarov@cfengine.com") (:url . "https://github.com/cfengine/core"))]) (cff . [(20160118 2018) ((cl-lib (0 5)) (emacs (24))) "Search of the C/C++ file header by the source and vice versa" tar ((:commit . "b6ab2a28e64ef06f281ec74cfe3114e450644dfa") (:authors ("Alexey Veretennikov" . "alexey.veretennikov@gmail.com")) (:maintainers ("Alexey Veretennikov" . "alexey.veretennikov@gmail.com")) (:maintainer "Alexey Veretennikov" . "alexey.veretennikov@gmail.com") (:keywords "find-file") (:url . "https://github.com/fourier/cff"))]) (cfml-mode . [(20190617 1130) ((emacs (25))) "Emacs mode for editing CFML files" tar ((:commit . "b06d7cee2af0ed5d55a94f0db80fc1f429a1829a") (:authors ("Andrew Myers" . "am2605@gmail.com")) (:maintainers ("Andrew Myers" . "am2605@gmail.com")) (:maintainer "Andrew Myers" . "am2605@gmail.com") (:url . "https://github.com/am2605/cfml-mode"))]) - (cfn-mode . [(20220221 1029) ((emacs (26 0)) (f (0 20 0)) (s (1 12 0)) (yaml-mode (0 0 13))) "AWS cloudformation mode" tar ((:commit . "4cf56affe3035fda364109836e26499431095185") (:authors ("William Orr" . "will@worrbase.com")) (:maintainers ("William Orr" . "will@worrbase.com")) (:maintainer "William Orr" . "will@worrbase.com") (:keywords "convenience" "languages" "tools") (:url . "https://gitlab.com/worr/cfn-mode"))]) - (cframe . [(20201222 1930) ((emacs (26)) (buffer-manage (0 11)) (dash (2 17 0))) "Customize a frame and fast switch size and positions" tar ((:commit . "38544521e82befc06e397123a118dd96dda2c6b6") (:authors ("Paul Landes")) (:maintainers ("Paul Landes")) (:maintainer "Paul Landes") (:keywords "frames") (:url . "https://github.com/plandes/cframe"))]) + (cfn-mode . [(20240303 904) ((emacs (26 0)) (f (0 20 0)) (s (1 12 0)) (yaml-mode (0 0 13))) "AWS cloudformation mode" tar ((:commit . "10321f428b1b029cc1c3dd54dc25ac9747ff5e8c") (:authors ("William Orr" . "will@worrbase.com")) (:maintainers ("William Orr" . "will@worrbase.com")) (:maintainer "William Orr" . "will@worrbase.com") (:keywords "convenience" "languages" "tools") (:url . "https://gitlab.com/worr/cfn-mode"))]) + (cframe . [(20240223 2335) ((emacs (26)) (buffer-manage (0 11)) (dash (2 17 0))) "Customize a frame and fast switch size and positions" tar ((:commit . "580a20573ef413c269c032221de04abc1c97a6a8") (:authors ("Paul Landes")) (:maintainers ("Paul Landes")) (:maintainer "Paul Landes") (:keywords "frames") (:url . "https://github.com/plandes/cframe"))]) (cfrs . [(20220129 1149) ((emacs (26 1)) (dash (2 11 0)) (s (1 10 0)) (posframe (0 6 0))) "Child-frame based read-string" tar ((:commit . "f3a21f237b2a54e6b9f8a420a9da42b4f0a63121") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainers ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/cfrs"))]) - (cg . [(20230816 1122) ((emacs (26 1))) "Major mode for editing Constraint Grammar files" tar ((:commit . "611ffa634c5af98843fa9477bcc5d6ee657da9f1") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainers ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org") (:keywords "languages") (:url . "https://visl.sdu.dk/constraint_grammar.html"))]) - (challenger-deep-theme . [(20210120 941) ((emacs (24))) "challenger-deep Theme" tar ((:commit . "2a799259406a8b96a688873093ffab6630a3ad3b") (:authors ("MaxSt")) (:maintainers ("MaxSt")) (:maintainer "MaxSt") (:url . "https://github.com/challenger-deep-theme/emacs"))]) - (champagne . [(20230511 1540) ((emacs (28 1)) (posframe (1 4 2))) "Graphical countdowns" tar ((:commit . "069452fa162d6aefc693c8d0546a84d967218289") (:authors ("Psionik K" . "73710933+psionic-k@users.noreply.github.com")) (:maintainers ("Psionik K" . "73710933+psionic-k@users.noreply.github.com")) (:maintainer "Psionik K" . "73710933+psionic-k@users.noreply.github.com") (:keywords "games") (:url . "http://github.com/positron-solutions/champagne"))]) - (change-inner . [(20210126 1456) ((expand-region (0 7))) "Change contents based on semantic units" tar ((:commit . "42cad58aed2caec260f8e8ff61f78a7d3db72d1b") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainers ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:keywords "convenience" "extensions"))]) + (cg . [(20230920 1245) ((emacs (26 1))) "Major mode for editing Constraint Grammar files" tar ((:commit . "14367436c123220a0bb84987db51b6c774ac813a") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainers ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org") (:keywords "languages") (:url . "https://visl.sdu.dk/constraint_grammar.html"))]) + (challenger-deep-theme . [(20231218 1042) ((emacs (24))) "challenger-deep Theme" tar ((:commit . "1afd5787374c2bf3bfb46beb18e64d5677c07366") (:authors ("MaxSt")) (:maintainers ("MaxSt")) (:maintainer "MaxSt") (:url . "https://github.com/challenger-deep-theme/emacs"))]) + (champagne . [(20231229 947) ((emacs (28 1)) (posframe (1 4 2))) "Graphical countdowns" tar ((:commit . "2106273c47f898006a799f0c5e35922af4b41f54") (:authors ("Psionic K" . "73710933+psionic-k@users.noreply.github.com")) (:maintainers ("Psionic K" . "73710933+psionic-k@users.noreply.github.com")) (:maintainer "Psionic K" . "73710933+psionic-k@users.noreply.github.com") (:keywords "games") (:url . "http://github.com/positron-solutions/champagne"))]) + (change-inner . [(20231203 1021) ((expand-region (0 7))) "Change contents based on semantic units" tar ((:commit . "1394f5c07a95a97e39d616a1d7054d7c9bc49ba3") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainers ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:keywords "convenience" "extensions"))]) (chaos-mode . [(20221227 223) ((emacs (24 3))) "A major mode for the Chaos programming language" tar ((:commit . "801d869c461166eb2face2554b9b7883a26374c6") (:authors ("XXIV")) (:maintainers ("XXIV")) (:maintainer "XXIV") (:keywords "files" "chaos") (:url . "https://github.com/thechampagne/chaos-mode"))]) (chapel-mode . [(20210513 457) ((emacs (25 1)) (hydra (0 15 0))) "A major mode for the Chapel programming language" tar ((:commit . "39fd24bb7cf44808200354ac0496be4fc4fddd9a") (:keywords "chapel" "chpl" "programming" "languages") (:url . "https://github.com/damon-kwok/chapel-mode"))]) (char-menu . [(20210321 1657) ((emacs (24 3)) (avy-menu (0 1))) "Create your own menu for fast insertion of arbitrary symbols" tar ((:commit . "d77c4d64fc8acc386a0fb9727d346c838e75f011") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainers ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:keywords "convenience" "editing") (:url . "https://github.com/mrkkrp/char-menu"))]) (charmap . [(20200616 1418) nil "Unicode table for Emacs" tar ((:commit . "feac50b87d2a596c5e5b7b82b79ddd65b6dedd8c") (:authors ("Anan Mikami" . "lateau@gmail.com")) (:maintainers ("Anan Mikami" . "lateau@gmail.com")) (:maintainer "Anan Mikami" . "lateau@gmail.com") (:keywords "unicode" "character" "ucs") (:url . "https://github.com/lateau/charmap"))]) - (chatgpt-shell . [(20230807 1640) ((emacs (27 1)) (shell-maker (0 42 1))) "ChatGPT shell + buffer insert commands" tar ((:commit . "b2e46cfa69d7cc514b5c2f9a31c1ca63a8bdea1d") (:authors ("Alvaro Ramirez https://xenodium.com")) (:maintainers ("Alvaro Ramirez https://xenodium.com")) (:maintainer "Alvaro Ramirez https://xenodium.com") (:url . "https://github.com/xenodium/chatgpt-shell"))]) + (chatgpt-shell . [(20240306 857) ((emacs (27 1)) (shell-maker (0 50 1))) "ChatGPT shell + buffer insert commands" tar ((:commit . "bf2d12ed2ed60c498d95215fa1cf81c2b23191a7") (:authors ("Alvaro Ramirez https://xenodium.com")) (:maintainers ("Alvaro Ramirez https://xenodium.com")) (:maintainer "Alvaro Ramirez https://xenodium.com") (:url . "https://github.com/xenodium/chatgpt-shell"))]) + (chatu . [(20240308 1129) ((org (9 6 6)) (emacs (29 1)) (plantuml-mode (1 2 9))) "Convert and insert any images to org-mode or markdown buffer" tar ((:commit . "63a42219b28b2011e86ae5e8abb1366b65a25347") (:authors ("Kimi Ma" . "kimi.im@outlook.com")) (:maintainers ("Kimi Ma" . "kimi.im@outlook.com")) (:maintainer "Kimi Ma" . "kimi.im@outlook.com") (:keywords "multimedia" "convenience") (:url . "https://github.com/kimim/chatu"))]) (chatwork . [(20170511 442) nil "ChatWork client for Emacs" tar ((:commit . "fea231d479f06bf40dbfcf45de143eecc9ed744c") (:authors ("Masayuki Ataka" . "masayuki.ataka@gmail.com")) (:maintainers ("Masayuki Ataka" . "masayuki.ataka@gmail.com")) (:maintainer "Masayuki Ataka" . "masayuki.ataka@gmail.com") (:keywords "web") (:url . "https://github.com/ataka/chatwork"))]) (cheat-sh . [(20210607 1307) ((emacs (25 1))) "Interact with cheat.sh" tar ((:commit . "33bae22feae8d3375739c6bdef08d0dcdf47ee42") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainers ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:keywords "docs" "help") (:url . "https://github.com/davep/cheat-sh.el"))]) (cheatsheet . [(20170126 2150) ((emacs (24)) (cl-lib (0 5))) "create your own cheatsheet" tar ((:commit . "e4f8e0110167ea16a17a74517d1f10cb7ff805b8") (:authors ("Shirin Nikita" . "shirin.nikita@gmail.com")) (:maintainers ("Shirin Nikita" . "shirin.nikita@gmail.com")) (:maintainer "Shirin Nikita" . "shirin.nikita@gmail.com") (:keywords "convenience" "usability") (:url . "http://github.com/darksmile/cheatsheet/"))]) @@ -530,9 +543,10 @@ (chinese-wbim . [(20190727 854) nil "Enable Wubi Input Method in Emacs." tar ((:commit . "5d496364b0b6bbaaf0f9b37e5a6d260d4994f260") (:authors (nil . "Guanghui Qu")) (:maintainer nil . "Guanghui Qu") (:keywords "wubi" "input" "method.") (:url . "https://github.com/andyque/chinese-wbim"))]) (chinese-word-at-point . [(20170811 941) ((cl-lib (0 5))) "Add `chinese-word' thing to `thing-at-point'" tar ((:commit . "8223d7439e005555b86995a005b225ae042f0538") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainers ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com") (:keywords "convenience" "chinese") (:url . "https://github.com/xuchunyang/chinese-word-at-point.el"))]) (chinese-yasdcv . [(20171015 144) ((cl-lib (0 5)) (pyim (1 6 0))) "Yet another StarDict frontend" tar ((:commit . "5ab830daf1273d5a5cddcb94b56a9737f12d996f") (:authors ("Feng Shu" . "tumashu@gmail.com")) (:maintainers ("Feng Shu" . "tumashu@gmail.com")) (:maintainer "Feng Shu" . "tumashu@gmail.com") (:keywords "convenience" "chinese" "dictionary") (:url . "https://github.com/tumashu/chinese-yasdcv"))]) + (chip8 . [(20240210 1459) ((emacs (28 1))) "A CHIP-8 emulator" tar ((:commit . "69a764f5c1119508dd109a0ba64080f04b5fb702") (:authors ("Gabriele Lana" . "gabriele.lana@gmail.com")) (:maintainers ("Gabriele Lana" . "gabriele.lana@gmail.com")) (:maintainer "Gabriele Lana" . "gabriele.lana@gmail.com") (:keywords "chip-8" "game" "games" "emulator") (:url . "http://github.com/gabrielelana/chip8.el"))]) (chocolate-theme . [(20210128 1647) ((emacs (24 1)) (autothemer (0 2))) "A dark chocolaty theme" tar ((:commit . "ccc05f7ad96d3d1332727689bf6250443adc7ec0") (:url . "http://github.com/SavchenkoValeriy/emacs-chocolate-theme"))]) (choice-program . [(20230805 1641) ((emacs (26)) (dash (2 17 0))) "Parameter based program" tar ((:commit . "90df8d118c20d5d05ee97daf81012dc39759be92") (:authors ("Paul Landes")) (:maintainers ("Paul Landes")) (:maintainer "Paul Landes") (:keywords "execution" "processes" "unix" "lisp") (:url . "https://github.com/plandes/choice-program"))]) - (chordpro-mode . [(20230821 750) ((emacs (28 1)) (compat (29 1 4 1))) "Major mode for ChordPro lead sheet file format" tar ((:commit . "819a0913ca7967d4069f02fbfb24654352cb2a89") (:authors ("Howard Ding" . "hading2@gmail.com")) (:maintainers ("Howard Ding" . "hading2@gmail.com")) (:maintainer "Howard Ding" . "hading2@gmail.com") (:keywords "convenience") (:url . "https://git.sr.ht/~breatheoutbreathein/chordpro-mode.el/"))]) + (chordpro-mode . [(20231205 26) ((emacs (28 1)) (compat (29 1 4 1))) "Major mode for ChordPro lead sheet file format" tar ((:commit . "a63fc0b7181299befc4496cba04e0f84d5953000") (:authors ("Howard Ding" . "hading2@gmail.com")) (:maintainers ("Howard Ding" . "hading2@gmail.com")) (:maintainer "Howard Ding" . "hading2@gmail.com") (:keywords "convenience") (:url . "https://git.sr.ht/~breatheoutbreathein/chordpro-mode.el/"))]) (chroma . [(20230503 1210) ((emacs (24 1))) "Color manipulation library" tar ((:commit . "e6ebe08ce439b0dd8cfd2a0a78abf34f195feb3c") (:authors ("Nicolas Martyanoff" . "nicolas@n16f.net")) (:maintainers ("Nicolas Martyanoff" . "nicolas@n16f.net")) (:maintainer "Nicolas Martyanoff" . "nicolas@n16f.net") (:url . "https://github.com/galdor/chroma"))]) (chronometer . [(20190304 1528) ((emacs (24))) "a [not so] simple chronometer" tar ((:commit . "8457b296ef87be339cbe47730b922757d60bdcd5") (:authors ("Marcelo Toledo" . "marcelo@marcelotoledo.com")) (:maintainers ("Marcelo Toledo" . "marcelo@marcelotoledo.com")) (:maintainer "Marcelo Toledo" . "marcelo@marcelotoledo.com") (:keywords "tools" "convenience") (:url . "https://github.com/marcelotoledo/chronometer"))]) (chronometrist . [(20230712 1532) ((emacs (27 1)) (dash (2 16 0)) (seq (2 20)) (ts (0 2))) "Friendly and powerful personal time tracker and analyzer" tar ((:commit . "dbbcdfd4398cc2845a20aca4161358fafcb60c65") (:authors ("contrapunctus" . "xmpp:contrapunctus@jabjab.de")) (:maintainers ("contrapunctus" . "xmpp:contrapunctus@jabjab.de")) (:maintainer "contrapunctus" . "xmpp:contrapunctus@jabjab.de") (:keywords "calendar") (:url . "https://codeberg.org/contrapunctus/chronometrist"))]) @@ -541,8 +555,8 @@ (chronometrist-spark . [(20230629 1039) ((emacs (25 1)) (chronometrist (0 7 0)) (spark (0 1))) "Show sparklines in Chronometrist buffers" tar ((:commit . "d8290a82ea65730413627325a705067269cfa2f1") (:authors ("contrapunctus" . "xmpp:contrapunctus@jabjab.de")) (:maintainers ("contrapunctus" . "xmpp:contrapunctus@jabjab.de")) (:maintainer "contrapunctus" . "xmpp:contrapunctus@jabjab.de") (:keywords "calendar") (:url . "https://tildegit.org/contrapunctus/chronometrist"))]) (chronos . [(20230804 1712) ((emacs (27 1))) "Multiple simultaneous countdown / countup timers" tar ((:commit . "517c53f57c54ec64e1bc870a63b0f4cf1772fcf1") (:authors ("David Knight" . "dxknight@opmbx.org")) (:maintainers ("David Knight" . "dxknight@opmbx.org")) (:maintainer "David Knight" . "dxknight@opmbx.org") (:keywords "calendar") (:url . "http://github.com/DarkBuffalo/chronos"))]) (chruby . [(20180114 1652) ((cl-lib (0 5))) "Emacs integration for chruby" tar ((:commit . "42bc6d521f832eca8e2ba210f30d03ad5529788f") (:authors ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainers ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainer "Arne Brasseur" . "arne@arnebrasseur.net") (:keywords "languages") (:url . "https://github.com/plexus/chruby.el"))]) - (chyla-theme . [(20221213 1012) nil "chyla.org - green color theme." tar ((:commit . "b24d0379516857ccf75caff9ae1d00b820c9a6f6") (:authors ("Adam Chyła" . "adam@chyla.org")) (:maintainers ("Adam Chyła" . "adam@chyla.org")) (:maintainer "Adam Chyła" . "adam@chyla.org") (:url . "https://github.com/chyla/ChylaThemeForEmacs"))]) - (cider . [(20230829 1935) ((emacs (26)) (clojure-mode (5 16 2)) (parseedn (1 0 6)) (queue (0 2)) (spinner (1 7)) (seq (2 22)) (sesman (0 3 2)) (transient (0 4 1))) "Clojure Interactive Development Environment that Rocks" tar ((:commit . "ef5bbe080fdd7b4e33f31e8354eaea04413aefca") (:authors ("Tim King" . "kingtim@gmail.com") ("Phil Hagelberg" . "technomancy@gmail.com") ("Bozhidar Batsov" . "bozhidar@batsov.dev") ("Artur Malabarba" . "bruce.connor.am@gmail.com") ("Hugo Duncan" . "hugo@hugoduncan.org") ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev") (:keywords "languages" "clojure" "cider") (:url . "http://www.github.com/clojure-emacs/cider"))]) + (chyla-theme . [(20231220 1545) nil "chyla.org - green color theme." tar ((:commit . "4d4b9dca3547e919ed5311cc7d04821f77860fbd") (:authors ("Adam Chyła" . "adam@chyla.org")) (:maintainers ("Adam Chyła" . "adam@chyla.org")) (:maintainer "Adam Chyła" . "adam@chyla.org") (:url . "https://github.com/chyla/ChylaThemeForEmacs"))]) + (cider . [(20240310 1926) ((emacs (26)) (clojure-mode (5 18 1)) (parseedn (1 2 1)) (queue (0 2)) (spinner (1 7)) (seq (2 22)) (sesman (0 3 2)) (transient (0 4 1))) "Clojure Interactive Development Environment that Rocks" tar ((:commit . "c4fa1a84a3b3d03ef5f61cc5d33ff4e91b9a1dce") (:authors ("Tim King" . "kingtim@gmail.com") ("Phil Hagelberg" . "technomancy@gmail.com") ("Bozhidar Batsov" . "bozhidar@batsov.dev") ("Artur Malabarba" . "bruce.connor.am@gmail.com") ("Hugo Duncan" . "hugo@hugoduncan.org") ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev") (:keywords "languages" "clojure" "cider") (:url . "https://www.github.com/clojure-emacs/cider"))]) (cider-decompile . [(20151122 537) ((cider (0 3 0)) (javap-mode (9))) "decompilation extension for cider" tar ((:commit . "5d87035f3c3c14025e8f01c0c53d0ce2c8f56651") (:authors ("Dmitry Bushenko")) (:maintainers ("Dmitry Bushenko")) (:maintainer "Dmitry Bushenko") (:keywords "languages" "clojure" "cider") (:url . "http://www.github.com/clojure-emacs/cider-decompile"))]) (cider-eval-sexp-fu . [(20190311 2152) ((emacs (24)) (eval-sexp-fu (0 5 0))) "Briefly highlights an evaluated sexp." tar ((:commit . "7fd229f1441356866aedba611fd0cf4e89b50921") (:authors ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainers ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainer "Sylvain Benner" . "sylvain.benner@gmail.com") (:keywords "languages" "clojure" "cider"))]) (cider-hydra . [(20190816 1121) ((cider (0 22 0)) (hydra (0 13 0))) "Hydras for CIDER." tar ((:commit . "c3b8a15d72dddfbc390ab6a454bd7e4c765a2c95") (:authors ("Tianxiang Xiong" . "tianxiang.xiong@gmail.com")) (:maintainers ("Tianxiang Xiong" . "tianxiang.xiong@gmail.com")) (:maintainer "Tianxiang Xiong" . "tianxiang.xiong@gmail.com") (:keywords "convenience" "tools") (:url . "https://github.com/clojure-emacs/cider-hydra"))]) @@ -550,23 +564,24 @@ (cil-mode . [(20160622 1431) nil "Common Intermediate Language mode" tar ((:commit . "a78a88ca9a66a82f069329a96e34b67478ae2d9b") (:authors ("Friedrich von Never" . "friedrich@fornever.me")) (:maintainers ("Friedrich von Never" . "friedrich@fornever.me")) (:maintainer "Friedrich von Never" . "friedrich@fornever.me") (:keywords "languages") (:url . "https://github.com/ForNeVeR/cil-mode"))]) (cilk-mode . [(20220807 1629) ((emacs (25 1)) (flycheck (32 -4))) "Minor mode for Cilk code editing" tar ((:commit . "d5ba732a5a313a97a96085943cd7840b8e2d9c7c") (:authors ("Alexandros-Stavros Iliopoulos ")) (:maintainers ("Alexandros-Stavros Iliopoulos" . "1577182+ailiop@users.noreply.github.com")) (:maintainer "Alexandros-Stavros Iliopoulos" . "1577182+ailiop@users.noreply.github.com") (:keywords "c" "convenience" "faces" "languages") (:url . "https://github.com/ailiop/cilk-mode"))]) (cinspect . [(20150716 233) ((emacs (24)) (cl-lib (0 5)) (deferred (0 3 1)) (python-environment (0 0 2))) "Use cinspect to look at the CPython source of builtins and other C objects!" tar ((:commit . "4e199a90f89b335cccda1518aa0963e0a1d4fbab") (:authors ("Ben Yelsey" . "ben.yelsey@gmail.com")) (:maintainers ("Ben Yelsey" . "ben.yelsey@gmail.com")) (:maintainer "Ben Yelsey" . "ben.yelsey@gmail.com") (:keywords "python") (:url . "https://github.com/inlinestyle/cinspect-mode"))]) - (circadian . [(20221223 1734) ((emacs (24 4))) "Theme-switching based on daytime" tar ((:commit . "9959e4b9d2ed9920b668fc229aab1f5fa5bd8584") (:authors ("Guido Schmidt")) (:maintainers ("Guido Schmidt" . "git@guidoschmidt.cc")) (:maintainer "Guido Schmidt" . "git@guidoschmidt.cc") (:keywords "themes") (:url . "https://github.com/GuidoSchmidt/circadian"))]) - (circe . [(20221126 1508) ((emacs (25 1)) (cl-lib (0 5))) "Client for IRC in Emacs" tar ((:commit . "57fe189d7c0b98b9b1b5a59767cea1c7e2c22b13") (:authors ("Jorgen Schaefer" . "forcer@forcix.cx")) (:maintainer "Jorgen Schaefer" . "forcer@forcix.cx") (:keywords "irc" "chat" "comm") (:url . "https://github.com/emacs-circe/circe"))]) + (circadian . [(20231027 744) ((emacs (24 4))) "Theme-switching based on daytime" tar ((:commit . "b3bb94040080ac18aab04b010752d4984feee37b") (:authors ("Guido Schmidt")) (:maintainers ("Guido Schmidt" . "git@guidoschmidt.cc")) (:maintainer "Guido Schmidt" . "git@guidoschmidt.cc") (:keywords "themes") (:url . "https://github.com/GuidoSchmidt/circadian"))]) + (circe . [(20240227 2116) ((emacs (25 1)) (cl-lib (0 5))) "Client for IRC in Emacs" tar ((:commit . "7044e07ab235ae09498c430558449750ec1e6a9f") (:authors ("Jorgen Schaefer" . "forcer@forcix.cx")) (:maintainer "Jorgen Schaefer" . "forcer@forcix.cx") (:keywords "irc" "chat" "comm") (:url . "https://github.com/emacs-circe/circe"))]) (circe-notifications . [(20180102 2318) ((emacs (24 4)) (circe (2 3)) (alert (1 2))) "Add desktop notifications to Circe." tar ((:commit . "291149ac12877bbd062da993479d3533a26862b0") (:authors ("Ruben Maher" . "r@rkm.id.au")) (:maintainers ("Ruben Maher" . "r@rkm.id.au")) (:maintainer "Ruben Maher" . "r@rkm.id.au") (:url . "https://github.com/eqyiel/circe-notifications"))]) (circleci-api . [(20210227 1607) ((emacs (27)) (request (0 3 2))) "Bindings for the CircleCI API" tar ((:commit . "1432b0ad0f32b03fec564c0815951d5e096c2f6a") (:authors ("Robin Schroer")) (:maintainers ("Robin Schroer")) (:maintainer "Robin Schroer") (:url . "https://github.com/sulami/circleci-api"))]) - (citar . [(20230725 1020) ((emacs (27 1)) (parsebib (4 2)) (org (9 5)) (citeproc (0 9))) "Citation-related commands for org, latex, markdown" tar ((:commit . "2c0547db57f2fb30ff071d126b256287a4e9452c") (:authors ("Bruce D'Arcus ")) (:maintainers ("Bruce D'Arcus ")) (:maintainer "Bruce D'Arcus ") (:url . "https://github.com/emacs-citar/citar"))]) - (citar-denote . [(20230708 403) ((emacs (28 1)) (citar (1 1)) (denote (1 2 0)) (dash (2 19 1))) "Minor mode to integrate Citar and Denote" tar ((:commit . "2107142e3c621aa64f95c7820d4b12b69f1763f4") (:authors ("Peter Prevos" . "peter@prevos.net")) (:maintainers ("Peter Prevos" . "peter@prevos.net")) (:maintainer "Peter Prevos" . "peter@prevos.net") (:url . "https://github.com/pprevos/citar-denote"))]) - (citar-embark . [(20230323 1926) ((emacs (27 1)) (embark (0 17)) (citar (0 9 7))) "Citar/Embark integration" tar ((:commit . "0c6a8038e9b7f72c2e6837bd3342eab942c08d0d") (:authors ("Bruce D'Arcus" . "bdarcus@gmail.com")) (:maintainers ("Bruce D'Arcus" . "bdarcus@gmail.com")) (:maintainer "Bruce D'Arcus" . "bdarcus@gmail.com") (:keywords "bib" "extensions") (:url . "https://github.com/emacs-citar/citar-embark"))]) - (citar-org-roam . [(20230404 1225) ((emacs (27 1)) (org-roam (2 2)) (citar (1 2 0))) "Citar/org-roam integration" tar ((:commit . "761eed66782fdbb6d65749098caa42ba43e8441d") (:authors ("Bruce D'Arcus" . "bdarcus@gmail.com")) (:maintainers ("Bruce D'Arcus" . "bdarcus@gmail.com")) (:maintainer "Bruce D'Arcus" . "bdarcus@gmail.com") (:url . "https://github.com/emacs-citar/citar-org-roam"))]) - (citeproc . [(20230228 1414) ((emacs (26)) (dash (2 13 0)) (s (1 12 0)) (f (0 18 0)) (queue (0 2)) (string-inflection (1 0)) (org (9)) (parsebib (2 4))) "A CSL 1.0.2 Citation Processor" tar ((:commit . "290320fc579f886255f00d7268600df7fa5cc7e8") (:authors ("András Simonyi" . "andras.simonyi@gmail.com")) (:maintainers ("András Simonyi" . "andras.simonyi@gmail.com")) (:maintainer "András Simonyi" . "andras.simonyi@gmail.com") (:keywords "bib") (:url . "https://github.com/andras-simonyi/citeproc-el"))]) + (citar . [(20231226 1453) ((emacs (27 1)) (parsebib (4 2)) (org (9 5)) (citeproc (0 9))) "Citation-related commands for org, latex, markdown" tar ((:commit . "885b86f6733fd70f42c32dd7791d3447f93db990") (:authors ("Bruce D'Arcus ")) (:maintainers ("Bruce D'Arcus ")) (:maintainer "Bruce D'Arcus ") (:url . "https://github.com/emacs-citar/citar"))]) + (citar-denote . [(20240228 807) ((emacs (28 1)) (citar (1 4)) (denote (2 0)) (dash (2 19 1))) "Minor mode integrating Citar and Denote" tar ((:commit . "43ecacd818f0b569b949d160bd86bff5bbe4b0f7") (:authors ("Peter Prevos" . "peter@prevos.net")) (:maintainers ("Peter Prevos" . "peter@prevos.net")) (:maintainer "Peter Prevos" . "peter@prevos.net") (:url . "https://github.com/pprevos/citar-denote"))]) + (citar-embark . [(20231122 1548) ((emacs (27 1)) (embark (0 17)) (citar (0 9 7))) "Citar/Embark integration" tar ((:commit . "572b7b6e569e9423dd948539fa48d3f53ceffe57") (:authors ("Bruce D'Arcus" . "bdarcus@gmail.com")) (:maintainers ("Bruce D'Arcus" . "bdarcus@gmail.com")) (:maintainer "Bruce D'Arcus" . "bdarcus@gmail.com") (:keywords "bib" "extensions") (:url . "https://github.com/emacs-citar/citar"))]) + (citar-org-roam . [(20240212 2159) ((emacs (27 1)) (org-roam (2 2)) (citar (1 2 0))) "Citar/org-roam integration" tar ((:commit . "999268c7a077aad6a8f4dfc88d0eeabdf4267fea") (:authors ("Bruce D'Arcus" . "bdarcus@gmail.com")) (:maintainers ("Bruce D'Arcus" . "bdarcus@gmail.com")) (:maintainer "Bruce D'Arcus" . "bdarcus@gmail.com") (:url . "https://github.com/emacs-citar/citar-org-roam"))]) + (citeproc . [(20240307 1412) ((emacs (26)) (dash (2 13 0)) (s (1 12 0)) (f (0 18 0)) (queue (0 2)) (string-inflection (1 0)) (org (9)) (parsebib (2 4)) (compat (28 1))) "A CSL 1.0.2 Citation Processor" tar ((:commit . "cb2d3e72116e626133703aa9875d680442249abe") (:authors ("András Simonyi" . "andras.simonyi@gmail.com")) (:maintainers ("András Simonyi" . "andras.simonyi@gmail.com")) (:maintainer "András Simonyi" . "andras.simonyi@gmail.com") (:keywords "bib") (:url . "https://github.com/andras-simonyi/citeproc-el"))]) (citeproc-org . [(20200915 2009) ((emacs (25 1)) (dash (2 12 0)) (org (9)) (f (0 18 0)) (citeproc (0 1)) (org-ref (1 1 1))) "Render org-mode references in CSL styles" tar ((:commit . "22a759c4f0ec80075014dcc594baa4d1b470d995") (:authors ("András Simonyi" . "andras.simonyi@gmail.com")) (:maintainers ("András Simonyi" . "andras.simonyi@gmail.com")) (:maintainer "András Simonyi" . "andras.simonyi@gmail.com") (:keywords "org-ref" "org-mode" "cite" "bib") (:url . "https://github.com/andras-simonyi/citeproc-org"))]) - (citre . [(20230630 1536) ((emacs (26 1))) "Ctags IDE on the True Editor" tar ((:commit . "c617acef3dc2a88aaffa42a515ce7dbaba98228a") (:authors ("Hao Wang" . "amaikinono@gmail.com")) (:maintainers ("Hao Wang" . "amaikinono@gmail.com")) (:maintainer "Hao Wang" . "amaikinono@gmail.com") (:keywords "convenience" "tools") (:url . "https://github.com/universal-ctags/citre"))]) + (citre . [(20240203 457) ((emacs (26 1))) "Ctags IDE on the True Editor" tar ((:commit . "155251127bbb51588445ed8fa49368cff1fff2c2") (:authors ("Hao Wang" . "amaikinono@gmail.com")) (:maintainers ("Hao Wang" . "amaikinono@gmail.com")) (:maintainer "Hao Wang" . "amaikinono@gmail.com") (:keywords "convenience" "tools") (:url . "https://github.com/universal-ctags/citre"))]) (cl-format . [(20230818 1726) nil "CL format routine." tar ((:commit . "42b662d27eefa458c1a39bea1836d6ada740b863") (:authors ("Andreas Politz" . "politza@fh-trier.de")) (:maintainer "akater" . "nuclearspace@gmail.com") (:keywords "extensions") (:url . "https://gitlab.com/akater/elisp-cl-format"))]) (cl-libify . [(20181130 230) ((emacs (25))) "Update elisp code to use cl-lib instead of cl" tar ((:commit . "e205b96f944a4f312fd523804cbbaf00027a3c8b") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "lisp") (:url . "https://github.com/purcell/cl-libify"))]) (clang-capf . [(20221030 1830) ((emacs (24 4))) "Completion-at-point backend for c/c++ using clang" tar ((:commit . "5e4dfba90ce86bbc7ee61805edfca04fff93c291") (:authors ("Philip K. ")) (:maintainers ("Philip K. ")) (:maintainer "Philip K. ") (:keywords "c" "abbrev" "convenience") (:url . "https://git.sr.ht/~pkal/clang-capf"))]) - (clang-format . [(20230809 2200) ((cl-lib (0 3))) "Format code using clang-format" tar ((:commit . "bce0bb4ca17ecb6e6927074920945cef2a78f5b6") (:keywords "tools" "c"))]) + (clang-format . [(20240115 1750) ((cl-lib (0 3))) "Format code using clang-format" tar ((:commit . "9f4358fcc8b04018cc1ed46fcc96fc7bfa361a47") (:keywords "tools" "c"))]) (clang-format+ . [(20190824 2216) ((emacs (25 1)) (clang-format (20180406 1514))) "Minor mode for automatic clang-format application" tar ((:commit . "ddd4bfe1a13c2fd494ce339a320a51124c1d2f68") (:keywords "c" "c++" "clang-format") (:url . "https://github.com/SavchenkoValeriy/emacs-clang-format-plus"))]) (clause . [(20230405 1235) ((emacs (27 1)) (mark-thing-at (0 3))) "Functions to move, mark, kill by clause" tar ((:commit . "0ea166fa218618c1b80b60c995f927310c25b02a") (:authors ("Marty Hiatt ")) (:maintainers ("Marty Hiatt ")) (:maintainer "Marty Hiatt ") (:keywords "wp" "convenience" "sentences" "text") (:url . "https://codeberg.org/martianh/clause.el"))]) + (clay . [(20240115 2125) ((emacs (26 1)) (cider (1 0))) "Emacs commands Clay - literate in Clojure" tar ((:commit . "26b65a107cf55e4955401d3dbc63d58479f29773") (:authors ("daslu")) (:maintainers ("daslu")) (:maintainer "daslu") (:keywords "lisp") (:url . "https://github.com/scicloj/clay.el"))]) (clean-aindent-mode . [(20171017 2043) nil "Simple indent and unindent, trims indent white-space" tar ((:commit . "a97bcae8f43a9ff64e95473e4ef0d8bafe829211") (:authors ("peter marinov" . "efravia@gmail.com")) (:maintainers ("peter marinov" . "efravia@gmail.com")) (:maintainer "peter marinov" . "efravia@gmail.com") (:keywords "indentation" "whitespace" "backspace") (:url . "https://github.com/pmarinov/clean-aindent-mode"))]) (clean-buffers . [(20160529 2259) ((cl-lib (0 5))) "clean useless buffers" tar ((:commit . "1be6c54e3095761b6b64bf749faae3dfce94e72a") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "convenience" "usability" "buffers"))]) (clean-kill-ring . [(20230115 2153) ((emacs (24 4))) "Keep the kill ring clean" tar ((:commit . "d05fa7ee97e760d21d533261c7b63eecf223f612") (:authors ("Nicholas Hubbard" . "nicholashubbard@posteo.net")) (:maintainers ("Nicholas Hubbard" . "nicholashubbard@posteo.net")) (:maintainer "Nicholas Hubbard" . "nicholashubbard@posteo.net") (:keywords "kill-ring" "convenience") (:url . "http://github.com/NicholasBHubbard/clean-kill-ring.el"))]) @@ -582,7 +597,7 @@ (clips-mode . [(20170909 823) nil "Major mode for editing CLIPS code and REPL" tar ((:commit . "dd38e2822640a38f7d8bfec4f69d8dd24be27074") (:authors ("David E. Young" . "david.young@fnc.fujitsu.com") ("Andrey Kotlarski" . "m00naticus@gmail.com") ("Grant Rettke" . "grettke@acm.org")) (:maintainer "Grant Rettke" . "grettke@acm.org") (:keywords "clips"))]) (clj-decompiler . [(20220103 1746) ((emacs (26 1)) (clojure-mode (5 12)) (cider (1 2 0))) "Clojure Java decompiler expansion" tar ((:commit . "8c0c53f87e6e33f2be7e7aff6095eb586b50be1a") (:authors ("Ben Sless" . "ben.sless@gmail.com")) (:maintainers ("Ben Sless" . "ben.sless@gmail.com")) (:maintainer "Ben Sless" . "ben.sless@gmail.com") (:keywords "languages" "clojure" "cider" "java" "decompiler") (:url . "https://www.github.com/bsless/clj-decompiler.el"))]) (clj-deps-new . [(20230413 1833) ((emacs (25 1)) (transient (0 3 7))) "Create clojure projects from templates" tar ((:commit . "72f25d86bbd9cd6cb4aa431e70bda38f35b19262") (:authors ("jpe90" . "eskinjp@gmail.com")) (:maintainers ("jpe90" . "eskinjp@gmail.com")) (:maintainer "jpe90" . "eskinjp@gmail.com") (:url . "https://github.com/jpe90/emacs-deps-new"))]) - (clj-refactor . [(20230801 1030) ((emacs (26 1)) (seq (2 19)) (yasnippet (0 6 1)) (paredit (24)) (multiple-cursors (1 2 2)) (clojure-mode (5 16 1)) (cider (1 7 0)) (parseedn (1 1 0)) (inflections (2 6)) (hydra (0 13 2))) "A collection of commands for refactoring Clojure code" tar ((:commit . "a0f488206290acd83315f6d22171dcb9e671b7e7") (:authors ("Magnar Sveen" . "magnars@gmail.com") ("Lars Andersen" . "expez@expez.com") ("Benedek Fazekas" . "benedek.fazekas@gmail.com") ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainers ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:keywords "convenience" "clojure" "cider"))]) + (clj-refactor . [(20240310 2054) ((emacs (26 1)) (seq (2 19)) (yasnippet (0 6 1)) (paredit (24)) (multiple-cursors (1 2 2)) (clojure-mode (5 18 0)) (cider (1 11 1)) (parseedn (1 2 0)) (inflections (2 6)) (hydra (0 13 2))) "A collection of commands for refactoring Clojure code" tar ((:commit . "dc1bbc8cdaa723bdbb6669ea7d280625c370755d") (:authors ("Magnar Sveen" . "magnars@gmail.com") ("Lars Andersen" . "expez@expez.com") ("Benedek Fazekas" . "benedek.fazekas@gmail.com") ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainers ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:keywords "convenience" "clojure" "cider"))]) (cljr-helm . [(20220721 824) ((clj-refactor (0 13 0)) (helm-core (3 6 0)) (cl-lib (0 5))) "Wraps clojure refactor commands with helm" tar ((:commit . "2c1f9cbd892ec03335f671ea3f974ee2ff6078dc") (:authors ("Phil Jackson" . "phil@shellarchive.co.uk")) (:maintainers ("Phil Jackson" . "phil@shellarchive.co.uk")) (:maintainer "Phil Jackson" . "phil@shellarchive.co.uk") (:keywords "helm" "clojure" "refactor") (:url . "https://github.com/philjackson/cljr-helm"))]) (cljr-ivy . [(20200602 1607) ((clj-refactor (2 5 0)) (ivy (0 13 0)) (emacs (24 3)) (cl-lib (0 6 1))) "Access clojure refactor with ivy completion" tar ((:commit . "18e6e3526e872010a643c91aa71ff1d429431b83") (:authors ("Wanderson Ferreira" . "iagwanderson@gmail.com")) (:maintainers ("Wanderson Ferreira" . "iagwanderson@gmail.com")) (:maintainer "Wanderson Ferreira" . "iagwanderson@gmail.com") (:keywords "convenience" "matching") (:url . "https://github.com/wandersoncferreira/cljr-ivy"))]) (cljsbuild-mode . [(20160402 1700) nil "A minor mode for the ClojureScript 'lein cljsbuild' command" tar ((:commit . "fa2315660cb3ce944b5e16c679dcf5afd6a97f4c") (:keywords "clojure" "clojurescript" "leiningen" "compilation") (:url . "http://github.com/kototama/cljsbuild-mode"))]) @@ -595,13 +610,13 @@ (clojars . [(20180825 1951) ((request-deferred (0 2 0))) "clojars.org search interface" tar ((:commit . "c78e4d5ddacda064c253e2b38d1c35188aa1ad71") (:authors ("Joshua Miller" . "josh@joshmiller.io")) (:maintainers ("Joshua Miller" . "josh@joshmiller.io")) (:maintainer "Joshua Miller" . "josh@joshmiller.io") (:keywords "docs" "help" "tools") (:url . "https://github.com/joshuamiller/clojars.el"))]) (clojure-essential-ref . [(20221215 1427) ((emacs (24)) (cider (0 24 0))) "Cider-doc to \"Clojure, The Essential Reference\"" tar ((:commit . "6741bf65cf9b9bc896ab1cc3c384573e8ffe5f96") (:url . "https://github.com/p3r7/clojure-essential-ref"))]) (clojure-essential-ref-nov . [(20221215 1427) ((emacs (24)) (dash (2 16 0)) (nov (0 3 1)) (clojure-essential-ref (0 1 0))) "Cider-doc to \"Clojure, The Essential Reference\" (EPUB)" tar ((:commit . "6741bf65cf9b9bc896ab1cc3c384573e8ffe5f96") (:url . "https://github.com/p3r7/clojure-essential-ref"))]) - (clojure-mode . [(20230829 620) ((emacs (25 1))) "Major mode for Clojure code" tar ((:commit . "81b67ecd3aab13b35f76772a1021d5638d6bb148") (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev") (:keywords "languages" "clojure" "clojurescript" "lisp") (:url . "https://github.com/clojure-emacs/clojure-mode"))]) - (clojure-mode-extra-font-locking . [(20230823 1720) ((clojure-mode (3 0))) "Extra font-locking for Clojure mode" tar ((:commit . "192a46653fdc27601905f97a044d47764fee1f4e") (:authors ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev") (:keywords "languages" "lisp") (:url . "https://github.com/clojure-emacs/clojure-mode"))]) + (clojure-mode . [(20240304 559) ((emacs (25 1))) "Major mode for Clojure code" tar ((:commit . "3792e08b76aa7fdae18938e1966ea140b9817a9a") (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev") (:keywords "languages" "clojure" "clojurescript" "lisp") (:url . "https://github.com/clojure-emacs/clojure-mode"))]) + (clojure-mode-extra-font-locking . [(20231124 732) ((clojure-mode (3 0))) "Extra font-locking for Clojure mode" tar ((:commit . "25d713a67d8e0209ee74bfc0153fdf677697b43f") (:authors ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev") (:keywords "languages" "lisp") (:url . "https://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." tar ((:commit . "8fe4e44939e8a01a4cdf60c0001d9a6abf8a73c3") (:keywords "languages" "clojure" "cider" "clojurescript") (:url . "https://github.com/symfrog/clojure-quick-repls"))]) (clojure-snippets . [(20220914 950) ((yasnippet (0 10 0))) "Yasnippets for clojure" tar ((:commit . "66d23f0ffedf2cc2be0387c3504b5f89d7300cfa") (:authors ("Max Penet" . "m@qbits.cc")) (:maintainer "Max Penet" . "m@qbits.cc") (:keywords "snippets"))]) - (clojure-ts-mode . [(20230829 2110) ((emacs (29))) "Major mode for Clojure code" tar ((:commit . "623c98292f9207a95169cdeae6f8595c016c6320") (:maintainers ("Danny Freeman" . "danny@dfreeman.email")) (:maintainer "Danny Freeman" . "danny@dfreeman.email") (:keywords "languages" "clojure" "clojurescript" "lisp") (:url . "http://github.com/clojure-emacs/clojure-ts-mode"))]) + (clojure-ts-mode . [(20240314 552) ((emacs (29 1))) "Major mode for Clojure code" tar ((:commit . "8afa5656955814193b3b27020faf4edf00abda88") (:maintainers ("Danny Freeman" . "danny@dfreeman.email")) (:maintainer "Danny Freeman" . "danny@dfreeman.email") (:keywords "languages" "clojure" "clojurescript" "lisp") (:url . "http://github.com/clojure-emacs/clojure-ts-mode"))]) (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." tar ((:commit . "9cd7c9fd86bc7bc627a31275d1ef131378b90a49") (:authors ("Kostafey" . "kostafey@gmail.com")) (:maintainers ("Kostafey" . "kostafey@gmail.com")) (:maintainer "Kostafey" . "kostafey@gmail.com") (:keywords "clojure" "interaction") (:url . "https://github.com/clojure-emacs/clomacs"))]) - (closql . [(20230806 2058) ((emacs (25 1)) (compat (29 1 4 2)) (emacsql (20230220))) "Store EIEIO objects using EmacSQL" tar ((:commit . "ea49aa1d12ad7fb5d8e9f87eec033732aff1ee7a") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "extensions") (:url . "https://github.com/emacscollective/closql"))]) + (closql . [(20240216 1729) ((emacs (25 1)) (compat (29 1 4 2)) (emacsql (20230220))) "Store EIEIO objects using EmacSQL" tar ((:commit . "81f04f60aab27c0d9161746384d4eeb0633202e2") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("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" tar ((:commit . "bc3d2fd5c35580bf1b8af43b12484c95a343b4b5") (:authors ("Roman Scherer" . "roman@burningswell.com")) (:maintainers ("Roman Scherer" . "roman@burningswell.com")) (:maintainer "Roman Scherer" . "roman@burningswell.com") (:keywords "tools" "closure" "javascript" "lint" "flymake") (:url . "https://github.com/r0man/closure-lint-mode"))]) (cloud-theme . [(20220205 1336) ((emacs (24))) "A light colored theme" tar ((:commit . "16ef7fbf0a423b29e3c3a0a2d9525afaf265aaed") (:authors ("Valerii Lysenko" . "vallyscode@gmail.com")) (:maintainers ("Valerii Lysenko" . "vallyscode@gmail.com")) (:maintainer "Valerii Lysenko" . "vallyscode@gmail.com") (:keywords "color" "theme") (:url . "https://github.com/vallyscode/cloud-theme"))]) (cloud-to-butt-erc . [(20130627 2308) nil "Replace 'the cloud' with 'my butt'" tar ((:commit . "6710c03d1bc91736435cbfe845924940cae34e5c") (:authors ("David Leatherman" . "leathekd@gmail.com")) (:maintainers ("David Leatherman" . "leathekd@gmail.com")) (:maintainer "David Leatherman" . "leathekd@gmail.com") (:url . "http://www.github.com/leathekd/cloud-to-butt-erc"))]) @@ -609,17 +624,17 @@ (cm-mode . [(20170203 2107) ((cl-lib (0 5))) "Minor mode for CriticMarkup" tar ((:commit . "276d49c859822265070ae5dfbb403fd7d8d06436") (:authors ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainers ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm") (:keywords "text" "markdown"))]) (cmake-font-lock . [(20230304 2223) ((cmake-mode (0 0))) "Advanced, type aware, highlight support for CMake" tar ((:commit . "a6038e916bcca807ae695f7d7e5c300c3f38f415") (:authors ("Anders Lindgren")) (:maintainers ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "faces" "languages") (:url . "https://github.com/Lindydancer/cmake-font-lock"))]) (cmake-ide . [(20210610 1525) ((emacs (24 4)) (cl-lib (0 5)) (seq (1 11)) (levenshtein (0)) (s (1 11 0))) "Calls CMake to find out include paths and other compiler flags" tar ((:commit . "28dc4ab5bd01d99553901b4efeb7234280928b18") (:authors ("Atila Neves" . "atila.neves@gmail.com")) (:maintainers ("Atila Neves" . "atila.neves@gmail.com")) (:maintainer "Atila Neves" . "atila.neves@gmail.com") (:keywords "languages") (:url . "http://github.com/atilaneves/cmake-ide"))]) - (cmake-mode . [(20230823 1325) ((emacs (24 1))) "major-mode for editing CMake sources" tar ((:commit . "c3977582b77f8b5a4ccacf460a262ff0a75d3cc5"))]) + (cmake-mode . [(20240126 1513) ((emacs (24 1))) "major-mode for editing CMake sources" tar ((:commit . "409ab01039dd3c8f5ae0df48a1ee1c356132a9bf"))]) (cmake-project . [(20171121 1115) nil "Integrates CMake build process with Emacs" tar ((:commit . "d3f408f226eff3f77f7e00dd519f4efc78fd292d") (:authors ("Alexander Lamaison" . "alexander.lamaison@gmail")) (:maintainers ("Alexander Lamaison" . "alexander.lamaison@gmail")) (:maintainer "Alexander Lamaison" . "alexander.lamaison@gmail") (:keywords "c" "cmake" "languages" "tools") (:url . "http://github.com/alamaison/emacs-cmake-project"))]) (cmd-to-echo . [(20161203 2133) ((emacs (24 4)) (s (1 11 0)) (shell-split-string (20151224 208))) "Show the output of long-running commands in the echo area" tar ((:commit . "e0e874fc0e1ad6d291e39ed76023445297ad438a") (:authors ("Tijs Mallaerts" . "tijs.mallaerts@gmail.com")) (:maintainers ("Tijs Mallaerts" . "tijs.mallaerts@gmail.com")) (:maintainer "Tijs Mallaerts" . "tijs.mallaerts@gmail.com"))]) (cmm-mode . [(20150225 746) nil "Major mode for C-- source code" tar ((:commit . "c3ad514dff3eb30434f6b20d953276d4c00de1ee"))]) - (cnfonts . [(20230412 132) ((emacs (24))) "A simple Chinese fonts config tool" tar ((:commit . "5115f53366bd6118dce3673ddec5ff428534ce67") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainers ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:keywords "convenience" "chinese" "font") (:url . "https://github.com/tumashu/cnfonts"))]) + (cnfonts . [(20240320 254) ((emacs (24))) "A simple Chinese fonts config tool" tar ((:commit . "323bfd2f66ac0d9cc831cc1ff785c1ed603f5ef2") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainers ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:keywords "convenience" "chinese" "font") (:url . "https://github.com/tumashu/cnfonts"))]) (cobalt . [(20180304 1155) ((emacs (24))) "Easily use the Cobalt.rs static site generator" tar ((:commit . "634ace275697e188746ca22a30ff94380ec756be") (:authors ("Juan Karlo Licudine" . "accidentalrebel@gmail.com")) (:maintainers ("Juan Karlo Licudine" . "accidentalrebel@gmail.com")) (:maintainer "Juan Karlo Licudine" . "accidentalrebel@gmail.com") (:keywords "convenience") (:url . "https://github.com/cobalt-org/cobalt.el"))]) (cobra-mode . [(20140116 2116) nil "Major mode for .NET-based Cobra language" tar ((:commit . "acd6e53f6286af5176471d01f25257e5ddb6dd01") (:authors ("Taylor \"Nekroze\" Lawson")) (:maintainers ("Taylor \"Nekroze\" Lawson")) (:maintainer "Taylor \"Nekroze\" Lawson") (:keywords "languages") (:url . "http://github.com/Nekroze/cobra-mode"))]) (codcut . [(20190915 1009) nil "Share pieces of code to Codcut" tar ((:commit . "bf07c3db3900e36b0b87423f3b715d6378f86393") (:authors ("Diego Pasquali" . "hello@dgopsq.space")) (:maintainers ("Diego Pasquali" . "hello@dgopsq.space")) (:maintainer "Diego Pasquali" . "hello@dgopsq.space") (:keywords "comm" "tools" "codcut" "share") (:url . "https://github.com/codcut/codcut-emacs"))]) (code-archive . [(20190612 308) ((emacs (24 3))) "git supported code archive and reference for org-mode" tar ((:commit . "1ad9af6679d0294c3056eab9cad673f29c562721") (:authors ("Michael Schuldt" . "mbschuldt@gmail.com")) (:maintainers ("Michael Schuldt" . "mbschuldt@gmail.com")) (:maintainer "Michael Schuldt" . "mbschuldt@gmail.com") (:url . "https://github.com/mschuldt/code-archive"))]) - (code-cells . [(20220917 1431) ((emacs (27 1))) "Lightweight notebooks with support for ipynb files" tar ((:commit . "fd68a33eb43b3cbd44fed767f48e230382903592") (:authors ("Augusto Stoffel" . "arstoffel@gmail.com")) (:maintainers ("Augusto Stoffel" . "arstoffel@gmail.com")) (:maintainer "Augusto Stoffel" . "arstoffel@gmail.com") (:keywords "convenience" "outlines") (:url . "https://github.com/astoff/code-cells.el"))]) - (code-compass . [(20230527 1309) ((emacs (26 1)) (s (1 12 0)) (dash (2 13)) (async (1 9 7)) (simple-httpd (1 5 1))) "Navigate software aided by metrics and visualization" tar ((:commit . "f55155ef7c098aea4275e18211cd45ad028a5f82") (:authors ("Andrea" . "andrea-dev@hotmail.com")) (:maintainers ("Andrea" . "andrea-dev@hotmail.com")) (:maintainer "Andrea" . "andrea-dev@hotmail.com") (:keywords "tools" "extensions" "help") (:url . "https://github.com/ag91/code-compass"))]) + (code-cells . [(20231119 2138) ((emacs (27 1))) "Lightweight notebooks with support for ipynb files" tar ((:commit . "44546ca256f3da29e3ac884e3d699c8455acbd6e") (:authors ("Augusto Stoffel" . "arstoffel@gmail.com")) (:maintainers ("Augusto Stoffel" . "arstoffel@gmail.com")) (:maintainer "Augusto Stoffel" . "arstoffel@gmail.com") (:keywords "convenience" "outlines") (:url . "https://github.com/astoff/code-cells.el"))]) + (code-compass . [(20231108 1618) ((emacs (26 1)) (s (1 12 0)) (dash (2 13)) (async (1 9 7)) (simple-httpd (1 5 1))) "Navigate software aided by metrics and visualization" tar ((:commit . "67ec53f9ca43bea941ec5ba6fccba8565c1d937f") (:authors ("Andrea" . "andrea-dev@hotmail.com")) (:maintainers ("Andrea" . "andrea-dev@hotmail.com")) (:maintainer "Andrea" . "andrea-dev@hotmail.com") (:keywords "tools" "extensions" "help") (:url . "https://github.com/ag91/code-compass"))]) (code-library . [(20160426 1218) ((gist (1 3 1))) "use org-mode to collect code snippets" tar ((:commit . "3c79338eae5c892bfb4e4882298422d9fd65d2d7") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "lisp" "code"))]) (code-review . [(20221206 113) ((emacs (25 1)) (closql (1 2 0)) (magit (3 0 0)) (transient (0 3 7)) (a (1 0 0)) (ghub (3 5 1)) (uuidgen (1 2)) (deferred (0 5 1)) (markdown-mode (2 4)) (forge (0 3 0)) (emojify (1 2))) "Perform code review from Github, Gitlab, and Bitbucket Cloud" tar ((:commit . "a8bb63b53f2a1fd31302c110e668ad7b5c871b34") (:authors ("Wanderson Ferreira ")) (:maintainers ("Wanderson Ferreira" . "wand@hey.com")) (:maintainer "Wanderson Ferreira" . "wand@hey.com") (:keywords "git" "tools" "vc") (:url . "https://github.com/wandersoncferreira/code-review"))]) (code-stats . [(20201209 2135) ((emacs (25)) (request (0 3 0))) "Code::Stats plugin" tar ((:commit . "9a467dfd6a3cef849468623e1c085cbf59dac154") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainers ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:url . "https://github.com/xuchunyang/code-stats-emacs"))]) @@ -627,27 +642,28 @@ (codesearch . [(20181006 1431) ((log4e (0 3 1))) "Core support for managing codesearch tools" tar ((:commit . "f6eb96f034a925444412cfa03e45e0ccbbafe3f2") (:authors ("Austin Bingham" . "austin.bingham@gmail.com") ("Youngjoo Lee" . "youngker@gmail.com")) (:maintainers ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:keywords "tools" "development" "search") (:url . "https://github.com/abingham/emacs-codesearch"))]) (codespaces . [(20221018 1831) ((emacs (28 1))) "Connect to GitHub Codespaces via TRAMP" tar ((:commit . "8e0843684ea685c2b25b8f5601cf02553bab4b08") (:authors ("Patrick Thomson" . "patrickt@github.com")) (:maintainers ("Patrick Thomson" . "patrickt@github.com")) (:maintainer "Patrick Thomson" . "patrickt@github.com") (:keywords "comm") (:url . "https://github.com/patrickt/codespaces.el"))]) (codic . [(20150926 1127) ((emacs (24)) (cl-lib (0 5))) "Search Codic (codic.jp) naming dictionaries" tar ((:commit . "52bbb6997ef4ab9fb7fea43bbfff7f04671aa557") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-codic"))]) + (coercion . [(20240107 2154) ((emacs (29 1))) "Naming convention style switch" tar ((:commit . "a96ecfa3a44f2e15349abf265905c6c607cf2c07") (:authors ("liuyinz" . "liuyinz95@gmail.com")) (:maintainers ("liuyinz" . "liuyinz95@gmail.com")) (:maintainer "liuyinz" . "liuyinz95@gmail.com") (:keywords "convenience" "editing") (:url . "https://github.com/liuyinz/coercion.el"))]) (coffee-fof . [(20131012 1230) ((coffee-mode (0 4 1))) "A coffee-mode configuration for `ff-find-other-file'." tar ((:commit . "211529594bc074721c6cbc4edb73a63cc05f89ac") (:authors ("Yasuyki Oka" . "yasuyk@gmail.com")) (:maintainers ("Yasuyki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyki Oka" . "yasuyk@gmail.com") (:keywords "coffee-mode") (:url . "http://github.com/yasuyk/coffee-fof"))]) (coffee-mode . [(20200315 1133) ((emacs (24 3))) "Major mode for CoffeeScript code" tar ((:commit . "35a41c7d8233eac0b267d9593e67fb8b6235e134") (:authors ("Chris Wanstrath" . "chris@ozmm.org")) (:maintainers ("Chris Wanstrath" . "chris@ozmm.org")) (:maintainer "Chris Wanstrath" . "chris@ozmm.org") (:keywords "coffeescript" "major" "mode") (:url . "http://github.com/defunkt/coffee-mode"))]) (coin-ticker . [(20170611 727) ((request (0 3 0)) (emacs (25))) "Show a cryptocurrency price ticker" tar ((:commit . "45108e239e1d129c0cc1ff37f2870cf73087780b") (:authors ("Evan Klitzke" . "evan@eklitzke.org")) (:maintainers ("Evan Klitzke" . "evan@eklitzke.org")) (:maintainer "Evan Klitzke" . "evan@eklitzke.org") (:keywords "news") (:url . "https://github.com/eklitzke/coin-ticker-mode"))]) (colonoscopy-theme . [(20170808 1309) ((emacs (24 0))) "an Emacs 24 theme based on Colonoscopy (tmTheme)" tar ((:commit . "64bbb322b13dae91ce9f1e3581f836f94f800ead") (:authors ("Jason Milkins")) (:maintainers ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/tmtheme-to-deftheme"))]) - (color-identifiers-mode . [(20230405 527) ((dash (2 5 0)) (emacs (24))) "Color identifiers based on their names" tar ((:commit . "c4060d1bca6fa2acfe449e086171d4efee62863f") (:authors ("Ankur Dave" . "ankurdave@gmail.com")) (:maintainers ("Ankur Dave" . "ankurdave@gmail.com")) (:maintainer "Ankur Dave" . "ankurdave@gmail.com") (:keywords "faces" "languages") (:url . "https://github.com/ankurdave/color-identifiers-mode"))]) + (color-identifiers-mode . [(20240218 1801) ((dash (2 5 0)) (emacs (24))) "Color identifiers based on their names" tar ((:commit . "6cb50ae7e61189f55387e5350c20651e081d613c") (:authors ("Ankur Dave" . "ankurdave@gmail.com")) (:maintainers ("Ankur Dave" . "ankurdave@gmail.com")) (:maintainer "Ankur Dave" . "ankurdave@gmail.com") (:keywords "faces" "languages") (:url . "https://github.com/ankurdave/color-identifiers-mode"))]) (color-moccur . [(20141223 35) nil "multi-buffer occur (grep) mode" tar ((:commit . "4f1c59ffd1ccc2ab1a171cd6b721e8cb9e002fb7") (:keywords "convenience") (:url . "http://www.bookshelf.jp/elc/color-moccur.el"))]) (color-theme . [(20190220 1115) nil "An OBSOLETE color-theme implementation" tar ((:commit . "3a2f6b615f5e2401e30d93a3e0adc210bbb4b7aa") (:authors ("Jonadab the Unsightly One" . "jonadab@bright.net")) (:maintainers ("Xavier Maillard" . "zedek@gnu.org")) (:maintainer "Xavier Maillard" . "zedek@gnu.org") (:keywords "faces") (:url . "http://www.emacswiki.org/cgi-bin/wiki.pl?ColorTheme"))]) (color-theme-approximate . [(20140228 436) nil "Makes Emacs theme works on terminal transparently" tar ((:commit . "f54301ca39bc5d2ffb000f233f8114184a3e7d71") (:authors ("Tung Dao" . "me@tungdao.com")) (:maintainers ("Tung Dao" . "me@tungdao.com")) (:maintainer "Tung Dao" . "me@tungdao.com"))]) (color-theme-buffer-local . [(20170126 601) ((color-theme (0))) "Install color-themes by buffer." tar ((:commit . "faf7415c99e132094f1f09c6b6974ec118a18d87") (:authors ("Victor Borja" . "vic.borja@gmail.com")) (:maintainers ("Victor Borja" . "vic.borja@gmail.com")) (:maintainer "Victor Borja" . "vic.borja@gmail.com") (:keywords "faces") (:url . "http://github.com/vic/color-theme-buffer-local"))]) - (color-theme-modern . [(20220506 858) ((emacs (24))) "Reimplement colortheme with Emacs 24 theme framework." tar ((:commit . "74ad69bbca6fcfff3c0960d888c7c9c1f9f3e2e8") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/emacs-jp/replace-colorthemes"))]) + (color-theme-modern . [(20231116 2258) ((emacs (24))) "Reimplement colortheme with Emacs 24 theme framework." tar ((:commit . "5f790421b6eff5d2915819fa23cfcdb19827fa91") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/emacs-jp/replace-colorthemes"))]) (color-theme-sanityinc-solarized . [(20220917 1350) ((emacs (24 1)) (cl-lib (0 6))) "A version of Ethan Schoonover's Solarized themes" tar ((:commit . "b8f4a65bd53b97b56b93fff2fb14f71b2831aa6f") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "faces" "themes") (:url . "https://github.com/purcell/color-theme-sanityinc-solarized"))]) - (color-theme-sanityinc-tomorrow . [(20230806 1552) nil "A version of Chris Kempson's \"tomorrow\" themes" tar ((:commit . "d34e8db507ee0c7b465ff18a8f220c33ed77cd79") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "faces" "themes") (:url . "https://github.com/purcell/color-theme-sanityinc-tomorrow"))]) + (color-theme-sanityinc-tomorrow . [(20240226 1133) ((emacs (24 1))) "A version of Chris Kempson's \"tomorrow\" themes" tar ((:commit . "e74bb5bbf714c8ec9649d161a90708f0b9b093d6") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "faces" "themes") (:url . "https://github.com/purcell/color-theme-sanityinc-tomorrow"))]) (color-theme-x . [(20201204 2245) ((cl-lib (0 5))) "convert color themes to X11 resource settings" tar ((:commit . "ec853dd931d625e07116fbc91d8829bd15f90889") (:authors ("Matthew Kennedy" . "mkennedy@killr.ath.cx")) (:maintainers ("Andrew Johnson" . "andrew@andrewjamesjohnson.com")) (:maintainer "Andrew Johnson" . "andrew@andrewjamesjohnson.com") (:keywords "convenience" "faces" "frames") (:url . "https://github.com/ajsquared/color-theme-x"))]) (colorless-themes . [(20210102 1035) ((emacs (24 1))) "A macro to generate mostly colorless themes" tar ((:commit . "95fff8b4e313bdd2073454fd5be9420d95dab267") (:authors ("Thomas Letan" . "contact@thomasletan.fr")) (:maintainers ("Thomas Letan" . "contact@thomasletan.fr")) (:maintainer "Thomas Letan" . "contact@thomasletan.fr") (:keywords "faces themes" "faces") (:url . "https://git.sr.ht/~lthms/colorless-themes.el"))]) (colormaps . [(20171008 2224) ((emacs (25))) "Hex colormaps" tar ((:commit . "3a88961ba66b09a49ea5aa92b2b8776b2c92d68c") (:authors ("Abhinav Tushar" . "lepisma@fastmail.com")) (:maintainers ("Abhinav Tushar" . "lepisma@fastmail.com")) (:maintainer "Abhinav Tushar" . "lepisma@fastmail.com") (:keywords "tools") (:url . "https://github.com/lepisma/colormaps.el"))]) (column-enforce-mode . [(20200605 1933) nil "Highlight text that extends beyond a column" tar ((:commit . "14a7622f2268890e33536ccd29510024d51ee96f") (:authors ("Jordon Biondo")) (:maintainers ("Jordon Biondo")) (:maintainer "Jordon Biondo") (:url . "www.github.com/jordonbiondo/column-enforce-mode"))]) - (com-css-sort . [(20220704 647) ((emacs (25 1)) (s (1 12 0))) "Common way of sorting the CSS attributes" tar ((:commit . "eba4ecbb52aeca7b7d0f6b80ad21e0d2c70d0685") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "matching" "css" "sort") (:url . "https://github.com/jcs-elpa/com-css-sort"))]) + (com-css-sort . [(20240101 940) ((emacs (25 1)) (s (1 12 0))) "Common way of sorting the CSS attributes" tar ((:commit . "ad957f427dd6fe4af2f0690487fb5ebb28791741") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "matching" "css" "sort") (:url . "https://github.com/jcs-elpa/com-css-sort"))]) (comb . [(20201010 1147) ((emacs (25 1))) "Interactive code auditing and grep tool" tar ((:commit . "31f3e94afb2a7f7d18d30c2468a0c683700f7a66") (:authors ("Andrea Cardaci" . "cyrus.and@gmail.com")) (:maintainers ("Andrea Cardaci" . "cyrus.and@gmail.com")) (:maintainer "Andrea Cardaci" . "cyrus.and@gmail.com") (:keywords "matching") (:url . "https://github.com/cyrus-and/comb"))]) (comby . [(20200629 140) ((emacs (25 1))) "Emacs comby integration" tar ((:commit . "928b8b8959a2556aba5526f2a25801341eb59dc3") (:authors ("Sergey Kostyaev" . "feo.me@ya.ru")) (:maintainers ("Sergey Kostyaev" . "feo.me@ya.ru")) (:maintainer "Sergey Kostyaev" . "feo.me@ya.ru") (:keywords "languages") (:url . "https://github.com/s-kostyaev/comby.el"))]) (comint-hyperlink . [(20211026 100) ((emacs (24 3))) "Create hyperlinks in comint for SGR URL control sequences" tar ((:commit . "905f2db1f95950899301b9f71faed9e9362cf5dc") (:authors ("Matthew Bauer" . "mjbauer95@gmail.com")) (:maintainers ("Matthew Bauer" . "mjbauer95@gmail.com")) (:maintainer "Matthew Bauer" . "mjbauer95@gmail.com") (:keywords "comint" "shell" "processes" "hypermedia" "terminals") (:url . "https://github.com/matthewbauer/comint-hyperlink"))]) - (comint-intercept . [(20200106 454) ((emacs (24 3))) "Intercept input in comint-mode" tar ((:commit . "3c9a6125e450435b79ab5e6466f830e57c5e0a30") (:authors ("\"Huang, Ying\"" . "huang.ying.caritas@gmail.com")) (:maintainers ("\"Huang, Ying\"" . "huang.ying.caritas@gmail.com")) (:maintainer "\"Huang, Ying\"" . "huang.ying.caritas@gmail.com") (:keywords "processes" "terminals") (:url . "https://github.com/hying-caritas/comint-intercept"))]) + (comint-intercept . [(20230930 956) ((emacs (24 3))) "Intercept input in comint-mode" tar ((:commit . "79cfa3f15558f99285734ff36e80e3c4628565ae") (:authors ("\"Huang, Ying\"" . "huang.ying.caritas@gmail.com")) (:maintainers ("\"Huang, Ying\"" . "huang.ying.caritas@gmail.com")) (:maintainer "\"Huang, Ying\"" . "huang.ying.caritas@gmail.com") (:keywords "processes" "terminals") (:url . "https://github.com/hying-caritas/comint-intercept"))]) (command-log-mode . [(20160413 447) nil "log keyboard commands to buffer" tar ((:commit . "af600e6b4129c8115f464af576505ea8e789db27") (:authors ("Michael Weber" . "michaelw@foldr.org")) (:maintainers ("Michael Weber" . "michaelw@foldr.org")) (:maintainer "Michael Weber" . "michaelw@foldr.org") (:keywords "help") (:url . "https://github.com/lewang/command-log-mode"))]) (command-queue . [(20160328 1725) ((emacs (24 3))) "shell command queue" tar ((:commit . "f327c6f852592229a755ec6de0c62c6aeafd6659") (:authors ("Yuki INOUE ")) (:maintainers ("Yuki INOUE ")) (:maintainer "Yuki INOUE ") (:url . "https://github.com/Yuki-Inoue/command-queue"))]) (commander . [(20140120 1852) ((s (1 6 0)) (dash (2 0 0)) (cl-lib (0 3)) (f (0 6 1))) "Emacs command line parser" tar ((:commit . "2c8a57b9c619e29ccbe2d5a85921b9c689e95bf9") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainers ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:keywords "cli" "argv") (:url . "http://github.com/rejeep/commander.el"))]) @@ -658,28 +674,29 @@ (commenter . [(20160219 1627) ((emacs (24 4)) (let-alist (1 0 4))) "multiline-comment support package" tar ((:commit . "6d1885419434ba779270c6fda0e30d390bb074bd") (:authors ("Yuta Yamada ")) (:maintainers ("Yuta Yamada ")) (:maintainer "Yuta Yamada ") (:keywords "comment") (:url . "https://github.com/yuutayamada/commenter"))]) (commify . [(20230616 1042) ((s (1 9 0))) "Toggle grouping commas in numbers" tar ((:commit . "35e2438eb7feeb28273c4920376fcf296cc83283") (:authors ("Daniel E. Doherty" . "ded-commify@ddoherty.net")) (:maintainers ("Daniel E. Doherty" . "ded-commify@ddoherty.net")) (:maintainer "Daniel E. Doherty" . "ded-commify@ddoherty.net") (:keywords "convenience" "editing" "numbers" "grouping" "commas") (:url . "https://github.com/ddoherty03/commify"))]) (common-lisp-snippets . [(20180226 1523) ((yasnippet (0 8 0))) "Yasnippets for Common Lisp" tar ((:commit . "1ddf808311ba4d9e8444a1cb50bd5ee75e4111f6") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainers ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:keywords "snippets") (:url . "https://github.com/mrkkrp/common-lisp-snippets"))]) - (company . [(20230703 2021) ((emacs (25 1))) "Modular text completion framework" tar ((:commit . "3ec40b0a0ea751b6c48f24abd58c8304deb53014") (:authors ("Nikolaj Schumacher")) (:maintainers ("Dmitry Gutov" . "dgutov@yandex.ru")) (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru") (:keywords "abbrev" "convenience" "matching") (:url . "http://company-mode.github.io/"))]) + (company . [(20240311 1943) ((emacs (25 1))) "Modular text completion framework" tar ((:commit . "b0a522ac5bf8ba3d2f4f22e3aa846a4f82978a16") (:authors ("Nikolaj Schumacher")) (:maintainers ("Dmitry Gutov" . "dmitry@gutov.dev")) (:maintainer "Dmitry Gutov" . "dmitry@gutov.dev") (:keywords "abbrev" "convenience" "matching") (:url . "http://company-mode.github.io/"))]) (company-anaconda . [(20230821 2126) ((emacs (25 1)) (company (0 8 0)) (anaconda-mode (0 1 1)) (cl-lib (0 5 0)) (dash (2 6 0)) (s (1 9))) "Anaconda backend for company-mode" tar ((:commit . "14867265e474f7a919120bbac74870c3256cbacf") (:authors ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainers ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainer "Artem Malyshev" . "proofit404@gmail.com") (:keywords "convenience" "company" "anaconda") (:url . "https://github.com/proofit404/anaconda-mode"))]) - (company-ansible . [(20200306 1441) ((emacs (24 4)) (company (0 8 12))) "A company back-end for ansible" tar ((:commit . "79dd421b161efa49fbdffad57fa40edb41f484a3") (:authors ("Krzysztof Magosa" . "krzysztof@magosa.pl")) (:maintainers ("Krzysztof Magosa" . "krzysztof@magosa.pl")) (:maintainer "Krzysztof Magosa" . "krzysztof@magosa.pl") (:keywords "ansible") (:url . "https://github.com/krzysztof-magosa/company-ansible"))]) + (company-ansible . [(20240221 2255) ((emacs (24 4)) (company (0 8 12))) "A company back-end for ansible" tar ((:commit . "338922601cf9e8ada863fe6f2dd9d5145d9983b0") (:authors ("Krzysztof Magosa" . "krzysztof@magosa.pl")) (:maintainers ("Krzysztof Magosa" . "krzysztof@magosa.pl")) (:maintainer "Krzysztof Magosa" . "krzysztof@magosa.pl") (:keywords "ansible") (:url . "https://github.com/krzysztof-magosa/company-ansible"))]) (company-arduino . [(20160306 1739) ((emacs (24 1)) (company (0 8 0)) (irony (0 1 0)) (cl-lib (0 5)) (company-irony (0 1 0)) (company-c-headers (20140930)) (arduino-mode (1 0))) "company-mode for Arduino" tar ((:commit . "5958b917cc5cc729dc64d74d947da5ee91c48980") (:authors ("Yuta Yamada" . "sleepboy.zzz@gmail.com")) (:maintainers ("Yuta Yamada" . "sleepboy.zzz@gmail.com")) (:maintainer "Yuta Yamada" . "sleepboy.zzz@gmail.com") (:keywords "convenience" "development" "company") (:url . "https://github.com/yuutayamada/company-arduino"))]) (company-auctex . [(20200529 1835) ((yasnippet (0 8 0)) (company (0 8 0)) (auctex (11 87))) "Company-mode auto-completion for AUCTeX" tar ((:commit . "9400a2ec7459dde8cbf1a5d50dfee4e300ed7e18") (:authors ("Christopher Monsanto , Alexey Romanov" . "alexey.v.romanov@gmail.com")) (:maintainers ("Christopher Monsanto , Alexey Romanov" . "alexey.v.romanov@gmail.com")) (:maintainer "Christopher Monsanto , Alexey Romanov" . "alexey.v.romanov@gmail.com") (:url . "https://github.com/alexeyr/company-auctex/"))]) (company-axiom . [(20220612 1535) ((emacs (24)) (company (0 9)) (axiom-environment (20171021))) "A company-mode backend for the axiom-environment system" tar ((:commit . "01d88daa0c864af9918db5a147fbb5e435dec199") (:authors ("Paul Onions" . "paul.onions@acm.org")) (:maintainers ("Paul Onions" . "paul.onions@acm.org")) (:maintainer "Paul Onions" . "paul.onions@acm.org") (:keywords "axiom" "openaxiom" "fricas" "axiom-environment"))]) (company-bibtex . [(20171105 644) ((company (0 9 0)) (cl-lib (0 5)) (parsebib (1 0))) "Company completion for bibtex keys" tar ((:commit . "225c6f5c0c070c94c8cdbbd452ea548cd94d76f4") (:authors ("GB Gardner" . "gbgar@users.noreply.github.com")) (:maintainers ("GB Gardner" . "gbgar@users.noreply.github.com")) (:maintainer "GB Gardner" . "gbgar@users.noreply.github.com") (:keywords "company-mode" "bibtex") (:url . "https://github.com/gbgar/company-bibtex"))]) - (company-box . [(20230312 1028) ((emacs (26 0 91)) (dash (2 19 0)) (company (0 9 6)) (frame-local (0 0 1))) "Company front-end with icons" tar ((:commit . "b6f53e26adf948aca55c3ff6c22c21a6a6614253") (:authors ("Sebastien Chapuis" . "sebastien@chapu.is")) (:maintainers ("Sebastien Chapuis" . "sebastien@chapu.is")) (:maintainer "Sebastien Chapuis" . "sebastien@chapu.is") (:keywords "company" "completion" "front-end" "convenience") (:url . "https://github.com/sebastiencs/company-box"))]) + (company-box . [(20240320 921) ((emacs (26 0 91)) (dash (2 19 0)) (company (0 9 6)) (frame-local (0 0 1))) "Company front-end with icons" tar ((:commit . "c4f2e243fba03c11e46b1600b124e036f2be7691") (:authors ("Sebastien Chapuis" . "sebastien@chapu.is")) (:maintainers ("Sebastien Chapuis" . "sebastien@chapu.is")) (:maintainer "Sebastien Chapuis" . "sebastien@chapu.is") (:keywords "company" "completion" "front-end" "convenience") (:url . "https://github.com/sebastiencs/company-box"))]) (company-c-headers . [(20190825 1631) ((emacs (24 1)) (company (0 8))) "Company mode backend for C/C++ header files" tar ((:commit . "5e676ab0c2f287c868b1e3931afd4c78895910cd") (:authors ("Alastair Rankine" . "alastair@girtby.net")) (:maintainers ("Alastair Rankine" . "alastair@girtby.net")) (:maintainer "Alastair Rankine" . "alastair@girtby.net") (:keywords "development" "company"))]) (company-cabal . [(20170917 1317) ((cl-lib (0 5)) (company (0 8 0)) (emacs (24))) "company-mode cabal backend" tar ((:commit . "62112a7259e24bd6c08885629a185afe512b7d3d") (:authors ("Iku Iwasa" . "iku.iwasa@gmail.com")) (:maintainers ("Iku Iwasa" . "iku.iwasa@gmail.com")) (:maintainer "Iku Iwasa" . "iku.iwasa@gmail.com") (:url . "https://github.com/iquiw/company-cabal"))]) (company-coq . [(20221130 536) ((cl-lib (0 5)) (dash (2 12 1)) (yasnippet (0 11 0)) (company (0 8 12)) (company-math (1 1))) "A collection of extensions for Proof General's Coq mode" tar ((:commit . "5affe7a96a25df9101f9e44bac8a828d8292c2fa") (:authors ("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) (:maintainer "Clément Pit-Claudel" . "clement.pitclaudel@live.com") (:keywords "convenience" "languages") (:url . "https://github.com/cpitclaudel/company-coq"))]) (company-ctags . [(20211211 338) ((emacs (25 1)) (company (0 9 0))) "Fastest company-mode completion backend for ctags" tar ((:commit . "313508ba5d4f1e4b5d5d554faaa74076201c3248") (:authors ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainers ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainer "Chen Bin" . "chenbin.sh@gmail.com") (:keywords "convenience") (:url . "https://github.com/redguardtoo/company-ctags"))]) - (company-dcd . [(20210307 649) ((company (0 9)) (flycheck-dmd-dub (0 7)) (yasnippet (0 8)) (popwin (0 7)) (cl-lib (0 5)) (ivy (20160804 326))) "Company backend for Dlang using DCD." tar ((:commit . "858500115d4f0285f963698ede9492f409a90e52") (:authors ("tsukimizake ")) (:maintainers ("tsukimizake ")) (:maintainer "tsukimizake ") (:keywords "languages") (:url . "http://github.com/tsukimizake/company-dcd"))]) + (company-dcd . [(20240218 1726) ((company (0 9)) (flycheck-dmd-dub (0 7)) (yasnippet (0 8)) (popwin (0 7)) (cl-lib (0 5)) (ivy (20160804 326))) "Company backend for Dlang using DCD." tar ((:commit . "29dc3dc7fd0f7effe8f6a3dfbe7028a2019de48e") (:authors ("tsukimizake ")) (:maintainers ("tsukimizake ")) (:maintainer "tsukimizake ") (:keywords "languages") (:url . "http://github.com/tsukimizake/company-dcd"))]) (company-dict . [(20190302 5) ((emacs (24 4)) (company (0 8 12)) (parent-mode (2 3))) "A backend that emulates ac-source-dictionary" tar ((:commit . "cd7b8394f6014c57897f65d335d6b2bd65dab1f4") (:authors ("Henrik Lissner ")) (:maintainers ("Henrik Lissner" . "henrik@lissner.net")) (:maintainer "Henrik Lissner" . "henrik@lissner.net") (:keywords "company" "dictionary" "ac-source-dictionary") (:url . "https://github.com/hlissner/emacs-company-dict"))]) (company-distel . [(20180827 1344) ((distel-completion-lib (1 0 0))) "Erlang/distel completion backend for company-mode" tar ((:commit . "acc4c0a5521904203d797fe96b08e5fae4233c7e") (:authors ("Sebastian Weddmark Olsson")) (:maintainers ("Sebastian Weddmark Olsson")) (:maintainer "Sebastian Weddmark Olsson") (:keywords "erlang" "distel" "company") (:url . "github.com/sebastiw/distel-completion"))]) + (company-eask . [(20240101 819) ((emacs (26 1)) (company (0 8 0)) (eask (0 1 0))) "Company backend for Eask-file" tar ((:commit . "c1dd9411bed01cc79f8b34d900396e53198b918e") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience") (:url . "https://github.com/emacs-eask/company-eask"))]) (company-emacs-eclim . [(20180911 1121) ((eclim (0 3)) (company (0 7)) (cl-lib (0 5))) "Eclim company backend" tar ((:commit . "edff7e0e30c87036710d88fb0b7a4644750858e8"))]) - (company-emoji . [(20221208 2344) ((cl-lib (0 5)) (company (0 8 0))) "company-mode backend for emoji" tar ((:commit . "9e2816ce9b5795bd0066f92d4f80d15ccf94ef36") (:authors ("Alex Dunn" . "dunn.alex@gmail.com")) (:maintainers ("Alex Dunn" . "dunn.alex@gmail.com")) (:maintainer "Alex Dunn" . "dunn.alex@gmail.com") (:keywords "emoji" "company") (:url . "https://github.com/dunn/company-emoji.git"))]) - (company-emojify . [(20221231 1708) ((emacs (26 1)) (company (0 8 0)) (emojify (1 2 1)) (ht (2 0))) "Company completion for Emojify" tar ((:commit . "89652ee1a5488fbbe7b73c03ac316b895bb3fc19") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "emoji" "company" "emojify") (:url . "https://github.com/jcs-elpa/company-emojify"))]) + (company-emoji . [(20230903 1854) ((cl-lib (0 5)) (company (0 8 0))) "company-mode backend for emoji" tar ((:commit . "9c372be9406fba61d71aa0ed2d41adafae5a866e") (:authors ("Alex Dunn" . "dunn.alex@gmail.com")) (:maintainers ("Alex Dunn" . "dunn.alex@gmail.com")) (:maintainer "Alex Dunn" . "dunn.alex@gmail.com") (:keywords "emoji" "company") (:url . "https://github.com/dunn/company-emoji.git"))]) + (company-emojify . [(20240101 926) ((emacs (26 1)) (company (0 8 0)) (emojify (1 2 1)) (ht (2 0))) "Company completion for Emojify" tar ((:commit . "f115e03b9d4369f9170f4328028dd9c8080edb3d") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "emoji" "company" "emojify") (:url . "https://github.com/jcs-elpa/company-emojify"))]) (company-erlang . [(20170123 538) ((emacs (24 4)) (ivy-erlang-complete (0 1)) (company (0 9 2))) "company backend based on ivy-erlang-complete" tar ((:commit . "bc0524a16f17b66c7397690e4ca0e004f09ea6c5") (:authors ("Sergey Kostyaev" . "feo.me@ya.ru")) (:maintainers ("Sergey Kostyaev" . "feo.me@ya.ru")) (:maintainer "Sergey Kostyaev" . "feo.me@ya.ru") (:keywords "tools"))]) (company-flow . [(20180225 2159) ((company (0 8 0)) (dash (2 13 0))) "Flow backend for company-mode" tar ((:commit . "76ef585c70d2a3206c2eadf24ba61e59124c3a16") (:authors ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainers ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainer "Aaron Jensen" . "aaronjensen@gmail.com") (:url . "https://github.com/aaronjensen/company-flow"))]) (company-flx . [(20180103 518) ((emacs (24)) (company (0 8 12)) (flx (0 5))) "flx based fuzzy matching for company" tar ((:commit . "05efcafb488f587bb6e60923078d97227462eb68") (:authors ("PythonNut" . "pythonnut@pythonnut.com")) (:maintainers ("PythonNut" . "pythonnut@pythonnut.com")) (:maintainer "PythonNut" . "pythonnut@pythonnut.com") (:keywords "convenience" "company" "fuzzy" "flx") (:url . "https://github.com/PythonNut/company-flx"))]) - (company-fuzzy . [(20230531 743) ((emacs (26 1)) (company (0 8 12)) (s (1 12 0)) (ht (2 0))) "Fuzzy matching for `company-mode'" tar ((:commit . "85dd0a7852db70673d70387a834af01ed705c3f7") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "matching" "auto-complete" "complete" "fuzzy") (:url . "https://github.com/jcs-elpa/company-fuzzy"))]) + (company-fuzzy . [(20240101 943) ((emacs (26 1)) (company (0 8 12)) (s (1 12 0)) (ht (2 0))) "Fuzzy matching for `company-mode'" tar ((:commit . "059e3e0893a2b3c0ad4bf27b6963e7547b97b5d4") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "matching" "auto-complete" "complete" "fuzzy") (:url . "https://github.com/jcs-elpa/company-fuzzy"))]) (company-ghci . [(20190707 311) ((company (0 8 11)) (haskell-mode (13))) "company backend which uses the current ghci process." tar ((:commit . "a1d25652583ab4666c5a78cac18cd8039776b50d") (:authors ("Hector Orellana" . "hofm92@gmail.com")) (:maintainers ("Hector Orellana" . "hofm92@gmail.com")) (:maintainer "Hector Orellana" . "hofm92@gmail.com"))]) (company-glsl . [(20210109 1403) ((company (0 9 4)) (glsl-mode (2 4)) (emacs (24 4))) "Support glsl in company-mode" tar ((:commit . "3a40501ba831a30a7fd3e8529b20d1305d0454aa") (:authors ("Guido Schmidt" . "git@guidoschmidt.cc")) (:maintainers ("Guido Schmidt" . "git@guidoschmidt.cc")) (:maintainer "Guido Schmidt" . "git@guidoschmidt.cc") (:url . "https://github.com/guidoschmidt/company-glsl"))]) (company-go . [(20170825 1643) ((company (0 8 0)) (go-mode (1 0 0))) "company-mode backend for Go (using gocode)" tar ((:commit . "31948b463f2fc18f8801e5a8fe511fef300eb3dd") (:authors ("nsf" . "no.smile.face@gmail.com")) (:maintainers ("nsf" . "no.smile.face@gmail.com")) (:maintainer "nsf" . "no.smile.face@gmail.com") (:keywords "languages"))]) @@ -700,16 +717,16 @@ (company-ngram . [(20170129 1913) ((cl-lib (0 5)) (company (0 8 0))) "N-gram based completion" tar ((:commit . "d15182df3eac72b29772802759b77c9eafef5066") (:authors ("kshramt")) (:maintainers ("kshramt")) (:maintainer "kshramt") (:url . "https://github.com/kshramt/company-ngram"))]) (company-nixos-options . [(20160215 857) ((company (0 8 0)) (nixos-options (0 0 1)) (cl-lib (0 5 0))) "Company Backend for nixos-options" tar ((:commit . "a4e1d9ea9f2e773170caa3afbe54ecdf73d04ec8") (:authors ("Diego Berrocal" . "cestdiego@gmail.com") ("Travis B. Hartwell" . "nafai@travishartwell.net")) (:maintainers ("Diego Berrocal" . "cestdiego@gmail.com")) (:maintainer "Diego Berrocal" . "cestdiego@gmail.com") (:keywords "unix") (:url . "http://www.github.com/travisbhartwell/nix-emacs/"))]) (company-org-block . [(20230115 1202) ((emacs (25 1)) (company (0 8 0)) (org (9 2 0))) "Org blocks company backend" tar ((:commit . "aee601a2bfcc86d26e762eeb84e5e42573f8c5ca") (:authors ("Alvaro Ramirez")) (:maintainers ("Alvaro Ramirez")) (:maintainer "Alvaro Ramirez") (:url . "https://github.com/xenodium/company-org-block"))]) - (company-php . [(20230529 1404) ((cl-lib (0 5)) (ac-php-core (2 0)) (company (0 9))) "A company back-end for PHP." tar ((:commit . "7b89fbf25360cc146aee9b2b2ca60f3462b21078") (:authors ("jim" . "xcwenn@qq.com")) (:maintainers ("jim")) (:maintainer "jim") (:keywords "completion" "convenience" "intellisense") (:url . "https://github.com/xcwen/ac-php"))]) + (company-php . [(20240222 320) ((cl-lib (0 5)) (ac-php-core (2 0)) (company (0 9))) "A company back-end for PHP." tar ((:commit . "d4378a857aa1c60b34d86557aa10238785d1ac66") (:authors ("jim" . "xcwenn@qq.com")) (:maintainers ("jim")) (:maintainer "jim") (:keywords "completion" "convenience" "intellisense") (:url . "https://github.com/xcwen/ac-php"))]) (company-phpactor . [(20221023 608) ((emacs (24 3)) (company (0 9 6)) (phpactor (0 1 0))) "A company-mode backend for Phpactor" tar ((:commit . "c652439afd052910d322a8fb9249e09d278a3f37") (:authors ("Martin Tang" . "martin.tang365@gmail.com") ("Mikael Kermorgant" . "mikael@kgtech.fi")) (:maintainers ("Martin Tang" . "martin.tang365@gmail.com")) (:maintainer "Martin Tang" . "martin.tang365@gmail.com") (:keywords "tools" "php") (:url . "https://github.com/emacs-php/phpactor.el"))]) (company-plisp . [(20200531 1927) ((emacs (25)) (s (1 2 0)) (company (0 8 12)) (dash (2 12 0)) (cl-lib (0 5))) "Company mode backend for PicoLisp language" tar ((:commit . "0e6941e1832faafb2176238339667edd482acd95") (:authors ("Fermin MF" . "fmfs@posteo.net")) (:maintainers ("Fermin MF" . "fmfs@posteo.net")) (:maintainer "Fermin MF" . "fmfs@posteo.net") (:keywords "company" "plisp" "convenience" "auto-completion") (:url . "https://gitlab.com/sasanidas/company-plisp"))]) (company-plsense . [(20180118 58) ((company (0 9 3)) (cl-lib (0 5 0)) (dash (2 12 0)) (s (1 12)) (emacs (24))) "Company backend for Perl" tar ((:commit . "b48e3181e08ec597269621d621aa06636f02d883") (:authors ("Troy Hinckley" . "troy.hinckley@gmail.com")) (:maintainers ("Troy Hinckley" . "troy.hinckley@gmail.com")) (:maintainer "Troy Hinckley" . "troy.hinckley@gmail.com") (:url . "https://github.com/CeleritasCelery/company-plsense"))]) (company-pollen . [(20160812 1510) ((company (0 9 0)) (pollen-mode (1 0))) "company-mode completion backend for pollen" tar ((:commit . "9779f7f13b1e0cfb58af01af5d8ee9e783bb8a43") (:authors ("Junsong Li ")) (:maintainers ("Junsong Li")) (:maintainer "Junsong Li") (:keywords "languages" "pollen" "pollenpub" "company") (:url . "https://github.com/lijunsong/pollen-mode"))]) (company-posframe . [(20230104 1229) ((emacs (26 0)) (company (0 9 0)) (posframe (0 9 0))) "Use a posframe as company candidate menu" tar ((:commit . "18d6641bba72cba3c00018cee737ea8b454f64a8") (:authors ("Clément Pit-Claudel, Feng Shu, Lars Andersen" . "expez@expez.com")) (:maintainers ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:keywords "abbrev" "convenience" "matching") (:url . "https://github.com/tumashu/company-posframe"))]) - (company-prescient . [(20221216 112) ((emacs (25 1)) (prescient (6 1 0)) (company (0 9 6))) "prescient.el + Company" tar ((:commit . "72b023f5fc1ae2bbf2f51f1786cc012d40671bf4") (:authors ("Radian LLC" . "contact+prescient@radian.codes")) (:maintainers ("Radian LLC" . "contact+prescient@radian.codes")) (:maintainer "Radian LLC" . "contact+prescient@radian.codes") (:keywords "extensions") (:url . "https://github.com/raxod502/prescient.el"))]) + (company-prescient . [(20240226 204) ((emacs (25 1)) (prescient (6 1 0)) (company (0 9 6))) "prescient.el + Company" tar ((:commit . "c39bf07c56b427bf41aafd7d20eaef5cf3c312b5") (:authors ("Radian LLC" . "contact+prescient@radian.codes")) (:maintainers ("Radian LLC" . "contact+prescient@radian.codes")) (:maintainer "Radian LLC" . "contact+prescient@radian.codes") (:keywords "extensions") (:url . "https://github.com/raxod502/prescient.el"))]) (company-qml . [(20170428 1708) ((qml-mode (0 1)) (company (0 8 12))) "Company backend for QML files" tar ((:commit . "4af4f32a7ad86d86bb9293fb0b675aec513b5736") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainers ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions"))]) - (company-quickhelp . [(20221212 534) ((emacs (24 3)) (company (0 8 9)) (pos-tip (0 4 6))) "Popup documentation for completion candidates" tar ((:commit . "9505fb09d064581da142d75c139d48b5cf695bd5") (:authors ("Lars Andersen" . "expez@expez.com")) (:maintainers ("Lars Andersen" . "expez@expez.com")) (:maintainer "Lars Andersen" . "expez@expez.com") (:keywords "company" "popup" "documentation" "quickhelp") (:url . "https://www.github.com/expez/company-quickhelp"))]) - (company-quickhelp-terminal . [(20220704 647) ((emacs (24 4)) (company-quickhelp (2 2 0)) (popup (0 5 3))) "Terminal support for `company-quickhelp'" tar ((:commit . "08925e9dfe97482795dfe2f14542cfa2fd8895dd") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "terminal" "extends" "support" "tip" "help") (:url . "https://github.com/jcs-elpa/company-quickhelp-terminal"))]) + (company-quickhelp . [(20231026 1714) ((emacs (24 3)) (company (0 8 9)) (pos-tip (0 4 6))) "Popup documentation for completion candidates" tar ((:commit . "5bda859577582cc42d16fc0eaf5f7c8bedfd9e69") (:authors ("Lars Andersen" . "expez@expez.com")) (:maintainers ("Lars Andersen" . "expez@expez.com")) (:maintainer "Lars Andersen" . "expez@expez.com") (:keywords "company" "popup" "documentation" "quickhelp") (:url . "https://www.github.com/expez/company-quickhelp"))]) + (company-quickhelp-terminal . [(20240101 1005) ((emacs (24 4)) (company-quickhelp (2 2 0)) (popup (0 5 3))) "Terminal support for `company-quickhelp'" tar ((:commit . "1ea1dcc8696714f349df21e151bc66fb2cf396a8") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "terminal" "extends" "support" "tip" "help") (:url . "https://github.com/jcs-elpa/company-quickhelp-terminal"))]) (company-racer . [(20171205 310) ((emacs (24 4)) (cl-lib (0 5)) (company (0 8 0)) (deferred (0 3 1))) "Company integration for racer" tar ((:commit . "a00381c9d416f375f783fcb6ae8d40669ce1f567") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainers ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:keywords "convenience") (:url . "https://github.com/emacs-pe/company-racer"))]) (company-reftex . [(20210418 1316) ((emacs (25 1)) (s (1 12)) (company (0 8))) "Company backend based on RefTeX." tar ((:commit . "42eb98c6504e65989635d95ab81b65b9d5798e76") (:authors ("Eivind Fonn" . "evfonn@gmail.com")) (:maintainers ("Eivind Fonn" . "evfonn@gmail.com")) (:maintainer "Eivind Fonn" . "evfonn@gmail.com") (:keywords "bib" "tex" "company" "latex" "reftex" "references" "labels" "citations") (:url . "https://github.com/TheBB/company-reftex"))]) (company-restclient . [(20190426 1312) ((cl-lib (0 5)) (company (0 8 0)) (emacs (24)) (know-your-http-well (0 2 0)) (restclient (0 0 0))) "company-mode completion back-end for restclient-mode" tar ((:commit . "e5a3ec54edb44776738c13e13e34c85b3085277b") (:authors ("Iku Iwasa" . "iku.iwasa@gmail.com")) (:maintainers ("Iku Iwasa" . "iku.iwasa@gmail.com")) (:maintainer "Iku Iwasa" . "iku.iwasa@gmail.com") (:url . "https://github.com/iquiw/company-restclient"))]) @@ -717,7 +734,7 @@ (company-shell . [(20230106 1532) ((emacs (24 4)) (company (0 8 12)) (dash (2 12 0)) (cl-lib (0 5))) "Company mode backend for shell functions" tar ((:commit . "5f959a63a6e66eb0cbdac3168cad523a62cc2ccd") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainers ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:keywords "company" "shell" "auto-completion") (:url . "https://github.com/Alexander-Miller/company-shell"))]) (company-solidity . [(20200113 1721) ((company (0 9 0)) (cl-lib (0 5 0)) (solidity-mode (0 1 9))) "Company-mode back-end for solidity-mode" tar ((:commit . "93412f211fad7dfc3b02aa226856fc52b6a15c22") (:authors ("Samuel Smolkin" . "sam@future-precedent.org")) (:maintainers ("Samuel Smolkin" . "sam@future-precedent.org")) (:maintainer "Samuel Smolkin" . "sam@future-precedent.org") (:keywords "solidity" "completion" "company") (:url . "https://github.com/ethereum/emacs-solidity"))]) (company-sourcekit . [(20210430 2155) ((emacs (24 3)) (company (0 8 12)) (dash (2 18 0)) (sourcekit (0 2 0))) "company-mode completion backend for SourceKit" tar ((:commit . "a1860ad4dd3a542acd2fa0dfac2a388cbdf4af0c") (:authors ("Nathan Kot" . "nk@nathankot.com")) (:maintainers ("Nathan Kot" . "nk@nathankot.com")) (:maintainer "Nathan Kot" . "nk@nathankot.com") (:keywords "abbrev") (:url . "https://github.com/nathankot/company-sourcekit"))]) - (company-spell . [(20230813 1849) ((emacs (24 4)) (company (0 9 13))) "Autocompleting spelling for Company" tar ((:commit . "67505e492def67ae7bcf438882977fd857e94785") (:keywords "wp") (:url . "https://github.com/enzuru/company-spell"))]) + (company-spell . [(20230906 1635) ((emacs (24 4)) (company (0 9 13))) "Autocompleting spelling for Company" tar ((:commit . "f25b592c271dd1098ebe06b233b6ebb6fbeed488") (:keywords "wp") (:url . "https://github.com/enzuru/company-spell"))]) (company-stan . [(20211129 2051) ((emacs (24 3)) (company (0 9 10)) (stan-mode (10 3 0))) "A company-mode completion backend for stan" tar ((:commit . "150bbbe5fd3ad2b5a3dbfba9d291e66eeea1a581") (:authors ("Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu")) (:maintainers ("Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu")) (:maintainer "Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu") (:keywords "languages") (:url . "https://github.com/stan-dev/stan-mode/tree/master/company-stan"))]) (company-statistics . [(20170210 1933) ((emacs (24 3)) (company (0 8 5))) "Sort candidates using completion history" tar ((:commit . "e62157d43b2c874d2edbd547c3bdfb05d0a7ae5c") (:authors ("Ingo Lohmar" . "i.lohmar@gmail.com")) (:maintainers ("Ingo Lohmar" . "i.lohmar@gmail.com")) (:maintainer "Ingo Lohmar" . "i.lohmar@gmail.com") (:keywords "abbrev" "convenience" "matching") (:url . "https://github.com/company-mode/company-statistics"))]) (company-suggest . [(20200911 1845) ((company (0 9 0)) (emacs (25 1))) "Company-mode back-end for search engine suggests" tar ((:commit . "1c89c9de3852f07ce28b0bedf1fbf56fe6eedcdc") (:authors ("Jürgen Hötzel" . "juergen@archlinux.org")) (:maintainers ("Jürgen Hötzel" . "juergen@archlinux.org")) (:maintainer "Jürgen Hötzel" . "juergen@archlinux.org") (:keywords "completion" "convenience") (:url . "https://github.com/juergenhoetzel/company-suggest"))]) @@ -730,60 +747,65 @@ (company-ycmd . [(20180520 1053) ((ycmd (1 3)) (company (0 9 3)) (deferred (0 5 1)) (s (1 11 0)) (dash (2 13 0)) (let-alist (1 0 5)) (f (0 19 0))) "company-mode backend for ycmd" tar ((:commit . "966594701c1eef1f6d4dad0c71c6d43a029977d7") (:url . "https://github.com/abingham/emacs-ycmd"))]) (compdef . [(20200304 611) ((emacs (24 4))) "A local completion definer" tar ((:commit . "30fb5846ed851efee641ce8c5d8879ad36cd7ac6") (:authors ("Uros Perisic")) (:maintainers ("Uros Perisic")) (:maintainer "Uros Perisic") (:keywords "convenience") (:url . "https://gitlab.com/jjzmajic/compdef"))]) (competitive-programming-snippets . [(20201115 1702) ((emacs (26)) (yasnippet (0 8 0))) "Competitive Programming snippets for yasnippet" tar ((:commit . "3b43c1aeaa6676d1d3d0c47e78790db9bee150b6") (:authors ("Seong Yong-ju" . "sei40kr@gmail.com")) (:maintainers ("Seong Yong-ju" . "sei40kr@gmail.com")) (:maintainer "Seong Yong-ju" . "sei40kr@gmail.com") (:keywords "tools") (:url . "https://github.com/sei40kr/competitive-programming-snippets"))]) - (compile-multi . [(20230828 1034) ((emacs (28 1))) "A multi target interface to compile" tar ((:commit . "870baff1d9e0ab199bfa7dfd3f54c2a81ee5ba46") (:authors ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainers ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainer "mohsin kaleem" . "mohkale@kisara.moe") (:keywords "tools" "compile" "build") (:url . "https://github.com/mohkale/compile-multi"))]) - (compile-multi-all-the-icons . [(20230822 1933) ((emacs (28 0)) (all-the-icons-completion (0 0 1))) "Affixate `compile-multi' with icons" tar ((:commit . "28595f31c4c9b37c2e342cd7bb4b7f1553d18943") (:authors ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainers ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainer "mohsin kaleem" . "mohkale@kisara.moe") (:keywords "tools" "compile" "build") (:url . "https://github.com/mohkale/compile-multi"))]) - (compiler-explorer . [(20221108 825) ((emacs (26 1)) (request (0 3 0))) "Compiler explorer client (godbolt.org)" tar ((:commit . "36a2cbf0863d4563096546c38ff26db3d7a3e18c") (:authors ("Michał Krzywkowski" . "k.michal@zoho.com")) (:maintainers ("Michał Krzywkowski" . "k.michal@zoho.com")) (:maintainer "Michał Krzywkowski" . "k.michal@zoho.com") (:keywords "c" "tools") (:url . "https://github.com/mkcms/compiler-explorer.el"))]) + (compile-multi . [(20240315 2126) ((emacs (28 1))) "A multi target interface to compile" tar ((:commit . "7124939e77da2bf3847aeeba2ba0387e47e11ce7") (:authors ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainers ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainer "mohsin kaleem" . "mohkale@kisara.moe") (:keywords "tools" "compile" "build") (:url . "https://github.com/mohkale/compile-multi"))]) + (compile-multi-all-the-icons . [(20231226 2123) ((emacs (28 0)) (all-the-icons-completion (0 0 1))) "Affixate `compile-multi' with icons" tar ((:commit . "3d5b72478fc5fe0c0fd7431daec516a8ccf3ec76") (:authors ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainers ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainer "mohsin kaleem" . "mohkale@kisara.moe") (:keywords "tools" "compile" "build") (:url . "https://github.com/mohkale/compile-multi"))]) + (compile-multi-embark . [(20230904 1806) ((emacs (28 1)) (compile-multi (0 4)) (embark (0 22 1))) "Integration for `compile-multi' and `embark'" tar ((:commit . "30edb0e86287101269debf20f43cead92310029a") (:authors ("Mohsin Kaleem" . "mohkale@kisara.moe")) (:maintainers ("Mohsin Kaleem" . "mohkale@kisara.moe")) (:maintainer "Mohsin Kaleem" . "mohkale@kisara.moe") (:keywords "project" "convenience") (:url . "https://github.com/mohkale/compile-multi"))]) + (compiler-explorer . [(20230922 753) ((emacs (26 1)) (request (0 3 0))) "Compiler explorer client (godbolt.org)" tar ((:commit . "73a353c229aea84e6f24412b82f6f842fe01c55f") (:authors ("Michał Krzywkowski" . "k.michal@zoho.com")) (:maintainers ("Michał Krzywkowski" . "k.michal@zoho.com")) (:maintainer "Michał Krzywkowski" . "k.michal@zoho.com") (:keywords "c" "tools") (:url . "https://github.com/mkcms/compiler-explorer.el"))]) (composable . [(20220608 1148) ((emacs (25 1))) "composable editing" tar ((:commit . "205a69c64ea95ef67070423c31ed70ec44ec980c") (:authors ("Simon Friis Vindum" . "simon@vindum.io")) (:maintainers ("Simon Friis Vindum" . "simon@vindum.io")) (:maintainer "Simon Friis Vindum" . "simon@vindum.io") (:keywords "lisp"))]) (composer . [(20221120 202) ((emacs (25 1)) (seq (1 9)) (php-runtime (0 1 0))) "Interface to PHP Composer" tar ((:commit . "2299cd731205906350d615021f99a66d7a8905c2") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "tools" "php" "dependency" "manager") (:url . "https://github.com/zonuexe/composer.el"))]) - (comware-router-mode . [(20230107 1624) ((dash (2 16 0)) (emacs (24 3))) "Major mode for editing Comware configuration files" tar ((:commit . "cc0c1937e02f84ca8182b2de3ce5cc0982308ab8") (:authors ("Davide Restivo" . "davide.restivo@yahoo.it")) (:maintainers ("Davide Restivo" . "davide.restivo@yahoo.it")) (:maintainer "Davide Restivo" . "davide.restivo@yahoo.it") (:keywords "convenience" "faces") (:url . "https://github.com/daviderestivo/comware-router-mode"))]) + (comware-router-mode . [(20240103 907) ((dash (2 16 0)) (emacs (24 3))) "Major mode for editing Comware configuration files" tar ((:commit . "e1671efe5e0ade2dcbea0c17697d460cd8f0ba67") (:authors ("Davide Restivo" . "davide.restivo@yahoo.it")) (:maintainers ("Davide Restivo" . "davide.restivo@yahoo.it")) (:maintainer "Davide Restivo" . "davide.restivo@yahoo.it") (:keywords "convenience" "faces") (:url . "https://github.com/daviderestivo/comware-router-mode"))]) + (conan . [(20231016 830) ((emacs (29 1)) (s (1 7 0)) (f (0 20 0))) "Generate flags for c++ using conan 2.0" tar ((:commit . "80d17373cb6c3dc7952c538efd9f94a7f564ffec") (:authors ("Carl Olsen")) (:maintainers ("Calle")) (:maintainer "Calle") (:keywords "tools") (:url . "https://github.com/Carl2/conan-elisp"))]) (concurrent . [(20170601 435) ((emacs (24 3)) (deferred (0 5 0))) "Concurrent utility functions for emacs lisp" tar ((:commit . "d012a1ab50edcc2c44e3e49006f054dbff47cb6c") (:authors ("SAKURAI Masashi ")) (:maintainers ("SAKURAI Masashi ")) (:maintainer "SAKURAI Masashi ") (:keywords "deferred" "async" "concurrent") (:url . "https://github.com/kiwanami/emacs-deferred/blob/master/README-concurrent.markdown"))]) - (conda . [(20230620 1745) ((emacs (25 1)) (pythonic (0 1 0)) (dash (2 13 0)) (s (1 11 0)) (f (0 18 2))) "Work with your conda environments" tar ((:commit . "6a6a27dad7ab696b41b54a1cb7591ca489133fec") (:authors ("Rami Chowdhury" . "rami.chowdhury@gmail.com")) (:maintainers ("Rami Chowdhury" . "rami.chowdhury@gmail.com")) (:maintainer "Rami Chowdhury" . "rami.chowdhury@gmail.com") (:keywords "languages" "local" "tools" "python" "environment" "conda") (:url . "http://github.com/necaris/conda.el"))]) + (conda . [(20231109 219) ((emacs (25 1)) (pythonic (0 1 0)) (dash (2 13 0)) (s (1 11 0)) (f (0 18 2))) "Work with your conda environments" tar ((:commit . "60e14d1e9793431b91913a5688e278bd91d56224") (:authors ("Rami Chowdhury" . "rami.chowdhury@gmail.com")) (:maintainers ("Rami Chowdhury" . "rami.chowdhury@gmail.com")) (:maintainer "Rami Chowdhury" . "rami.chowdhury@gmail.com") (:keywords "languages" "local" "tools" "python" "environment" "conda") (:url . "http://github.com/necaris/conda.el"))]) (config-general-mode . [(20171024 1840) nil "Config::General config file mode" tar ((:commit . "b4a8e6ba0bb027a77e4a0f701409f3e57bb2e4c0") (:authors ("T.v.Dein" . "tlinden@cpan.org")) (:maintainers ("T.v.Dein" . "tlinden@cpan.org")) (:maintainer "T.v.Dein" . "tlinden@cpan.org") (:keywords "files") (:url . "https://github.com/tlinden/config-general-mode"))]) (config-parser . [(20160426 1219) ((emacs (24 4))) "a library for parsing config file" tar ((:commit . "85d559e7889d8f5b98b8794b79426ae25ec3caa5") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "convenience" "config") (:url . "https://github.com/lujun9972/el-config-parser"))]) (conkeror-minor-mode . [(20150114 1604) nil "Mode for editing conkeror javascript files." tar ((:commit . "476e81c27b056e21c192391fe674a2bf875466b0") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com>")) (:maintainers ("Artur Malabarba" . "bruce.connor.am@gmail.com>")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com>") (:keywords "programming" "tools") (:url . "http://github.com/Bruce-Connor/conkeror-minor-mode"))]) (conllu-mode . [(20200501 2328) ((emacs (25)) (cl-lib (0 5)) (flycheck (30)) (hydra (0 13 0)) (s (1 0))) "editing mode for CoNLL-U files" tar ((:commit . "0db3063572b0de08874822e20570bb153747e6ed") (:authors ("bruno cuconato" . "bcclaro+emacs@gmail.com")) (:maintainers ("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" tar ((:commit . "c9cad101100975e88873636bfd426b7a19304ebd") (:authors ("Torsten Hilbrich" . "torsten.hilbrich@gmx.net")) (:maintainers ("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")) (:maintainers ("Jannis Pohlmann" . "contact@jannispohlmann.de")) (:maintainer "Jannis Pohlmann" . "contact@jannispohlmann.de") (:keywords "themes") (:url . "https://github.com/jannis/emacs-constant-theme"))]) - (consult . [(20230821 2055) ((emacs (27 1)) (compat (29 1 4 1))) "Consulting completing-read" tar ((:commit . "5b7a9d0f506374f500a1216146f3dca3cb10306b") (:authors ("Daniel Mendler and Consult contributors")) (:maintainers ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:keywords "matching" "files" "completion") (:url . "https://github.com/minad/consult"))]) + (consult . [(20240314 642) ((emacs (27 1)) (compat (29 1 4 4))) "Consulting completing-read" tar ((:commit . "b48ff6bf0527baeb6bfd07c6da9d303ff0b79c3d") (:authors ("Daniel Mendler and Consult contributors")) (:maintainers ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:keywords "matching" "files" "completion") (:url . "https://github.com/minad/consult"))]) (consult-ag . [(20230227 406) ((emacs (27 1)) (consult (0 32))) "The silver searcher integration using Consult" tar ((:commit . "9eb4df265aedf2628a714610c2ade6d2f21de053") (:authors ("Kanon Kakuno" . "yadex205@outlook.jp")) (:maintainers ("Kanon Kakuno" . "yadex205@outlook.jp")) (:maintainer "Kanon Kakuno" . "yadex205@outlook.jp") (:url . "https://github.com/yadex205/consult-ag"))]) (consult-codesearch . [(20230315 1424) ((emacs (27 1)) (consult (0 20))) "Consult interface for codesearch" tar ((:commit . "51df545bb57b468058245950322ae15f6c3a0ce2") (:authors ("Youngjoo Lee" . "youngker@gmail.com")) (:maintainers ("Youngjoo Lee" . "youngker@gmail.com")) (:maintainer "Youngjoo Lee" . "youngker@gmail.com") (:keywords "tools") (:url . "https://github.com/youngker/consult-codesearch"))]) (consult-company . [(20230606 1824) ((emacs (27 1)) (company (0 9)) (consult (0 9))) "Consult frontend for company" tar ((:commit . "6e309fa9115c9ecd29aa27bff4e3b733979e5dbc") (:authors ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainers ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainer "mohsin kaleem" . "mohkale@kisara.moe") (:url . "https://github.com/mohkale/consult-company"))]) - (consult-compile-multi . [(20230828 1034) ((emacs (28 1)) (compile-multi (0 4)) (consult (0 34))) "Consulting read support for `compile-multi'" tar ((:commit . "870baff1d9e0ab199bfa7dfd3f54c2a81ee5ba46") (:authors ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainers ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainer "mohsin kaleem" . "mohkale@kisara.moe") (:keywords "tools" "compile" "build") (:url . "https://github.com/mohkale/compile-multi"))]) + (consult-compile-multi . [(20230904 1806) ((emacs (28 1)) (compile-multi (0 4)) (consult (0 34))) "Consulting read support for `compile-multi'" tar ((:commit . "30edb0e86287101269debf20f43cead92310029a") (:authors ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainers ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainer "mohsin kaleem" . "mohkale@kisara.moe") (:keywords "tools" "compile" "build") (:url . "https://github.com/mohkale/compile-multi"))]) (consult-dash . [(20230529 1419) ((emacs (27 2)) (dash-docs (1 4 0)) (consult (0 16))) "Consult front-end for dash-docs" tar ((:commit . "af9f26393583e4b5eb5f29fa4d7e72bf1a46d5f9") (:authors ("Ravi R Kiran" . "lists.ravi@gmail.com")) (:maintainers ("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"))]) (consult-dir . [(20230725 2338) ((emacs (27 1)) (consult (0 9))) "Insert paths into the minibuffer prompt" tar ((:commit . "3268ec3f7194c086ecfbd2863e029f42d91b77c1") (:authors ("Karthik Chikmagalur")) (:maintainers ("Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com")) (:maintainer "Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com") (:keywords "convenience") (:url . "https://github.com/karthink/consult-dir"))]) - (consult-eglot . [(20230423 1505) ((emacs (27 1)) (eglot (1 7)) (consult (0 31)) (project (0 3 0))) "A consulting-read interface for eglot" tar ((:commit . "db9d41c9812a5a8a7b9a22fa7f3c314e37584d41") (:authors ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainers ("Mohsin Kaleem")) (:maintainer "Mohsin Kaleem") (:keywords "tools" "completion" "lsp") (:url . "https://github.com/mohkale/consult-eglot"))]) - (consult-flycheck . [(20230702 1115) ((emacs (27 1)) (consult (0 32)) (flycheck (32))) "Provides the command `consult-flycheck'" tar ((:commit . "3f2a7c17cc2fe64e0c07e3bf90e33c885c0d7062") (:authors ("Daniel Mendler and Consult contributors")) (:maintainers ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:keywords "languages" "tools" "completion") (:url . "https://github.com/minad/consult"))]) + (consult-eglot . [(20240316 2212) ((emacs (27 1)) (eglot (1 7)) (consult (0 31)) (project (0 3 0))) "A consulting-read interface for eglot" tar ((:commit . "788804314139d6572c4e66d67e554a8e2e64589b") (:authors ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainers ("Mohsin Kaleem")) (:maintainer "Mohsin Kaleem") (:keywords "tools" "completion" "lsp") (:url . "https://github.com/mohkale/consult-eglot"))]) + (consult-flycheck . [(20240310 1442) ((emacs (27 1)) (consult (1 4)) (flycheck (34))) "Provides the command `consult-flycheck'" tar ((:commit . "754f5497d827f7d58009256a21af614cc44378a3") (:authors ("Daniel Mendler and Consult contributors")) (:maintainers ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:keywords "languages" "tools" "completion") (:url . "https://github.com/minad/consult-flycheck"))]) (consult-flyspell . [(20230322 204) ((emacs (25 1)) (consult (0 12))) "Consult integration for flyspell" tar ((:commit . "7011e6634598530ea2d874e7e7389dc1bb94e1ca") (:authors ("Marco Pawłowski")) (:maintainers ("Marco Pawłowski")) (:maintainer "Marco Pawłowski") (:keywords "convenience") (:url . "https://gitlab.com/OlMon/consult-flyspell"))]) - (consult-ghq . [(20210606 2047) ((emacs (26 1)) (consult (0 8)) (affe (0 1))) "Ghq interface using consult" tar ((:commit . "c8619d66bd8f8728e43ed15096078b89eb4d2083") (:authors ("Tomoya Otake" . "tomoya.ton@gmail.com")) (:maintainers ("Tomoya Otake" . "tomoya.ton@gmail.com")) (:maintainer "Tomoya Otake" . "tomoya.ton@gmail.com") (:keywords "convenience" "usability" "consult" "ghq") (:url . "https://github.com/tomoya/consult-ghq"))]) + (consult-ghq . [(20231111 1303) ((emacs (26 1)) (consult (0 8))) "Ghq interface using consult" tar ((:commit . "65a99980fb313d473376542cb87464a8a44ff25e") (:authors ("Tomoya Otake" . "tomoya.ton@gmail.com")) (:maintainers ("Tomoya Otake" . "tomoya.ton@gmail.com")) (:maintainer "Tomoya Otake" . "tomoya.ton@gmail.com") (:keywords "convenience" "usability" "consult" "ghq") (:url . "https://github.com/tomoya/consult-ghq"))]) (consult-git-log-grep . [(20230204 1753) ((emacs (27 1)) (consult (0 16))) "Consult integration for git log grep" tar ((:commit . "30dfcad5745a6b9882d94fec75d38c345a1eff89") (:authors ("Ghosty")) (:maintainers ("Ghosty")) (:maintainer "Ghosty") (:keywords "git" "convenience") (:url . "https://github.com/Ghosty141/consult-git-log-grep"))]) (consult-hatena-bookmark . [(20221125 109) ((emacs (27 1)) (consult (0 9)) (async-await (1 1))) "Consult commands for the Hatena Bookmark" tar ((:commit . "b85484b11705ebd896878d3ac7fdb12bc8c9637a") (:authors ("Yukinori Kitadai")) (:maintainers ("Yukinori Kitadai")) (:maintainer "Yukinori Kitadai") (:url . "https://github.com/Nyoho/consult-hatena-bookmark"))]) - (consult-ls-git . [(20230120 1500) ((emacs (27 1)) (consult (0 16))) "Consult integration for git" tar ((:commit . "7ba583abc16f70c497d038bfcbddbadd6894bd3d") (:authors ("Robin Joy")) (:maintainers ("Robin Joy")) (:maintainer "Robin Joy") (:keywords "convenience") (:url . "https://github.com/rcj/consult-ls-git"))]) + (consult-ls-git . [(20230924 810) ((emacs (27 1)) (consult (0 16))) "Consult integration for git" tar ((:commit . "3ccd9d80da73a05ef2a74616ffdc469860f74c21") (:authors ("Robin Joy")) (:maintainers ("Robin Joy")) (:maintainer "Robin Joy") (:keywords "convenience") (:url . "https://github.com/rcj/consult-ls-git"))]) (consult-lsp . [(20230209 714) ((emacs (27 1)) (lsp-mode (5 0)) (consult (0 16)) (f (0 20 0))) "LSP-mode Consult integration" tar ((:commit . "f8db3252c0daa41225ba4ed1c0d178b281cd3e90") (:authors ("Gerry Agbobada")) (:maintainers ("Gerry Agbobada")) (:maintainer "Gerry Agbobada") (:keywords "tools" "completion" "lsp") (:url . "https://github.com/gagbo/consult-lsp"))]) - (consult-notes . [(20230706 2018) ((emacs (27 1)) (consult (0 17)) (s (1 12 0)) (dash (2 19))) "Manage notes with consult" tar ((:commit . "4d905df3b74a5a46ebf27ce601846e3adc6b8144") (:authors ("Colin McLear" . "mclear@fastmail.com")) (:maintainers ("Colin McLear")) (:maintainer "Colin McLear") (:keywords "convenience") (:url . "https://github.com/mclear-tools/consult-notes"))]) - (consult-notmuch . [(20221216 1701) ((emacs (26 1)) (consult (0 9)) (notmuch (0 31))) "Notmuch search using consult" tar ((:commit . "d0d4129d45ccceddaeeaa3631eb42d5dd09a758b") (:authors ("Jose A Ortega Ruiz" . "jao@gnu.org")) (:maintainers ("Jose A Ortega Ruiz")) (:maintainer "Jose A Ortega Ruiz") (:keywords "mail") (:url . "https://codeberg.org/jao/consult-notmuch"))]) - (consult-org-roam . [(20230528 855) ((emacs (27 1)) (org-roam (2 2 0)) (consult (0 16))) "Consult integration for org-roam" tar ((:commit . "2ca42a1c1641a29f1447d35be01bd1fda368a9e2") (:authors ("jgru ")) (:maintainers ("jgru ")) (:maintainer "jgru ") (:url . "https://github.com/jgru/consult-org-roam"))]) - (consult-project-extra . [(20221013 1014) ((emacs (27 1)) (consult (0 17)) (project (0 8 1))) "Consult integration for project.el" tar ((:commit . "9fdf45fa40471900b0b158d73c4b1521a13d47ef") (:authors ("Enrique Kessler Martínez")) (:maintainers ("Enrique Kessler Martínez")) (:maintainer "Enrique Kessler Martínez") (:keywords "convenience" "project" "management") (:url . "https://github.com/Qkessler/consult-project-extra"))]) + (consult-notes . [(20240306 1529) ((emacs (27 1)) (consult (0 17)) (s (1 12 0)) (dash (2 19))) "Manage notes with consult" tar ((:commit . "652d0281b81becac643efe96386facf23e1dee01") (:authors ("Colin McLear" . "mclear@fastmail.com")) (:maintainers ("Colin McLear")) (:maintainer "Colin McLear") (:keywords "convenience") (:url . "https://github.com/mclear-tools/consult-notes"))]) + (consult-notmuch . [(20240127 406) ((emacs (26 1)) (consult (0 9)) (notmuch (0 31))) "Notmuch search using consult" tar ((:commit . "d8022e2ddc67ed4e89cc6f5bbe664fdb04e1e815") (:authors ("Jose A Ortega Ruiz" . "jao@gnu.org")) (:maintainers ("Jose A Ortega Ruiz")) (:maintainer "Jose A Ortega Ruiz") (:keywords "mail") (:url . "https://codeberg.org/jao/consult-notmuch"))]) + (consult-org-roam . [(20240217 1442) ((emacs (27 1)) (org-roam (2 2 0)) (consult (0 16))) "Consult integration for org-roam" tar ((:commit . "a6dec09dcd06a3014409044399c4f8860ca45ef1") (:authors ("jgru ")) (:maintainers ("jgru ")) (:maintainer "jgru ") (:url . "https://github.com/jgru/consult-org-roam"))]) + (consult-project-extra . [(20231221 1857) ((emacs (27 1)) (consult (0 17)) (project (0 8 1))) "Consult integration for project.el" tar ((:commit . "982e8008d69ea6733a2a7548e245d645c0fefb3f") (:authors ("Enrique Kessler Martínez")) (:maintainers ("Enrique Kessler Martínez")) (:maintainer "Enrique Kessler Martínez") (:keywords "convenience" "project" "management") (:url . "https://github.com/Qkessler/consult-project-extra"))]) (consult-projectile . [(20230821 406) ((emacs (25 1)) (consult (0 12)) (projectile (2 5 0))) "Consult integration for projectile" tar ((:commit . "400439c56d17bca7888f7d143d8a11f84900a406") (:authors ("Marco Pawłowski")) (:maintainers ("Marco Pawłowski")) (:maintainer "Marco Pawłowski") (:keywords "convenience") (:url . "https://gitlab.com/OlMon/consult-projectile"))]) - (consult-recoll . [(20221014 2002) ((emacs (26 1)) (consult (0 19))) "Recoll queries using consult" tar ((:commit . "8d506e2d01f46fc6b0a0825efb90b062ad6fe3d4") (:authors ("Jose A Ortega Ruiz" . "jao@gnu.org")) (:maintainers ("Jose A Ortega Ruiz" . "jao@gnu.org")) (:maintainer "Jose A Ortega Ruiz" . "jao@gnu.org") (:keywords "docs" "convenience") (:url . "https://codeberg.org/jao/consult-recoll"))]) + (consult-recoll . [(20231211 1221) ((emacs (26 1)) (consult (0 19))) "Recoll queries using consult" tar ((:commit . "ba68d052d9479aeaa5dda15a57a2c070df7d9bca") (:authors ("Jose A Ortega Ruiz" . "jao@gnu.org")) (:maintainers ("Jose A Ortega Ruiz" . "jao@gnu.org")) (:maintainer "Jose A Ortega Ruiz" . "jao@gnu.org") (:keywords "docs" "convenience") (:url . "https://codeberg.org/jao/consult-recoll"))]) (consult-spotify . [(20211114 2258) ((emacs (26 1)) (consult (0 8)) (espotify (0 1))) "Spotify queries using consult" tar ((:commit . "5c1dcf0182135cda4191d4ba206fe2f265100293") (:authors ("Jose A Ortega Ruiz" . "jao@gnu.org")) (:maintainers ("Jose A Ortega Ruiz")) (:maintainer "Jose A Ortega Ruiz") (:keywords "multimedia") (:url . "https://codeberg.org/jao/espotify"))]) - (consult-yasnippet . [(20220724 1338) ((emacs (27 1)) (yasnippet (0 14)) (consult (0 16))) "A consulting-read interface for yasnippet" tar ((:commit . "ae0450889484f23dc4ec37518852a2c61b89f184") (:authors ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainers ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainer "mohsin kaleem" . "mohkale@kisara.moe") (:url . "https://github.com/mohkale/consult-yasnippet"))]) + (consult-tex . [(20240307 1019) ((emacs (28 2)) (consult (0 35))) "Consult powered completion for tex" tar ((:commit . "29ab438792cb0a258dc7158526919ffcf0b5f134") (:authors ("Titus Pinta")) (:maintainers ("Titus Pinta" . "titus.pinta@gmail.com")) (:maintainer "Titus Pinta" . "titus.pinta@gmail.com") (:keywords "consult" "tex" "latex") (:url . "https://gitlab.com/titus.pinta/consult-TeX"))]) + (consult-todo . [(20231022 2059) ((emacs (27 1)) (consult (0 35)) (hl-todo (3 1 2))) "Search hl-todo keywords in consult" tar ((:commit . "84f3c9876a285f733d75053076a97cc30f7d8eb9") (:authors ("liuyinz" . "liuyinz@gmail.com")) (:maintainers ("liuyinz" . "liuyinz@gmail.com")) (:maintainer "liuyinz" . "liuyinz@gmail.com") (:url . "https://github.com/liuyinz/consult-todo"))]) + (consult-yasnippet . [(20240314 1838) ((emacs (27 1)) (yasnippet (0 14)) (consult (0 16))) "A consulting-read interface for yasnippet" tar ((:commit . "834d39acfe8a7d2c304afbe4d649b9372118c756") (:authors ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainers ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainer "mohsin kaleem" . "mohkale@kisara.moe") (:url . "https://github.com/mohkale/consult-yasnippet"))]) (contextual . [(20180726 800) ((emacs (24)) (dash (2 12 1)) (cl-lib (0 5))) "Contextual profile management system" tar ((:commit . "7ad2bb36426fd182d4d5ee7fd9be1cc0db8c7a84") (:authors ("Alexander Kahl" . "ak@sodosopa.io")) (:maintainers ("Alexander Kahl" . "ak@sodosopa.io")) (:maintainer "Alexander Kahl" . "ak@sodosopa.io") (:keywords "convenience" "tools") (:url . "https://github.com/lshift-de/contextual"))]) (contextual-menubar . [(20180205 709) nil "display the menubar only on a graphical display" tar ((:commit . "f76f55232ac07df76ef9a334a0c527dfab97c40b") (:authors ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainers ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainer "Aaron Jensen" . "aaronjensen@gmail.com") (:url . "https://github.com/aaronjensen/contextual-menubar"))]) (contrast-color . [(20160903 1807) ((emacs (24 3)) (cl-lib (0 5))) "Pick best contrast color for you" tar ((:commit . "6ff1b807e09ef6a775e4ab1032bb2ea3fc442d9e") (:authors ("Yuta Yamada ")) (:maintainers ("Yuta Yamada ")) (:maintainer "Yuta Yamada ") (:keywords "color" "convenience") (:url . "https://github.com/yuutayamada/contrast-color-el"))]) (control-mode . [(20160624 1710) nil "A \"control\" mode, similar to vim's \"normal\" mode" tar ((:commit . "6bf487144119b03f9cc54168f70e3d7d8d84e22b") (:authors ("Stephen Marsh" . "stephen.david.marsh@gmail.com")) (:maintainers ("Stephen Marsh" . "stephen.david.marsh@gmail.com")) (:maintainer "Stephen Marsh" . "stephen.david.marsh@gmail.com") (:keywords "convenience" "emulations") (:url . "https://github.com/stephendavidmarsh/control-mode"))]) - (conventional-changelog . [(20230101 1656) ((emacs (26 3)) (transient (0 3 7))) "Conventional Changelog Generator" tar ((:commit . "56f0e134f0edc1964965575dea259b186d34155a") (:authors ("liuyinz" . "liuyinz95@gmail.com")) (:maintainers ("liuyinz" . "liuyinz95@gmail.com")) (:maintainer "liuyinz" . "liuyinz95@gmail.com") (:keywords "tools") (:url . "https://github.com/liuyinz/emacs-conventional-changelog"))]) - (cool-mode . [(20220612 1904) ((emacs (25))) "Major mode for cool compiler language" tar ((:commit . "961e66956412a1dd63f79473a8273da8853f7179") (:authors ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainers ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainer "Noah Peart" . "noah.v.peart@gmail.com") (:url . "https://github.com/nverno/cool-mode"))]) - (copy-as-format . [(20190523 258) ((cl-lib (0 5))) "Copy buffer locations as GitHub/Slack/JIRA etc... formatted code" tar ((:commit . "a0962b670e26b723ce304b14e3397da453aef84e") (:authors ("Skye Shaw" . "skye.shaw@gmail.com")) (:maintainers ("Skye Shaw" . "skye.shaw@gmail.com")) (:maintainer "Skye Shaw" . "skye.shaw@gmail.com") (:keywords "github" "slack" "jira" "hipchat" "gitlab" "bitbucket" "org-mode" "pod" "rst" "asciidoc" "tools" "convenience") (:url . "https://github.com/sshaw/copy-as-format"))]) + (conventional-changelog . [(20230902 815) ((emacs (26 3)) (transient (0 4 1))) "Conventional Changelog Generator" tar ((:commit . "97778186ff529a487d7fb0fc20d199d26ef70f5c") (:authors ("liuyinz" . "liuyinz95@gmail.com")) (:maintainers ("liuyinz" . "liuyinz95@gmail.com")) (:maintainer "liuyinz" . "liuyinz95@gmail.com") (:keywords "tools") (:url . "https://github.com/liuyinz/emacs-conventional-changelog"))]) + (cool-mode . [(20231026 456) ((emacs (25))) "Major mode for cool compiler language" tar ((:commit . "46b6a38a99a954c5e77e90506eafec4092690692") (:authors ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainers ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainer "Noah Peart" . "noah.v.peart@gmail.com") (:url . "https://github.com/nverno/cool-mode"))]) + (copy-as-format . [(20231112 1710) ((cl-lib (0 5))) "Copy buffer locations as GitHub/Slack/JIRA etc... formatted code" tar ((:commit . "b9f6f725ca9701c5a02bfb479573fdfcce2e1e30") (:authors ("Skye Shaw" . "skye.shaw@gmail.com")) (:maintainers ("Skye Shaw" . "skye.shaw@gmail.com")) (:maintainer "Skye Shaw" . "skye.shaw@gmail.com") (:keywords "github" "slack" "jira" "telegram" "gitlab" "bitbucket" "org-mode" "pod" "rst" "asciidoc" "whatsapp" "tools" "convenience") (:url . "https://github.com/sshaw/copy-as-format"))]) (copy-file-on-save . [(20230402 1829) ((emacs (24 3)) (compat (29))) "Copy file on save, automatic deployment it" tar ((:commit . "370b1586feb2690d3c72185bd4f17c31ce03673a") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "files" "comm" "deploy") (:url . "https://github.com/emacs-php/emacs-auto-deployment"))]) (copyit . [(20190919 1258) ((emacs (24 3)) (s (1 9 0))) "Copy it, yank anything!" tar ((:commit . "c4f2c28e5b6270e8e3364341619f1154bb4e682e") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "convenience" "yank" "clipboard") (:url . "https://github.com/zonuexe/emacs-copyit"))]) (copyit-pandoc . [(20190919 1258) ((emacs (24 3)) (copyit (0 1 0)) (pandoc (0 0 1))) "Copy it, yank anything!" tar ((:commit . "c4f2c28e5b6270e8e3364341619f1154bb4e682e") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "convenience" "yank" "clipboard") (:url . "https://github.com/zonuexe/emacs-copyit"))]) (coq-commenter . [(20170822 2309) ((dash (2 13 0)) (s (1 11 0)) (cl-lib (0 5))) "Coq commenting minor mode for proof" tar ((:commit . "7fe9a2cc0ebdb0b1e54a24eb7971d757fb588ac3") (:authors ("Junyoung Clare Jang" . "jjc9310@gmail.com")) (:maintainers ("Junyoung Clare Jang" . "jjc9310@gmail.com")) (:maintainer "Junyoung Clare Jang" . "jjc9310@gmail.com") (:keywords "comment" "coq" "proof") (:url . "http://github.com/ailrun/coq-commenter"))]) + (corfu . [(20240122 2327) ((emacs (27 1)) (compat (29 1 4 4))) "COmpletion in Region FUnction" tar ((:commit . "b48d3017a47706198e04440cc1b3483bdf646771") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainers ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:keywords "abbrev" "convenience" "matching" "completion" "text") (:url . "https://github.com/minad/corfu"))]) (corfu-candidate-overlay . [(20230814 1537) ((emacs (28 1)) (corfu (0 36))) "Show first candidate in an overlay while typing" tar ((:commit . "265438b16155e899d82a869aebca16105665c998") (:authors ("Adam Kruszewski" . "adam@kruszewski.name")) (:maintainers ("Adam Kruszewski" . "adam@kruszewski.name")) (:maintainer "Adam Kruszewski" . "adam@kruszewski.name") (:url . "https://code.bsdgeek.org/adam/corfu-candidate-overlay/"))]) - (corfu-prescient . [(20221216 112) ((emacs (27 1)) (prescient (6 1 0)) (corfu (0 28))) "prescient.el + Corfu" tar ((:commit . "72b023f5fc1ae2bbf2f51f1786cc012d40671bf4") (:authors ("Radian LLC" . "contact+prescient@radian.codes")) (:maintainers ("Radian LLC" . "contact+prescient@radian.codes")) (:maintainer "Radian LLC" . "contact+prescient@radian.codes") (:keywords "extensions") (:url . "https://github.com/radian-software/prescient.el"))]) + (corfu-prescient . [(20240226 204) ((emacs (27 1)) (prescient (6 1 0)) (corfu (1 1))) "prescient.el + Corfu" tar ((:commit . "c39bf07c56b427bf41aafd7d20eaef5cf3c312b5") (:authors ("Radian LLC" . "contact+prescient@radian.codes")) (:maintainers ("Radian LLC" . "contact+prescient@radian.codes")) (:maintainer "Radian LLC" . "contact+prescient@radian.codes") (:keywords "extensions") (:url . "https://github.com/radian-software/prescient.el"))]) (corral . [(20160502 948) nil "Quickly surround text with delimiters" tar ((:commit . "e7ab6aa118e46b93d4933d1364bc273f57cd6911") (:authors ("Kevin Liu" . "mail@nivekuil.com")) (:maintainers ("Kevin Liu" . "mail@nivekuil.com")) (:maintainer "Kevin Liu" . "mail@nivekuil.com") (:url . "http://github.com/nivekuil/corral"))]) (cort . [(20211020 18) ((emacs (24 1)) (ansi (0 4)) (cl-lib (0 6))) "Simplify extended unit test framework" tar ((:commit . "3f64a7b03a4c5b768ec21fd5987acd0d62d16c7b") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "test" "lisp") (:url . "https://github.com/conao3/cort.el"))]) (cosmo . [(20170922 744) ((emacs (24 4))) "Cosmological Calculator" tar ((:commit . "dd83b09a49a2843606b28279b674b2207040b36b") (:authors ("Francesco Montanari" . "fmnt@fmnt.info")) (:maintainers ("Francesco Montanari" . "fmnt@fmnt.info")) (:maintainer "Francesco Montanari" . "fmnt@fmnt.info") (:keywords "tools") (:url . "https://gitlab.com/montanari/cosmo-el"))]) - (counsel . [(20230619 1623) ((emacs (24 5)) (ivy (0 14 0)) (swiper (0 14 0))) "Various completion functions using Ivy" tar ((:commit . "aa18c1f4861cef2ddcf0c70b6fd7edd93ae9c627") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "convenience" "matching" "tools") (:url . "https://github.com/abo-abo/swiper"))]) + (counsel . [(20240229 1509) ((emacs (24 5)) (ivy (0 14 2)) (swiper (0 14 2))) "Various completion functions using Ivy" tar ((:commit . "14c696aa2d6cd905795ba543374457a04a13ccae") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Basil L. Contovounesios" . "basil@contovou.net")) (:maintainer "Basil L. Contovounesios" . "basil@contovou.net") (:keywords "convenience" "matching" "tools") (:url . "https://github.com/abo-abo/swiper"))]) (counsel-ag-popup . [(20210121 805) ((emacs (26 1)) (counsel (0 13 0)) (transient (0 3 0))) "Interactive search with counsel-ag" tar ((:commit . "41d85fe36edd72da68f5009ad9cf9013cd19960d") (:authors ("Eder Elorriaga" . "gexplorer8@gmail.com")) (:maintainers ("Eder Elorriaga" . "gexplorer8@gmail.com")) (:maintainer "Eder Elorriaga" . "gexplorer8@gmail.com") (:keywords "convenience" "matching" "tools") (:url . "https://github.com/gexplorer/counsel-ag-popup"))]) (counsel-at-point . [(20230808 1344) ((emacs (26 2)) (counsel (0 13 0))) "Context sensitive project search" tar ((:commit . "08f45559597ffbff2e9ecda35bacaaa4dae26fc2") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:keywords "convenience") (:url . "https://codeberg.org/ideasman42/emacs-counsel-at-point"))]) (counsel-bbdb . [(20220909 727) ((emacs (24 3)) (bbdb (3 2 2 2))) "Quick search&input email from BBDB based on Emacs API `completing-read'" tar ((:commit . "ccae56b0551abb305cad087d85f1b6a97adb7c0f") (:authors ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainers ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainer "Chen Bin" . "chenbin.sh@gmail.com") (:keywords "mail" "abbrev" "convenience" "matching") (:url . "https://github.com/redguard/counsel-bbdb"))]) @@ -811,7 +833,7 @@ (counsel-web . [(20210609 2156) ((emacs (25 1)) (counsel (0 13 0)) (request (0 3 0))) "Search the Web using Ivy" tar ((:commit . "1359b3b204fcdac7a3d6664c7d540a88b5acecfd") (:authors ("Matthew Sojourner Newton" . "matt@mnewton.com")) (:maintainers ("Matthew Sojourner Newton" . "matt@mnewton.com")) (:maintainer "Matthew Sojourner Newton" . "matt@mnewton.com") (:keywords "convenience" "hypermedia") (:url . "https://github.com/mnewt/counsel-web"))]) (counsel-world-clock . [(20190709 2211) ((ivy (0 9 0)) (s (1 12 0))) "Display world clock using Ivy." tar ((:commit . "674e4c6b82a92ea765af97cc5f017b357284c7dc") (:authors ("Kuang Chen ")) (:maintainers ("Kuang Chen ")) (:maintainer "Kuang Chen ") (:url . "https://github.com/kchenphy/counsel-world-clock"))]) (countdown . [(20190626 244) ((emacs (25 1)) (stream (2 2 4))) "Countdown using big LCD-like digits" tar ((:commit . "139dea91fc818d65944aca5f16c9626abbdfbf04") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainers ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:keywords "tools") (:url . "https://github.com/xuchunyang/countdown.el"))]) - (cov . [(20220727 31) ((emacs (24 4)) (f (0 18 2)) (s (1 11 0)) (elquery (0))) "Show coverage stats in the fringe." tar ((:commit . "cd3e1995c596cc227124db9537792d8329ffb696") (:authors ("Adam Niederer")) (:maintainers ("Adam Niederer")) (:maintainer "Adam Niederer") (:keywords "coverage" "gcov" "c" "lcov" "coveralls" "clover") (:url . "https://github.com/AdamNiederer/cov"))]) + (cov . [(20231007 254) ((emacs (24 4)) (f (0 18 2)) (s (1 11 0)) (elquery (0))) "Show coverage stats in the fringe." tar ((:commit . "42bf07c6ab51ceb45753c798bcbc3327a9230ed5") (:authors ("Adam Niederer")) (:maintainers ("Adam Niederer")) (:maintainer "Adam Niederer") (:keywords "coverage" "gcov" "c" "lcov" "coveralls" "clover") (:url . "https://github.com/AdamNiederer/cov"))]) (coverage . [(20191113 1958) ((ov (1 0)) (cl-lib (0 5))) "Code coverage line highlighting" tar ((:commit . "6e3c6f2dcb759a76086adeeb1fdfe83e4f082482") (:authors ("Kieran Trezona-le Comte" . "trezona.lecomte@gmail.com")) (:maintainers ("Kieran Trezona-le Comte" . "trezona.lecomte@gmail.com")) (:maintainer "Kieran Trezona-le Comte" . "trezona.lecomte@gmail.com") (:keywords "coverage" "metrics" "simplecov" "ruby" "rspec") (:url . "https://github.com/trezona-lecomte/coverage"))]) (coverlay . [(20190414 940) ((emacs (24 1)) (cl-lib (0 5))) "Test coverage overlays" tar ((:commit . "0beae208d0e7d746a94385428bd61aa5cd7ea828") (:authors ("Takuto Wada ")) (:maintainers ("Takuto Wada ")) (:maintainer "Takuto Wada ") (:keywords "coverage" "overlay") (:url . "https://github.com/twada/coverlay.el"))]) (cowsay . [(20210510 1540) ((emacs (24 5))) "Poorly drawn ASCII cartoons saying things" tar ((:commit . "d8a72a311c6875f1aef6a30b3d23a1b02df75941") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "games") (:url . "https://github.com/lassik/emacs-cowsay"))]) @@ -823,7 +845,7 @@ (cql-mode . [(20190315 225) ((emacs (24))) "Major mode for editting CQLs" tar ((:commit . "d400c046850d3cf404778b2c47d6be4ff84ca04b") (:authors ("Yuki Inoue ")) (:maintainers ("Yuki Inoue ")) (:maintainer "Yuki Inoue ") (:keywords "cql" "cassandra") (:url . "https://github.com/Yuki-Inoue/cql-mode"))]) (cquery . [(20190118 542) ((emacs (25 1)) (lsp-mode (3 4)) (dash (0 13))) "cquery client for lsp-mode" tar ((:commit . "555e50984ebda177421fdcdc8c76cb29235d9694") (:authors ("Tobias Pisani")) (:maintainers ("Tobias Pisani")) (:maintainer "Tobias Pisani") (:keywords "languages" "lsp" "c++") (:url . "https://github.com/jacobdufault/cquery"))]) (crappy-jsp-mode . [(20140311 931) nil "A pretty crappy major-mode for jsp." tar ((:commit . "6c45ab92b452411cc0fab9bcee2f456276b4fc40") (:keywords "jsp" "major" "mode"))]) - (creamsody-theme . [(20230826 1651) ((autothemer (0 2)) (emacs (24))) "Straight from the soda fountain" tar ((:commit . "5f1bd04241cae39845336a18ea5eab3c5046f6ec") (:url . "http://github.com/emacsfodder/emacs-theme-creamsody"))]) + (creamsody-theme . [(20240109 557) ((autothemer (0 2)) (emacs (24))) "Straight from the soda fountain" tar ((:commit . "5f4fce9de6920cd2788bf6baf3a3da110f09bffd") (:url . "http://github.com/emacsfodder/emacs-theme-creamsody"))]) (create-link . [(20220621 1440) ((emacs (25 1))) "Smart format link generator" tar ((:commit . "276fafcc6fb568ede256c8d459c3beb408ad9b46") (:authors ("Kijima Daigo" . "norimaking777@gmail.com")) (:maintainers ("Kijima Daigo" . "norimaking777@gmail.com")) (:maintainer "Kijima Daigo" . "norimaking777@gmail.com") (:keywords "link" "format" "browser" "convenience") (:url . "https://github.com/kijimaD/create-link"))]) (creds . [(20140510 1706) ((s (1 9 0)) (dash (2 5 0))) "A parser credentials file library (not limited to credentials entries)" tar ((:commit . "00ebefd10005c170b790a01380cb6a98f798ce5c") (:authors ("Antoine R. Dumont ")) (:maintainer "Antoine R. Dumont ") (:keywords "credentials") (:url . "https://github.com/ardumont/emacs-creds"))]) (creole . [(20140924 1500) ((noflet (0 0 3)) (kv (0 0 17))) "A parser for the Creole Wiki language" tar ((:commit . "7d5cffe93857f6c75ca09ac79c0e47b8d4410e53") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainers ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:keywords "lisp" "creole" "wiki"))]) @@ -832,19 +854,19 @@ (crm-custom . [(20160117 6) ((cl-lib (0 5))) "Alternate `completing-read-multiple' that uses `completing-read'" tar ((:commit . "f1aaccf64306a5f99d9bf7ba815d7ea41c15518d") (:authors ("Ryan C. Thompson" . "rct@thompsonclan.org")) (:maintainers ("Ryan C. Thompson" . "rct@thompsonclan.org")) (:maintainer "Ryan C. Thompson" . "rct@thompsonclan.org") (:keywords "completion" "minibuffer" "multiple elements") (:url . "https://github.com/DarwinAwardWinner/crm-custom"))]) (crontab-mode . [(20210715 133) ((emacs (24 3))) "Major mode for crontab(5)" tar ((:commit . "7412f3df0958812bfcacd5875a409fa795fa8ecc") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainers ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:keywords "languages") (:url . "https://github.com/emacs-pe/crontab-mode"))]) (crossword . [(20210614 633) ((emacs (26 1))) "Download and play crossword puzzles" tar ((:commit . "e462de8ef15d1f979207a95b224e68d7feead92f") (:keywords "games") (:url . "https://github.com/Boruch-Baum/emacs-crossword"))]) - (crux . [(20221121 859) ((seq (1 11))) "A Collection of Ridiculously Useful eXtensions" tar ((:commit . "f8789f67a9d2e1eb31a0e4531aec9bb6d6ec1282") (:authors ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev") (:keywords "convenience") (:url . "https://github.com/bbatsov/crux"))]) + (crux . [(20240229 957) ((emacs (26 1))) "A Collection of Ridiculously Useful eXtensions" tar ((:commit . "7980df10e47eef41d4d1c57cfb690ec406381ed3") (:authors ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev") (:keywords "convenience") (:url . "https://github.com/bbatsov/crux"))]) (cryptol-mode . [(20190531 2051) nil "Cryptol major mode for Emacs" tar ((:commit . "81ebbde83f7cb75b2dfaefc09de6a1703068c769") (:authors (nil . "Austin Seipp ")) (:maintainers (nil . "Austin Seipp ")) (:maintainer nil . "Austin Seipp ") (:keywords "cryptol" "cryptography") (:url . "http://github.com/thoughtpolice/cryptol-mode"))]) - (crystal-mode . [(20230720 2043) ((emacs (24 4))) "Major mode for editing Crystal files" tar ((:commit . "e5b54c3ad728d791772ceccca607d0434ddaf985") (:keywords "languages" "crystal") (:url . "https://github.com/crystal-lang-tools/emacs-crystal-mode"))]) + (crystal-mode . [(20231205 1943) ((emacs (24 4))) "Major mode for editing Crystal files" tar ((:commit . "ea89b108fa4222df94ffb99e6e7eaec5d7aa4fea") (:keywords "languages" "crystal") (:url . "https://github.com/crystal-lang-tools/emacs-crystal-mode"))]) (crystal-playground . [(20180830 501) ((emacs (25)) (crystal-mode (0 1 2))) "Local crystal playground for short code snippets." tar ((:commit . "532dc7e4239eb4bdd241bc4347d34760344c1ebb") (:authors ("Jason Howell")) (:maintainers ("Jason Howell")) (:maintainer "Jason Howell") (:keywords "tools" "crystal") (:url . "https://github.com/jasonrobot/crystal-playground"))]) (csgo-conf-mode . [(20161209 1619) nil "CS:GO Configuration files syntax highlighting" tar ((:commit . "df45ca833eb68c394dd03acce5733a33c3b06bf8") (:authors ("Guillermo Robles" . "guillerobles1995@gmail.com")) (:maintainers ("Guillermo Robles" . "guillerobles1995@gmail.com")) (:maintainer "Guillermo Robles" . "guillerobles1995@gmail.com") (:keywords "languages") (:url . "https://github.com/wynro/emacs-csgo-conf-mode"))]) (csharp-mode . [(20221126 2005) ((emacs (26 1))) "C# mode derived mode" tar ((:commit . "d8b058c9e9d0429ea7e81d121ce19b064bd7e0f5") (:authors ("Theodor Thornhill" . "theo@thornhill.no")) (:maintainers ("Jostein Kjønigsen" . "jostein@gmail.com")) (:maintainer "Jostein Kjønigsen" . "jostein@gmail.com") (:keywords "c#" "languages" "oop" "mode") (:url . "https://github.com/emacs-csharp/csharp-mode"))]) - (csound-mode . [(20230825 946) ((emacs (25)) (shut-up (0 3 2)) (multi (2 0 1)) (dash (2 16 0)) (highlight (0))) "A major mode for interacting and coding Csound" tar ((:commit . "21b2841696fed1b3d8103ad58202d5604326fcc1") (:authors ("Hlöðver Sigurðsson" . "hlolli@gmail.com")) (:maintainers ("Hlöðver Sigurðsson" . "hlolli@gmail.com")) (:maintainer "Hlöðver Sigurðsson" . "hlolli@gmail.com") (:url . "https://github.com/hlolli/csound-mode"))]) + (csound-mode . [(20231024 1442) ((emacs (25)) (shut-up (0 3 2)) (multi (2 0 1)) (dash (2 16 0)) (highlight (0))) "A major mode for interacting and coding Csound" tar ((:commit . "2c9107a78048f16c4e274390eb3021e974372d64") (:authors ("Hlöðver Sigurðsson" . "hlolli@gmail.com")) (:maintainers ("Hlöðver Sigurðsson" . "hlolli@gmail.com")) (:maintainer "Hlöðver Sigurðsson" . "hlolli@gmail.com") (:url . "https://github.com/hlolli/csound-mode"))]) (csproj-mode . [(20200801 1732) ((emacs (24))) "Work with .NET project files (csproj, vbproj)" tar ((:commit . "a7f0f4610c976a28c41b9b8299892f88b5d0336c") (:authors ("Omair Majid" . "omair.majid@gmail.com")) (:maintainers ("Omair Majid" . "omair.majid@gmail.com")) (:maintainer "Omair Majid" . "omair.majid@gmail.com") (:keywords "languages" "tools") (:url . "https://github.com/omajid/csproj-mode"))]) (css-autoprefixer . [(20180311 1600) ((emacs (24))) "Adds autoprefix to CSS" tar ((:commit . "386a5defc8543a3b87820f1761c075c7d1d93b38") (:authors (nil . "Kyung Mo Kweon and contributors")) (:maintainers (nil . "Kyung Mo Kweon and contributors")) (:maintainer nil . "Kyung Mo Kweon and contributors") (:keywords "convenience" "usability" "css") (:url . "https://github.com/kkweon/emacs-css-autoprefixer"))]) (css-comb . [(20160416 559) nil "Sort CSS properties in a particular order using CSS Comb" tar ((:commit . "6fa45e5af8a8bd3af6c1154cde3540e32c4206ee") (:authors ("Charanjit Singh" . "ckhabra@gmail.com")) (:maintainers ("Charanjit Singh" . "ckhabra@gmail.com")) (:maintainer "Charanjit Singh" . "ckhabra@gmail.com") (:url . "https://github.com/channikhabra/css-comb.el"))]) (css-eldoc . [(20220415 1629) nil "an eldoc-mode plugin for CSS source code" tar ((:commit . "73ebf9757a043b56b7d3b5befec5a38e6754b9e5") (:authors ("Zeno Zeng" . "zenoes@qq.com")) (:maintainers ("Zeno Zeng" . "zenoes@qq.com")) (:maintainer "Zeno Zeng" . "zenoes@qq.com"))]) (cssh . [(20150810 1709) nil "clusterssh implementation for emacs" tar ((:commit . "2fe2754235225a59b63f08b130cfd4352e2e1c3f") (:authors ("Dimitri Fontaine" . "dim@tapoueh.org")) (:maintainers ("Dimitri Fontaine" . "dim@tapoueh.org")) (:maintainer "Dimitri Fontaine" . "dim@tapoueh.org") (:keywords "clusterssh" "ssh" "cssh") (:url . "http://tapoueh.org/emacs/cssh.html"))]) - (csv . [(20161113 1510) nil "Functions for reading and parsing CSV files." tar ((:commit . "aa1dfa1263565d5fac3879c21d8ddf5f8915e411") (:authors ("Ulf Jasper" . "ulf.jasper@web.de")) (:maintainers ("Ulf Jasper" . "ulf.jasper@web.de")) (:maintainer "Ulf Jasper" . "ulf.jasper@web.de") (:keywords "extensions" "data" "csv"))]) + (csv . [(20231216 1243) nil "Functions for reading and parsing CSV files" tar ((:commit . "8ed083c171a5e8caf11ebfbec67af3119ab1fd90") (:authors ("Ulf Jasper" . "ulf.jasper@web.de")) (:maintainers ("Ulf Jasper" . "ulf.jasper@web.de")) (:maintainer "Ulf Jasper" . "ulf.jasper@web.de") (:keywords "extensions" "data" "csv"))]) (ct . [(20230519 1319) ((emacs (26 1)) (dash (2 18 0)) (hsluv (1 0 0))) "Color Tools - a color api" tar ((:commit . "02f209fe6c8ad85c832d8f80193255d0bf78e218") (:authors ("neeasade")) (:maintainers ("neeasade")) (:maintainer "neeasade") (:keywords "convenience" "color" "theming" "rgb" "hsv" "hsl" "cie-lab" "background") (:url . "https://github.com/neeasade/ct.el"))]) (ctable . [(20210128 629) ((emacs (24 3)) (cl-lib (0 5))) "Table component for Emacs Lisp" tar ((:commit . "48b73742757a3ae5736d825fe49e00034cc453b5") (:authors ("SAKURAI Masashi ")) (:maintainers ("SAKURAI Masashi ")) (:maintainer "SAKURAI Masashi ") (:keywords "table") (:url . "https://github.com/kiwanami/emacs-ctable"))]) (ctags-update . [(20190609 613) nil "(auto) update TAGS in parent directory using exuberant-ctags" tar ((:commit . "67faf248b92388442958a069263c62a345425a1b") (:authors (nil . "Joseph(纪秀峰) jixiuf@gmail.com")) (:maintainers (nil . "Joseph(纪秀峰) jixiuf@gmail.com")) (:maintainer nil . "Joseph(纪秀峰) jixiuf@gmail.com") (:keywords "exuberant-ctags" "etags") (:url . "https://github.com/jixiuf/ctags-update"))]) @@ -860,15 +882,16 @@ (cue-mode . [(20220811 1938) ((emacs (25 1))) "Major mode for CUE language files" tar ((:commit . "31c671d56e7884fa87ad0f1d27d0bb439dc65380") (:authors ("Russell Sim" . "russell.sim@gmail.com")) (:maintainers ("Russell Sim" . "russell.sim@gmail.com")) (:maintainer "Russell Sim" . "russell.sim@gmail.com") (:keywords "data" "languages") (:url . "https://github.com/russell/cue-mode"))]) (cue-sheet-mode . [(20230522 511) ((emacs (27 1))) "Major mode for editing CUE sheet files" tar ((:commit . "016dfa8aeed264e15e2f55b0b34fcfdb7e14b9d9") (:authors ("Peter Hoeg" . "peter@hoeg.com")) (:maintainers ("Peter Hoeg" . "peter@hoeg.com")) (:maintainer "Peter Hoeg" . "peter@hoeg.com") (:keywords "languages") (:url . "https://github.com/peterhoeg/cue-sheet-mode"))]) (curl-to-elisp . [(20201124 1012) ((emacs (25 1))) "Convert cURL command to Emacs Lisp code" tar ((:commit . "63d8d9c6d5efb8af8aa88042bfc0690ba699ef64") (:authors ("Xu Chunyang")) (:maintainers ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:keywords "lisp") (:url . "https://github.com/xuchunyang/curl-to-elisp"))]) - (currency-convert . [(20210427 2032) ((emacs (24 4))) "Currency converter" tar ((:commit . "12805ea66aa8421de5eedda39d23f709de634460") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "comm" "convenience" "i18n") (:url . "https://github.com/lassik/emacs-currency-convert"))]) + (currency-convert . [(20231215 1526) ((emacs (24 4))) "Currency converter" tar ((:commit . "125a718e73f826f461856aabd19bb2de9327531b") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "comm" "convenience" "i18n") (:url . "https://github.com/lassik/emacs-currency-convert"))]) (current-word-highlight . [(20210323 1401) nil "Highlight the current word minor mode" tar ((:commit . "d860f4e170ffa4cef840da93647f458cc409d554") (:authors ("Kijima Daigo" . "norimaking777@gmail.com")) (:maintainers ("Kijima Daigo" . "norimaking777@gmail.com")) (:maintainer "Kijima Daigo" . "norimaking777@gmail.com") (:keywords "highlight" "face" "convenience" "word") (:url . "https://github.com/kijimaD/current-word-highlight"))]) (curry-on-theme . [(20210322 1717) ((emacs (24 1))) "A low contrast color theme" tar ((:commit . "b53a61d443cc75906d9f97e19f19be71f1e19bc4") (:authors ("Martín Varela" . "martin@varela.fi")) (:maintainers ("Martín Varela" . "martin@varela.fi")) (:maintainer "Martín Varela" . "martin@varela.fi") (:url . "https://github.com/mvarela/Curry-On-Theme"))]) (cursor-flash . [(20210722 445) ((emacs (24 3))) "Highlight the cursor on buffer/window-switch" tar ((:commit . "6bb54a1e2e1bf9df80926718b1b8b9ee49080484") (:keywords "convenience" "faces" "maint") (:url . "https://github.com/Boruch-Baum/emacs-cursor-flash"))]) (cursor-test . [(20131207 1732) ((emacs (24))) "testing library for cursor position in emacs." tar ((:commit . "e09956e048b88fd2ee8dd90b5678baed8b04d31b") (:authors ("ainame")) (:maintainers ("ainame")) (:maintainer "ainame") (:url . "https://github.com/ainame/cursor-test.el"))]) (cwl-mode . [(20210510 1150) ((yaml-mode (0 0 13)) (emacs (24 4))) "A major mode for editing CWL" tar ((:commit . "23a333119efaac78453cba95d316109805bd6aec") (:authors ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainers ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainer "Tomoya Tanjo" . "ttanjo@gmail.com") (:keywords "languages" "cwl" "common workflow language") (:url . "https://github.com/tom-tan/cwl-mode"))]) (cyanometric-theme . [(20220822 301) ((autothemer (0 2)) (emacs (24))) "A Theme with overwhelming bias towards cyan" tar ((:commit . "9b20e33a8cc2c76bfe6ad45916be6881386707f5") (:url . "http://github.com/emacsfodder/emacs-theme-cyanometric"))]) + (cybercafe-theme . [(20231122 1444) ((emacs (24 1))) "Cybercafe color theme" tar ((:commit . "c241228914c9bd070733b1e97ea11a5cb6331e86") (:authors (nil . "Gabriel de Brito gabrielgbrito@icloud.com")) (:maintainers (nil . "Gabriel de Brito gabrielgbrito@icloud.com")) (:maintainer nil . "Gabriel de Brito gabrielgbrito@icloud.com") (:keywords "faces") (:url . "http://github.com/gboncoffee/cybercafe-emacs-theme"))]) (cyberpunk-2019-theme . [(20191008 1133) ((emacs (24 1))) "A retina-scorching cyberpunk theme" tar ((:commit . "7e40c37210c363b2819fd9bb98a73101d7a3c206") (:authors ("Alex Lynham" . "alex@lynh.am")) (:maintainers ("Alex Lynham" . "alex@lynh.am")) (:maintainer "Alex Lynham" . "alex@lynh.am") (:keywords "cyberpunk" "theme" "themes") (:url . "https://github.com/the-frey/cyberpunk-2019"))]) - (cyberpunk-theme . [(20200601 1632) nil "Cyberpunk Color Theme" tar ((:commit . "81004fc774d373777d426926fc11abcf1e7ab334") (:authors ("Nicholas M. Van Horn" . "nvanhorn@protonmail.com")) (:maintainers ("Nicholas M. Van Horn" . "nvanhorn@protonmail.com")) (:maintainer "Nicholas M. Van Horn" . "nvanhorn@protonmail.com") (:keywords "color" "theme" "cyberpunk") (:url . "https://github.com/n3mo/cyberpunk-theme.el"))]) + (cyberpunk-theme . [(20240112 1944) nil "Cyberpunk Color Theme" tar ((:commit . "1fd5350ddfc53c30e6eef82af77c62d7c825df3c") (:authors ("Nicholas M. Van Horn" . "nvanhorn@protonmail.com")) (:maintainers ("Nicholas M. Van Horn" . "nvanhorn@protonmail.com")) (:maintainer "Nicholas M. Van Horn" . "nvanhorn@protonmail.com") (:keywords "color" "theme" "cyberpunk") (:url . "https://github.com/n3mo/cyberpunk-theme.el"))]) (cycbuf . [(20131203 2037) nil "Cycle buffers, inspired by swbuff.el, swbuff-x.el, and bs.el" tar ((:commit . "1079b41c3eb27d65b66d4399959bb6253f84858e") (:authors ("Martin Pohlack martinp (at) gmx.de")) (:maintainers ("Martin Pohlack martinp (at) gmx.de")) (:maintainer "Martin Pohlack martinp (at) gmx.de") (:keywords "files" "convenience" "buffer switching") (:url . "https://github.com/martinp26/cycbuf"))]) (cycle-at-point . [(20230805 925) ((emacs (28 1)) (recomplete (0 2))) "Cycle (rotate) the thing under the cursor" tar ((:commit . "cbbd8721af0cbc84ba737d42bdf702d9a80fa3fb") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:keywords "convenience") (:url . "https://codeberg.org/ideasman42/emacs-cycle-at-point"))]) (cycle-resize . [(20160521 1557) nil "Cycle resize the current window horizontally or vertically" tar ((:commit . "7d255d6fe85f12c967a0f7fcfcf18633be194c88") (:authors ("Pierre Lecocq")) (:maintainers ("Pierre Lecocq")) (:maintainer "Pierre Lecocq") (:url . "https://github.com/pierre-lecocq/cycle-resize"))]) @@ -877,42 +900,44 @@ (cypher-mode . [(20151110 1142) nil "major mode for editing cypher scripts" tar ((:commit . "ce8543d7877c736c574a17b49874c9dcdc7a06d6") (:authors ("François-Xavier Bois ")) (:maintainers ("François-Xavier Bois")) (:maintainer "François-Xavier Bois") (:keywords "cypher" "graph") (:url . "http://github.com/fxbois/cypher-mode"))]) (cython-mode . [(20221130 1257) nil "Major mode for editing Cython files" tar ((:commit . "3e4790559d3168fe992cf2aa62f01423038cedb5"))]) (czech-holidays . [(20160113 1752) nil "Adds a list of Czech public holidays to Emacs calendar" tar ((:commit . "d19828122cf3322bcf50601cefa4ac385d2d8f82") (:authors ("David Chkhikvadze" . "david.chk@outlook.com")) (:maintainers ("David Chkhikvadze" . "david.chk@outlook.com")) (:maintainer "David Chkhikvadze" . "david.chk@outlook.com") (:keywords "calendar"))]) - (d-mode . [(20230827 2032) ((emacs (25 1))) "D Programming Language major mode for (X)Emacs" tar ((:commit . "0c8c9e3a5ebb7bfd55bea138a8ad4390abf6b383") (:authors ("William Baxter")) (:maintainers ("Russel Winder" . "russel@winder.org.uk")) (:maintainer "Russel Winder" . "russel@winder.org.uk") (:keywords "d" "programming" "language" "emacs" "cc-mode"))]) + (d-mode . [(20240218 1753) ((emacs (25 1))) "D Programming Language major mode for (X)Emacs" tar ((:commit . "dc583981dd2d4097ce1c9a80a958a7a1bf225ad4") (:authors ("William Baxter")) (:maintainers ("Russel Winder" . "russel@winder.org.uk")) (:maintainer "Russel Winder" . "russel@winder.org.uk") (:keywords "d" "programming" "language" "emacs" "cc-mode"))]) (d2-mode . [(20230210 1130) ((emacs (26 1))) "Major mode for working with d2 graphs" tar ((:commit . "cbe7b16141bd80fe4344f0403e61fd7ee4e0fd89") (:authors ("Andor Kesselman" . "andor@henosisknot.com")) (:maintainers ("Andor Kesselman" . "andor@henosisknot.com")) (:maintainer "Andor Kesselman" . "andor@henosisknot.com") (:keywords "d2" "graphs" "tools" "processes") (:url . "https://github.com/andorsk/d2-mode"))]) (dactyl-mode . [(20140906 1725) nil "Major mode for editing Pentadactyl config files" tar ((:commit . "cc55fe6b987271d9647492b8df4c812d884f661f") (:keywords "languages" "vim") (:url . "https://github.com/luxbock/dactyl-mode"))]) (dad-joke . [(20170928 658) ((emacs (24))) "Get/display dad jokes" tar ((:commit . "bee47e7b746b403228fa7d7361cb095de19ac9ba") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainers ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:keywords "games") (:url . "https://github.com/davep/dad-joke.el"))]) - (daemons . [(20230717 1627) ((emacs (25 1)) (s (1 13 0))) "UI for managing init system daemons (services)" tar ((:commit . "060525c13eeb385b20898da93610dbe964f446f9") (:authors ("Chris Bowdon")) (:maintainers ("Chris Bowdon")) (:maintainer "Chris Bowdon") (:keywords "unix" "convenience") (:url . "https://github.com/cbowdon/daemons.el"))]) + (daemons . [(20231212 1324) ((emacs (25 1)) (s (1 13 0)) (compat (29 1 4 2))) "UI for managing init system daemons (services)" tar ((:commit . "6b6b97b7bac3040cfc58ea5ca7bd9dc9003068fb") (:authors ("Chris Bowdon")) (:maintainers ("Chris Bowdon")) (:maintainer "Chris Bowdon") (:keywords "unix" "convenience") (:url . "https://github.com/cbowdon/daemons.el"))]) (dakrone-light-theme . [(20170808 2140) nil "dakrone's custom light theme" tar ((:commit . "06f198dc8b4ca7421990b30a23d89c8e0b8c5de4") (:authors ("Lee Hinman ")) (:maintainers ("Lee Hinman ")) (:maintainer "Lee Hinman ") (:keywords "color" "themes" "faces") (:url . "https://github.com/dakrone/dakrone-light-theme"))]) (dakrone-theme . [(20170801 1933) nil "dakrone's custom dark theme" tar ((:commit . "232ad1be5f3572dcbdf528f1655109aa355a6937") (:authors ("Lee Hinman ")) (:maintainers ("Lee Hinman ")) (:maintainer "Lee Hinman ") (:keywords "color" "themes") (:url . "https://github.com/dakrone/dakrone-theme"))]) - (dall-e-shell . [(20230807 1640) ((emacs (27 1)) (shell-maker (0 42 1))) "Interaction mode for DALL-E" tar ((:commit . "b2e46cfa69d7cc514b5c2f9a31c1ca63a8bdea1d") (:authors ("Alvaro Ramirez https://xenodium.com")) (:maintainers ("Alvaro Ramirez https://xenodium.com")) (:maintainer "Alvaro Ramirez https://xenodium.com") (:url . "https://github.com/xenodium/chatgpt-shell"))]) - (danneskjold-theme . [(20221121 634) nil "Beautiful high-contrast Emacs theme." tar ((:commit . "39ff00f8a40bcab96afd9450195124b57becd625") (:authors ("Dmitry Akatov" . "akatovda@yandex.com")) (:maintainer "Dmitry Akatov" . "akatovda@yandex.com") (:url . "https://github.com/rails-to-cosmos/"))]) + (dall-e-shell . [(20240112 1749) ((emacs (27 1)) (shell-maker (0 49 1))) "Interaction mode for DALL-E" tar ((:commit . "39dd8e7415ebe6d836a1d721337019cfea89f5ad") (:authors ("Alvaro Ramirez https://xenodium.com")) (:maintainers ("Alvaro Ramirez https://xenodium.com")) (:maintainer "Alvaro Ramirez https://xenodium.com") (:url . "https://github.com/xenodium/chatgpt-shell"))]) + (daml-lsp . [(20231101 1818) ((daml-mode (1 0)) (dash (2 18 0)) (f (0 20 0)) (ht (2 3)) (lsp-mode (7 0))) "LSP client definition for daml" tar ((:commit . "26ea6a1b34c49aaa5a2b395a0468c8af710bfab7") (:authors ("Bártfai Tamás")) (:maintainers ("Bártfai Tamás")) (:maintainer "Bártfai Tamás") (:url . "https://github.com/bartfaitamas/daml-mode"))]) + (daml-mode . [(20231106 916) ((emacs (27 1)) (haskell-mode (16 1))) "Major mode for daml" tar ((:commit . "3ba1166edd4c22402996625b1f8a05a2d5b1cbc6") (:authors ("Bártfai Tamás")) (:maintainers ("Bártfai Tamás")) (:maintainer "Bártfai Tamás") (:url . "https://github.com/bartfaitamas/daml-mode"))]) + (danneskjold-theme . [(20231110 722) nil "Beautiful high-contrast Emacs theme." tar ((:commit . "b3335e44f468c019c95a8210ce1ed9fe23c65735") (:authors ("Dmitry Akatov" . "akatovda@yandex.com")) (:maintainer "Dmitry Akatov" . "akatovda@yandex.com") (:url . "https://github.com/rails-to-cosmos/danneskjold-theme"))]) (dante . [(20230808 658) ((dash (2 12 0)) (emacs (27 1)) (f (0 19 0)) (flycheck (0 30)) (company (0 9)) (flymake (1 0)) (s (1 11 0)) (lcr (1 5))) "Development mode for Haskell" tar ((:commit . "ca47f8cc1392c7045db7da8b4fafe86b7c044e90") (:authors ("Jean-Philippe Bernardy" . "jeanphilippe.bernardy@gmail.com")) (:maintainers ("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 . [(20230822 603) ((emacs (27 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 . "096070aacff875a09c13e596e5d60a55e0f07ab1") (:authors ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainers ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainer "Ivan Yonchovski" . "yyoncho@gmail.com") (:keywords "languages" "debug") (:url . "https://github.com/emacs-lsp/dap-mode"))]) + (dap-mode . [(20240113 926) ((emacs (27 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 . "03bcfe90b6acb6811bfa877882ba72949503234d") (:authors ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainers ("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" tar ((:commit . "6a8b690539d133c5e3d17cb23fe4365fbb6fb493") (:authors ("John Wiegley" . "johnw@gnu.org")) (:maintainers ("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" tar ((:commit . "d9b82b58ded9014985be6658f4ab17e26ed9e93e") (:authors ("Sam Halliday" . "Sam.Halliday@gmail.com")) (:maintainers ("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)" tar ((:commit . "79084b99665dc9ffb0ec62cc092349a5ecebebbc") (:authors ("Jason Milkins")) (:maintainers ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/tmtheme-to-deftheme"))]) (dark-mint-theme . [(20160302 642) nil "dark & minty fresh theme" tar ((:commit . "c8ad39b7115baf889b54c3e9bffe32daeab93c29"))]) (dark-souls . [(20140314 1128) nil "Prepare to die" tar ((:commit . "2c9437265b52f966b2fb13a410a12f3b1e167cb7") (:authors ("Tom Jakubowski" . "tom@crystae.net")) (:maintainers ("Tom Jakubowski" . "tom@crystae.net")) (:maintainer "Tom Jakubowski" . "tom@crystae.net") (:keywords "games") (:url . "http://github.com/tomjakubowski/dark-souls.el"))]) - (darkman . [(20230711 1806) ((emacs (28 1))) "Seamless integration with Darkman" tar ((:commit . "740d33a2b20efb59fc2ebd3b67f66c7ac4356b59") (:authors ("Taha Aziz Ben Ali" . "tahaaziz.benali@esprit.tn")) (:maintainers ("Taha Aziz Ben Ali" . "tahaaziz.benali@esprit.tn")) (:maintainer "Taha Aziz Ben Ali" . "tahaaziz.benali@esprit.tn") (:keywords "convenience") (:url . "https://darkman.grtcdr.tn"))]) + (darkman . [(20240203 1209) ((emacs (28 1))) "Seamless integration with Darkman" tar ((:commit . "136eac628595c6777eb6b2246a014dfcb3b6c625") (:authors ("Taha Aziz Ben Ali" . "ba.tahaaziz@gmail.com")) (:maintainers ("Taha Aziz Ben Ali" . "ba.tahaaziz@gmail.com")) (:maintainer "Taha Aziz Ben Ali" . "ba.tahaaziz@gmail.com") (:keywords "convenience") (:url . "https://darkman.grtcdr.tn"))]) (darkmine-theme . [(20160406 624) nil "Yet another emacs dark color theme." tar ((:commit . "7f7e82ca03bcad52911fa41fb3e204e32d6ee63e") (:authors ("Pierre Lecocq" . "pierre.lecocq@gmail.com")) (:maintainers ("Pierre Lecocq" . "pierre.lecocq@gmail.com")) (:maintainer "Pierre Lecocq" . "pierre.lecocq@gmail.com") (:url . "https://github.com/pierre-lecocq/darkmine-theme"))]) (darkokai-theme . [(20200614 1452) nil "A darker variant on Monokai." tar ((:commit . "5820aeddfc8c869ba840cc534eba776936656a66") (:url . "http://github.com/sjrmanning/darkokai"))]) - (darktooth-theme . [(20230818 157) ((emacs (27 1)) (autothemer (0 2))) "From the darkness... it watches" tar ((:commit . "6910ebd3ec2441487a730ef98df591d6b1e0c671") (:url . "http://github.com/emacsfodder/emacs-theme-darktooth"))]) - (dart-mode . [(20220401 0) ((emacs (24 3))) "Major mode for editing Dart files" tar ((:commit . "ae032b9b30ebadfe1b8a48a4cf278417e506d100") (:authors ("https://github.com/bradyt/dart-mode/issues")) (:maintainers ("https://github.com/bradyt/dart-mode/issues")) (:maintainer "https://github.com/bradyt/dart-mode/issues") (:keywords "languages") (:url . "https://github.com/bradyt/dart-mode"))]) + (darktooth-theme . [(20231011 427) ((emacs (27 1)) (autothemer (0 2))) "From the darkness... it watches" tar ((:commit . "2358dd334b5dcb6dc9828422bd7bd1e4da556819") (:url . "http://github.com/emacsfodder/emacs-theme-darktooth"))]) + (dart-mode . [(20231002 1138) ((emacs (27 1))) "Major mode for editing Dart files" tar ((:commit . "61e01142352f6813aca6512bedadb5007de3a0b9") (:authors ("Brady Trainor")) (:maintainers ("Jen-Chieh Shen" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh Shen" . "jcs090218@gmail.com") (:keywords "languages") (:url . "https://github.com/emacsorphanage/dart-mode"))]) (dart-server . [(20210501 1445) ((emacs (24 5)) (cl-lib (0 5)) (dash (2 10 0)) (flycheck (0 23)) (s (1 10))) "Minor mode for editing Dart files" tar ((:commit . "75562baf9a89b7e314bc2f795f6ecdc5d1f2cc8c") (:authors ("Natalie Weizenbaum") ("Brady Trainor" . "mail@bradyt.com")) (:maintainers ("Brady Trainor" . "mail@bradyt.com")) (:maintainer "Brady Trainor" . "mail@bradyt.com") (:keywords "languages") (:url . "https://github.com/bradyt/dart-server"))]) - (dash . [(20230714 723) ((emacs (24))) "A modern list library for Emacs" tar ((:commit . "f46268c75cb7c18361d3cee942cd4dc14a03aef4") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainers ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:keywords "extensions" "lisp") (:url . "https://github.com/magnars/dash.el"))]) + (dash . [(20240103 1301) ((emacs (24))) "A modern list library for Emacs" tar ((:commit . "e32a70ca636bad42232b6c79f1491dc86802a721") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainers ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:keywords "extensions" "lisp") (:url . "https://github.com/magnars/dash.el"))]) (dash-alfred . [(20191024 450) ((emacs (25 1))) "Search Dash documentation via Dash-Alfred-Workflow" tar ((:commit . "fcd21bd6c7eb5cd31377be970406ff3d2454bd5c") (:authors ("Xu Chunyang")) (:maintainers ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:keywords "docs") (:url . "https://github.com/xuchunyang/dash-alfred.el"))]) (dash-at-point . [(20211023 104) nil "Search the word at point with Dash" tar ((:commit . "fba1a6f42ea51d05110e12c62bdced664059eb55") (:authors ("Shinji Tanaka" . "shinji.tanaka@gmail.com")) (:maintainers ("Shinji Tanaka" . "shinji.tanaka@gmail.com")) (:maintainer "Shinji Tanaka" . "shinji.tanaka@gmail.com") (:url . "https://github.com/stanaka/dash-at-point"))]) (dash-docs . [(20210830 926) ((emacs (24 4)) (cl-lib (0 5)) (async (1 9 3))) "Offline documentation browser using Dash docsets." tar ((:commit . "29848b6b347ac520f7646c200ed2ec36cea3feda") (:authors ("Raimon Grau" . "raimonster@gmail.com") ("Toni Reina " . "areina0@gmail.com") ("Bryan Gilbert" . "bryan@bryan.sh")) (:maintainers ("Raimon Grau" . "raimonster@gmail.com")) (:maintainer "Raimon Grau" . "raimonster@gmail.com") (:keywords "docs") (:url . "http://github.com/areina/helm-dash"))]) (dash-functional . [(20210826 1149) ((dash (2 18 0))) "Collection of useful combinators for Emacs Lisp" tar ((:commit . "39d067b9fbb2db65fc7a6938bfb21489ad990cb4") (:authors ("Matus Goljer" . "matus.goljer@gmail.com") ("Magnar Sveen" . "magnars@gmail.com")) (:maintainers ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com") (:keywords "extensions" "lisp") (:url . "https://github.com/magnars/dash.el"))]) - (dashboard . [(20230726 2018) ((emacs (26 1))) "A startup screen extracted from Spacemacs" tar ((:commit . "6480e0797b41c8ce1de4f37ba8016d177c22ab04") (:authors ("Rakan Al-Hneiti" . "rakan.alhneiti@gmail.com")) (:maintainers ("Jesús Martínez" . "jesusmartinez93@gmail.com")) (:maintainer "Jesús Martínez" . "jesusmartinez93@gmail.com") (:keywords "startup" "screen" "tools" "dashboard") (:url . "https://github.com/emacs-dashboard/emacs-dashboard"))]) + (dashboard . [(20240319 915) ((emacs (26 1))) "A startup screen extracted from Spacemacs" tar ((:commit . "e34ce1b4730fb88a33a571b9065114b7a77645f0") (:authors ("Rakan Al-Hneiti" . "rakan.alhneiti@gmail.com")) (:maintainers ("Jesús Martínez" . "jesusmartinez93@gmail.com")) (:maintainer "Jesús Martínez" . "jesusmartinez93@gmail.com") (:keywords "startup" "screen" "tools" "dashboard") (:url . "https://github.com/emacs-dashboard/emacs-dashboard"))]) (dashboard-hackernews . [(20220516 1809) ((emacs (24)) (dashboard (1 2 5)) (request (0 3 0))) "Display Hacker News on dashboard" tar ((:commit . "34d86bffcde7e6d10ffa7c5080a71a144f01f3aa") (:authors ("Hayato KAJIYAMA" . "kaji1216@gmail.com")) (:maintainers ("Hayato KAJIYAMA" . "kaji1216@gmail.com")) (:maintainer "Hayato KAJIYAMA" . "kaji1216@gmail.com") (:url . "https://github.com/hyakt/emacs-dashboard-hackernews"))]) - (dashboard-ls . [(20221231 1629) ((emacs (26 1)) (dashboard (1 2 5))) "Display files/directories in current directory on Dashboard" tar ((:commit . "b24e0bcb87e20ffcc71efb83a97f9516255fa8e4") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "directory" "file" "show") (:url . "https://github.com/emacs-dashboard/dashboard-ls"))]) + (dashboard-ls . [(20240101 841) ((emacs (26 1)) (dashboard (1 2 5))) "Display files/directories in current directory on Dashboard" tar ((:commit . "bc79640e8fcc625ff1af31d5e17b054b1f535f39") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "directory" "file" "show") (:url . "https://github.com/emacs-dashboard/dashboard-ls"))]) (dashboard-project-status . [(20190202 1354) ((emacs (24)) (git (0 1 1)) (dashboard (1 2 5))) "Display a git project status in a dashboard widget." tar ((:commit . "7675c138e9df8fe2c626e7ba9bbb8b6717671a41") (:authors ("Jason Duncan" . "jasond496@msn.com")) (:maintainers ("Jason Duncan" . "jasond496@msn.com")) (:maintainer "Jason Duncan" . "jasond496@msn.com") (:url . "https://github.com/functionreturnfunction/dashboard-project-status"))]) (date-at-point . [(20150308 1243) nil "Add `date' to `thing-at-point' function" tar ((:commit . "258c0268cc4357640c2af78774ba9667beff28ee") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainers ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:keywords "convenience") (:url . "https://github.com/alezost/date-at-point.el"))]) (date-field . [(20141129 1539) ((dash (2 9 0)) (log4e (0 2 0)) (yaxception (0 3 2))) "Date widget" tar ((:commit . "11c9170d1f7b343233f7716d4c0a62be024c1654") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "widgets") (:url . "https://github.com/aki2o/emacs-date-field"))]) (date2name . [(20190630 933) ((emacs (24 4))) "Package to prepend ISO Timestamps to files" tar ((:commit . "1d239e4d647ad8ba5cd23a8d4012a9f10bcf7d7d") (:authors ("Max Beutelspacher")) (:maintainers ("Max Beutelspacher")) (:maintainer "Max Beutelspacher") (:keywords "files" "convenience") (:url . "https://github.com/DerBeutlin/date2name.el"))]) - (datetime . [(20230729 1954) ((emacs (24 4)) (extmap (1 1 1))) "Parsing, formatting and matching timestamps" tar ((:commit . "cdbf5299359860f8f429b2ddf621e52a79901657") (:authors ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainers ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainer "Paul Pogonyshev" . "pogonyshev@gmail.com") (:keywords "lisp" "i18n") (:url . "https://github.com/doublep/datetime"))]) - (datetime-format . [(20160612 1715) nil "Datetime functions" tar ((:commit . "e6427538b547cbe02e1bd6ed4b765c73620bdae8") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "datetime" "calendar") (:url . "https://github.com/zonuexe/emacs-datetime"))]) + (datetime . [(20231025 1805) ((emacs (25 1)) (extmap (1 1 1))) "Parsing, formatting and matching timestamps" tar ((:commit . "0ec8ecf25e857638ead944eeb3e7d68c6f16f2de") (:authors ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainers ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainer "Paul Pogonyshev" . "pogonyshev@gmail.com") (:keywords "lisp" "i18n") (:url . "https://github.com/doublep/datetime"))]) + (datetime-format . [(20240105 1901) ((emacs (26 3))) "Datetime functions" tar ((:commit . "c4ee8ef11bc95c78c390497f1d1397ca57a96f97") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "lisp" "datetime" "calendar") (:url . "https://github.com/emacs-php/emacs-datetime"))]) (datomic-snippets . [(20180817 1045) ((s (1 4 0)) (dash (1 2 0)) (yasnippet (0 6 1))) "Yasnippets for Datomic" tar ((:commit . "4a14228840d5252e13d2bf6209670f26345bbb84") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:keywords "snippets"))]) (dayone . [(20160105 1240) ((uuid (0 0 3)) (mustache (0 22)) (ht (1 5))) "Utility script for Day One" tar ((:commit . "ab628274f0806451f23bce16f62a6a11cbf91a2b") (:authors ("mori-dev" . "mori.dev.asdf@gmail.com")) (:maintainers ("mori-dev" . "mori.dev.asdf@gmail.com")) (:maintainer "mori-dev" . "mori.dev.asdf@gmail.com") (:keywords "day one" "tools" "convenience") (:url . "https://github.com/mori-dev/emacs-dayone"))]) (db . [(20140421 2111) ((kv (0 0 11))) "A database for EmacsLisp" tar ((:commit . "b3a423fb8e72f9013009cbe033d654df2ce31438") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainers ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:keywords "data" "lisp"))]) @@ -921,41 +946,45 @@ (ddate . [(20221031 1611) ((emacs (24 4))) "Manage Discordian dates with ddate" tar ((:commit . "31576a62792743c614e362688b3752b7a959814e") (:authors ("Erik L. Arneson" . "earneson@arnesonium.com")) (:maintainers ("Erik L. Arneson" . "earneson@arnesonium.com")) (:maintainer "Erik L. Arneson" . "earneson@arnesonium.com") (:keywords "lisp" "dates" "tools" "dashboard") (:url . "https://git.sr.ht/~earneson/emacs-ddate"))]) (ddskk . [(20230701 2340) ((ccc (1 43)) (cdb (20141201 754))) "Simple Kana to Kanji conversion program." tar ((:commit . "8c47f46e38a29a0f3eabcd524268d20573102467") (:authors ("Masahiko Sato" . "masahiko@kuis.kyoto-u.ac.jp")) (:maintainer "SKK Development Team") (:keywords "japanese" "mule" "input method") (:url . "https://github.com/skk-dev/ddskk"))]) (ddskk-posframe . [(20200812 917) ((emacs (26 1)) (posframe (0 4 3)) (ddskk (16 2 50))) "Show Henkan tooltip for ddskk via posframe" tar ((:commit . "299493dd951e5a0b43b8213321e3dc0bac10f762") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "tooltip" "convenience" "posframe") (:url . "https://github.com/conao3/ddskk-posframe.el"))]) - (deadgrep . [(20230816 1728) ((emacs (25 1)) (dash (2 12 0)) (s (1 11 0)) (spinner (1 7 3))) "fast, friendly searching with ripgrep" tar ((:commit . "f720ce8cf958cf7bb5588512de9eb1b8526e417c") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:keywords "tools") (:url . "https://github.com/Wilfred/deadgrep"))]) - (debian-el . [(20211006 1939) nil "Emacs helpers specific to Debian users" tar ((:commit . "a3ef20c269b9192710567571b20718f572942bc4"))]) + (deadgrep . [(20231130 1628) ((emacs (25 1)) (dash (2 12 0)) (s (1 11 0)) (spinner (1 7 3))) "fast, friendly searching with ripgrep" tar ((:commit . "38abe362997d2f18633a75d04c09da751bf8085e") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:keywords "tools") (:url . "https://github.com/Wilfred/deadgrep"))]) + (debian-el . [(20231207 2347) nil "startup file for the debian-el package" tar ((:commit . "67dbe593b650b7748e8cbe93fdb8f0cf883563ad") (:authors ("Debian Emacsen Team" . "debian-emacsen@lists.debian.org")) (:maintainers ("Debian Emacsen Team" . "debian-emacsen@lists.debian.org")) (:maintainer "Debian Emacsen Team" . "debian-emacsen@lists.debian.org") (:keywords "debian" "apt" "elisp"))]) (debpaste . [(20161214 2023) ((xml-rpc (1 6 7))) "Interface for getting/posting/deleting pastes from paste.debian.net" tar ((:commit . "6f2a400665062468ebd03a2ce1de2a73d9084958") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainers ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:keywords "paste") (:url . "http://github.com/alezost/debpaste.el"))]) (debug-print . [(20140126 19) ((emacs (24))) "A nice printf debugging environment by the way Gauche do" tar ((:commit . "d817fd9ea2d3f8d2c1ace4d8af155684f3a99dc5") (:authors ("Ken Okada" . "keno.ss57@gmail.com")) (:maintainers ("Ken Okada" . "keno.ss57@gmail.com")) (:maintainer "Ken Okada" . "keno.ss57@gmail.com") (:keywords "extensions" "lisp" "tools" "maint") (:url . "https://github.com/kenoss/debug-print"))]) (decide . [(20230424 1647) nil "rolling dice and other random things" tar ((:commit . "9c0e4c4493f9af9a981627d0630ac6cb2d8c98f0") (:authors ("Pelle Nilsson" . "perni@lysator.liu.se")) (:maintainers ("Pelle Nilsson" . "perni@lysator.liu.se")) (:maintainer "Pelle Nilsson" . "perni@lysator.liu.se"))]) (decl . [(20221027 1823) ((dash (2 5 0)) (emacs (24 3)) (cl-lib (0 3))) "Library for organizing code declaratively" tar ((:commit . "1b11ee91c4b2a2d30b236debf65538fbe4bf10a9") (:authors ("Preetpal S. Sohal")) (:maintainers ("Preetpal S. Sohal")) (:maintainer "Preetpal S. Sohal") (:url . "https://github.com/preetpalS/decl.el"))]) (declutter . [(20220310 2101) ((emacs (25 1))) "Read html content and (some) paywall sites without clutter" tar ((:commit . "0b2ca86fa716dfc2fb3bc3425019f049dd65eda2") (:authors ("Sanel Zukan" . "sanelz@gmail.com")) (:maintainers ("Sanel Zukan" . "sanelz@gmail.com")) (:maintainer "Sanel Zukan" . "sanelz@gmail.com") (:keywords "html" "hypermedia" "terminals") (:url . "http://www.github.com/sanel/declutter"))]) + (decor . [(20231210 1247) ((emacs (24 1))) "Modify visual decorations" tar ((:commit . "b0c8dfee69c9c5fe54c82cfcb2638377eb744464") (:authors ("Peter Badida" . "keyweeusr@gmail.com")) (:maintainers ("Peter Badida" . "keyweeusr@gmail.com")) (:maintainer "Peter Badida" . "keyweeusr@gmail.com") (:keywords "convenience" "window" "decoration" "distraction" "xprop" "xwayland") (:url . "https://github.com/KeyWeeUsr/decor"))]) (dedicated . [(20151202 110) nil "A very simple minor mode for dedicated buffers" tar ((:commit . "f47b504c0c56fa5ab9d1028417ca1f65a713a2f0") (:authors ("Eric Crampton" . "eric@atdesk.com")) (:maintainers ("Eric Crampton" . "eric@atdesk.com")) (:maintainer "Eric Crampton" . "eric@atdesk.com") (:keywords "dedicated" "buffer"))]) (dedukti-mode . [(20171103 1212) nil "Major mode for Dedukti files" tar ((:commit . "d7c3505a1046187de3c3aeb144455078d514594e") (:authors ("Raphaël Cauderlier")) (:maintainers ("Raphaël Cauderlier")) (:maintainer "Raphaël Cauderlier") (:keywords "languages" "dedukti") (:url . "https://github.com/rafoo/dedukti-mode"))]) (default-font-presets . [(20230708 1012) ((emacs (26 1))) "Support selecting fonts from a list of presets" tar ((:commit . "21b0ab8e5363ad5b83df1458cca2380a8ebe318d") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.org/ideasman42/emacs-default-font-presets"))]) (default-text-scale . [(20191226 2234) ((emacs (24))) "Easily adjust the font size in all frames" tar ((:commit . "bfc0987c37e93742255d3b23d86c17096fda8e7e") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "frames" "faces") (:url . "https://github.com/purcell/default-text-scale"))]) + (defcapture . [(20230909 353) ((emacs (25 1)) (doct (3 0))) "A convenience macro for the Doct DSL" tar ((:commit . "777a10a3343da0553813d004a67e39e2df1bcbb2") (:authors ("Abraham Aguilar" . "a.aguilar@ciencias.unam.mx")) (:maintainers ("Abraham Aguilar" . "a.aguilar@ciencias.unam.mx")) (:maintainer "Abraham Aguilar" . "a.aguilar@ciencias.unam.mx") (:keywords "convenience" "org") (:url . "https://github.com/aggu4/defcapture"))]) (deferred . [(20170901 1330) ((emacs (24 4))) "Simple asynchronous functions for emacs lisp" tar ((:commit . "2239671d94b38d92e9b28d4e12fd79814cfb9c16") (:authors ("SAKURAI Masashi ")) (:maintainers ("SAKURAI Masashi ")) (:maintainer "SAKURAI Masashi ") (:keywords "deferred" "async") (:url . "https://github.com/kiwanami/emacs-deferred"))]) - (define-it . [(20220713 750) ((emacs (25 1)) (s (1 12 0)) (popup (0 5 3)) (pos-tip (0 4 6)) (posframe (1 1 7)) (define-word (0 1 0)) (google-translate (0 11 18)) (wiki-summary (0 1))) "Define, translate, wiki the word" tar ((:commit . "de026f399d5b7fa9286f7733b2e3416c6f234372") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "dictionary" "explanation" "search" "wiki") (:url . "https://github.com/jcs-elpa/define-it"))]) + (define-it . [(20240101 933) ((emacs (25 1)) (s (1 12 0)) (popup (0 5 3)) (pos-tip (0 4 6)) (posframe (1 1 7)) (define-word (0 1 0)) (google-translate (0 11 18)) (wiki-summary (0 1))) "Define, translate, wiki the word" tar ((:commit . "a12331b5f4098b3cb0b046398fc3a34de1651de6") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "dictionary" "explanation" "search" "wiki") (:url . "https://github.com/jcs-elpa/define-it"))]) (define-scratch . [(20221220 946) ((emacs (24 3))) "Define new commands to make scratch buffers" tar ((:commit . "26cf11f801c2b5df0fbd56d2c4f7ac41b3ccd1c6") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "languages" "util") (:url . "https://github.com/lassik/emacs-define-scratch"))]) (define-word . [(20220104 1848) ((emacs (24 3))) "display the definition of word at point." tar ((:commit . "31a8c67405afa99d0e25e7c86a4ee7ef84a808fe") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "dictionary" "convenience") (:url . "https://github.com/abo-abo/define-word"))]) (defproject . [(20151201 2219) ((emacs (24))) "Manager dir-locals and project specific variables" tar ((:commit . "674d48a5e34cb4bba76faa38ee901322ec649086") (:authors (nil . "")) (:maintainers (nil . "")) (:maintainer nil . "") (:keywords "convenience") (:url . "https://github.com/kotfic/defproject"))]) (defrepeater . [(20180830 410) ((emacs (25 2)) (s (1 12 0))) "Easily make commands repeatable" tar ((:commit . "62b00ede57d2e115b9ef9f21268c021ae1186873") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "convenience") (:url . "http://github.com/alphapapa/defrepeater.el"))]) - (deft . [(20210707 1633) nil "quickly browse, filter, and edit plain text notes" tar ((:commit . "28be94d89bff2e1c7edef7244d7c5ba0636b1296") (:authors ("Jason R. Blevins" . "jrblevin@xbeta.org")) (:maintainers ("Jason R. Blevins" . "jrblevin@xbeta.org")) (:maintainer "Jason R. Blevins" . "jrblevin@xbeta.org") (:keywords "plain text" "notes" "simplenote" "notational velocity") (:url . "https://jblevins.org/projects/deft/"))]) + (deft . [(20240309 2117) nil "quickly browse, filter, and edit plain text notes" tar ((:commit . "bb1a16b87c3e0fe70fade6227e47dd7712b89bf6") (:authors ("Jason R. Blevins" . "jrblevin@xbeta.org")) (:maintainers ("Jason R. Blevins" . "jrblevin@xbeta.org")) (:maintainer "Jason R. Blevins" . "jrblevin@xbeta.org") (:keywords "plain text" "notes" "simplenote" "notational velocity") (:url . "https://jblevins.org/projects/deft/"))]) (delim-kill . [(20100517 620) nil "Kill text between delimiters." tar ((:commit . "1dbe47344f2d2cbc8c54beedf0cf0bf10fd203c1") (:authors ("Thomas Kappler" . "tkappler@gmail.com")) (:maintainers ("Thomas Kappler" . "tkappler@gmail.com")) (:maintainer "Thomas Kappler" . "tkappler@gmail.com") (:keywords "convenience" "languages") (:url . "http://github.com/thomas11/delim-kill/tree/master"))]) (demangle-mode . [(20210822 2210) ((cl-lib (0 1)) (emacs (24 3))) "Automatically demangle C++, D, and Rust symbols" tar ((:commit . "04f545adab066708d6151f13da65aaf519f8ac4e") (:authors ("Ben Liblit" . "liblit@acm.org")) (:maintainers ("Ben Liblit" . "liblit@acm.org")) (:maintainer "Ben Liblit" . "liblit@acm.org") (:keywords "c" "tools") (:url . "https://github.com/liblit/demangle-mode"))]) (demap . [(20220322 2309) ((emacs (25 1))) "Detachable minimap package" tar ((:commit . "c42ec4752544f80ca7c172ff65e705a56089bc96") (:authors ("Sawyer Gardner ")) (:maintainers ("Sawyer Gardner ")) (:maintainer "Sawyer Gardner ") (:keywords "lisp" "tools" "convenience") (:url . "https://gitlab.com/sawyerjgardner/demap.el"))]) (demo-it . [(20211221 2152) nil "Create demonstrations" tar ((:commit . "8ade739bb2605275f1f56128a0a9a8c6b55bab6a") (:authors ("Howard Abrams" . "howard.abrams@gmail.com")) (:maintainers ("Howard Abrams" . "howard.abrams@gmail.com")) (:maintainer "Howard Abrams" . "howard.abrams@gmail.com") (:keywords "demonstration" "presentation" "test"))]) (deno-fmt . [(20230117 1117) ((emacs (24))) "Minor mode for using deno fmt on save" tar ((:commit . "6378966f448a3b9b5ae98af58cd13a031bd26702") (:authors ("Russell Clarey ")) (:maintainers ("Russell Clarey ")) (:maintainer "Russell Clarey ") (:url . "https://github.com/russell/deno-emacs"))]) - (deno-ts-mode . [(20230830 116) ((emacs (29 1))) "Major mode for Deno" tar ((:commit . "c6f827b998b5d0fbc8bb3254c4d3b1efca0c5c6f") (:authors ("Graham Marlow" . "info@mgmarlow.com")) (:maintainers ("Graham Marlow" . "info@mgmarlow.com")) (:maintainer "Graham Marlow" . "info@mgmarlow.com") (:keywords "languages") (:url . "https://git.sr.ht/~mgmarlow/deno-ts-mode"))]) + (deno-ts-mode . [(20230912 202) ((emacs (29 1))) "Major mode for Deno" tar ((:commit . "526b6c00483cd86a028805e31ebd8a4a7000c3da") (:authors ("Graham Marlow" . "info@mgmarlow.com")) (:maintainers ("Graham Marlow" . "info@mgmarlow.com")) (:maintainer "Graham Marlow" . "info@mgmarlow.com") (:keywords "languages") (:url . "https://git.sr.ht/~mgmarlow/deno-ts-mode"))]) + (denote-explore . [(20240317 919) ((emacs (29 1)) (denote (2 2 4)) (dash (2 19 1))) "Explore Denote files" tar ((:commit . "53dcead5eea35ec0545aa85e8f0c8384b6f4eb57") (:authors ("Peter Prevos" . "peter@prevos.net")) (:maintainers ("Peter Prevos" . "peter@prevos.net")) (:maintainer "Peter Prevos" . "peter@prevos.net") (:url . "https://github.com/pprevos/denote-explore/"))]) + (derl . [(20231004 821) ((emacs (29 1))) "Erlang distribution protocol implementation" tar ((:commit . "6f31592bb3083de366cdb13a7db0ed69fc72de47") (:authors ("Axel Forsman" . "axel@axelf.se")) (:maintainers ("Axel Forsman" . "axel@axelf.se")) (:maintainer "Axel Forsman" . "axel@axelf.se") (:keywords "comm" "extensions" "languages" "processes") (:url . "https://github.com/axelf4/derl.el"))]) (describe-hash . [(20200718 1556) nil "Help function for examining a hash map" tar ((:commit . "20dbbbea630055b2401f13a55fbb21216960dc46") (:url . "https://github.com/Junker/describe-hash"))]) (describe-number . [(20151101 55) ((yabin (1 1))) "Describe arbitrarily large number at point." tar ((:commit . "40618345a37831804b29589849a785ef5aa5ac24") (:authors ("Morten Slot Kristensen ")) (:maintainers ("Morten Slot Kristensen ")) (:maintainer "Morten Slot Kristensen ") (:keywords "describe" "value" "help") (:url . "https://github.com/netromdk/describe-number"))]) (desktop+ . [(20170107 2132) ((emacs (24 4)) (dash (2 11 0)) (f (0 17 2))) "Handle special buffers when saving & restoring sessions" tar ((:commit . "d26f369bda96860eef18365cdb5c79f39a2c765c") (:authors ("François Févotte" . "fevotte@gmail.com")) (:maintainers ("François Févotte" . "fevotte@gmail.com")) (:maintainer "François Févotte" . "fevotte@gmail.com") (:url . "https://github.com/ffevotte/desktop-plus"))]) - (desktop-environment . [(20230403 1823) ((emacs (25 1))) "Helps you control your GNU/Linux computer" tar ((:commit . "530035e567a95830f1a8b265e026b76d163c7367") (:authors ("Damien Cassou , Nicolas Petton" . "nicolas@petton.fr")) (:maintainers ("Damien Cassou , Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Damien Cassou , Nicolas Petton" . "nicolas@petton.fr") (:url . "https://gitlab.petton.fr/DamienCassou/desktop-environment"))]) + (desktop-environment . [(20230903 1229) ((emacs (25 1))) "Helps you control your GNU/Linux computer" tar ((:commit . "bc1153aa619b12456304cca642424a0d8d2eb416") (:authors ("Damien Cassou , Nicolas Petton" . "nicolas@petton.fr")) (:maintainers ("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" tar ((:commit . "caac672ef7e4ddced960fa31cef3a6ba5d7ab451") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("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" tar ((:commit . "244c2e7f9f0a1050aa8a47ad0b38f4e4584682dd") (:authors ("Tom Willemse" . "tom@ryuslash.org")) (:maintainers ("Tom Willemse" . "tom@ryuslash.org")) (:maintainer "Tom Willemse" . "tom@ryuslash.org") (:keywords "convenience") (:url . "http://projects.ryuslash.org/desktop-registry/"))]) (detached . [(20221129 1430) ((emacs (27 1))) "A package to launch, and manage, detached processes" tar ((:commit . "6b64d4d8064cee781e071e825857b442ea96c3d9") (:authors ("Niklas Eklund" . "niklas.eklund@posteo.net")) (:maintainers ("detached.el Development" . "~niklaseklund/detached.el@lists.sr.ht")) (: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" tar ((:commit . "f41f17cf1cf4f3db41563ff011786b6567596fb4") (:authors ("Stefan Kamphausen ")) (:maintainers ("Stefan Kamphausen ")) (:maintainer "Stefan Kamphausen ") (:keywords "convenience" "abbrev") (:url . "https://github.com/ska2342/detour/"))]) - (devdocs . [(20230220 2042) ((emacs (27 1))) "Emacs viewer for DevDocs" tar ((:commit . "2988d4d201df16d72c3bea465d2b93b554dbddfc") (:authors ("Augusto Stoffel" . "arstoffel@gmail.com")) (:maintainers ("Augusto Stoffel" . "arstoffel@gmail.com")) (:maintainer "Augusto Stoffel" . "arstoffel@gmail.com") (:keywords "help") (:url . "https://github.com/astoff/devdocs.el"))]) - (devdocs-browser . [(20230423 444) ((emacs (27 1))) "Browse devdocs.io documents using EWW" tar ((:commit . "ef7686e4ff4ecab42e1b4a1a5d079bcf947a5b71") (:authors ("blahgeek" . "i@blahgeek.com")) (:maintainers ("blahgeek" . "i@blahgeek.com")) (:maintainer "blahgeek" . "i@blahgeek.com") (:keywords "docs" "help" "tools") (:url . "https://github.com/blahgeek/emacs-devdocs-browser"))]) - (devil . [(20230816 2251) ((emacs (24 4))) "Minor mode for translating key sequences" tar ((:commit . "95677d158fba0f0248e9cf5aa1357bee4b293d8e") (:authors ("Susam Pal" . "susam@susam.net")) (:maintainers ("Susam Pal" . "susam@susam.net")) (:maintainer "Susam Pal" . "susam@susam.net") (:keywords "convenience" "abbrev") (:url . "https://github.com/susam/devil"))]) + (devdocs . [(20240301 1838) ((emacs (27 1))) "Emacs viewer for DevDocs" tar ((:commit . "3424436f333955b39a0803ce9781aaffaae003f5") (:authors ("Augusto Stoffel" . "arstoffel@gmail.com")) (:maintainers ("Augusto Stoffel" . "arstoffel@gmail.com")) (:maintainer "Augusto Stoffel" . "arstoffel@gmail.com") (:keywords "help") (:url . "https://github.com/astoff/devdocs.el"))]) + (devdocs-browser . [(20231231 1455) ((emacs (27 1))) "Browse devdocs.io documents using EWW" tar ((:commit . "afc460e687bec4eb947ab85d207778fc3b9b3bbc") (:authors ("blahgeek" . "i@blahgeek.com")) (:maintainers ("blahgeek" . "i@blahgeek.com")) (:maintainer "blahgeek" . "i@blahgeek.com") (:keywords "docs" "help" "tools") (:url . "https://github.com/blahgeek/emacs-devdocs-browser"))]) + (devil . [(20240107 2149) ((emacs (24 4))) "Minor mode for translating key sequences" tar ((:commit . "dd29681fe07f37c4acbff32a5767bddcbf3b5b80") (:authors ("Susam Pal" . "susam@susam.net")) (:maintainers ("Susam Pal" . "susam@susam.net")) (:maintainer "Susam Pal" . "susam@susam.net") (:keywords "convenience" "abbrev") (:url . "https://github.com/susam/devil"))]) (dfmt . [(20170728 1023) nil "Emacs Interface to D indenting/formatting tool dfmt." tar ((:commit . "21b9094e907b7ac53f5ecb4ff4539613a9d12434") (:authors ("Per Nordlöw")) (:maintainers ("Kirill Babikhin ")) (:maintainer "Kirill Babikhin ") (:keywords "tools" "convenience" "languages" "dlang") (:url . "https://github.com/qsimpleq/elisp-dfmt"))]) (dhall-mode . [(20230228 1005) ((emacs (24 4)) (reformatter (0 3))) "Major mode for the dhall configuration language" tar ((:commit . "87ab69fe765d87b3bb1604a306a8c44d6887681d") (:authors ("Sibi Prabakaran" . "sibi@psibi.in")) (:maintainers ("Sibi Prabakaran" . "sibi@psibi.in")) (:maintainer "Sibi Prabakaran" . "sibi@psibi.in") (:keywords "languages") (:url . "https://github.com/psibi/dhall-mode"))]) (dianyou . [(20210525 1517) ((emacs (24 4))) "Search and analyze mails in Gnus" tar ((:commit . "f77d9e76be5d8022fa6ee5426144f13f38dd09f2") (:authors ("Chen Bin ")) (:maintainers ("Chen Bin ")) (:maintainer "Chen Bin ") (:keywords "mail") (:url . "http://github.com/redguardtoo/dianyou"))]) @@ -963,50 +992,53 @@ (dic-lookup-w3m . [(20180526 1621) ((w3m (20120723 324)) (stem (20120826))) "look up dictionaries on the Internet" tar ((:commit . "3254ab10cbf0078c7162557dd1f68dac28459cf9") (:authors ("mcprvmec")) (:maintainers ("mcprvmec")) (:maintainer "mcprvmec") (:keywords "emacs-w3m" "w3m" "dictionary"))]) (dictcc . [(20221231 1703) ((emacs (24 4)) (cl-lib (0 5))) "Look up translations on dict.cc" tar ((:commit . "30b505759e5a97c2aaa8b0e8ea5e187fdf625c65") (:authors ("Marten Lienen" . "marten.lienen@gmail.com")) (:maintainers ("Marten Lienen" . "marten.lienen@gmail.com")) (:maintainer "Marten Lienen" . "marten.lienen@gmail.com") (:keywords "convenience"))]) (dictionary . [(20201001 1727) ((connection (1 11)) (link (1 11))) "Client for rfc2229 dictionary servers" tar ((:commit . "bdf0aa7761d1c1a3bc0652b2fdc4a54b3acdb06a") (:authors ("Torsten Hilbrich" . "torsten.hilbrich@gmx.net")) (:maintainers ("Torsten Hilbrich" . "torsten.hilbrich@gmx.net")) (:maintainer "Torsten Hilbrich" . "torsten.hilbrich@gmx.net") (:keywords "interface" "dictionary"))]) - (didyoumean . [(20200905 1843) ((emacs (24 4))) "Did you mean to open another file?" tar ((:commit . "ce5edcce160b86e7f6480f0381be785d43f97e19") (:keywords "convenience") (:url . "https://gitlab.com/kisaragi-hiu/didyoumean.el"))]) - (diff-ansi . [(20230808 1343) ((emacs (27 1))) "Display diff's using alternative diffing tools" tar ((:commit . "c14d1f6c58ddf579cba86b95d160f71589c8cd04") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.org/ideasman42/emacs-diff-ansi"))]) + (didyoumean . [(20240229 1807) ((emacs (24 4))) "Did you mean to open another file?" tar ((:commit . "fc12bd33c7b4f6dc74e49735c269ff75c72227a1") (:keywords "convenience") (:url . "https://gitlab.com/kisaragi-hiu/didyoumean.el"))]) + (diff-ansi . [(20231221 57) ((emacs (27 1))) "Display diff's using alternative diffing tools" tar ((:commit . "cdae72a4713704692aa4edf3433d6b6df1d84746") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.org/ideasman42/emacs-diff-ansi"))]) (diff-at-point . [(20230320 2355) ((emacs (26 2))) "Diff navigation" tar ((:commit . "0a4815a364b636eadf2f9ca6f468fb5996ff8d6f") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.org/ideasman42/emacs-diff-at-point"))]) - (diff-hl . [(20230807 1516) ((cl-lib (0 2)) (emacs (25 1))) "Highlight uncommitted changes using VC" tar ((:commit . "b5651f1c57b42e0f38e01a8fc8c7df9bc76d5d38") (:authors ("Dmitry Gutov" . "dgutov@yandex.ru")) (:maintainers ("Dmitry Gutov" . "dgutov@yandex.ru")) (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru") (:keywords "vc" "diff") (:url . "https://github.com/dgutov/diff-hl"))]) + (diff-hl . [(20240225 116) ((cl-lib (0 2)) (emacs (25 1))) "Highlight uncommitted changes using VC" tar ((:commit . "96620839430c1205cbb8c92dd54973397f70f9d2") (:authors ("Dmitry Gutov" . "dmitry@gutov.dev")) (:maintainers ("Dmitry Gutov" . "dmitry@gutov.dev")) (:maintainer "Dmitry Gutov" . "dmitry@gutov.dev") (:keywords "vc" "diff") (:url . "https://github.com/dgutov/diff-hl"))]) (diffed . [(20230208 1546) ((emacs (27 1))) "Diffed is for recursive diff like Dired is for ls" tar ((:commit . "f7dc37f13a4f1660212c41a6e9faba61eb8cc078") (:authors ("Bernhard Rotter" . "bernhard@b-rotter.de")) (:maintainers ("Bernhard Rotter" . "bernhard@b-rotter.de")) (:maintainer "Bernhard Rotter" . "bernhard@b-rotter.de") (:keywords "tools") (:url . "https://github.com/ber-ro/diffed"))]) (difflib . [(20210224 2242) ((emacs (24 4)) (cl-generic (0 3)) (ht (2 2)) (s (1 12 0))) "Helpers for computing deltas between sequences." tar ((:commit . "646fc4388274fe765bbf4661e17a24e4d081250c") (:authors ("Diego A. Mundo" . "dieggsy@pm.me")) (:maintainers ("Diego A. Mundo" . "dieggsy@pm.me")) (:maintainer "Diego A. Mundo" . "dieggsy@pm.me") (:keywords "matching" "tools" "string") (:url . "http://github.com/dieggsy/difflib.el"))]) (diffpdf . [(20210626 1447) ((emacs (25 1)) (transient (0 3 0))) "Transient diffpdf" tar ((:commit . "a5b203b549e373cb9b0ef3f00c0010bd34dd644a") (:authors ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainers ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainer "Shuguang Sun" . "shuguang79@qq.com") (:keywords "tools") (:url . "https://github.com/ShuguangSun/diffpdf.el"))]) (diffscuss-mode . [(20141014 2357) nil "Major mode for diffscuss files." tar ((:commit . "bbc6dbed4b97d1eb9ae5dae021ed1e066129bd98") (:authors ("Edmund Jorgensen" . "edmund@hut8labs.com")) (:maintainers ("Edmund Jorgensen" . "edmund@hut8labs.com")) (:maintainer "Edmund Jorgensen" . "edmund@hut8labs.com") (:keywords "tools"))]) + (difftastic . [(20240308 1548) ((emacs (28 1)) (compat (29 1 4 2)) (magit (20220326))) "Wrapper for difftastic" tar ((:commit . "763e5f25925a8a625a943953a5f13d21b9a3bc51") (:authors ("Przemyslaw Kryger" . "pkryger@gmail.com")) (:maintainers ("Przemyslaw Kryger" . "pkryger@gmail.com")) (:maintainer "Przemyslaw Kryger" . "pkryger@gmail.com") (:keywords "tools" "diff") (:url . "https://github.com/pkryger/difftastic.el"))]) (diffview . [(20230224 1916) nil "View diffs in side-by-side format" tar ((:commit . "8f07c0ff4a1acef990589df0d3e32288f19c9d71") (:authors ("Mitchel Humpherys" . "mitch.special@gmail.com")) (:maintainers ("Mitchel Humpherys" . "mitch.special@gmail.com")) (:maintainer "Mitchel Humpherys" . "mitch.special@gmail.com") (:keywords "convenience" "diff") (:url . "https://github.com/mgalgs/diffview-mode"))]) - (digistar-mode . [(20230313 1256) nil "major mode for Digistar scripts" tar ((:commit . "2bb1076778468d90a132c04f7b8455fb887b6bfe") (:authors ("John Foerch" . "jjfoerch@gmail.com")) (:maintainers ("John Foerch" . "jjfoerch@gmail.com")) (:maintainer "John Foerch" . "jjfoerch@gmail.com") (:keywords "languages"))]) + (digistar-mode . [(20240220 1600) nil "major mode for Digistar scripts" tar ((:commit . "178cb58a3a52d22168f641a5436addf0904d5c45") (:authors ("John Foerch" . "jjfoerch@gmail.com")) (:maintainers ("John Foerch" . "jjfoerch@gmail.com")) (:maintainer "John Foerch" . "jjfoerch@gmail.com") (:keywords "languages"))]) (digit-groups . [(20200506 37) ((dash (2 11 0))) "Highlight place-value positions in numbers" tar ((:commit . "7b81930cad19b8b7913b7eedbcb498964bfdcbdb") (:authors ("Michael D. Adams ")) (:maintainers ("Michael D. Adams ")) (:maintainer "Michael D. Adams ") (:url . "https://github.com/adamsmd/digit-groups/"))]) (digitalocean . [(20190607 726) ((request (2 5)) (emacs (24 4))) "Create and manipulate digitalocean droplets" tar ((:commit . "6c32d3593286e2a62d9afab0057c829407b0d1e8") (:authors ("Oliver Marks" . "oly@digitaloctave.com")) (:maintainers ("Oliver Marks" . "oly@digitaloctave.com")) (:maintainer "Oliver Marks" . "oly@digitaloctave.com") (:keywords "processes" "tools") (:url . "https://github.com/olymk2/emacs-digitalocean"))]) (digitalocean-helm . [(20180610 746) ((emacs (24 3)) (helm (2 5)) (digitalocean (0 1))) "Create and manipulate digitalocean droplets" tar ((:commit . "b125c9882eded7d73ec109d152b26625f333440b") (:authors ("Oliver Marks" . "oly@digitaloctave.com")) (:maintainers ("Oliver Marks" . "oly@digitaloctave.com")) (:maintainer "Oliver Marks" . "oly@digitaloctave.com") (:keywords "processes" "tools") (:url . "https://gitlab.com/olymk2/digitalocean-api"))]) (dilbert . [(20211118 1512) ((emacs (26 1)) (enlive (0 0 1)) (dash (2 19 1))) "View Dilbert comics" tar ((:commit . "d8c586f1bac58c334822b64bce671dde5e25a27f") (:authors ("Daniils Petrovs" . "thedanpetrov@gmail.com")) (:maintainers ("Daniils Petrovs" . "thedanpetrov@gmail.com")) (:maintainer "Daniils Petrovs" . "thedanpetrov@gmail.com") (:keywords "multimedia" "news") (:url . "https://github.com/DaniruKun/dilbert-el"))]) (dim . [(20160818 949) ((emacs (24 4))) "Change mode-line names of major/minor modes" tar ((:commit . "110624657fec0c8a7b3589108230e6a635302ae0") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainers ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:keywords "convenience") (:url . "https://github.com/alezost/dim.el"))]) - (dim-autoload . [(20230511 2114) ((emacs (25 1)) (compat (29 1 4 1))) "Dim or hide autoload cookie lines" tar ((:commit . "9e7b4d47f2dc972ec16baa6bd56b016000790ff4") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience") (:url . "https://github.com/tarsius/dim-autoload"))]) + (dim-autoload . [(20240101 2213) ((emacs (25 1)) (compat (29 1 4 1))) "Dim or hide autoload cookie lines" tar ((:commit . "ace955cd85b3775a028cfda71f2665f33d85bf5d") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience") (:url . "https://github.com/tarsius/dim-autoload"))]) (dime . [(20210613 1431) ((emacs (25 1)) (dylan (3 0))) "Dylan interaction mode" tar ((:commit . "d85409dc3cba57a390ca85da95822f8078ecbfa2") (:url . "https://opendylan.org/"))]) (diminish . [(20220909 847) ((emacs (24 3))) "Diminished modes are minor modes with no modeline display" tar ((:commit . "fbd5d846611bad828e336b25d2e131d1bc06b83d") (:authors ("Will Mengarini" . "seldon@eskimo.com")) (:maintainers ("Martin Yrjölä" . "martin.yrjola@gmail.com")) (:maintainer "Martin Yrjölä" . "martin.yrjola@gmail.com") (:keywords "extensions" "diminish" "minor" "codeprose") (:url . "https://github.com/myrjola/diminish.el"))]) - (diminish-buffer . [(20221028 1921) ((emacs (24 4))) "Diminish (hide) buffers from buffer-menu" tar ((:commit . "983854a90ae39ef5d4d7aecaea108dc64aa2a593") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "diminish" "hide" "buffer" "menu") (:url . "https://github.com/jcs-elpa/diminish-buffer"))]) + (diminish-buffer . [(20240101 934) ((emacs (24 4))) "Diminish (hide) buffers from buffer-menu" tar ((:commit . "e26c299e1f538573d3badae701947005b4a01df7") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "diminish" "hide" "buffer" "menu") (:url . "https://github.com/jcs-elpa/diminish-buffer"))]) (dimmer . [(20220817 122) ((emacs (25 1))) "Visually highlight the selected buffer" tar ((:commit . "a5b697580e5aed6168b571ae3d925753428284f8") (:authors ("Neil Okamoto")) (:maintainers ("Neil Okamoto")) (:maintainer "Neil Okamoto") (:keywords "faces" "editing") (:url . "https://github.com/gonewest818/dimmer.el"))]) (dionysos . [(20160810 1056) ((libmpdee (2 1 0)) (alert (1 2)) (s (1 11 0)) (dash (2 12 1)) (pkg-info (0 5 0)) (cl-lib (0 5))) "Dionysos, a music player for Emacs" tar ((:commit . "98bc789d20e41020d6e62d63d3c78f8032fa4bf2") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainers ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "music") (:url . "https://github.com/nlamirault/dionysos"))]) - (dir-treeview . [(20221103 35) ((emacs (24 4)) (treeview (1 1 1))) "A directory tree browser and simple file manager" tar ((:commit . "bdcce576c4e8e8da7f82192cecc650e76d068958") (:authors ("Tilman Rassy" . "tilman.rassy@googlemail.com")) (:maintainers ("Tilman Rassy" . "tilman.rassy@googlemail.com")) (:maintainer "Tilman Rassy" . "tilman.rassy@googlemail.com") (:keywords "tools" "convenience" "files") (:url . "https://github.com/tilmanrassy/emacs-dir-treeview"))]) + (dir-treeview . [(20230922 2328) ((emacs (24 4)) (treeview (1 2 0))) "A directory tree browser and simple file manager" tar ((:commit . "9024df99284414aa9dc2dff5f3ee9f874830ab74") (:authors ("Tilman Rassy" . "tilman.rassy@googlemail.com")) (:maintainers ("Tilman Rassy" . "tilman.rassy@googlemail.com")) (:maintainer "Tilman Rassy" . "tilman.rassy@googlemail.com") (:keywords "tools" "convenience" "files") (:url . "https://github.com/tilmanrassy/emacs-dir-treeview"))]) (dir-treeview-themes . [(20230112 134) ((emacs (24 4)) (dir-treeview (1 3 3))) "Themes for dir-treeview" tar ((:commit . "8e28c2501a978e6ff733fc9cf43a826fd8e7b87e") (:authors ("Tilman Rassy" . "tilman.rassy@googlemail.com")) (:maintainers ("Tilman Rassy" . "tilman.rassy@googlemail.com")) (:maintainer "Tilman Rassy" . "tilman.rassy@googlemail.com") (:keywords "tools" "convenience" "files") (:url . "https://github.com/tilmanrassy/emacs-dir-treeview-themes"))]) (dircmp . [(20141204 1756) nil "Compare and sync directories." tar ((:commit . "558ee0b601c2de9d247612085aafe2926f56a09f") (:authors ("Matt McClure -- http://matthewlmcclure.com")) (:maintainers ("Matt McClure -- http://matthewlmcclure.com")) (:maintainer "Matt McClure -- http://matthewlmcclure.com") (:keywords "unix" "tools") (:url . "https://github.com/matthewlmcclure/dircmp-mode"))]) (director . [(20230213 1201) ((emacs (27 1))) "Simulate user sessions" tar ((:commit . "16afdbbd91b451fab44c68c8f7d0b810f5283f28") (:authors ("Massimiliano Mirra" . "hyperstruct@gmail.com")) (:maintainers ("Massimiliano Mirra" . "hyperstruct@gmail.com")) (:maintainer "Massimiliano Mirra" . "hyperstruct@gmail.com") (:keywords "maint" "tools") (:url . "https://bard.github.io/emacs-director"))]) (dired-atool . [(20210719 404) ((emacs (24))) "Pack/unpack files with atool on dired." tar ((:commit . "01416fd5961b901c50686c91cb59b3833adc831b") (:authors ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainers ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainer "Hiroki YAMAKAWA" . "s06139@gmail.com") (:keywords "files") (:url . "https://github.com/HKey/dired-atool"))]) + (dired-auto-readme . [(20240318 953) ((emacs (29 1)) (markdown-mode (2 5))) "Auto-display README file in Dired buffers" tar ((:commit . "8c31904ec8200e04e3d4efa2be2d1c935675423e") (:authors ("Arthur Miller")) (:maintainers ("Arthur Miller")) (:maintainer "Arthur Miller") (:keywords "tools" "convenience") (:url . "https://github.com/amno1/dired-auto-readme"))]) (dired-avfs . [(20230512 1107) ((dash (2 5 0)) (dired-hacks-utils (0 0 1))) "AVFS support for dired" tar ((:commit . "523f51b4152a3bf4e60fe57f512732c698b5c96f") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com") (:keywords "files"))]) (dired-collapse . [(20230621 1019) ((dash (2 10 0)) (f (0 19 0)) (dired-hacks-utils (0 0 1))) "Collapse unique nested paths in dired listing" tar ((:commit . "874449d6fc98aee565e1715ec18acec3c1c2cafb") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "files"))]) - (dired-duplicates . [(20221007 703) ((emacs (27 1))) "Find duplicate files locally and remotely" tar ((:commit . "3c16f563880453ad65e1b19ec92d7c4c5a6269f2") (:authors ("Harald Judt" . "h.judt@gmx.at")) (:maintainers ("Harald Judt" . "h.judt@gmx.at")) (:maintainer "Harald Judt" . "h.judt@gmx.at") (:keywords "files") (:url . "https://codeberg.org/hjudt/dired-duplicates"))]) + (dired-duplicates . [(20231114 2150) ((emacs (27 1))) "Find duplicate files locally and remotely" tar ((:commit . "e07552323b26ce68956f8b03aa66af145bae4d86") (:authors ("Harald Judt" . "h.judt@gmx.at")) (:maintainers ("Harald Judt" . "h.judt@gmx.at")) (:maintainer "Harald Judt" . "h.judt@gmx.at") (:keywords "files") (:url . "https://codeberg.org/hjudt/dired-duplicates"))]) (dired-dups . [(20130527 2125) nil "Find duplicate files and display them in a dired buffer" tar ((:commit . "694ad128c822c59348ced16c4a0c1356d43da47a") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainers ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com") (:keywords "unix") (:url . "https://github.com/vapniks/dired-dups"))]) (dired-efap . [(20220421 1535) nil "Edit Filename At Point in a dired buffer" tar ((:commit . "360b369cb19998c6730ee1debfbec3edb7f349a9") (:authors ("Juan-Leon Lahoz" . "juanleon1@gmail.com")) (:maintainers ("Juan-Leon Lahoz" . "juanleon1@gmail.com")) (:maintainer "Juan-Leon Lahoz" . "juanleon1@gmail.com") (:keywords "dired" "environment" "files" "renaming") (:url . "https://github.com/juan-leon/dired-efap"))]) (dired-explorer . [(20180607 221) ((cl-lib (0 5))) "minor-mode provides Explorer like select file at dired." tar ((:commit . "3ade0a31b5340271d05e9bf443f2504960f6c6dd") (:maintainers ("jidaikobo-shibata")) (:maintainer "jidaikobo-shibata") (:keywords "dired" "explorer"))]) - (dired-fdclone . [(20230604 1057) nil "dired functions and settings to mimic FDclone" tar ((:commit . "38555dc5a9427664b9b24af352de7550939625de") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainers ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:keywords "unix" "directories" "dired") (:url . "https://github.com/knu/dired-fdclone.el"))]) + (dired-fdclone . [(20231128 1614) nil "dired functions and settings to mimic FDclone" tar ((:commit . "82f161e4d0d9994d128c922170df54f966af182a") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainers ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:keywords "unix" "directories" "dired") (:url . "https://github.com/knu/dired-fdclone.el"))]) (dired-filetype-face . [(20180907 1339) nil "Set different faces for different filetypes in dired" tar ((:commit . "7ade7f7e8c2d7518c65f3f0343a10c272da0f47e") (:authors ("纪秀峰 ")) (:maintainers ("纪秀峰 ")) (:maintainer "纪秀峰 ") (:keywords "dired" "filetype" "face") (:url . "https://github.com/jixiuf/dired-filetype-face"))]) (dired-filter . [(20221127 1247) ((dash (2 10 0)) (dired-hacks-utils (0 0 1)) (f (0 17 0)) (cl-lib (0 3))) "Ibuffer-like filtering for dired" tar ((:commit . "41d3eb42195d9f0894c20d18cc8e722b099aa1c1") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "files"))]) (dired-git . [(20220828 6) ((emacs (26 1)) (async-await (1 0)) (async (1 9 4)) (all-the-icons (2 2 0)) (ppp (1 0 0))) "Git integration for dired" tar ((:commit . "e84387b947cd707d3ff0c039ddef753a468f88e7") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "tools") (:url . "https://github.com/conao3/dired-git.el"))]) - (dired-gitignore . [(20230425 1223) ((emacs (27 1))) "A minor mode to hide gitignored files in a dired buffer" tar ((:commit . "9e7678533b132f73057f2cb3839a9f00aff97ac3") (:authors ("Johannes Mueller" . "github@johannes-mueller.org")) (:maintainers ("Johannes Mueller" . "github@johannes-mueller.org")) (:maintainer "Johannes Mueller" . "github@johannes-mueller.org") (:keywords "dired" "convenience" "git") (:url . "https://github.com/johannes-mueller/dired-gitignore.el"))]) + (dired-gitignore . [(20230909 1408) ((emacs (27 1))) "A minor mode to hide gitignored files in a dired buffer" tar ((:commit . "b6e804c212b497d5502600bd4df10196e44d2bf7") (:authors ("Johannes Mueller" . "github@johannes-mueller.org")) (:maintainers ("Johannes Mueller" . "github@johannes-mueller.org")) (:maintainer "Johannes Mueller" . "github@johannes-mueller.org") (:keywords "dired" "convenience" "git") (:url . "https://github.com/johannes-mueller/dired-gitignore.el"))]) (dired-hacks-utils . [(20230512 1107) ((dash (2 5 0))) "Utilities and helpers for dired-hacks collection" tar ((:commit . "523f51b4152a3bf4e60fe57f512732c698b5c96f") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "files"))]) (dired-hide-dotfiles . [(20210222 1919) ((emacs (25 1))) "Hide dotfiles in dired" tar ((:commit . "6a379f23f64045f5950d229254ce6f32dbbf5364") (:authors ("Mattias Bengtsson" . "mattias.jc.bengtsson@gmail.com")) (:maintainers ("Mattias Bengtsson" . "mattias.jc.bengtsson@gmail.com")) (:maintainer "Mattias Bengtsson" . "mattias.jc.bengtsson@gmail.com") (:keywords "files") (:url . "https://github.com/mattiasb/dired-hide-dotfiles"))]) + (dired-hist . [(20240320 518) ((emacs (27 1))) "Traverse Dired buffer's history: back, forward" tar ((:commit . "b49320be3c67e4517e44e8e6e88f3e2015f6b4ea") (:authors ("Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com") ("Anoncheg1")) (:maintainers ("Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com")) (:maintainer "Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com") (:keywords "convenience" "dired" "history") (:url . "https://github.com/Anoncheg1/dired-hist"))]) (dired-icon . [(20170223 526) ((emacs (24 3))) "A minor mode to display a list of associated icons in dired buffers." tar ((:commit . "f60e10757a5011235b519231ad35974ff25963ed") (:authors ("Hong Xu" . "hong@topbug.net")) (:maintainers ("Hong Xu" . "hong@topbug.net")) (:maintainer "Hong Xu" . "hong@topbug.net") (:keywords "dired" "files") (:url . "https://gitlab.com/xuhdev/dired-icon"))]) - (dired-imenu . [(20140109 1610) nil "imenu binding for dired mode" tar ((:commit . "610e21fe0988c85931d34894d3eee2442c79ab0a") (:authors ("Damien Cassou" . "damien.cassou@gmail.com")) (:maintainers ("Damien Cassou" . "damien.cassou@gmail.com")) (:maintainer "Damien Cassou" . "damien.cassou@gmail.com") (:keywords "dired" "imenu") (:url . "https://github.com/DamienCassou/dired-imenu"))]) + (dired-imenu . [(20230904 1810) nil "imenu binding for dired mode" tar ((:commit . "4f6169f9056fe5f9b9a97e9e75f27825a15e05b9") (:authors ("Damien Cassou" . "damien.cassou@gmail.com")) (:maintainers ("Damien Cassou" . "damien.cassou@gmail.com")) (:maintainer "Damien Cassou" . "damien.cassou@gmail.com") (:keywords "dired" "imenu") (:url . "https://github.com/DamienCassou/dired-imenu"))]) (dired-k . [(20211002 2358) ((emacs (24 3))) "Highlight dired by size, date, git status" tar ((:commit . "b9507bac79fc8c030abbec389267262bc671f58b") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Neil Okamoto" . "neil.okamoto+melpa@gmail.com")) (:maintainer "Neil Okamoto" . "neil.okamoto+melpa@gmail.com") (:url . "https://github.com/emacsorphanage/dired-k"))]) - (dired-launch . [(20230812 604) ((emacs (24 3))) "Use dired as a launcher" tar ((:commit . "b2639051a2cbc56be7f9b5df2f4391c159770a6d") (:authors ("David Thompson")) (:maintainers ("David Thompson")) (:maintainer "David Thompson") (:keywords "dired" "launch") (:url . "https://github.com/thomp/dired-launch"))]) - (dired-list . [(20230512 1107) ((dash (2 10 0)) (emacs (24 3)) (dired-hacks-utils (0 0 1))) "Create dired listings from sources" tar ((:commit . "523f51b4152a3bf4e60fe57f512732c698b5c96f") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "files") (:url . "https://github.com/Fuco1/dired-hacks"))]) + (dired-launch . [(20240317 2344) ((emacs (24 3))) "Use dired as a launcher" tar ((:commit . "0a7dbe002306cbeeedcf5b9fbbc72adc83f0d331") (:authors ("David Thompson")) (:maintainers ("David Thompson")) (:maintainer "David Thompson") (:keywords "dired" "launch") (:url . "https://codeberg.org/thomp/dired-launch"))]) + (dired-list . [(20240318 845) ((dash (2 10 0)) (emacs (24 3)) (dired-hacks-utils (0 0 1))) "Create dired listings from sources" tar ((:commit . "475be5486bc2d593283ba6e8c8c43053d4cbdd7f") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "files") (:url . "https://github.com/Fuco1/dired-hacks"))]) (dired-lsi . [(20200812 929) ((emacs (26 1))) "Add memo to directory and show it in dired" tar ((:commit . "0f4038c8b47f6cfc70f82062800700c14c9912c2") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "convenience") (:url . "https://github.com/conao3/dired-lsi.el"))]) (dired-narrow . [(20230512 1107) ((dash (2 7 0)) (dired-hacks-utils (0 0 1))) "Live-narrowing of search results for dired" tar ((:commit . "523f51b4152a3bf4e60fe57f512732c698b5c96f") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "files"))]) (dired-open . [(20230512 1107) ((dash (2 5 0)) (dired-hacks-utils (0 0 1))) "Open files from dired using using custom actions" tar ((:commit . "523f51b4152a3bf4e60fe57f512732c698b5c96f") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "files"))]) @@ -1019,16 +1051,16 @@ (dired-rmjunk . [(20191007 1232) nil "A home directory cleanup utility for Dired." tar ((:commit . "0e890a41fa680a45b4b4aad2c28f9d6dca999cee") (:authors ("Jakob L. Kreuze" . "zerodaysfordays@sdf.lonestar.org")) (:maintainers ("Jakob L. Kreuze" . "zerodaysfordays@sdf.lonestar.org")) (:maintainer "Jakob L. Kreuze" . "zerodaysfordays@sdf.lonestar.org") (:keywords "files" "matching") (:url . "https://git.sr.ht/~jakob/dired-rmjunk"))]) (dired-rsync . [(20230822 1350) ((s (1 12 0)) (dash (2 0 0)) (emacs (25 1))) "Allow rsync from dired buffers" tar ((:commit . "5bcb851f3bf9c4f7c07299fcc25be7c408a68cda") (:authors ("Alex Bennée" . "alex@bennee.com")) (:maintainers ("Alex Bennée" . "alex@bennee.com")) (:maintainer "Alex Bennée" . "alex@bennee.com") (:url . "https://github.com/stsquad/dired-rsync"))]) (dired-rsync-transient . [(20230714 1459) ((dired-rsync (0 6)) (transient (0 3 0)) (emacs (24 4))) "Transient command for dired-rsync" tar ((:commit . "95607fc7eb84e792122b52d2b1d62f49199a2a37") (:authors ("Alex Bennée" . "alex@bennee.com")) (:maintainers ("Alex Bennée" . "alex@bennee.com")) (:maintainer "Alex Bennée" . "alex@bennee.com") (:url . "https://github.com/stsquad/dired-rsync"))]) - (dired-sidebar . [(20230623 1655) ((emacs (25 1)) (dired-subtree (0 0 1))) "Tree browser leveraging dired" tar ((:commit . "85ec4fffc2607d38ec2e3b8577320aceb8e652dd") (:authors ("James Nguyen" . "james@jojojames.com")) (:maintainers ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com") (:keywords "dired" "files" "tools") (:url . "https://github.com/jojojames/dired-sidebar"))]) - (dired-single . [(20230306 626) ((emacs (25 1))) "Reuse the current dired buffer" tar ((:commit . "c781b7dcff6e7f9a5060b067d2cdb0acbc840c49") (:url . "https://codeberg.org/amano.kenji/dired-single"))]) + (dired-sidebar . [(20240224 1640) ((emacs (25 1)) (dired-subtree (0 0 1))) "Tree browser leveraging dired" tar ((:commit . "04b39fb52021832eed4bf9bb748f46892afaf62e") (:authors ("James Nguyen" . "james@jojojames.com")) (:maintainers ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com") (:keywords "dired" "files" "tools") (:url . "https://github.com/jojojames/dired-sidebar"))]) + (dired-single . [(20240131 1148) ((emacs (25 1))) "Reuse the current dired buffer" tar ((:commit . "60fce6599326e12cc2033c28d50b8bf6c6ba164a") (:url . "https://codeberg.org/amano.kenji/dired-single"))]) (dired-subtree . [(20230512 1107) ((dash (2 5 0)) (dired-hacks-utils (0 0 1))) "Insert subdirectories in a tree-like fashion" tar ((:commit . "523f51b4152a3bf4e60fe57f512732c698b5c96f") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "files"))]) (dired-toggle . [(20190616 303) nil "Show dired as sidebar and will not create new buffers when changing dir" tar ((:commit . "b694ba91a45d0762bd032ff1bb4109e4c62ca686") (:authors ("Xu FaSheng ")) (:maintainers ("Xu FaSheng")) (:maintainer "Xu FaSheng") (:keywords "dired" "sidebar") (:url . "https://github.com/fasheng/dired-toggle"))]) (dired-toggle-sudo . [(20211216 102) nil "Browse directory with sudo privileges." tar ((:commit . "9f86cdf858225b15c20affb97ed105e4109047bf") (:authors ("Sebastien Gross ")) (:maintainers ("Sebastien Gross ")) (:maintainer "Sebastien Gross ") (:keywords "emacs" "dired"))]) (dired-view-data . [(20220129 339) ((emacs (26 1)) (ess (18 10 1)) (ess-view-data (1 0))) "View data from dired via ESS and R" tar ((:commit . "96d4cb6569fd2be90a516dedd98263374bbc6ead") (:authors ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainers ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainer "Shuguang Sun" . "shuguang79@qq.com") (:keywords "tools") (:url . "https://github.com/ShuguangSun/dired-view-data"))]) - (diredc . [(20220113 332) ((emacs (26 1)) (key-assist (1 0))) "Extensions for dired" tar ((:commit . "7ee68f6b1c87f8ab86cf23416472747e88860717") (:keywords "files") (:url . "https://github.com/Boruch-Baum/emacs-diredc"))]) + (diredc . [(20240314 753) ((emacs (26 1)) (key-assist (1 0))) "Midnight Commander features (plus) for dired" tar ((:commit . "b638face71558cc1444c352fe6bab2d9b28bf281") (:keywords "files") (:url . "https://github.com/Boruch-Baum/emacs-diredc"))]) (diredfl . [(20230224 1302) ((emacs (24))) "Extra font lock rules for a more colourful dired" tar ((:commit . "17e805763d57370c4eff2c92ed257b72eeb9f94a") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "faces") (:url . "https://github.com/purcell/diredfl"))]) (diredful . [(20160529 2017) nil "colorful file names in dired buffers" tar ((:commit . "b17b3087e0084a5571a9ac4d47ccfc36d96b109e") (:authors ("Thamer Mahmoud" . "thamer.mahmoud@gmail.com")) (:maintainers ("Thamer Mahmoud" . "thamer.mahmoud@gmail.com")) (:maintainer "Thamer Mahmoud" . "thamer.mahmoud@gmail.com") (:keywords "dired" "colors" "extension" "widget") (:url . "https://github.com/thamer/diredful"))]) - (direnv . [(20230721 714) ((emacs (25 1)) (dash (2 12 0))) "direnv integration" tar ((:commit . "14f74269af34f8c30ab4a521eff290b74460daed") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainers ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee") (:keywords "direnv" "environment" "processes" "unix" "tools") (:url . "https://github.com/wbolster/emacs-direnv"))]) + (direnv . [(20240314 715) ((emacs (25 1)) (dash (2 12 0))) "direnv integration" tar ((:commit . "c0bf3b81c7a97e2a0d06d05495e86848254fcc1f") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainers ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee") (:keywords "direnv" "environment" "processes" "unix" "tools") (:url . "https://github.com/wbolster/emacs-direnv"))]) (direx . [(20230409 1425) nil "Simple Directory Explorer" tar ((:commit . "935d2010234c02c93e22d6e1cc72d595341ba855") (:authors ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainers ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainer "Tomohiro Matsuyama" . "m2ym.pub@gmail.com") (:keywords "convenience"))]) (direx-grep . [(20140515 1506) ((direx (0 1 -3))) "Grep node of direx.el using incremental search like anything.el/helm.el" tar ((:commit . "1109a512a80b2673a70b18b8568514049017faad") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("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" tar ((:commit . "ba55f1e716e386fdd37cb8e7f48616e405dc7251") (:authors ("Ye Wenbin" . "wenbinye@gmail.com")) (:maintainers ("Ye Wenbin" . "wenbinye@gmail.com")) (:maintainer "Ye Wenbin" . "wenbinye@gmail.com"))]) @@ -1046,7 +1078,7 @@ (display-theme . [(20140115 1556) ((emacs (24))) "display current theme(s) at mode-line" tar ((:commit . "b180b3be7a74ae4799a14e7e4bc2fe10e3ff7a15") (:authors ("KAWABATA, Taichi ")) (:maintainers ("KAWABATA, Taichi ")) (:maintainer "KAWABATA, Taichi ") (:keywords "tools") (:url . "https://github.com/kawabata/emacs-display-theme/"))]) (display-wttr . [(20221102 1426) ((emacs (27 1))) "Display wttr(weather) in the mode line" tar ((:commit . "7062953d034e27c297d58748cf74dad552aa2873") (:authors ("Jose G Perez Taveras" . "josegpt27@gmail.com")) (:maintainers ("Jose G Perez Taveras" . "josegpt27@gmail.com")) (:maintainer "Jose G Perez Taveras" . "josegpt27@gmail.com") (:url . "https://github.com/josegpt/display-wttr"))]) (dispwatch . [(20210305 342) ((emacs (24 4))) "Watch displays for configuration changes" tar ((:commit . "03abbac89a9f625aaa1a808dd49ae4906f466421") (:authors ("Mitchell Perilstein" . "mitchell.perilstein@gmail.com")) (:maintainers ("Mitchell Perilstein" . "mitchell.perilstein@gmail.com")) (:maintainer "Mitchell Perilstein" . "mitchell.perilstein@gmail.com") (:keywords "frames") (:url . "https://github.com/mnp/dispwatch"))]) - (dist-file-mode . [(20180830 418) ((emacs (24)) (cl-lib (0 5)) (s (1 9 0))) "Dispatch major mode for *.dist files" tar ((:commit . "e1ce8f592bc5d4d86d2f09e334728ac0d524c761") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "files" "convenience") (:url . "https://github.com/emacs-php/dist-file-mode.el"))]) + (dist-file-mode . [(20240107 2040) ((emacs (26))) "Dispatch major mode for *.dist files" tar ((:commit . "8bb2f05487164cd690cac9c9c442969f6f79b81f") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "files" "convenience") (:url . "https://github.com/emacs-php/dist-file-mode.el"))]) (distel-completion-lib . [(20180827 1344) nil "Completion library for Erlang/Distel" tar ((:commit . "acc4c0a5521904203d797fe96b08e5fae4233c7e") (:authors ("Sebastian Weddmark Olsson")) (:maintainers ("Sebastian Weddmark Olsson")) (:maintainer "Sebastian Weddmark Olsson") (:keywords "erlang" "distel" "completion") (:url . "github.com/sebastiw/distel-completion"))]) (distinguished-theme . [(20151216 2015) nil "A dark and elegant theme for emacs." tar ((:commit . "9b1d25ac59465a5016d187ea84b7614c95a29b3b") (:authors ("Kim Silkebækken" . "kim.silkebaekken@gmail.com")) (:maintainers ("Kim Silkebækken" . "kim.silkebaekken@gmail.com")) (:maintainer "Kim Silkebækken" . "kim.silkebaekken@gmail.com") (:url . "https://github.com/Lokaltog/distinguished-theme"))]) (ditz-mode . [(20150729 940) nil "Emacs interface to Ditz issue tracking system" tar ((:commit . "56668844acd91c3d15a08ba406dbb1ba0c2fe9b4") (:authors ("Glenn Hutchings" . "zondo42@gmail.com")) (:maintainers ("Glenn Hutchings" . "zondo42@gmail.com")) (:maintainer "Glenn Hutchings" . "zondo42@gmail.com") (:keywords "tools"))]) @@ -1070,24 +1102,25 @@ (doc-show-inline . [(20230808 1344) ((emacs (27 1))) "Show doc-strings found in external files" tar ((:commit . "dc914d79b99fc76694d356ea786eb39aab74649a") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:keywords "convenience") (:url . "https://codeberg.org/ideasman42/emacs-doc-show-inline"))]) (docbook-snippets . [(20150714 1625) ((yasnippet (0 8 0))) "Yasnippets for DocBook" tar ((:commit . "b06297fdec039a541aaa6312cb328a11062cfab4") (:authors ("Jaromir Hradilek" . "jhradilek@gmail.com")) (:maintainers ("Jaromir Hradilek" . "jhradilek@gmail.com")) (:maintainer "Jaromir Hradilek" . "jhradilek@gmail.com") (:keywords "snippets" "docbook") (:url . "https://github.com/jhradilek/emacs-docbook-snippets"))]) (docean . [(20180605 1744) ((emacs (24)) (cl-lib (0 5)) (request (0 2 0))) "Interact with DigitalOcean from Emacs." tar ((:commit . "bbe2298fd21f7876fc2d5c52a69b931ff59df979") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainers ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:keywords "convenience") (:url . "https://github.com/emacs-pe/docean.el"))]) - (docker . [(20230823 937) ((aio (1 0)) (dash (2 19 1)) (emacs (26 1)) (s (1 12 0)) (tablist (1 0)) (transient (0 3 7))) "Interface to Docker" tar ((:commit . "0899a56c41589e179d3b42994480802d8472e5b3") (:authors ("Philippe Vaucher" . "philippe.vaucher@gmail.com")) (:maintainers ("Philippe Vaucher" . "philippe.vaucher@gmail.com")) (:maintainer "Philippe Vaucher" . "philippe.vaucher@gmail.com") (:keywords "filename" "convenience") (:url . "https://github.com/Silex/docker.el"))]) + (docker . [(20231110 1006) ((aio (1 0)) (dash (2 19 1)) (emacs (26 1)) (s (1 13 0)) (tablist (1 1)) (transient (0 4 3))) "Interface to Docker" tar ((:commit . "2def2ab7fa04ed14403d00e3547a94c3822302cb") (:authors ("Philippe Vaucher" . "philippe.vaucher@gmail.com")) (:maintainers ("Philippe Vaucher" . "philippe.vaucher@gmail.com")) (:maintainer "Philippe Vaucher" . "philippe.vaucher@gmail.com") (:keywords "filename" "convenience") (:url . "https://github.com/Silex/docker.el"))]) (docker-api . [(20160525 720) ((dash (2 12 1)) (request (0 2 0)) (s (1 11 0))) "Emacs interface to the Docker API" tar ((:commit . "206144346b7fa4165223349cfeb64a75d47ddd1b") (:authors ("Philippe Vaucher" . "philippe.vaucher@gmail.com")) (:maintainers ("Philippe Vaucher" . "philippe.vaucher@gmail.com")) (:maintainer "Philippe Vaucher" . "philippe.vaucher@gmail.com") (:url . "https://github.com/Silex/docker-api.el"))]) (docker-cli . [(20190524 1624) nil "Running various commands in docker containers" tar ((:commit . "328429219574555c5fb831a421b4b5d9a2338561") (:authors ("Boško Ivanišević" . "bosko.ivanisevic@gmail.com")) (:maintainers ("Boško Ivanišević" . "bosko.ivanisevic@gmail.com")) (:maintainer "Boško Ivanišević" . "bosko.ivanisevic@gmail.com") (:keywords "processes") (:url . "https://github.com/bosko/docker-cli"))]) (docker-compose-mode . [(20200830 1336) ((emacs (24 3)) (dash (2 12 0)) (yaml-mode (0 0 12))) "Major mode for editing docker-compose files" tar ((:commit . "abaa4f3aeb5c62d7d16e186dd7d77f4e846e126a") (:authors ("Ricardo Martins")) (:maintainers ("Ricardo Martins")) (:maintainer "Ricardo Martins") (:keywords "convenience") (:url . "https://github.com/meqif/docker-compose-mode"))]) (docker-tramp . [(20230809 511) ((emacs (24)) (cl-lib (0 5))) "TRAMP integration for docker containers for Emacs 28 and earlier" tar ((:commit . "19d0771db4e6b89e19c00af5806438e315779c15") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainers ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:keywords "docker" "convenience") (:url . "https://github.com/emacs-pe/docker-tramp.el"))]) - (dockerfile-mode . [(20220822 2021) ((emacs (24))) "Major mode for editing Docker's Dockerfiles" tar ((:commit . "52c6c00da1d31c0b6c29c74335b3af63ed6bf06c") (:keywords "docker" "languages" "processes" "tools") (:url . "https://github.com/spotify/dockerfile-mode"))]) + (dockerfile-mode . [(20240318 24) ((emacs (24)) (s (1 2 0))) "Major mode for editing Docker's Dockerfiles" tar ((:commit . "f6196726342b44081933597a343805db6366e7ac") (:keywords "docker" "languages" "processes" "tools") (:url . "https://github.com/spotify/dockerfile-mode"))]) (docopt . [(20230216 957) ((emacs (26 3)) (dash (2 17 0)) (emacs (26 1)) (f (0 20 0)) (parsec (0 1 3)) (s (1 12 0)) (transient (0 3 7))) "A Docopt implementation in Elisp" tar ((:commit . "21c575db68d4ccadb3125241a62136a0f8b76f63") (:authors ("r0man" . "roman@burningswell.com")) (:maintainers ("r0man" . "roman@burningswell.com")) (:maintainer "r0man" . "roman@burningswell.com") (:keywords "docopt" "tools" "processes") (:url . "https://github.com/r0man/docopt.el"))]) (docsim . [(20230627 47) ((emacs (24 4)) (org (8 0))) "Search and compare notes with a local search engine" tar ((:commit . "069569deba0f08906a42274ade321120b433f39a") (:authors ("Harry R. Schwartz" . "hello@harryrschwartz.com")) (:maintainers ("Harry R. Schwartz" . "hello@harryrschwartz.com")) (:maintainer "Harry R. Schwartz" . "hello@harryrschwartz.com") (:url . "https://github.com/hrs/docsim.el"))]) - (docstr . [(20221231 1701) ((emacs (27 1)) (s (1 9 0))) "A document string minor mode" tar ((:commit . "68a72e8a9abac28d8451769cab3846c342f657bc") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "document" "string") (:url . "https://github.com/emacs-vs/docstr"))]) - (doct . [(20230108 1507) ((emacs (25 1))) "DOCT: Declarative Org capture templates" tar ((:commit . "69bfe30317c7fa7a5a51f2763515dfe9c989ebf1") (:authors ("Nicholas Vollmer" . "progfolio@protonmail.com")) (:maintainers ("Nicholas Vollmer" . "progfolio@protonmail.com")) (:maintainer "Nicholas Vollmer" . "progfolio@protonmail.com") (:keywords "org" "convenience") (:url . "https://github.com/progfolio/doct"))]) - (dogears . [(20230608 400) ((emacs (26 3)) (map (2 1))) "Never lose your place again" tar ((:commit . "32cc340bdd87098c7de666a797dcae5f05a5a4de") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "convenience") (:url . "https://github.com/alphapapa/dogears.el"))]) + (docstr . [(20240101 901) ((emacs (27 1)) (s (1 9 0))) "A document string minor mode" tar ((:commit . "f780904cffd40e34d72bef04f73c7e007c5f98c0") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "document" "string") (:url . "https://github.com/emacs-vs/docstr"))]) + (doct . [(20230622 1847) ((emacs (25 1))) "DOCT: Declarative Org capture templates" tar ((:commit . "5cab660dab653ad88c07b0493360252f6ed1d898") (:authors ("Nicholas Vollmer" . "progfolio@protonmail.com")) (:maintainers ("Nicholas Vollmer" . "progfolio@protonmail.com")) (:maintainer "Nicholas Vollmer" . "progfolio@protonmail.com") (:keywords "org" "convenience") (:url . "https://github.com/progfolio/doct"))]) + (doctest . [(20240310 8) ((emacs (28 1))) "Doctests for Emacs Lisp" tar ((:commit . "5c7922d739845681a69855de4e0d604262a4ec78") (:keywords "lisp" "maint" "docs" "help") (:url . "https://github.com/ag91/doctest"))]) + (dogears . [(20231016 2356) ((emacs (26 3)) (map (2 1))) "Never lose your place again" tar ((:commit . "1136f28ceaed522351369fb97cc098763293a7a6") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "convenience") (:url . "https://github.com/alphapapa/dogears.el"))]) (dokuwiki . [(20180102 59) ((emacs (24 3)) (xml-rpc (1 6 8))) "Edit Remote DokuWiki Pages Using XML-RPC" tar ((:commit . "594c4d4904dcc2796bbbd2c0845d9e7c09ccf6f7") (:authors ("Juan Karlo Licudine" . "accidentalrebel@gmail.com")) (:maintainers ("Juan Karlo Licudine" . "accidentalrebel@gmail.com")) (:maintainer "Juan Karlo Licudine" . "accidentalrebel@gmail.com") (:keywords "convenience") (:url . "http://www.github.com/accidentalrebel/emacs-dokuwiki"))]) (dokuwiki-mode . [(20170223 1301) nil "Major mode for DokuWiki document" tar ((:commit . "e4e116f6fcc373e3f5937c1a7daa5c2c9c6d3fa1") (:authors ("Tsunenobu Kai" . "kai2nenobu@gmail.com")) (:maintainers ("Tsunenobu Kai" . "kai2nenobu@gmail.com")) (:maintainer "Tsunenobu Kai" . "kai2nenobu@gmail.com") (:keywords "hypermedia" "text" "dokuwiki") (:url . "https://github.com/kai2nenobu/emacs-dokuwiki-mode"))]) (dollaro . [(20151123 1302) ((s (1 6 0))) "simple text templates" tar ((:commit . "500127f0172ac7a1eec627e026b59136580a74ac") (:authors ("Alessandro Piras" . "laynor@gmail.com")) (:maintainers ("Alessandro Piras" . "laynor@gmail.com")) (:maintainer "Alessandro Piras" . "laynor@gmail.com") (:keywords "tools" "convenience"))]) (doom . [(20180301 2308) ((cl-lib (0 5))) "DOM implementation and manipulation library" tar ((:commit . "e59040aefc92dd9b3134eb623624307fb9e4327b") (:authors ("Alex Schroeder" . "alex@gnu.org") ("Henrik.Motakef" . "elisp@henrik-motakef.de") ("Katherine Whitlock" . "toroidal-code@gmail.com") ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Alex Schroeder")) (:maintainer "Alex Schroeder") (:keywords "xml" "dom") (:url . "http://www.github.com/kensanata/doom.el/"))]) - (doom-modeline . [(20230829 1039) ((emacs (25 1)) (compat (29 1 4 2)) (nerd-icons (0 0 1)) (shrink-path (0 3 1))) "A minimal and modern mode-line" tar ((:commit . "66ccd690a5fa5925c21dda16e8aa224a0d8dbb24") (:authors ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainers ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainer "Vincent Zhang" . "seagle0128@gmail.com") (:keywords "faces" "mode-line") (:url . "https://github.com/seagle0128/doom-modeline"))]) + (doom-modeline . [(20240318 234) ((emacs (25 1)) (compat (29 1 4 2)) (nerd-icons (0 1 0)) (shrink-path (0 3 1))) "A minimal and modern mode-line" tar ((:commit . "e09b8e989fa5fc1d98320aaa29d7138631b20ae5") (:authors ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainers ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainer "Vincent Zhang" . "seagle0128@gmail.com") (:keywords "faces" "mode-line") (:url . "https://github.com/seagle0128/doom-modeline"))]) (doom-modeline-now-playing . [(20210831 1442) ((emacs (24 4)) (doom-modeline (3 0 0)) (async (1 9 3))) "Segment for Doom Modeline to show playerctl information" tar ((:commit . "ef9158dfdf32e8eb789b69e7394d0bddaa68f42c") (:authors ("Ellis Kenyő" . "me@elken.dev")) (:maintainers ("Ellis Kenyő" . "me@elken.dev")) (:maintainer "Ellis Kenyő" . "me@elken.dev") (:url . "https://github.com/elken/doom-modeline-now-playing"))]) - (doom-themes . [(20230221 610) ((emacs (25 1)) (cl-lib (0 5))) "an opinionated pack of modern color-themes" tar ((:commit . "4c239dbe42232e81c28901000f435746de2a55ab") (:authors ("Henrik Lissner" . "contact@henrik.io")) (:maintainers ("Henrik Lissner" . "contact@henrik.io")) (:maintainer "Henrik Lissner" . "contact@henrik.io") (:keywords "themes" "faces") (:url . "https://github.com/doomemacs/themes"))]) + (doom-themes . [(20240320 121) ((emacs (25 1)) (cl-lib (0 5))) "an opinionated pack of modern color-themes" tar ((:commit . "37d2182f5078d29fb22bbace346e523bb84b2c4e") (:authors ("Henrik Lissner" . "contact@henrik.io")) (:maintainers ("Henrik Lissner" . "contact@henrik.io")) (:maintainer "Henrik Lissner" . "contact@henrik.io") (:keywords "themes" "faces") (:url . "https://github.com/doomemacs/themes"))]) (dot-env . [(20230820 2014) ((emacs (24 4)) (s (1 13 0))) "Dotenv functionality" tar ((:commit . "83ce690e8ef9175fc621c85d5fbef4f7ace7b7a8") (:authors ("Amo DelBello")) (:maintainers ("Amo DelBello")) (:maintainer "Amo DelBello") (:keywords "convenience" "dotenv" "environment" "configuration") (:url . "https://github.com/amodelbello/dot-env.el"))]) (dot-mode . [(20180312 2300) ((emacs (24 3))) "minor mode to repeat typing or commands" tar ((:commit . "6ca22b73bcdae2363ee9641b822a60685df16a3e") (:authors ("Robert Wyrick" . "rob@wyrick.org")) (:maintainers ("Robert Wyrick" . "rob@wyrick.org")) (:maintainer "Robert Wyrick" . "rob@wyrick.org") (:keywords "convenience") (:url . "https://github.com/wyrickre/dot-mode"))]) (dotenv-mode . [(20191027 2129) ((emacs (24 3))) "Major mode for .env files" tar ((:commit . "e3701bf739bde44f6484eb7753deadaf691b73fb") (:authors ("Preetpal S. Sohal")) (:maintainers ("Preetpal S. Sohal")) (:maintainer "Preetpal S. Sohal") (:url . "https://github.com/preetpalS/emacs-dotenv-mode"))]) @@ -1098,9 +1131,9 @@ (doxy-graph-mode . [(20210604 723) ((emacs (26 3))) "Links source code editing with doxygen call graphs" tar ((:commit . "88af6ef4bc9c8918b66c7774f0a115b2addc310e") (:authors ("Gustavo Puche" . "gustavo.puche@gmail.com")) (:maintainers ("Gustavo Puche" . "gustavo.puche@gmail.com")) (:maintainer "Gustavo Puche" . "gustavo.puche@gmail.com") (:keywords "languages" "all") (:url . "https://github.com/gustavopuche/doxy-graph-mode"))]) (dpaste . [(20160303 2112) nil "Emacs integration for dpaste.com" tar ((:commit . "e7a1a18de77f752eb0dbb4b878925f2265538d0b") (:authors ("Greg Newman" . "greg@gregnewman.org") ("Guilherme Gondim" . "semente@taurinus.org")) (:maintainers ("Greg Newman" . "greg@gregnewman.org")) (:maintainer "Greg Newman" . "greg@gregnewman.org") (:keywords "paste" "pastie" "pastebin" "dpaste" "python"))]) (dpaste_de . [(20131015 1225) ((web (0 3 7))) "Emacs mode to paste to dpaste.de" tar ((:commit . "ab041443884a7a4bfdc81b055688821e8efc9b02") (:authors ("Thejaswi Puthraya" . "thejaswi.puthraya@gmail.com")) (:maintainers ("Thejaswi Puthraya" . "thejaswi.puthraya@gmail.com")) (:maintainer "Thejaswi Puthraya" . "thejaswi.puthraya@gmail.com") (:keywords "pastebin"))]) - (dpkg-dev-el . [(20230220 1635) ((debian-el (37))) "Emacs modes for debian packaging" tar ((:commit . "af9aad721cb263e495e2f77df458e9496549c04b") (:authors ("Peter S Galbraith" . "psg@debian.org")) (:maintainer "Peter S Galbraith" . "psg@debian.org"))]) + (dpkg-dev-el . [(20240303 1522) nil "startup file for the elpa-dpkg-dev-el package" tar ((:commit . "69b294694c57d8e7571fada6a6651c40d266285e") (:authors ("Peter S Galbraith" . "psg@debian.org")) (:maintainers ("Peter S Galbraith" . "psg@debian.org")) (:maintainer "Peter S Galbraith" . "psg@debian.org"))]) (dr-racket-like-unicode . [(20220810 2000) ((emacs (24 3))) "DrRacket-style unicode input" tar ((:commit . "d09b9be289e91e25c941107be5e8f52e7c8f0065") (:authors ("David Christiansen" . "david@davidchristiansen.dk")) (:maintainers ("David Christiansen" . "david@davidchristiansen.dk")) (:maintainer "David Christiansen" . "david@davidchristiansen.dk") (:keywords "i18n" "tools") (:url . "https://github.com/david-christiansen/dr-racket-like-unicode"))]) - (dracula-theme . [(20230405 1844) ((emacs (24 3))) "Dracula Theme" tar ((:commit . "54c26402555ab5b8b7cfd8ee2488c57b2fa5d32a") (:authors ("film42")) (:maintainers ("Étienne Deparis" . "etienne@depar.is")) (:maintainer "Étienne Deparis" . "etienne@depar.is") (:url . "https://github.com/dracula/emacs"))]) + (dracula-theme . [(20231013 821) ((emacs (24 3))) "Dracula Theme" tar ((:commit . "29d5180f7e34c0c858a520068fb650f705b8cfc2") (:authors ("film42")) (:maintainers ("Étienne Deparis" . "etienne@depar.is")) (:maintainer "Étienne Deparis" . "etienne@depar.is") (:url . "https://github.com/dracula/emacs"))]) (draft-mode . [(20160106 859) nil "Rough drafting for Emacs." tar ((:commit . "4779fb32daf53746459da2def7e08004492d4f18") (:authors ("Eeli Reilin" . "gaudecker@fea.st")) (:maintainers ("Eeli Reilin" . "gaudecker@fea.st")) (:maintainer "Eeli Reilin" . "gaudecker@fea.st") (:keywords "draft" "drafting") (:url . "https://github.com/gaudecker/draft-mode"))]) (drag-stuff . [(20161108 749) nil "Drag stuff (lines, words, region, etc...) around" tar ((:commit . "d49fe376d24f0f8ac5ade67b6d7fccc2487c81db") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:keywords "speed" "convenience") (:url . "http://github.com/rejeep/drag-stuff"))]) (drawille . [(20160418 1838) ((cl-lib (0 5))) "Drawille implementation in elisp" tar ((:commit . "d582b455c01432bc80933650c52a1f586bd1b5ad") (:authors ("Josuah Demangeon" . "josuah.demangeon@gmail.com")) (:maintainers ("Josuah Demangeon" . "josuah.demangeon@gmail.com")) (:maintainer "Josuah Demangeon" . "josuah.demangeon@gmail.com") (:keywords "graphics") (:url . "https://github.com/sshbio/elisp-drawille"))]) @@ -1112,26 +1145,28 @@ (drupal-spell . [(20130520 1655) nil "Aspell extra dictionary for Drupal" tar ((:commit . "a69f5e3b62c4c0da74ce26c1d00d5b8f7395e4ae") (:authors ("Arne Jørgensen" . "arne@arnested.dk")) (:maintainers ("Arne Jørgensen" . "arne@arnested.dk")) (:maintainer "Arne Jørgensen" . "arne@arnested.dk") (:keywords "wp") (:url . "https://github.com/arnested/drupal-spell"))]) (dsvn . [(20221102 1416) nil "Subversion interface" tar ((:commit . "36ecd5219584e46dcf6bd252e2ea1ec517d2fc05") (:authors ("David Kågedal" . "davidk@lysator.liu.se") (" Mattias Engdegård" . "mattiase@acm.org")) (:maintainers ("Mattias Engdegård" . "mattiase@acm.org")) (:maintainer "Mattias Engdegård" . "mattiase@acm.org") (:keywords "docs"))]) (dtb-mode . [(20210105 1132) ((emacs (25))) "Show device tree souce in dtbs" tar ((:commit . "d5bca7d1afaac5615c586b60c7314a1d0e2514dc") (:authors ("Schspa Shi" . "schspa@gmail.com")) (:maintainers ("Schspa Shi" . "schspa@gmail.com")) (:maintainer "Schspa Shi" . "schspa@gmail.com") (:keywords "dtb" "dts" "convenience") (:url . "https://github.com/schspa/dtb-mode"))]) - (dtk . [(20230601 1417) ((emacs (24 4)) (cl-lib (0 6 1)) (dash (2 12 0)) (seq (1 9)) (s (1 9))) "access SWORD content via diatheke" tar ((:commit . "c3214bcab4076ac7855a19b52a2925e279477e8d") (:authors ("David Thompson")) (:maintainers ("David Thompson")) (:maintainer "David Thompson") (:keywords "hypermedia") (:url . "https://github.com/dtk01/dtk.el"))]) + (dtext-mode . [(20231120 1606) ((emacs (24 4))) "Major mode for Danbooru DText" tar ((:commit . "5c68d1c05c4606f68384569d9baaef4f6e72fc73") (:authors ("John Russell" . "johndevlopment7@gmail.com")) (:maintainers ("John Russell" . "johndevlopment7@gmail.com")) (:maintainer "John Russell" . "johndevlopment7@gmail.com") (:keywords "languages") (:url . "https://github.com/JohnDevlopment/dtext-mode.el"))]) + (dtk . [(20240317 2328) ((emacs (24 4)) (cl-lib (0 6 1)) (dash (2 12 0)) (seq (1 9)) (s (1 9))) "access SWORD content via diatheke" tar ((:commit . "461f30f2e2038c3c469e710309046c0af4d6b41a") (:authors ("David Thompson")) (:maintainers ("David Thompson")) (:maintainer "David Thompson") (:keywords "hypermedia") (:url . "https://codeberg.org/thomp/dtk"))]) (dtrace-script-mode . [(20150214 623) nil "DTrace code editing commands for Emacs" tar ((:commit . "a92f76c65b9fb64d448e503b4ea7ff06085be8ee"))]) - (dtrt-indent . [(20230814 2156) nil "Adapt to foreign indentation offsets" tar ((:commit . "be07f4979a5b402a0cf5311c86c30b89ca0e1ee4") (:authors ("Julian Scheid" . "julians37@googlemail.com")) (:maintainers ("Reuben Thomas" . "rrt@sc3d.org")) (:maintainer "Reuben Thomas" . "rrt@sc3d.org") (:keywords "convenience" "files" "languages" "c"))]) + (dtrt-indent . [(20240211 1111) nil "Adapt to foreign indentation offsets" tar ((:commit . "5d1b44f9a1a484ca229cc14f8062609a10ef4891") (:authors ("Julian Scheid" . "julians37@googlemail.com")) (:maintainers ("Reuben Thomas" . "rrt@sc3d.org")) (:maintainer "Reuben Thomas" . "rrt@sc3d.org") (:keywords "convenience" "files" "languages" "c"))]) (dts-mode . [(20211202 18) nil "Major mode for Devicetree source code" tar ((:commit . "32517e7eeeccc785b7c669fd5e93c5df45597ef1") (:authors ("Ben Gamari" . "ben@smart-cactus.org")) (:maintainers ("Ben Gamari" . "ben@smart-cactus.org")) (:maintainer "Ben Gamari" . "ben@smart-cactus.org") (:keywords "languages"))]) (ducpel . [(20140702 1154) ((cl-lib (0 5))) "Logic game with sokoban elements" tar ((:commit . "2f2ce2df269d99261c808a5c4ebc00d6d2cddabc") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainers ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:keywords "games") (:url . "https://github.com/alezost/ducpel"))]) (dumb-diff . [(20171211 2122) ((emacs (24 3))) "fast arbitrary diffs" tar ((:commit . "1a2331d283049b71a07c1b06b1e0627a950d55f4") (:authors ("jack angers")) (:maintainers ("jack angers")) (:maintainer "jack angers") (:keywords "programming" "diff"))]) - (dumb-jump . [(20230716 1717) ((emacs (24 3)) (s (1 11 0)) (dash (2 9 0)) (popup (0 5 3))) "Jump to definition for 50+ languages without configuration" tar ((:commit . "d9503c157ab88f0ed2fa1301aeb57e95ac564760") (:authors ("jack angers and contributors")) (:maintainers ("jack angers and contributors")) (:maintainer "jack angers and contributors") (:keywords "programming") (:url . "https://github.com/jacktasia/dumb-jump"))]) + (dumb-jump . [(20240114 354) ((emacs (24 3)) (s (1 11 0)) (dash (2 9 0)) (popup (0 5 3))) "Jump to definition for 50+ languages without configuration" tar ((:commit . "ede6a04187e79a29ef31d14760ac0d8d4c5f4cc5") (:authors ("jack angers and contributors")) (:maintainers ("jack angers and contributors")) (:maintainer "jack angers and contributors") (:keywords "programming") (:url . "https://github.com/jacktasia/dumb-jump"))]) (dummyparens . [(20141009 1024) nil "parenthesis auto-pairing and wrapping" tar ((:commit . "9798ef1d0eaa24e4fe66f8aa6022a8c62714cc89") (:authors ("Sergei Nosov ")) (:maintainers ("Sergei Nosov ")) (:maintainer "Sergei Nosov ") (:keywords "dummyparens" "auto-pair" "wrapping") (:url . "https://github.com/snosov1/dummyparens"))]) - (dune . [(20230731 1217) nil "Integration with the dune build system" tar ((:commit . "fc382520272012638088848d7f3dd1ef6687a284") (:url . "https://github.com/ocaml/dune"))]) + (dune . [(20230402 1815) nil "Integration with the dune build system" tar ((:commit . "e53368337be3c353fd654bdbead322605fc875c5") (:url . "https://github.com/ocaml/dune"))]) (dune-format . [(20210505 108) ((reformatter (0 6)) (emacs (24 1))) "Reformat OCaml's dune files automatically" tar ((:commit . "eda7a16ae378e7c482c11228c43ef32b893a1520") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "languages") (:url . "https://github.com/purcell/emacs-dune-format"))]) + (duplexer . [(20230903 1836) ((emacs (26 3))) "Handle conflicts between local minor modes and reuse rules" tar ((:commit . "aa617ffa1cc37a06ce89a02fd8b38963e09fd4f3") (:authors ("liuyinz" . "liuyinz95@gmail.com")) (:maintainers ("liuyinz" . "liuyinz95@gmail.com")) (:maintainer "liuyinz" . "liuyinz95@gmail.com") (:keywords "tools") (:url . "https://github.com/liuyinz/duplexer.el"))]) (duplicate-thing . [(20181031 1500) nil "Duplicate current line & selection" tar ((:commit . "9d8fd05e3e5caa35d3f2a0c0032c92f0c0908e21") (:authors ("ongaeshi")) (:maintainers ("ongaeshi")) (:maintainer "ongaeshi") (:keywords "convenience" "command" "duplicate" "line" "selection") (:url . "https://github.com/ongaeshi/duplicate-thing"))]) (dut-mode . [(20170729 2111) ((emacs (24))) "Major mode for the Dut programming language" tar ((:commit . "9235c7acaa6690942e9de8b7acd1e4be0c859dc1") (:authors ("The dut-mode Authors")) (:maintainers ("The dut-mode Authors")) (:maintainer "The dut-mode Authors") (:keywords "languages" "gut") (:url . "https://github.com/dut-lang/dut-mode"))]) (dw . [(20210331 2311) ((emacs (25 1))) "Diceware passphrase generation commands" tar ((:commit . "61c5718ba64ace4c9e29de18aa2690ecc3f0f258") (:authors ("D. Williams" . "d.williams@posteo.net")) (:maintainers ("D. Williams" . "d.williams@posteo.net")) (:maintainer "D. Williams" . "d.williams@posteo.net") (:keywords "convenience" "games") (:url . "https://github.com/integral-dw/dw-passphrase-generator"))]) (dwim-coder-mode . [(20230830 1215) ((emacs (29))) "DWIM keybindings for C, Python, Rust, and more" tar ((:commit . "94a752fca078144dd309343880abafbc4eacca5f") (:authors ("Mohammed Sadiq" . "sadiq@sadiqpk.org")) (:maintainers ("Mohammed Sadiq" . "sadiq@sadiqpk.org")) (:maintainer "Mohammed Sadiq" . "sadiq@sadiqpk.org") (:keywords "convenience" "hacks") (:url . "https://sadiqpk.org/projects/dwim-coder-mode.html"))]) - (dwim-shell-command . [(20230730 1153) ((emacs (28 1))) "Shell commands with DWIM behaviour" tar ((:commit . "e91cd45b1bd0173e6d6a90079a86f13f2bfd79b7") (:authors ("Alvaro Ramirez")) (:maintainers ("Alvaro Ramirez")) (:maintainer "Alvaro Ramirez") (:url . "https://github.com/xenodium/dwim-shell-command"))]) + (dwim-shell-command . [(20240108 1754) ((emacs (28 1))) "Shell commands with DWIM behaviour" tar ((:commit . "7a2c298424466d2bff7c050e01fb85b5f882dbc3") (:authors ("Alvaro Ramirez")) (:maintainers ("Alvaro Ramirez")) (:maintainer "Alvaro Ramirez") (:url . "https://github.com/xenodium/dwim-shell-command"))]) (dyalog-mode . [(20230214 1027) ((cl-lib (0 2)) (emacs (24 3))) "Major mode for editing Dyalog APL source code" tar ((:commit . "13c0d391aa878a1609259a89fe3e6db8d21935e8") (:authors ("Joakim Hårsman" . "joakim.harsman@gmail.com")) (:maintainers ("Joakim Hårsman" . "joakim.harsman@gmail.com")) (:maintainer "Joakim Hårsman" . "joakim.harsman@gmail.com") (:keywords "languages") (:url . "https://github.com/harsman/dyalog-mode.git"))]) (dylan . [(20220115 1804) ((emacs (25 1))) "Dylan editing modes" tar ((:commit . "9d2891e3e06405b75072d296f385fa795aeb9835") (:url . "https://opendylan.org/"))]) (dynamic-fonts . [(20140731 1226) ((font-utils (0 7 0)) (persistent-soft (0 8 8)) (pcache (0 2 3))) "Set faces based on available fonts" tar ((:commit . "004ee6014dc7dbff8f14d26015c91d9229f6eac0") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "faces" "frames") (:url . "http://github.com/rolandwalker/dynamic-fonts"))]) (dynamic-graphs . [(20210908 2010) ((emacs (26 1))) "Manipulation with graphviz graphs" tar ((:commit . "64ca58dffecdecb636f7fe61c0c86e9c3c64d4dd") (:authors ("Tomas Zellerin" . "tomas@zellerin.cz")) (:maintainers ("Tomas Zellerin" . "tomas@zellerin.cz")) (:maintainer "Tomas Zellerin" . "tomas@zellerin.cz") (:keywords "tools") (:url . "https://github.com/zellerin/dynamic-graphs"))]) - (dynamic-ruler . [(20160602 808) nil "Displays a dynamic ruler at point." tar ((:commit . "c9c0de6fe5721f06b50e01d9b4684b519c71b367") (:authors ("Francesc Rocher" . "francesc.rocher@gmail.com")) (:maintainers ("Francesc Rocher" . "francesc.rocher@gmail.com")) (:maintainer "Francesc Rocher" . "francesc.rocher@gmail.com") (:keywords "ruler" "tools" "convenience") (:url . "http://rocher.github.io/dynamic-ruler"))]) + (dynamic-ruler . [(20231126 1915) nil "Displays a dynamic ruler at point." tar ((:commit . "984877f3ad8dd4e4bdec2fcacb82a11b4f3b5d75") (:authors ("Francesc Rocher" . "francesc.rocher@gmail.com")) (:maintainers ("Francesc Rocher" . "francesc.rocher@gmail.com")) (:maintainer "Francesc Rocher" . "francesc.rocher@gmail.com") (:keywords "ruler" "tools" "convenience") (:url . "http://rocher.github.io/dynamic-ruler"))]) (dynamic-spaces . [(20171027 1851) nil "When editing, don't move text separated by spaces" tar ((:commit . "97ae8480c257ba573ca3d06dbf602f9b23c41d38") (:authors ("Anders Lindgren")) (:maintainers ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "convenience") (:url . "https://github.com/Lindydancer/dynamic-spaces"))]) (dynaring . [(20230619 1854) ((emacs (25 1))) "A dynamically sized ring structure" tar ((:commit . "909a64aa96f09b05fe59d5703f7e0ad22d161bb5") (:authors ("Mike Mattie" . "codermattie@gmail.com") ("Sid Kasivajhula" . "sid@countvajhula.com")) (:maintainers ("Sid Kasivajhula" . "sid@countvajhula.com")) (:maintainer "Sid Kasivajhula" . "sid@countvajhula.com") (:url . "https://github.com/countvajhula/dynaring"))]) (dyncloze . [(20210712 145) ((emacs (25 1)) (dash (2 18))) "Language alternatives self-testing" tar ((:commit . "aafc5adc25c7f714b619109bccf92e475d6c84ef") (:authors ("Andrew Hyatt" . "ahyatt@gmail.com")) (:maintainers ("Andrew Hyatt" . "ahyatt@gmail.com")) (:maintainer "Andrew Hyatt" . "ahyatt@gmail.com") (:url . "https://github.com/ahyatt/emacs-dyncloze"))]) @@ -1143,28 +1178,33 @@ (e2wm-pkgex4pl . [(20140525 2211) ((e2wm (1 2)) (plsense-direx (0 2 0))) "Plugin of e2wm.el for package explorer of Perl" tar ((:commit . "7ea994450727190c4f3cb46cb429ba41b692ecc0") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "tools" "window manager" "perl") (:url . "https://github.com/aki2o/e2wm-pkgex4pl"))]) (e2wm-svg-clock . [(20150106 1306) ((e2wm (20130225 1602)) (svg-clock (0 4))) "e2wm plugin for svg-clock" tar ((:commit . "d425925e3afffcbe2ff74edc80b714e4319d4c94") (:authors ("Yuhei Maeda ")) (:maintainers ("Yuhei Maeda")) (:maintainer "Yuhei Maeda") (:keywords "convenience" "e2wm") (:url . "https://github.com/myuhe/e2wm-svg-clock.el"))]) (e2wm-sww . [(20200805 1339) ((e2wm (1 2))) "Plugin of e2wm.el to switch plugin quickly" tar ((:commit . "8926d0c70be05c7b4ef821e22e411e8813973687") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "tools" "window manager") (:url . "https://github.com/aki2o/e2wm-sww"))]) - (e2wm-term . [(20200322 729) ((e2wm (1 2)) (log4e (0 2 0)) (yaxception (0 3 2))) "Perspective of e2wm.el for work in terminal" tar ((:commit . "74362d6271e736272df32ea807c5a22e4df54a50") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "tools" "window manager") (:url . "https://github.com/aki2o/e2wm-term"))]) + (e2wm-term . [(20240107 850) ((e2wm (1 2)) (log4e (0 2 0)) (yaxception (1 0 0))) "Perspective of e2wm.el for work in terminal" tar ((:commit . "4542e52138484933dd99a497ff1b048ea42f9246") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "tools" "window manager") (:url . "https://github.com/aki2o/e2wm-term"))]) (eacl . [(20220526 1434) ((emacs (25 1))) "Auto-complete lines by grepping project" tar ((:commit . "4fe2cafbfeb73d806ebea8801c3522ff2886f30b") (:authors ("Chen Bin ")) (:maintainers ("Chen Bin ")) (:maintainer "Chen Bin ") (:keywords "abbrev" "convenience" "matching") (:url . "http://github.com/redguardtoo/eacl"))]) (earthfile-mode . [(20230809 2250) ((emacs (26))) "Major mode for editing Earthly file" tar ((:commit . "3029e5ab06171ca5947041e95053561e10e5ba41") (:authors ("Thanabodee Charoenpiriyakij" . "wingyminus@gmail.com")) (:maintainers ("Thanabodee Charoenpiriyakij" . "wingyminus@gmail.com")) (:maintainer "Thanabodee Charoenpiriyakij" . "wingyminus@gmail.com") (:url . "https://github.com/earthly/earthly-mode"))]) + (eask . [(20240316 220) ((emacs (26 1))) "Core Eask APIs, for Eask CLI development" tar ((:commit . "8adf14304a6d9aeddded320a39e5af63525ab0b2") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "lisp" "eask" "api") (:url . "https://github.com/emacs-eask/eask"))]) + (eask-mode . [(20240101 819) ((emacs (24 3)) (eask (0 1 0))) "Major mode for editing Eask files" tar ((:commit . "774bf05f2d778a107f27f8fa47034ad15f16395c") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "lisp" "eask") (:url . "https://github.com/emacs-eask/eask-mode"))]) + (easky . [(20240316 327) ((emacs (27 1)) (eask-mode (0 1 0)) (eask (0 1 0)) (ansi (0 4 1)) (lv (0 0)) (marquee-header (0 1 0))) "Control the Eask command-line interface" tar ((:commit . "85fcdf4db86f8d6773ce7d309cf752c9f972e564") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "maint" "easky") (:url . "https://github.com/emacs-eask/easky"))]) (easy-after-load . [(20170817 1231) nil "eval-after-load for all files in a directory" tar ((:commit . "29e20145da49ac9ea40463c552130777408040de") (:authors ("Kyle Hargraves")) (:maintainers ("Kyle Hargraves")) (:maintainer "Kyle Hargraves") (:url . "https://github.com/pd/easy-after-load"))]) (easy-escape . [(20210917 1254) nil "Improve readability of escape characters in regular expressions" tar ((:commit . "938497a21e65ba6b3ff8ec90e93a6d0ab18dc9b4") (:authors ("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) (:maintainers ("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) (:maintainer "Clément Pit-Claudel" . "clement.pitclaudel@live.com") (:keywords "convenience" "lisp" "tools") (:url . "https://github.com/cpitclaudel/easy-escape"))]) - (easy-hugo . [(20230314 2338) ((emacs (25 1)) (popup (0 5 3)) (request (0 3 0)) (transient (0 3 6))) "Write blogs made with hugo by markdown or org-mode" tar ((:commit . "a26364acba671e2891ce3aa457103691e10e244e") (:authors ("Masashi Miyaura")) (:maintainers ("Masashi Miyaura")) (:maintainer "Masashi Miyaura") (:url . "https://github.com/masasam/emacs-easy-hugo"))]) + (easy-hugo . [(20240129 1534) ((emacs (25 1)) (popup (0 5 3)) (request (0 3 0)) (transient (0 3 6))) "Write blogs made with hugo by markdown or org-mode" tar ((:commit . "ecae28ef6bd70f3b7492592008bfa8776d81d2e7") (:authors ("Masashi Miyaura")) (:maintainers ("Masashi Miyaura")) (:maintainer "Masashi Miyaura") (:url . "https://github.com/masasam/emacs-easy-hugo"))]) (easy-jekyll . [(20211217 2311) ((emacs (25 1)) (request (0 3 0))) "Major mode managing jekyll blogs" tar ((:commit . "7f19af310162464956f2bc4c38c6b7e95cb20321") (:authors ("Masashi Miyaura")) (:maintainers ("Masashi Miyaura")) (:maintainer "Masashi Miyaura") (:url . "https://github.com/masasam/emacs-easy-jekyll"))]) (easy-kill . [(20220511 557) ((emacs (25)) (cl-lib (0 5))) "kill & mark things easily" tar ((:commit . "de7d66c3c864a4722a973ee9bc228a14be49ba0c") (:authors ("Leo Liu" . "sdl.web@gmail.com")) (:maintainers ("Leo Liu" . "sdl.web@gmail.com")) (:maintainer "Leo Liu" . "sdl.web@gmail.com") (:keywords "killing" "convenience") (:url . "https://github.com/leoliu/easy-kill"))]) - (easy-kill-extras . [(20230829 526) ((easy-kill (0 9 4))) "Extra functions for easy-kill." tar ((:commit . "677435739c698ed81c3732188c29aa98bd9ffb08") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainers ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:keywords "killing" "convenience") (:url . "https://github.com/knu/easy-kill-extras.el"))]) + (easy-kill-extras . [(20240122 1649) ((easy-kill (0 9 4))) "Extra functions for easy-kill." tar ((:commit . "6ec0a1ff47aee681f7aa7af4250ede75815385f2") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainers ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:keywords "killing" "convenience") (:url . "https://github.com/knu/easy-kill-extras.el"))]) (easy-repeat . [(20150516 848) ((emacs (24 4))) "Repeat easily" tar ((:commit . "060f0e6801c82c40c06961dc0528a00e18947a8c") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainers ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com") (:keywords "repeat" "convenience") (:url . "https://github.com/xuchunyang/easy-repeat.el"))]) + (ebdb-mua-sidecar . [(20240115 1727) ((emacs (28 1)) (universal-sidecar (1 5 1)) (ebdb (0 8 20))) "EBDB Integration for Universal Sidecar" tar ((:commit . "9050eaea7946e613a4b9ecd9dd1462614699edb1") (:authors ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainers ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainer "Samuel W. Flint" . "me@samuelwflint.com") (:keywords "mail" "convenience") (:url . "https://git.sr.ht/~swflint/emacs-universal-sidecar"))]) (ebf . [(20210225 1211) ((dash (2 18 0)) (cl-lib (0 5))) "brainfuck language transpiler to Emacs Lisp" tar ((:commit . "6cbeb4d62416f4cfd5be8906667342af8ecc44a6") (:authors ("Alexey Kutepov" . "reximkut@gmail.com")) (:maintainers ("Alexey Kutepov" . "reximkut@gmail.com")) (:maintainer "Alexey Kutepov" . "reximkut@gmail.com") (:url . "http://github.com/rexim/ebf"))]) - (ebib . [(20230221 2204) ((parsebib (4 0)) (emacs (26 1))) "a BibTeX database manager" tar ((:commit . "5a03e4662dccbffe63605bb8e88bfb691ebe0afa") (:authors ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainers ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm") (:keywords "text" "bibtex") (:url . "http://joostkremers.github.io/ebib/"))]) - (ebnf-mode . [(20220606 1846) ((emacs (25 1))) "Major mode for EBNF files" tar ((:commit . "9bc7242557dcef797afdcb4a50c70bf153aa221d") (:authors ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainers ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainer "Noah Peart" . "noah.v.peart@gmail.com") (:url . "https://github.com/nverno/ebnf-mode"))]) - (ebuku . [(20221122 427) ((emacs (25 1))) "Interface to the buku Web bookmark manager" tar ((:commit . "0c6cf404a49bd68800221446df186fffa0139325") (:authors ("Alexis , Erik Sjöstrand , Junji Zhi [https://github.com/junjizhi], Hilton Chain" . "hako@ultrarare.space")) (:maintainers ("Alexis" . "flexibeast@gmail.com")) (:maintainer "Alexis" . "flexibeast@gmail.com") (:keywords "bookmarks" "buku" "data" "web" "www") (:url . "https://github.com/flexibeast/ebuku"))]) + (ebib . [(20240305 752) ((parsebib (4 0)) (emacs (26 1)) (compat (29 1 4 3))) "a BibTeX database manager" tar ((:commit . "3d7b09606a04cd4c8236e290e709b56872148bc8") (:authors ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainers ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm") (:keywords "text" "bibtex") (:url . "http://joostkremers.github.io/ebib/"))]) + (ebib-sidecar . [(20240203 1945) ((emacs (28 1)) (citeproc (0 9 4)) (universal-sidecar (1 5 0)) (universal-sidecar-citeproc (1 0 0)) (ebib (2 39))) "Sidecar to show formatted reference of current Ebib Entry" tar ((:commit . "fbeaba52260f5ee7323839cbe15c4125532a9240") (:authors ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainers ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainer "Samuel W. Flint" . "me@samuelwflint.com") (:keywords "bib") (:url . "https://git.sr.ht/~swflint/emacs-universal-sidecar"))]) + (ebnf-mode . [(20231022 1759) ((emacs (25 1))) "Major mode for EBNF files" tar ((:commit . "61486b1c9d4746249640410e58087e318f801ed8") (:authors ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainers ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainer "Noah Peart" . "noah.v.peart@gmail.com") (:url . "https://github.com/nverno/ebnf-mode"))]) + (ebuku . [(20231113 748) ((emacs (25 1))) "Interface to the buku Web bookmark manager" tar ((:commit . "c854d128cba8576fe9693c19109b5deafb573e99") (:authors ("Alexis , Erik Sjöstrand , Junji Zhi [https://github.com/junjizhi], Hilton Chain" . "hako@ultrarare.space")) (:maintainers ("Alexis" . "flexibeast@gmail.com")) (:maintainer "Alexis" . "flexibeast@gmail.com") (:keywords "bookmarks" "buku" "data" "web" "www") (:url . "https://github.com/flexibeast/ebuku"))]) (ecb . [(20170728 1921) nil "a code browser for Emacs" tar ((:commit . "1330a44cf3c171781083b0b926ab7622f64e6e81") (:authors ("Jesper Nordenberg" . "mayhem@home.se") ("Klaus Berndl" . "klaus.berndl@sdm.de") ("Kevin A. Burton" . "burton@openprivacy.org")) (:maintainers ("Klaus Berndl" . "klaus.berndl@sdm.de")) (:maintainer "Klaus Berndl" . "klaus.berndl@sdm.de") (:keywords "browser" "code" "programming" "tools"))]) - (echo-bar . [(20230209 1350) nil "Turn the echo area into a custom status bar" tar ((:commit . "03cae6d045636948d8b47979d85774e39556f9e1") (:authors ("Adam Tillou" . "qaiviq@gmail.com")) (:maintainers ("Adam Tillou" . "qaiviq@gmail.com")) (:maintainer "Adam Tillou" . "qaiviq@gmail.com") (:keywords "convenience" "tools") (:url . "https://github.com/qaiviq/echo-bar.el"))]) + (echo-bar . [(20240307 741) nil "Turn the echo area into a custom status bar" tar ((:commit . "71ef563df7f1b85cfe64854b6e40bb353a281cc5") (:authors ("Adam Tillou" . "qaiviq@gmail.com")) (:maintainers ("Adam Tillou" . "qaiviq@gmail.com")) (:maintainer "Adam Tillou" . "qaiviq@gmail.com") (:keywords "convenience" "tools") (:url . "https://github.com/qaiviq/echo-bar.el"))]) (eclim . [(20181108 1134) ((dash (2 11 0)) (json (1 2)) (popup (0 5 2)) (s (1 9 0)) (cl-lib (0 5)) (yasnippet (0 10 0))) "An interface to the Eclipse IDE." tar ((:commit . "23f5b294f833ce58516d7b9ae08a7792d70022a1"))]) (eclipse-theme . [(20191113 1518) nil "Theme based on Eclipse circa 2010" tar ((:commit . "dcf97865512ed450f9d5137c1a05e12edb5b7f80") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "themes") (:url . "https://github.com/abo-abo/eclipse-theme"))]) - (ecukes . [(20230220 456) ((emacs (25)) (commander (0 6 1)) (espuds (0 2 2)) (ansi (0 3 0)) (dash (2 2 0)) (s (1 8 0)) (f (0 11 0))) "Cucumber for Emacs" tar ((:commit . "6bc1feb33d44bda7a7ccf06f8748050ffa1dc23c"))]) + (ecukes . [(20240315 2350) ((emacs (25)) (commander (0 6 1)) (espuds (0 2 2)) (ansi (0 3 0)) (dash (2 2 0)) (s (1 8 0)) (f (0 11 0))) "Cucumber for Emacs" tar ((:commit . "11225972934b3cfe09ada87dd785f8dd0082b6e3"))]) (edbi . [(20160225 141) ((concurrent (0 3 1)) (ctable (0 1 2)) (epc (0 1 1))) "Emacs Database Interface" tar ((:commit . "6f50aaf4bde75255221f2292c7a4ad3fa9d918c0") (:authors ("SAKURAI Masashi ")) (:maintainer "SAKURAI Masashi ") (:keywords "database" "epc") (:url . "https://github.com/kiwanami/emacs-edbi"))]) (ede-compdb . [(20150920 2033) ((ede (1 2)) (semantic (2 2)) (cl-lib (0 4))) "Support for compilation database projects in EDE" tar ((:commit . "23c91082270fcef24ea791b848f1604e36888ff0") (:authors ("Alastair Rankine" . "alastair@girtby.net")) (:maintainers ("Alastair Rankine" . "alastair@girtby.net")) (:maintainer "Alastair Rankine" . "alastair@girtby.net") (:keywords "development" "ninja" "build" "cedet" "ede"))]) - (ede-php-autoload . [(20180901 1255) nil "Simple EDE PHP Project" tar ((:commit . "8a4eeeaa93b8d87b65a107c4ebcbeb14528d9449") (:authors ("Steven Rémot" . "steven.remot@gmail.com") ("original code for C++ by Eric M. Ludlam" . "eric@siege-engine.com")) (:maintainers ("Steven Rémot" . "steven.remot@gmail.com")) (:maintainer "Steven Rémot" . "steven.remot@gmail.com") (:keywords "php" "project" "ede") (:url . "https://github.com/emacs-php/ede-php-autoload"))]) + (ede-php-autoload . [(20230916 441) nil "Simple EDE PHP Project" tar ((:commit . "a7c16292ecaf9b39321e7a99ccac259fcbf6c373") (:authors ("Steven Rémot" . "steven.remot@gmail.com") ("original code for C++ by Eric M. Ludlam" . "eric@siege-engine.com")) (:maintainers ("Steven Rémot" . "steven.remot@gmail.com")) (:maintainer "Steven Rémot" . "steven.remot@gmail.com") (:keywords "php" "project" "ede") (:url . "https://github.com/emacs-php/ede-php-autoload"))]) (ede-php-autoload-composer-installers . [(20170221 2026) ((ede-php-autoload (1 0 0)) (f (0 19 0)) (s (1 7 0))) "Composer installers support for ede-php-autoload" tar ((:commit . "3e2fde975a06757b363e235c67e6341ebe668f60") (:authors ("Thomas Fini Hansen" . "xen@xen.dk")) (:maintainers ("Thomas Fini Hansen" . "xen@xen.dk")) (:maintainer "Thomas Fini Hansen" . "xen@xen.dk") (:keywords "programming" "php") (:url . "https://github.com/xendk/ede-php-autoload-composer-installers"))]) (ede-php-autoload-drupal . [(20170316 2158) ((ede-php-autoload (1 0 0)) (f (0 19 0)) (s (1 7 0))) "Drupal support for ede-php-autoload" tar ((:commit . "54a04241d94fabc4f4d16ae4dc8ba4f0c6e3b435") (:authors ("Thomas Fini Hansen" . "xen@xen.dk")) (:maintainers ("Thomas Fini Hansen" . "xen@xen.dk")) (:maintainer "Thomas Fini Hansen" . "xen@xen.dk") (:keywords "programming" "php" "drupal"))]) (edebug-inline-result . [(20220820 2240) ((emacs (25 1))) "Show Edebug result inline" tar ((:commit . "90e401ae3e7b3c85da8b24af940fd97f5e744625") (:keywords "extensions" "lisp" "tools") (:url . "https://repo.or.cz/edebug-inline-result.git"))]) @@ -1173,22 +1213,22 @@ (edit-at-point . [(20191013 1218) nil "edit(copy,cut..) current things(word,symbol..) under cursor" tar ((:commit . "28c85a65c9c61f2aff50bc5e93f61cde26a5d9c0") (:authors (nil . "")) (:maintainers (nil . "")) (:maintainer nil . "") (:url . "http://github.com/enoson/edit-at-point.el"))]) (edit-chrome-textarea . [(20200324 1513) ((emacs (25 1)) (websocket (1 4))) "Edit Chrome Textarea" tar ((:commit . "302659e92b7ef88824691905df3f926766f64729") (:authors ("Xu Chunyang")) (:maintainers ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:keywords "tools") (:url . "https://github.com/xuchunyang/edit-chrome-textarea.el"))]) (edit-color-stamp . [(20130529 1733) ((es-lib (0 2)) (cl-lib (1 0))) "Edit a hex color stamp, using a QT or the internal color picker" tar ((:commit . "32dc1ca5bcf3dcf83fad5e39b55dc5b77becb3d3") (:authors ("sabof")) (:maintainers ("sabof")) (:maintainer "sabof") (:url . "https://github.com/sabof/edit-color-stamp"))]) - (edit-indirect . [(20220511 1124) ((emacs (24 3))) "Edit regions in separate buffers" tar ((:commit . "f80f63822ffae78de38dbe72cacaeb1aaa96c732") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainers ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com") (:url . "https://github.com/Fanael/edit-indirect"))]) + (edit-indirect . [(20240128 119) ((emacs (24 3))) "Edit regions in separate buffers" tar ((:commit . "82a28d8a85277cfe453af464603ea330eae41c05") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainers ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com") (:url . "https://github.com/Fanael/edit-indirect"))]) (edit-indirect-region-latex . [(20161129 645) ((emacs (24 3)) (ht (2 2)) (edit-indirect (0 1 4))) "Edit LaTeX regions in separate buffers, e.g. for English grammar checks" tar ((:commit . "05043f2c0c9838947d3ca4b51b695deb7c47612e") (:authors ("Hirotaka Niitsuma" . "hirotaka.niitsuma@gmail.com")) (:maintainers ("Hirotaka Niitsuma" . "hirotaka.niitsuma@gmail.com")) (:maintainer "Hirotaka Niitsuma" . "hirotaka.niitsuma@gmail.com") (:url . "https://github.com/niitsuma/edit-indirect-region-latex"))]) (edit-list . [(20100930 1443) nil "edit a single list" tar ((:commit . "f460d3f9e208a4e606fe6ded307f1b011916ca71") (:authors ("Michael Olson" . "mwolson@gnu.org")) (:maintainers ("Michael Olson" . "mwolson@gnu.org")) (:maintainer "Michael Olson" . "mwolson@gnu.org") (:url . "http://mwolson.org/static/dist/elisp/edit-list.el"))]) (edit-server . [(20220908 1014) nil "server that responds to edit requests from Chrome" tar ((:commit . "3ce09c6eb2919d56ef052b1584bba6abb12f7e99") (:authors ("Alex Bennée" . "alex@bennee.com")) (:maintainers ("Alex Bennée" . "alex@bennee.com")) (:maintainer "Alex Bennée" . "alex@bennee.com") (:url . "https://github.com/stsquad/emacs_chrome"))]) (edit-server-htmlize . [(20130329 2248) ((edit-server (1 9))) "(de)HTMLization hooks for edit-server.el" tar ((:commit . "e7f8dadfabe869c77ca241cd6fbd4c52bd908392") (:authors ("Roland McGrath" . "roland@hack.frob.com")) (:maintainers ("Roland McGrath" . "roland@hack.frob.com")) (:maintainer "Roland McGrath" . "roland@hack.frob.com") (:url . "https://github.com/frobtech/edit-server-htmlize"))]) - (editorconfig . [(20230802 1505) ((emacs (26 1)) (nadvice (0 3))) "EditorConfig Emacs Plugin" tar ((:commit . "df0e5180db1d1267c9ea39abbe98b7993e83bae7") (:authors ("EditorConfig Team" . "editorconfig@googlegroups.com")) (:maintainers ("EditorConfig Team" . "editorconfig@googlegroups.com")) (:maintainer "EditorConfig Team" . "editorconfig@googlegroups.com") (:keywords "convenience" "editorconfig") (:url . "https://github.com/editorconfig/editorconfig-emacs#readme"))]) + (editorconfig . [(20240318 2049) ((emacs (26 1)) (nadvice (0 3))) "EditorConfig Emacs Plugin" tar ((:commit . "6b85f0475f01ff97f3233acb68e2646d2ca32a91") (:authors ("EditorConfig Team" . "editorconfig@googlegroups.com")) (:maintainers ("EditorConfig Team" . "editorconfig@googlegroups.com")) (:maintainer "EditorConfig Team" . "editorconfig@googlegroups.com") (:keywords "convenience" "editorconfig") (:url . "https://github.com/editorconfig/editorconfig-emacs#readme"))]) (editorconfig-charset-extras . [(20180223 457) ((editorconfig (0 6 0))) "Extra EditorConfig Charset Support" tar ((:commit . "ddf60923c6f4841cb593b2ea04c9c710a01d262f") (:authors ("10sr" . "8.slashes@gmail.com")) (:maintainers ("10sr" . "8.slashes@gmail.com")) (:maintainer "10sr" . "8.slashes@gmail.com") (:keywords "tools") (:url . "https://github.com/10sr/editorconfig-charset-extras-el"))]) (editorconfig-custom-majormode . [(20180816 244) ((editorconfig (0 6 0))) "Decide major-mode and mmm-mode from EditorConfig" tar ((:commit . "13ad1c83f847bedd4b3a19f9df7fd925853b19de") (:authors ("10sr <8slashes+el [at] gmail [dot] com>")) (:maintainers ("10sr <8slashes+el [at] gmail [dot] com>")) (:maintainer "10sr <8slashes+el [at] gmail [dot] com>") (:keywords "editorconfig" "util") (:url . "https://github.com/10sr/editorconfig-custom-majormode-el"))]) (editorconfig-domain-specific . [(20180505 924) ((cl-lib (0 5)) (editorconfig (0 6 0))) "Apply brace style and other \"domain-specific\" EditorConfig properties" tar ((:commit . "e9824160fb2e466afa755240ee3ab7cc5657fb04") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "editorconfig" "util") (:url . "https://github.com/lassik/editorconfig-emacs-domain-specific"))]) (editorconfig-generate . [(20190513 433) ((emacs (24))) "Generate .editorconfig" tar ((:commit . "47a31f928f46d2a0188db8e2cffa5d6354a81573") (:authors ("10sr" . "8.slashes@gmail.com")) (:maintainers ("10sr" . "8.slashes@gmail.com")) (:maintainer "10sr" . "8.slashes@gmail.com") (:keywords "tools") (:url . "https://github.com/10sr/editorconfig-generate-el"))]) (edn . [(20160215 1219) ((cl-lib (0 3)) (emacs (24 1)) (peg (0 6))) "Support for reading and writing the edn data format from elisp" tar ((:commit . "be9e32d1b49e35247b263b0243df7cfdc8d413ab") (:authors ("Lars Andersen" . "expez@expez.com")) (:maintainers ("Lars Andersen" . "expez@expez.com")) (:maintainer "Lars Andersen" . "expez@expez.com") (:keywords "edn" "clojure") (:url . "https://www.github.com/expez/edn.el"))]) - (ednc . [(20230604 1643) ((emacs (26 1))) "Emacs Desktop Notification Center" tar ((:commit . "6fdb2da558049ad7978ffac40012ff1e1b2249a6") (:authors ("Simon Nicolussi" . "sinic@sinic.name")) (:maintainers ("Simon Nicolussi" . "sinic@sinic.name")) (:maintainer "Simon Nicolussi" . "sinic@sinic.name") (:keywords "unix") (:url . "https://github.com/sinic/ednc"))]) - (edts . [(20220521 1345) ((auto-complete (20201213 1255)) (auto-highlight-symbol (20211106 638)) (dash (20210609 1330)) (emacs (24 3)) (erlang (20210315 1640)) (f (20191110 1357)) (popup (20210317 138)) (s (20210603 736))) "Erlang Development Tool Suite" tar ((:commit . "77e0dc91f603e8bedebfdccc90352ebbfd217c99"))]) + (ednc . [(20240209 2028) ((emacs (26 1))) "Emacs Desktop Notification Center" tar ((:commit . "2580ada68ecc93aa693c61f997c9cf581698242e") (:authors ("Simon Nicolussi" . "sinic@sinic.name")) (:maintainers ("Simon Nicolussi" . "sinic@sinic.name")) (:maintainer "Simon Nicolussi" . "sinic@sinic.name") (:keywords "unix") (:url . "https://github.com/sinic/ednc"))]) + (edts . [(20230926 2146) ((auto-complete (20201213 1255)) (auto-highlight-symbol (20211106 638)) (dash (20210609 1330)) (emacs (24 3)) (erlang (20210315 1640)) (f (20191110 1357)) (popup (20210317 138)) (s (20210603 736))) "Erlang Development Tool Suite" tar ((:commit . "5c3cded3fab56baa60874f4e1efd14155cec587f"))]) (edwina . [(20221206 1610) ((emacs (25))) "Dynamic window manager" tar ((:commit . "f95c31b1de95df7e83338a5d4daf3363df325862") (:authors ("Alex Griffin" . "a@ajgrf.com")) (:maintainers ("Alex Griffin" . "a@ajgrf.com")) (:maintainer "Alex Griffin" . "a@ajgrf.com") (:keywords "convenience") (:url . "https://gitlab.com/ajgrf/edwina"))]) (efar . [(20230216 1213) ((emacs (26 1))) "FAR-like file manager" tar ((:commit . "78618a6cd9fe7d46c3728db3589d1fe50f7c1c6b") (:authors ("\"Vladimir Suntsov\"" . "vladimir@suntsov.online")) (:maintainers (nil . "vladimir@suntsov.online")) (:maintainer nil . "vladimir@suntsov.online") (:keywords "files") (:url . "https://github.com/suntsov/efar"))]) - (eff . [(20230613 958) ((emacs (28))) "Show symbols in Executable File Formats" tar ((:commit . "3ad6a3f3886c532149f9a1c8c740ab95940ab63b") (:keywords "elf" "readelf" "convenience") (:url . "https://github.com/oxidase/eff"))]) + (eff . [(20240108 658) ((emacs (28))) "Show symbols in Executable File Formats" tar ((:commit . "b8ce5d82dc2ef4df912b2b0cbe79e20b455ebd84") (:keywords "elf" "readelf" "convenience") (:url . "https://github.com/oxidase/eff"))]) (efire . [(20151009 2031) ((circe (1 2))) "Use campfire from Emacs" tar ((:commit . "d38dd6dd7974b7cb11bff6fd84846fd01163211a") (:authors ("João Távora" . "joaotavora@gmail.com")) (:maintainers ("João Távora" . "joaotavora@gmail.com")) (:maintainer "João Távora" . "joaotavora@gmail.com") (:keywords "convenience" "tools") (:url . "https://github.com/capitaomorte/efire"))]) (eg . [(20170830 815) ((cl-lib (0 5)) (emacs (24 3))) "Norton Guide reader" tar ((:commit . "1c7f1613d2aaae728ef540305f6ba030616f86bd") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainers ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:keywords "docs") (:url . "https://github.com/davep/eg.el"))]) (egalgo . [(20211105 1657) ((emacs (24 3))) "Genetic algorithm" tar ((:commit . "a56a86591351d53ca2add7c651757bfb0064fb22") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainers ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com") (:keywords "data") (:url . "https://github.com/ROCKTAKEY/egalgo"))]) @@ -1196,17 +1236,18 @@ (egg-timer . [(20200217 1650) ((emacs (25 1))) "Commonly used intervals for setting timers while working" tar ((:commit . "53a9e9d20453ea4b0198ca413b8b5069a0b30b38") (:authors ("William Carroll" . "wpcarro@gmail.com")) (:maintainers ("William Carroll" . "wpcarro@gmail.com")) (:maintainer "William Carroll" . "wpcarro@gmail.com") (:url . "https://github.com/wpcarro/egg-timer.el"))]) (egison-mode . [(20211218 1115) nil "Egison editing mode" tar ((:commit . "dbb395b41a4e4eb69f3f045cbfbe95a1575ac45b") (:authors ("Satoshi Egi" . "egisatoshi@gmail.com")) (:maintainers ("Satoshi Egi" . "egisatoshi@gmail.com")) (:maintainer "Satoshi Egi" . "egisatoshi@gmail.com") (:url . "https://github.com/egisatoshi/egison3/blob/master/elisp/egison-mode.el"))]) (eglot-fsharp . [(20230324 1942) ((emacs (27 1)) (eglot (1 4)) (fsharp-mode (1 10)) (jsonrpc (1 0 14))) "fsharp-mode eglot integration" tar ((:commit . "0ce19f272949f9ed335ab7a9fd9454c01f07eb8f") (:authors ("Jürgen Hötzel" . "juergen@hoetzel.info")) (:maintainers ("Jürgen Hötzel" . "juergen@hoetzel.info")) (:maintainer "Jürgen Hötzel" . "juergen@hoetzel.info") (:keywords "languages") (:url . "https://github.com/fsharp/emacs-fsharp-mode"))]) - (eglot-java . [(20230213 218) ((emacs (26 1)) (eglot (1 0)) (jsonrpc (1 0 0))) "Java extension for the eglot LSP client" tar ((:commit . "ff0f9515d78f94b8dfe158bf9a2c4f52216504c0") (:authors ("Yves Zoundi" . "yves_zoundi@hotmail.com")) (:maintainers ("Yves Zoundi" . "yves_zoundi@hotmail.com")) (:maintainer "Yves Zoundi" . "yves_zoundi@hotmail.com") (:keywords "convenience" "languages") (:url . "https://github.com/yveszoundi/eglot-java"))]) - (eglot-jl . [(20230601 1335) ((emacs (25 1)) (eglot (1 4)) (project (0 8 1)) (cl-generic (1 0))) "Julia support for eglot" tar ((:commit . "7dc604fe42a459a987853d065cd6d0f3c4cbc02a") (:authors ("Adam Beckmeyer" . "adam_git@thebeckmeyers.xyz")) (:maintainers ("Adam Beckmeyer" . "adam_git@thebeckmeyers.xyz")) (:maintainer "Adam Beckmeyer" . "adam_git@thebeckmeyers.xyz") (:keywords "convenience" "languages") (:url . "https://github.com/non-Jedi/eglot-jl"))]) + (eglot-java . [(20240305 950) ((emacs (26 1)) (eglot (1 0)) (jsonrpc (1 0 0))) "Java extension for the eglot LSP client" tar ((:commit . "50bcfb590a0f1077bace9215885cd0cad23d59e7") (:authors ("Yves Zoundi" . "yves_zoundi@hotmail.com")) (:maintainers ("Yves Zoundi" . "yves_zoundi@hotmail.com")) (:maintainer "Yves Zoundi" . "yves_zoundi@hotmail.com") (:keywords "convenience" "languages") (:url . "https://github.com/yveszoundi/eglot-java"))]) + (eglot-jl . [(20240318 1159) ((emacs (25 1)) (eglot (1 4)) (project (0 8 1)) (cl-generic (1 0))) "Julia support for eglot" tar ((:commit . "1d9cab682380f37ca1e9e9933cda13164600706d") (:authors ("Adam Beckmeyer" . "adam_git@thebeckmeyers.xyz")) (:maintainers ("Adam Beckmeyer" . "adam_git@thebeckmeyers.xyz")) (:maintainer "Adam Beckmeyer" . "adam_git@thebeckmeyers.xyz") (:keywords "convenience" "languages") (:url . "https://github.com/non-Jedi/eglot-jl"))]) + (eglot-signature-eldoc-talkative . [(20240209 2034) ((emacs (29 1)) (eglot (1 16)) (eldoc (1 14 0)) (jsonrpc (1 0 23))) "Make Eglot make ElDoc echo docs" tar ((:commit . "b6604648a2ea5d260fa315ffbaebebbf3872343a") (:authors ("João Távora" . "joaotavora@gmail.com") ("Mekeor Melire" . "mekeor@posteo.de")) (:maintainers ("Mekeor Melire" . "mekeor@posteo.de")) (:maintainer "Mekeor Melire" . "mekeor@posteo.de") (:keywords "convenience" "documentation" "eglot" "eldoc" "languages" "lsp") (:url . "https://codeberg.org/mekeor/emacs-eglot-signature-eldoc-talkative"))]) (eglot-tempel . [(20230626 1004) ((eglot (1 9)) (tempel (0 5)) (emacs (24 4))) "Use eglot as inline template expander" tar ((:commit . "70fee6ac33df7a6c5cce967005766b6702a9e9a5") (:authors ("Jeff Walsh" . "fejfighter@gmail.com")) (:maintainers ("Jeff Walsh" . "fejfighter@gmail.com")) (:maintainer "Jeff Walsh" . "fejfighter@gmail.com") (:keywords "convenience" "languages" "tools") (:url . "https://github.com/fejfighter/eglot-tempel"))]) (ego . [(20200803 1101) ((emacs (24 5)) (ht (1 5)) (mustache (0 22)) (htmlize (1 47)) (org (8 0)) (dash (2 0 0))) "a static site generator based on org mode, forked from org-page." tar ((:commit . "211c4cb2af2582849d9df984fb2346deecaf79be") (:authors ("Feng Shu ") ("Kelvin Hu ") ("Kuangdash ")) (:maintainer "Feng Shu ") (:keywords "org-mode" "convenience" "beautify") (:url . "https://github.com/emacs-china/EGO"))]) - (eide . [(20230525 651) nil "IDE interface" tar ((:commit . "8cabc6d77b41bf0c9982ab56530c088d980bc353") (:authors ("Cédric Marie" . "cedric@hjuvi.fr.eu.org")) (:maintainer "Cédric Marie" . "cedric@hjuvi.fr.eu.org") (:url . "https://software.hjuvi.fr.eu.org/eide/"))]) + (eide . [(20240122 1953) ((emacs (26 1))) "IDE interface" tar ((:commit . "d497539f00c33e3bee85d0f4b8ca367672fa2219") (:authors ("Cédric Marie" . "cedric@hjuvi.fr.eu.org")) (:maintainer "Cédric Marie" . "cedric@hjuvi.fr.eu.org") (:url . "https://software.hjuvi.fr.eu.org/eide/"))]) (eimp . [(20120826 2039) nil "Emacs Image Manipulation Package" tar ((:commit . "2e7536fe6d8f7faf1bad7a8ae37faba0162c3b4f") (:authors ("Matthew P. Hodges" . "MPHodges@member.fsf.org")) (:maintainers ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:keywords "files" "frames"))]) (ein . [(20230827 325) ((emacs (26 1)) (websocket (1 12)) (anaphora (1 0 4)) (request (0 3 3)) (deferred (0 5)) (polymode (0 2 2)) (dash (2 13 0)) (with-editor (0 -1))) "jupyter notebook client" tar ((:commit . "ac92eb92eac35a9542485969487e43f5318825a1") (:keywords "jupyter" "literate programming" "reproducible research") (:url . "https://github.com/dickmao/emacs-ipython-notebook"))]) (eink-theme . [(20190219 858) nil "E Ink color theme" tar ((:commit . "326b07523dcb076d6209cdbc7fdbb73df296dbdb") (:authors ("Marian Schubert" . "marian.schubert@gmail.com")) (:maintainers ("Marian Schubert" . "marian.schubert@gmail.com")) (:maintainer "Marian Schubert" . "marian.schubert@gmail.com") (:url . "http://github.com/maio/eink-emacs"))]) - (ejc-sql . [(20230822 1534) ((emacs (26 3)) (clomacs (0 0 5)) (dash (2 16 0)) (spinner (1 7 3))) "Emacs SQL client uses Clojure JDBC." tar ((:commit . "c99a257c18dbcca02a63172b4f1c2a947c908d8e") (:authors ("Kostafey" . "kostafey@gmail.com")) (:maintainers ("Kostafey" . "kostafey@gmail.com")) (:maintainer "Kostafey" . "kostafey@gmail.com") (:keywords "sql" "jdbc") (:url . "https://github.com/kostafey/ejc-sql"))]) + (ejc-sql . [(20240106 1848) ((emacs (26 3)) (clomacs (0 0 5)) (dash (2 16 0)) (spinner (1 7 3))) "Emacs SQL client uses Clojure JDBC." tar ((:commit . "b80b773238719fa7160e598219f300dfbc4db06d") (:authors ("Kostafey" . "kostafey@gmail.com")) (:maintainers ("Kostafey" . "kostafey@gmail.com")) (:maintainer "Kostafey" . "kostafey@gmail.com") (:keywords "sql" "jdbc") (:url . "https://github.com/kostafey/ejc-sql"))]) (ejson-mode . [(20190720 2138) ((emacs (25))) "Major mode for editing ejson files." tar ((:commit . "9630dfac9549779711dbe89e621f516bb4b3a354") (:authors ("Dante Catalfamo")) (:maintainers ("Dante Catalfamo")) (:maintainer "Dante Catalfamo") (:keywords "convenience" "languages" "tools") (:url . "https://github.com/dantecatalfamo/ejson-mode"))]) - (ekg . [(20230810 316) ((triples (0 3 5)) (emacs (28 1))) "A system for recording and linking information" tar ((:commit . "c668d397add6b84a7e35dfae04cdfb2be451f032") (:authors ("Andrew Hyatt" . "ahyatt@gmail.com")) (:maintainers ("Andrew Hyatt" . "ahyatt@gmail.com")) (:maintainer "Andrew Hyatt" . "ahyatt@gmail.com") (:keywords "outlines" "hypermedia") (:url . "https://github.com/ahyatt/ekg"))]) + (ekg . [(20240320 242) ((triples (0 3 5)) (emacs (28 1)) (llm (0 4 0))) "A system for recording and linking information" tar ((:commit . "8f050a65837d6d3ec4ea3ba7539541518d061539") (:authors ("Andrew Hyatt" . "ahyatt@gmail.com")) (:maintainers ("Andrew Hyatt" . "ahyatt@gmail.com")) (:maintainer "Andrew Hyatt" . "ahyatt@gmail.com") (:keywords "outlines" "hypermedia") (:url . "https://github.com/ahyatt/ekg"))]) (el-autoyas . [(20120918 1317) nil "Automatically create Emacs-Lisp Yasnippets" tar ((:commit . "bde0251ecb504f585dfa27c205c8e312655310cc") (:authors ("Matthew L. Fidler")) (:maintainers ("Matthew L. Fidler")) (:maintainer "Matthew L. Fidler") (:keywords "emacs" "lisp" "mode" "yasnippet") (:url . "https://github.com/mlf176f2/el-autoyas.el"))]) (el-fetch . [(20230624 2) ((emacs (25 1))) "Show system information in Neofetch-like style (eg CPU, RAM)" tar ((:commit . "7907fd7829ca55b21a62d23c17066fdfde9cd07c") (:authors ("Maciej Barć" . "xgqt@riseup.net")) (:maintainers ("Maciej Barć" . "xgqt@riseup.net")) (:maintainer "Maciej Barć" . "xgqt@riseup.net") (:keywords "games") (:url . "https://gitlab.com/xgqt/emacs-el-fetch"))]) (el-fly-indent-mode . [(20180422 243) ((emacs (25))) "Indent Emacs Lisp on the fly" tar ((:commit . "1dd4b907ff4d9581c18b4e38e8719e83ba0dace1") (:authors ("Jiahao Li" . "jiahaowork@gmail.com")) (:maintainers ("Jiahao Li" . "jiahaowork@gmail.com")) (:maintainer "Jiahao Li" . "jiahaowork@gmail.com") (:keywords "lisp" "languages") (:url . "https://github.com/jiahaowork/el-fly-indent-mode.el"))]) @@ -1214,7 +1255,7 @@ (el-init . [(20150728 920) ((emacs (24)) (cl-lib (0 5)) (anaphora (1 0 0))) "A loader inspired by init-loader" tar ((:commit . "25fd21d820bca1cf576b8f70c8d5a3bc76792597") (:authors ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainers ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainer "Hiroki YAMAKAWA" . "s06139@gmail.com") (:url . "https://github.com/HKey/el-init"))]) (el-init-viewer . [(20150303 828) ((emacs (24)) (cl-lib (0 5)) (ctable (0 1 2)) (dash (2 10 0)) (anaphora (1 0 0)) (el-init (0 1 4))) "Record viewer for el-init" tar ((:commit . "c40417db7808c8b8c9b2f196a69de5da7eee84a2") (:authors ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainers ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainer "Hiroki YAMAKAWA" . "s06139@gmail.com") (:url . "https://github.com/HKey/el-init-viewer"))]) (el-mock . [(20220625 1949) nil "Tiny Mock and Stub framework in Emacs Lisp" tar ((:commit . "6cfbc9de8f1927295dca6864907fe4156bd71910") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:keywords "lisp" "testing" "unittest") (:url . "http://github.com/rejeep/el-mock.el"))]) - (el-patch . [(20230409 2156) ((emacs (26))) "Future-proof your Elisp" tar ((:commit . "7dfbd374f9de256de03516d777146e7f8aba1cef") (:authors ("Radian LLC" . "contact+el-patch@radian.codes")) (:maintainers ("Radian LLC" . "contact+el-patch@radian.codes")) (:maintainer "Radian LLC" . "contact+el-patch@radian.codes") (:keywords "extensions") (:url . "https://github.com/radian-software/el-patch"))]) + (el-patch . [(20231123 2216) ((emacs (26))) "Future-proof your Elisp" tar ((:commit . "92803e7ea6e07cd56667ed7ea0dfacfc1f37f6d9") (:authors ("Radian LLC" . "contact+el-patch@radian.codes")) (:maintainers ("Radian LLC" . "contact+el-patch@radian.codes")) (:maintainer "Radian LLC" . "contact+el-patch@radian.codes") (:keywords "extensions") (:url . "https://github.com/radian-software/el-patch"))]) (el-secretario . [(20220426 1905) ((emacs (27 1)) (org-ql (0 6 -1)) (hercules (0 3))) "Unify all your inboxes with the Emacs secretary" tar ((:commit . "575396ca689065188ad0f90c379d9bcf7ff6fc0b") (:authors ("Leo Okawa Ericson ")) (:maintainers ("Leo" . "github@relevant-information.com")) (:maintainer "Leo" . "github@relevant-information.com") (:keywords "convenience") (:url . "https://git.sr.ht/~zetagon/el-secretario"))]) (el-secretario-elfeed . [(20211214 1851) ((emacs (27 1)) (el-secretario (0 0 1)) (elfeed (3 4 1))) "Add notmuch email inboxes to el-secretario" tar ((:commit . "2a5290ad57d9800d4b56896a768e37631bef06b0") (:authors ("Leo Okawa Ericson ")) (:maintainers ("Leo" . "github@relevant-information.com")) (:maintainer "Leo" . "github@relevant-information.com") (:keywords "convenience") (:url . "https://git.sr.ht/~zetagon/el-secretario"))]) (el-secretario-mu4e . [(20220422 2006) ((emacs (27 1)) (org-ql (0 6 -1)) (el-secretario (0 0 1))) "Add mu4e inboxes to el-secretario" tar ((:commit . "78a811f02c7104a39b908f9e4c8436abde4b9620") (:authors ("Leo Okawa Ericson ")) (:maintainers ("Leo" . "github@relevant-information.com")) (:maintainer "Leo" . "github@relevant-information.com") (:keywords "convenience" "mail") (:url . "https://git.sr.ht/~zetagon/el-secretario"))]) @@ -1228,19 +1269,20 @@ (el2org . [(20200408 146) ((emacs (25 1))) "Convert elisp file to org file" tar ((:commit . "7db77fdd73f378d4e60e34c11bbdf00677adc32c") (:authors ("Feng Shu " . "tumashu@163.com")) (:maintainers ("Feng Shu " . "tumashu@163.com")) (:maintainer "Feng Shu " . "tumashu@163.com") (:keywords "convenience") (:url . "https://github.com/tumashu/el2org"))]) (elbank . [(20180316 1343) ((emacs (25)) (seq (2 16))) "Personal finances reporting application" tar ((:commit . "6dbd21e31fdf7cf62491f6d24b8198d4f91a031b") (:authors ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainers ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr") (:keywords "tools" "personal-finances"))]) (elcontext . [(20210109 1238) ((ht (2 3)) (hydra (0 14 0)) (emacs (24 3)) (f (0 20 0)) (osx-location (0 4)) (uuidgen (0 3))) "Create context specific actions" tar ((:commit . "2efd3dd8c5176c4f071bb048be6cb069b05d6e9e") (:authors ("Thomas Sojka")) (:maintainers ("Thomas Sojka")) (:maintainer "Thomas Sojka") (:keywords "calendar" "convenience") (:url . "https://github.com/rollacaster/elcontext"))]) - (elcord . [(20230627 1213) ((emacs (25 1))) "Allows you to integrate Rich Presence from Discord" tar ((:commit . "bb12802f1f1e34345c600f69111c1a53bf98185e") (:authors ("heatingdevice") ("Wilfredo Velázquez-Rodríguez" . "zulu.inuoe@gmail.com")) (:maintainers ("heatingdevice")) (:maintainer "heatingdevice") (:keywords "games") (:url . "https://github.com/Mstrodl/elcord"))]) - (elcouch . [(20201108 955) ((emacs (25 1)) (json-mode (1 0 0)) (libelcouch (0 11 0)) (navigel (0 3 0))) "View and manipulate CouchDB databases" tar ((:commit . "3d162dda14411349e12509029d2b621c5d1edea2") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:keywords "data" "tools") (:url . "https://gitlab.petton.fr/DamienCassou/elcouch"))]) - (eldev . [(20230829 1903) ((emacs (24 4))) "Elisp development tool" tar ((:commit . "08db5ae31b1d4bf12a6d62b6d49a6fbd245d3d3e") (:authors ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainers ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainer "Paul Pogonyshev" . "pogonyshev@gmail.com") (:keywords "maint" "tools") (:url . "https://github.com/emacs-eldev/eldev"))]) - (eldoc-box . [(20230810 503) ((emacs (27 1))) "Display documentation in childframe" tar ((:commit . "73345daa47a5612f298896e5eb044e10a79496e7") (:authors ("Yuan Fu" . "casouri@gmail.com")) (:maintainers ("Yuan Fu" . "casouri@gmail.com")) (:maintainer "Yuan Fu" . "casouri@gmail.com") (:url . "https://github.com/casouri/eldoc-box"))]) + (elcord . [(20240305 2138) ((emacs (25 1))) "Allows you to integrate Rich Presence from Discord" tar ((:commit . "e2775f40ec55dfdceea83d535dff77d60534b6bc") (:authors ("heatingdevice") ("Wilfredo Velázquez-Rodríguez" . "zulu.inuoe@gmail.com")) (:maintainers ("heatingdevice")) (:maintainer "heatingdevice") (:keywords "games") (:url . "https://github.com/Mstrodl/elcord"))]) + (elcouch . [(20230903 750) ((emacs (25 1)) (json-mode (1 0 0)) (libelcouch (0 11 0)) (navigel (0 3 0))) "View and manipulate CouchDB databases" tar ((:commit . "a426e9bee9501284f4e1e84766621ca6b130c79a") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:keywords "data" "tools") (:url . "https://gitlab.petton.fr/DamienCassou/elcouch"))]) + (eldev . [(20240317 1521) ((emacs (24 4))) "Elisp development tool" tar ((:commit . "76b08f798c94e2c6f107cd1fec9fb8aa02b5aa5b") (:authors ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainers ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainer "Paul Pogonyshev" . "pogonyshev@gmail.com") (:keywords "maint" "tools") (:url . "https://github.com/emacs-eldev/eldev"))]) + (eldoc-box . [(20231115 519) ((emacs (27 1))) "Display documentation in childframe" tar ((:commit . "c36f31074b09930e8425963f39d5508da6d2c32d") (:authors ("Yuan Fu" . "casouri@gmail.com")) (:maintainers ("Yuan Fu" . "casouri@gmail.com")) (:maintainer "Yuan Fu" . "casouri@gmail.com") (:url . "https://github.com/casouri/eldoc-box"))]) (eldoc-cmake . [(20190419 2244) ((emacs (25 1))) "Eldoc support for CMake" tar ((:commit . "4453c03b5c95ff32842f13db2fc317fb0fe2f79e") (:authors ("Kirill Ignatiev")) (:maintainers ("Kirill Ignatiev")) (:maintainer "Kirill Ignatiev") (:url . "https://github.com/ikirill/eldoc-cmake"))]) + (eldoc-eask . [(20240101 819) ((emacs (26 1)) (eask (0 1 0))) "Eldoc support for Eask-file" tar ((:commit . "ade0f239814f3b8bc77229e903d2c4b806ded90a") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience") (:url . "https://github.com/emacs-eask/eldoc-eask"))]) (eldoc-eval . [(20220106 1951) nil "Enable eldoc support when minibuffer is in use." tar ((:commit . "e91800503c90cb75dc70abe42f1d6ae499346cc1") (:authors ("Thierry Volpiatto" . "thievol@posteo.net")) (:maintainers ("Thierry Volpiatto" . "thievol@posteo.net")) (:maintainer "Thierry Volpiatto" . "thievol@posteo.net"))]) (eldoc-overlay . [(20230406 959) ((emacs (24 4)) (inline-docs (1 0 1)) (quick-peek (1 0))) "Display eldoc with contextual documentation overlay" tar ((:commit . "14a9e141918c2e18a107920e8631e622c580b3ef") (:authors ("stardiviner" . "numbchild@gmail.com")) (:maintainers ("stardiviner" . "numbchild@gmail.com")) (:maintainer "stardiviner" . "numbchild@gmail.com") (:keywords "docs" "eldoc" "overlay") (:url . "https://repo.or.cz/eldoc-overlay.git"))]) (eldoc-stan . [(20211129 2051) ((emacs (25)) (stan-mode (10 3 0))) "Eldoc support for stan functions" tar ((:commit . "150bbbe5fd3ad2b5a3dbfba9d291e66eeea1a581") (:authors ("Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu")) (:maintainers ("Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu")) (:maintainer "Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu") (:keywords "help" "tools") (:url . "https://github.com/stan-dev/stan-mode/tree/master/eldoc-stan"))]) (eldoc-toml . [(20211026 1122) ((emacs (24 4))) "TOML table name at point for ElDoc" tar ((:commit . "61106be3c3f3a5b293c3f285eec8c6f400142b6d") (:authors ("Maor Kadosh" . "git@avocadosh.xyz")) (:maintainers ("Maor Kadosh" . "git@avocadosh.xyz")) (:maintainer "Maor Kadosh" . "git@avocadosh.xyz") (:keywords "data") (:url . "https://github.com/it-is-wednesday/eldoc-toml"))]) (electric-case . [(20150417 1112) nil "insert camelCase, snake_case words without \"Shift\"ing" tar ((:commit . "984b6a4c6c4cdcefeecb59e941f5f184cc1dedff") (:authors ("zk_phi")) (:maintainers ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))]) (electric-cursor . [(20221221 438) ((emacs (25 1))) "Change cursor automatically depending on mode" tar ((:commit . "bc09aa8c5d3cc32e3e6452cbf8018fc1ea772b73") (:authors ("Case Duckworth" . "acdw@acdw.net")) (:maintainers ("Case Duckworth" . "acdw@acdw.net")) (:maintainer "Case Duckworth" . "acdw@acdw.net") (:keywords "terminals" "frames") (:url . "https://github.com/duckwork/electric-cursor"))]) - (electric-operator . [(20230828 801) ((dash (2 10 0)) (emacs (24 4))) "Automatically add spaces around operators" tar ((:commit . "cb21b85b43255f9c1681995e7e36912e7f4e17b3") (:authors ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainers ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainer "David Shepherd" . "davidshepherd7@gmail.com") (:keywords "electric") (:url . "https://github.com/davidshepherd7/electric-operator"))]) - (electric-ospl . [(20230719 1531) ((emacs (26 1))) "Electric OSPL Mode" tar ((:commit . "8bf02159c2658a08198b2765ee979e930378956c") (:authors ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainers ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainer "Samuel W. Flint" . "swflint@flintfam.org") (:keywords "convenience" "text") (:url . "https://git.sr.ht/~swflint/electric-ospl-mode"))]) + (electric-operator . [(20231014 1107) ((dash (2 10 0)) (emacs (24 4))) "Automatically add spaces around operators" tar ((:commit . "18e555a5cdfd7264c179f810d7fd4c71a80b715a") (:authors ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainers ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainer "David Shepherd" . "davidshepherd7@gmail.com") (:keywords "electric") (:url . "https://github.com/davidshepherd7/electric-operator"))]) + (electric-ospl . [(20240319 1842) ((emacs (26 1))) "Electric OSPL Mode" tar ((:commit . "e5283062fdf66aa2d664059b307839bf94413055") (:authors ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainers ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainer "Samuel W. Flint" . "swflint@flintfam.org") (:keywords "convenience" "text") (:url . "https://git.sr.ht/~swflint/electric-ospl-mode"))]) (electric-spacing . [(20220220 1540) nil "Insert operators with surrounding spaces smartly" tar ((:commit . "c37b2502512dd49a8311d7c34e9bfd1af3d4dbcd") (:authors ("William Xu" . "william.xwl@gmail.com")) (:maintainers ("William Xu" . "william.xwl@gmail.com")) (:maintainer "William Xu" . "william.xwl@gmail.com"))]) (elegant-agenda-mode . [(20210115 353) ((emacs (26 1))) "An elegant theme for your org-agenda" tar ((:commit . "5cbc688584ba103ea3be7d7b30e5d94e52f59eb6") (:authors ("Justin Barclay" . "justinbarclay@gmail.com")) (:maintainers ("Justin Barclay" . "justinbarclay@gmail.com")) (:maintainer "Justin Barclay" . "justinbarclay@gmail.com") (:keywords "faces") (:url . "https://github.com/justinbarclay/elegant-agenda-mode"))]) (elein . [(20120120 1116) nil "running leiningen commands from emacs" tar ((:commit . "d4c0c0491dbb7c90e953d7a16172107c37103605") (:authors ("R.W. van 't Veer")) (:maintainers ("R.W. van 't Veer")) (:maintainer "R.W. van 't Veer") (:keywords "tools" "processes") (:url . "https://github.com/remvee/elein"))]) @@ -1248,51 +1290,54 @@ (elf-mode . [(20161009 748) ((emacs (24 3))) "Show symbols in binaries" tar ((:commit . "cd280d683cd3341d8bb31af6db7e3b74a133e6ab") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "matching") (:url . "https://github.com/abo-abo/elf-mode"))]) (elfeed . [(20221108 755) ((emacs (24 3))) "an Emacs Atom/RSS feed reader" tar ((:commit . "55fb162fa27e71b88effa59a83c57842e262b00f") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/elfeed"))]) (elfeed-autotag . [(20210607 637) ((emacs (27 1)) (elfeed (3 4 1)) (elfeed-protocol (0 8 0)) (org (8 2 7)) (dash (2 10 0)) (s (1 9 0))) "Easy auto-tagging for elfeed" tar ((:commit . "bc62c37fb79b720ff8b6d67f04f2268841306dcd") (:authors ("Paul Elms ")) (:maintainers ("Paul Elms" . "paul@elms.pro")) (:maintainer "Paul Elms" . "paul@elms.pro") (:keywords "news") (:url . "https://github.com/paulelms/elfeed-autotag"))]) + (elfeed-curate . [(20231119 32) ((emacs (25 1)) (elfeed (3 4 1))) "Elfeed entry curation" tar ((:commit . "195ee944a1dd95380c680d886e15a8aadab50b8e") (:authors ("Robert Nadler" . "robert.nadler@gmail.com")) (:maintainers ("Robert Nadler" . "robert.nadler@gmail.com")) (:maintainer "Robert Nadler" . "robert.nadler@gmail.com") (:keywords "news") (:url . "https://github.com/rnadler/elfeed-curate"))]) (elfeed-dashboard . [(20210727 603) ((emacs (25 1)) (elfeed (3 3 0))) "An extensible frontend for elfeed using org-mode" tar ((:commit . "b143f8453aed2053e8fc6f05cef6233797408546") (:authors ("Manoj Kumar Manikchand" . "manojm321@protonmail.com")) (:maintainers ("Manoj Kumar Manikchand" . "manojm321@protonmail.com")) (:maintainer "Manoj Kumar Manikchand" . "manojm321@protonmail.com") (:keywords "convenience") (:url . "https://github.com/Manoj321/elfeed-dashboard"))]) (elfeed-goodies . [(20221003 1406) ((popwin (1 0 0)) (powerline (2 2)) (elfeed (2 0 0)) (cl-lib (0 5)) (link-hint (0 1))) "Elfeed goodies" tar ((:commit . "544ef42ead011d960a0ad1c1d34df5d222461a6b") (:authors ("Gergely Nagy")) (:maintainers ("Gergely Nagy")) (:maintainer "Gergely Nagy") (:url . "https://github.com/algernon/elfeed-goodies"))]) - (elfeed-org . [(20230824 2034) ((elfeed (1 1 1)) (org (8 2 7)) (cl-lib (0 5))) "Configure elfeed with one or more org-mode files" tar ((:commit . "3438d0748063637dbe121993c7ca4f5f8f3b5a74") (:authors ("Remy Honig" . "remyhonig@gmail.com")) (:maintainers ("Remy Honig" . "remyhonig@gmail.com")) (:maintainer "Remy Honig" . "remyhonig@gmail.com") (:keywords "news") (:url . "https://github.com/remyhonig/elfeed-org"))]) - (elfeed-protocol . [(20230512 950) ((emacs (24 4)) (elfeed (2 1 1)) (cl-lib (0 5))) "Provide fever/newsblur/owncloud/ttrss protocols for elfeed" tar ((:commit . "51983fba76f2287d4f6cbbf3705d1c8fa13ac747") (:authors ("Xu Fasheng ")) (:maintainers ("Xu Fasheng ")) (:maintainer "Xu Fasheng ") (:keywords "news") (:url . "https://github.com/fasheng/elfeed-protocol"))]) + (elfeed-org . [(20231009 1125) ((elfeed (1 1 1)) (org (8 2 7)) (cl-lib (0 5))) "Configure elfeed with one or more org-mode files" tar ((:commit . "fe59a96969bd321f5f9ec7317a4bc80943b94c86") (:authors ("Remy Honig" . "remyhonig@gmail.com")) (:maintainers ("Remy Honig" . "remyhonig@gmail.com")) (:maintainer "Remy Honig" . "remyhonig@gmail.com") (:keywords "news") (:url . "https://github.com/remyhonig/elfeed-org"))]) + (elfeed-protocol . [(20231007 1535) ((emacs (24 4)) (elfeed (2 1 1)) (cl-lib (0 5))) "Provide fever/newsblur/owncloud/ttrss protocols for elfeed" tar ((:commit . "bcefb85a1d4075f36e73a94bda569e71f28a52c2") (:authors ("Xu Fasheng ")) (:maintainers ("Xu Fasheng ")) (:maintainer "Xu Fasheng ") (:keywords "news") (:url . "https://github.com/fasheng/elfeed-protocol"))]) (elfeed-score . [(20230728 1433) ((emacs (26 1)) (elfeed (3 3 0))) "Gnus-style scoring for Elfeed" tar ((:commit . "cc1a05a95bff953eb28151056ce3ce14ba3e901d") (:authors ("Michael Herstine" . "sp1ff@pobox.com")) (:maintainer "Michael Herstine" . "sp1ff@pobox.com") (:keywords "news") (:url . "https://github.com/sp1ff/elfeed-score"))]) - (elfeed-summary . [(20230823 925) ((emacs (27 1)) (magit-section (3 3 0)) (elfeed (3 4 1))) "Feed summary interface for elfeed" tar ((:commit . "6bad19a7d4b2375233cd3ff571e2e6ed55d457b2") (:authors ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainers ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainer "Korytov Pavel" . "thexcloud@gmail.com") (:url . "https://github.com/SqrtMinusOne/elfeed-summary.el"))]) - (elfeed-tube . [(20230627 1930) ((emacs (27 1)) (elfeed (3 4 1)) (aio (1 0))) "YouTube integration for Elfeed" tar ((:commit . "3f801e340ee92e4850486fea5f08bcbdbc89254c") (:authors ("Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com")) (:maintainers ("Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com")) (:maintainer "Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com") (:keywords "news" "hypermedia" "convenience") (:url . "https://github.com/karthink/elfeed-tube"))]) + (elfeed-summary . [(20231231 1456) ((emacs (27 1)) (magit-section (3 3 0)) (elfeed (3 4 1))) "Feed summary interface for elfeed" tar ((:commit . "7e308adaa351f8c7f6ba839cbcfd4e3cd145401c") (:authors ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainers ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainer "Korytov Pavel" . "thexcloud@gmail.com") (:url . "https://github.com/SqrtMinusOne/elfeed-summary.el"))]) + (elfeed-tube . [(20240123 1825) ((emacs (27 1)) (elfeed (3 4 1)) (aio (1 0))) "YouTube integration for Elfeed" tar ((:commit . "92c66d6adcebe0588ccf811616decf7ef8a8ac65") (:authors ("Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com")) (:maintainers ("Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com")) (:maintainer "Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com") (:keywords "news" "hypermedia" "convenience") (:url . "https://github.com/karthink/elfeed-tube"))]) (elfeed-tube-mpv . [(20230607 717) ((emacs (27 1)) (elfeed-tube (0 10)) (mpv (0 2 0))) "Control mpv from Elfeed" tar ((:commit . "6d5a24cfd0655068afd364cded5521a4550a8adb") (:authors ("Karthik Chikmagalur" . "karthikchikmagalur@gmail.com")) (:maintainers ("Karthik Chikmagalur" . "karthikchikmagalur@gmail.com")) (:maintainer "Karthik Chikmagalur" . "karthikchikmagalur@gmail.com") (:keywords "news" "hypermedia") (:url . "https://github.com/karthink/elfeed-tube"))]) (elfeed-web . [(20210226 258) ((simple-httpd (1 5 1)) (elfeed (3 2 0)) (emacs (24 3))) "web interface to Elfeed" tar ((:commit . "0ccd59aaace34546017a1a0d7c393749747d5bc6") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/elfeed"))]) (elfeed-webkit . [(20230604 2111) ((emacs (26 1)) (elfeed (3 4 1))) "Render elfeed entries in embedded webkit widgets" tar ((:commit . "db7ee83f9c0e67f01960b1e0489717cf7a8fd2c2") (:authors ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainers ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainer "Fritz Grabo" . "hello@fritzgrabo.com") (:keywords "comm") (:url . "https://github.com/fritzgrabo/elfeed-webkit"))]) (elforth . [(20210522 928) ((emacs (26 1))) "Do you have what it takes to hack Emacs Lisp in Forth?" tar ((:commit . "2d8540434a28e7edaa04a992c3c362832b2fd61e") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "games") (:url . "https://github.com/lassik/elforth"))]) (elgrep . [(20230814 1215) ((emacs (26 2)) (async (1 5))) "Searching files for regular expressions" tar ((:commit . "329eaf2e9e994e5535c7f7fe2685ec21d8323384") (:authors ("Tobias Zawada" . "i@tn-home.de")) (:maintainers ("Tobias Zawada" . "i@tn-home.de")) (:maintainer "Tobias Zawada" . "i@tn-home.de") (:keywords "tools" "matching" "files" "unix") (:url . "https://github.com/TobiasZawada/elgrep"))]) (elhome . [(20161025 2042) ((initsplit (20120630))) "A framework for a \"home\" Emacs configuration" tar ((:commit . "e789e806469af3e9705f72298683c21f6c3a516d") (:authors ("Dave Abrahams" . "dave@boostpro.com")) (:maintainers ("Demyan Rogozhin" . "demyan.rogozhin@gmail.com")) (:maintainer "Demyan Rogozhin" . "demyan.rogozhin@gmail.com") (:keywords "lisp") (:url . "http://github.com/demyanrogozhin/elhome"))]) - (elisp-autofmt . [(20230820 648) ((emacs (29 1))) "Emacs lisp auto-format" tar ((:commit . "fb280f362a1ef5015841ac6b97697cba9784d86c") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.org/ideasman42/emacs-elisp-autofmt"))]) - (elisp-def . [(20220803 1647) ((dash (2 12 0)) (f (0 19 0)) (s (1 11 0)) (emacs (24 3))) "macro-aware go-to-definition for elisp" tar ((:commit . "1d2e88a232ec16bce036b49577c4d4d96035f9f7") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:keywords "lisp"))]) - (elisp-demos . [(20230726 2059) ((emacs (24 4))) "Elisp API Demos" tar ((:commit . "8d0cd806b109076e6c4383edf59dbab9435dc5dc") (:authors ("Xu Chunyang")) (:maintainers ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:keywords "lisp" "docs") (:url . "https://github.com/xuchunyang/elisp-demos"))]) + (elisa . [(20240315 1823) ((emacs (29 2)) (ellama (0 8 6)) (llm (0 9 1)) (async (1 9 8))) "Emacs Lisp Information System Assistant" tar ((:commit . "48d96a97163611670d395db72515433c0c41094e") (:authors ("Sergey Kostyaev" . "sskostyaev@gmail.com")) (:maintainers ("Sergey Kostyaev" . "sskostyaev@gmail.com")) (:maintainer "Sergey Kostyaev" . "sskostyaev@gmail.com") (:keywords "help" "local" "tools") (:url . "http://github.com/s-kostyaev/elisa"))]) + (elisp-autofmt . [(20231207 1018) ((emacs (29 1))) "Emacs lisp auto-format" tar ((:commit . "6b280c854f964c303de2f9316f8f955e52893b8d") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.org/ideasman42/emacs-elisp-autofmt"))]) + (elisp-def . [(20230901 2308) ((dash (2 12 0)) (f (0 19 0)) (s (1 11 0)) (emacs (24 3))) "macro-aware go-to-definition for elisp" tar ((:commit . "1ad4baccbf3d0d13e7607d332ae6bc60a5dd7360") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:keywords "lisp"))]) + (elisp-demos . [(20240128 810) ((emacs (26 3))) "Elisp API Demos" tar ((:commit . "1a108d1c5011f9ced58be2ca98bea1fbd4130a2f") (:authors ("Xu Chunyang")) (:maintainers ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:keywords "lisp" "docs") (:url . "https://github.com/xuchunyang/elisp-demos"))]) (elisp-depend . [(20190325 1114) nil "Parse depend libraries of elisp file." tar ((:commit . "6679da9a6be5a845bb4804224c8394a9bc62168f"))]) (elisp-depmap . [(20220223 1131) ((emacs (26 1)) (dash (2 17 0))) "Generate an elisp dependency map in graphviz" tar ((:commit . "15909462e3f7daf445d3cecf402ee16c7e3263ed") (:authors ("Mehmet Tekman")) (:maintainers ("Mehmet Tekman")) (:maintainer "Mehmet Tekman") (:keywords "outlines") (:url . "https://gitlab.com/mtekman/elisp-depmap.el"))]) (elisp-docstring-mode . [(20170304 1615) nil "Major mode for editing elisp docstrings." tar ((:commit . "b135d95b158048927f12184e5cfb8fe01fc44713") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "languages"))]) (elisp-format . [(20160508 952) nil "Format elisp code" tar ((:commit . "9fe516d39b349070537099a01fe34e47fbded2c8") (:authors (nil . "Andy Stewart lazycat.manatee@gmail.com")) (:maintainers ("Yuki Inoue inouetakahiroki _at_ gmail.com")) (:maintainer "Yuki Inoue inouetakahiroki _at_ gmail.com") (:url . "https://github.com/Yuki-Inoue/elisp-format"))]) (elisp-lint . [(20220419 252) ((emacs (24 4)) (dash (2 15 0)) (package-lint (0 11))) "Basic linting for Emacs Lisp" tar ((:commit . "c5765abf75fd1ad22505b349ae1e6be5303426c2") (:authors ("Nikolaj Schumacher ,")) (:maintainers ("Neil Okamoto" . "neil.okamoto+melpa@gmail.com")) (:maintainer "Neil Okamoto" . "neil.okamoto+melpa@gmail.com") (:keywords "lisp" "maint" "tools") (:url . "http://github.com/gonewest818/elisp-lint/"))]) - (elisp-refs . [(20230419 405) ((dash (2 12 0)) (s (1 11 0))) "find callers of elisp functions or macros" tar ((:commit . "bf3cca8f74065b1b31036f461e3a093b162311bd") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:keywords "lisp"))]) + (elisp-refs . [(20230920 201) ((dash (2 12 0)) (s (1 11 0))) "find callers of elisp functions or macros" tar ((:commit . "541a064c3ce27867872cf708354a65d83baf2a6d") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:keywords "lisp"))]) (elisp-sandbox . [(20131116 1842) nil "Evaluate EmacsLisp expressions in a sandbox" tar ((:commit . "ddd669266ca36d7e4ebba73eb1ab42523787e042") (:authors ("Joel McCracken , D. Goel" . "deego@gnufans.org")) (:maintainers ("Joel McCracken , D. Goel" . "deego@gnufans.org")) (:maintainer "Joel McCracken , D. Goel" . "deego@gnufans.org") (:keywords "lisp") (:url . "https://github.com/joelmccracken/elisp-sandbox"))]) (elisp-slime-nav . [(20210510 528) ((emacs (24 1)) (cl-lib (0 2))) "Make M-. and M-, work in elisp like they do in slime" tar ((:commit . "8588d80d414aee1fafce5b9da0e913612ee0bcdd") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "languages" "navigation" "slime" "elisp" "emacs-lisp") (:url . "https://github.com/purcell/elisp-slime-nav"))]) (elixir-mode . [(20230626 1738) ((emacs (25))) "Major mode for editing Elixir files" tar ((:commit . "00d6580a040a750e019218f9392cf9a4c2dac23a") (:keywords "languages" "elixir") (:url . "https://github.com/elixir-editors/emacs-elixir"))]) - (elixir-ts-mode . [(20230403 823) ((emacs (29)) (heex-ts-mode (1 2))) "Major mode for Elixir with tree-sitter support" tar ((:commit . "6671c0ffe0e59d82b99948b08d200bd744cc9d26") (:authors ("Wilhelm H Kirschbaum")) (:maintainers ("Wilhelm H Kirschbaum")) (:maintainer "Wilhelm H Kirschbaum") (:keywords "elixir" "languages" "tree-sitter") (:url . "https://github.com/wkirschbaum/elixir-ts-mode"))]) + (elixir-ts-mode . [(20240116 645) ((emacs (29 1)) (heex-ts-mode (1 3))) "Major mode for Elixir with tree-sitter support" tar ((:commit . "6db05baed9a34d01edf0bfdd804d951dedc6dccb") (:authors ("Wilhelm H Kirschbaum")) (:maintainers ("Wilhelm H Kirschbaum")) (:maintainer "Wilhelm H Kirschbaum") (:keywords "elixir" "languages" "tree-sitter") (:url . "https://github.com/wkirschbaum/elixir-ts-mode"))]) (elixir-yasnippets . [(20150417 1239) ((yasnippet (0 8 0))) "Yasnippets for Elixir" tar ((:commit . "980ca7626c14ef0573bec0035ec7942796062783") (:authors ("Yinghai Zhao" . "zyinghai@gmail.com")) (:maintainer "Yinghai Zhao" . "zyinghai@gmail.com") (:keywords "snippets"))]) + (ellama . [(20240316 1610) ((emacs (28 1)) (llm (0 6 0)) (spinner (1 7 4))) "Tool for interacting with LLMs" tar ((:commit . "b94d5952d4e36e1caeef5ac0b3ecd6d89009082b") (:authors ("Sergey Kostyaev" . "sskostyaev@gmail.com")) (:maintainers ("Sergey Kostyaev" . "sskostyaev@gmail.com")) (:maintainer "Sergey Kostyaev" . "sskostyaev@gmail.com") (:keywords "help" "local" "tools") (:url . "http://github.com/s-kostyaev/ellama"))]) (ellocate . [(20200112 1931) ((emacs (25 1)) (s (1 12 0)) (f (0 20 0))) "The locate command reimplemented in Emacs Lisp" tar ((:commit . "81405082f68f0577c9f176d3d4f034a7142aba59") (:authors ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainers ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainer "Sebastian Wålinder" . "s.walinder@gmail.com") (:keywords "matching") (:url . "https://github.com/walseb/ellocate"))]) (elm-mode . [(20230315 1122) ((f (0 17)) (s (1 7 0)) (emacs (25 1)) (seq (2 23)) (reformatter (0 3))) "Major mode for Elm" tar ((:commit . "699841865e1bd5b7f2077baa7121510b6bcad3c7") (:authors ("Joseph Collard")) (:maintainers ("Joseph Collard")) (:maintainer "Joseph Collard") (:url . "https://github.com/jcollard/elm-mode"))]) - (elm-test-runner . [(20190105 1923) ((emacs (24 4))) "Enhanced support for running elm-test" tar ((:commit . "a31d567a64d86d36e3675347abd696824a731e0c") (:authors ("Juan Edi")) (:maintainers ("Juan Edi")) (:maintainer "Juan Edi") (:url . "https://github.com/juanedi/elm-test-runner"))]) + (elm-test-runner . [(20230905 331) ((emacs (24 4))) "Enhanced support for running elm-test" tar ((:commit . "b664e50a4c849f5f2e2f434fc01718da10515612") (:authors ("Juan Edi")) (:maintainers ("Juan Edi")) (:maintainer "Juan Edi") (:url . "https://github.com/juanedi/elm-test-runner"))]) (elm-yasnippets . [(20160401 524) ((yasnippet (0 8 0))) "Yasnippets for Elm" tar ((:commit . "45a11a0cef0c36633fb3477d3dc4167e82779ba4") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainers ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:keywords "snippets"))]) (elmacro . [(20210716 639) ((s (1 11 0)) (dash (2 13 0))) "Convert keyboard macros to emacs lisp" tar ((:commit . "d2e05012cee4f54fab6d8d8d6aced6e5eeef4f31") (:authors ("Philippe Vaucher" . "philippe.vaucher@gmail.com")) (:maintainers ("Philippe Vaucher" . "philippe.vaucher@gmail.com")) (:maintainer "Philippe Vaucher" . "philippe.vaucher@gmail.com") (:keywords "macro" "elisp" "convenience") (:url . "https://github.com/Silex/elmacro"))]) (elmine . [(20200520 1237) ((s (1 10 0))) "Redmine API access via elisp." tar ((:commit . "d42e328634828e0c1770b72d5e8b87671d081693") (:authors ("Arthur Andersen" . "leoc.git@gmail.com")) (:maintainers ("Arthur Andersen" . "leoc.git@gmail.com")) (:maintainer "Arthur Andersen" . "leoc.git@gmail.com") (:keywords "tools") (:url . "http://github.com/leoc/elmine"))]) - (elmpd . [(20210904 1340) ((emacs (25 1))) "A tight, ergonomic, async client library for mpd" tar ((:commit . "4b42a90610fdb05ac1a2811da5acd55493715795") (:authors ("Michael Herstine" . "sp1ff@pobox.com")) (:maintainers ("Michael Herstine" . "sp1ff@pobox.com")) (:maintainer "Michael Herstine" . "sp1ff@pobox.com") (:keywords "comm") (:url . "https://github.com/sp1ff/elmpd"))]) + (elmpd . [(20240208 1457) ((emacs (25 1))) "A tight, ergonomic, async client library for mpd" tar ((:commit . "c6c8c3fa52951c9570041fe78674f267ca8001a5") (:authors ("Michael Herstine" . "sp1ff@pobox.com")) (:maintainers ("Michael Herstine" . "sp1ff@pobox.com")) (:maintainer "Michael Herstine" . "sp1ff@pobox.com") (:keywords "comm") (:url . "https://github.com/sp1ff/elmpd"))]) (elnode . [(20190702 1509) ((web (0 1 4)) (dash (1 1 0)) (noflet (0 0 7)) (s (1 5 0)) (creole (0 8 14)) (fakir (0 1 6)) (db (0 0 5)) (kv (0 0 17))) "The Emacs webserver." tar ((:commit . "29ef0f51a65a24fca7fdcdb4140d2e4556e4bb29") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "GitHub user \"Jcaw\"") (:keywords "lisp" "http" "hypermedia"))]) (elog . [(20221207 643) ((eieio (1 3))) "logging library extended from logito" tar ((:commit . "e171d0ff0a21011124204d77111e5992b50b7007") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "lisp" "tool" "log"))]) (elogcat . [(20230121 459) ((s (1 9 0)) (dash (2 10 0))) "logcat interface" tar ((:commit . "f2f19d7ab6b77b8fec55cb67524df629fe967891") (:authors ("Youngjoo Lee" . "youngker@gmail.com")) (:maintainers ("Youngjoo Lee" . "youngker@gmail.com")) (:maintainer "Youngjoo Lee" . "youngker@gmail.com") (:keywords "tools"))]) (eloud . [(20190706 1707) ((emacs (24 4))) "A lightweight, interactive screen reader" tar ((:commit . "b8f4af1f652268d73281de91fb333b5984970847") (:authors ("Patrick Smyth" . "patricksmyth01@gmail.com")) (:maintainers ("Patrick Smyth" . "patricksmyth01@gmail.com")) (:maintainer "Patrick Smyth" . "patricksmyth01@gmail.com") (:keywords "extensions") (:url . "https://github.com/smythp/eloud"))]) (elpa-audit . [(20141023 1331) nil "Handy functions for inspecting and comparing package archives" tar ((:commit . "1ca4e6073f8c4cbb41688b69d3b3feaa1a392efc") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "maint") (:url . "https://github.com/purcell/elpa-audit"))]) - (elpa-clone . [(20230808 1523) ((emacs (24 4))) "Clone ELPA archive" tar ((:commit . "dfbb68ac183b8c3e6e370c45032790ed7cf52165") (:authors ("ZHANG Weiyi" . "dochang@gmail.com")) (:maintainers ("ZHANG Weiyi" . "dochang@gmail.com")) (:maintainer "ZHANG Weiyi" . "dochang@gmail.com") (:keywords "comm" "elpa" "clone" "mirror") (:url . "https://github.com/dochang/elpa-clone"))]) + (elpa-clone . [(20240229 1034) ((emacs (24 4))) "Clone ELPA archive" tar ((:commit . "3c77587a6ab6cdf041f969d8606407e575374022") (:authors ("ZHANG Weiyi" . "dochang@gmail.com")) (:maintainers ("ZHANG Weiyi" . "dochang@gmail.com")) (:maintainer "ZHANG Weiyi" . "dochang@gmail.com") (:keywords "comm" "elpa" "clone" "mirror") (:url . "https://github.com/dochang/elpa-clone"))]) (elpa-deploy . [(20191022 718) ((emacs (24 4)) (f (0 0))) "ELPA deployment library" tar ((:commit . "f5126a2da1e0e52981fad9c12028814be80328c2") (:authors ("Bruno Félix Rezende Ribeiro" . "oitofelix@gnu.org")) (:maintainers ("Bruno Félix Rezende Ribeiro" . "oitofelix@gnu.org")) (:maintainer "Bruno Félix Rezende Ribeiro" . "oitofelix@gnu.org") (:keywords "tools") (:url . "https://github.com/oitofelix/elpa-deploy"))]) (elpa-mirror . [(20230208 1148) ((emacs (25 1))) "Create local package repository from installed packages" tar ((:commit . "9d7cfbf72ef8c7cd014c91e5bb3d8fbebda56140") (:authors ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainers ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainer "Chen Bin" . "chenbin.sh@gmail.com") (:keywords "tools") (:url . "http://github.com/redguardtoo/elpa-mirror"))]) - (elpher . [(20230505 817) ((emacs (27 1))) "A friendly gopher and gemini client" tar ((:commit . "81f2883614c303184116449ec3583ef5c136ec2f") (:authors ("Tim Vaughan" . "plugd@thelambdalab.xyz")) (:maintainer "Tim Vaughan" . "plugd@thelambdalab.xyz") (:keywords "comm" "gopher" "gemini") (:url . "https://thelambdalab.xyz/elpher"))]) + (elpher . [(20240214 952) ((emacs (27 1))) "A friendly gopher and gemini client" tar ((:commit . "3f53ed5b6550d25a66bc83f6f26d8cfb06b1dcce") (:authors ("Tim Vaughan" . "plugd@thelambdalab.xyz")) (:maintainer "Tim Vaughan" . "plugd@thelambdalab.xyz") (:keywords "comm" "gopher" "gemini") (:url . "https://thelambdalab.xyz/elpher"))]) (elpl . [(20220328 316) ((emacs (24 4))) "Emacs Lisp REPL" tar ((:commit . "501871ab543b9967bfe87a8a82f83ab96b7f909e") (:authors ("Gong Qijian" . "gongqijian@gmail.com")) (:maintainers ("Gong Qijian" . "gongqijian@gmail.com")) (:maintainer "Gong Qijian" . "gongqijian@gmail.com") (:keywords "lisp" "tool") (:url . "https://github.com/twlz0ne/elpl"))]) - (elpy . [(20230803 1455) ((company (0 9 2)) (emacs (24 4)) (highlight-indentation (0 5 0)) (pyvenv (1 3)) (yasnippet (0 8 0)) (s (1 11 0))) "Emacs Python Development Environment" tar ((:commit . "7ff8ffa918411887d165764f7a5a12bc46646e73") (:authors ("Jorgen Schaefer , Gaby Launay" . "gaby.launay@protonmail.com")) (:maintainer "Jorgen Schaefer , Gaby Launay" . "gaby.launay@protonmail.com") (:keywords "python" "ide" "languages" "tools") (:url . "https://github.com/jorgenschaefer/elpy"))]) + (elpy . [(20240109 1445) ((company (0 9 2)) (emacs (24 4)) (highlight-indentation (0 5 0)) (pyvenv (1 3)) (yasnippet (0 8 0)) (s (1 11 0))) "Emacs Python Development Environment" tar ((:commit . "777e9909c8f1c11f1cfb8dbf5fe4a66d2ab95e1e") (:authors ("Jorgen Schaefer , Gaby Launay" . "gaby.launay@protonmail.com")) (:maintainer "Jorgen Schaefer , Gaby Launay" . "gaby.launay@protonmail.com") (:keywords "python" "ide" "languages" "tools") (:url . "https://github.com/jorgenschaefer/elpy"))]) (elpygen . [(20171225 1736) ((emacs (25)) (yasnippet (0 8 0))) "Generate a Python function/method using a symbol under point" tar ((:commit . "21929c997a05968f9eefe52b85a76ceaab3b0d81") (:authors ("Vladimir Kazanov" . "vkazanov@inbox.ru")) (:maintainers ("Vladimir Kazanov" . "vkazanov@inbox.ru")) (:maintainer "Vladimir Kazanov" . "vkazanov@inbox.ru") (:keywords "python" "languages" "tools") (:url . "https://github.com/vkazanov/elpygen"))]) (elquery . [(20220331 143) ((emacs (25 1)) (dash (2 13 0))) "The HTML library for elisp" tar ((:commit . "38f3bd41096cb270919b06095da0b9ac1add4598") (:authors ("Adam Niederer")) (:maintainers ("Adam Niederer")) (:maintainer "Adam Niederer") (:keywords "html" "hypermedia" "tools" "webscale") (:url . "https://github.com/AdamNiederer/elquery"))]) (elsa . [(20230621 1005) ((emacs (26 1)) (trinary (0)) (f (0)) (dash (2 14)) (cl-lib (0 3)) (lsp-mode (0)) (ansi (0)) (async (1 9 7)) (lgr (0 1 0))) "Emacs Lisp Static Analyser" tar ((:commit . "f719e2404ab6f3323df9341751469cb2e413e013") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "languages" "lisp") (:url . "https://github.com/emacs-elsa/Elsa"))]) @@ -1303,49 +1348,51 @@ (elscreen-multi-term . [(20200417 821) ((emacs (24 4)) (elscreen (1 4 6)) (multi-term (1 3))) "Multi term for elscreen" tar ((:commit . "4ea89bae0444d9d4377515929f76cb3e98140f1f") (:authors ("wamei" . "wamei.cho@gmail.com")) (:maintainers ("wamei" . "wamei.cho@gmail.com")) (:maintainer "wamei" . "wamei.cho@gmail.com") (:keywords "elscreen" "multi term"))]) (elscreen-separate-buffer-list . [(20200807 1324) ((emacs (24 4)) (elscreen (1 4 6))) "Separate buffer list manager for elscreen" tar ((:commit . "88d8850108947949431425a2d938a09d941454e8") (:authors ("wamei" . "wamei.cho@gmail.com")) (:maintainers ("wamei" . "wamei.cho@gmail.com")) (:maintainer "wamei" . "wamei.cho@gmail.com") (:keywords "elscreen"))]) (elscreen-tab . [(20230810 2114) ((emacs (26)) (elscreen (20180321)) (dash (2 14 1))) "Minor mode to display tabs of elscreen in a dedicated buffer" tar ((:commit . "21c1f3d3ec47f8b5e31bb0b26b4f60864e49e966") (:authors ("Aki Syunsuke" . "sunny.day.dev@gmail.com")) (:maintainers ("Aki Syunsuke" . "sunny.day.dev@gmail.com")) (:maintainer "Aki Syunsuke" . "sunny.day.dev@gmail.com") (:keywords "tools" "extensions") (:url . "https://github.com/aki-s/elscreen-tab"))]) - (elune-theme . [(20230526 2238) nil "Elune theme" tar ((:commit . "e0f3f4def066e679cfdde3bbade4c83dcfc38cd8") (:authors ("Çağan Korkmaz" . "xcatalystt@gmail.com")) (:maintainers ("Çağan Korkmaz" . "xcatalystt@gmail.com")) (:maintainer "Çağan Korkmaz" . "xcatalystt@gmail.com") (:url . "https://github.com/xcatalyst/elune-theme"))]) + (elune-theme . [(20231009 1709) nil "Elune theme" tar ((:commit . "4d0217a7601e34fa84fc174ccf7945cd598d4135") (:authors ("Çağan Korkmaz" . "xcatalystt@gmail.com")) (:maintainers ("Çağan Korkmaz" . "xcatalystt@gmail.com")) (:maintainer "Çağan Korkmaz" . "xcatalystt@gmail.com") (:url . "https://github.com/xcatalyst/elune-theme"))]) (elvish-mode . [(20180809 1612) ((emacs (24 3))) "Defines a major mode for Elvish" tar ((:commit . "c3a7e31564256b9755b1ab9fb40d32ad78cd1ad2") (:authors ("Adam Schwalm" . "adamschwalm@gmail.com")) (:maintainers ("Adam Schwalm" . "adamschwalm@gmail.com")) (:maintainer "Adam Schwalm" . "adamschwalm@gmail.com") (:url . "https://github.com/ALSchwalm/elvish-mode"))]) (elwm . [(20150817 1007) ((dash (1 1 0))) "Minimalistic window manager for emacs" tar ((:commit . "c33b183f006ad476c3a44dab316f580f8b369930") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com") (:keywords "docs") (:url . "https://github.com/Fuco1/elwm"))]) - (elx . [(20230511 2113) ((emacs (25 1)) (compat (29 1 4 1)) (llama (0 2 0))) "Extract information from Emacs Lisp libraries" tar ((:commit . "f3dfcb41c6471b8150cc19cea5ff96fe1321f5a1") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "docs" "libraries" "packages") (:url . "https://github.com/emacscollective/elx"))]) - (emacs-everywhere . [(20230706 1152) ((emacs (26 3))) "System-wide popup windows for quick edits" tar ((:commit . "44775589ad050134adf433885be0a94398055630") (:authors ("TEC ")) (:maintainers ("TEC" . "contact@tecosaur.net")) (:maintainer "TEC" . "contact@tecosaur.net") (:keywords "convenience" "frames") (:url . "https://github.com/tecosaur/emacs-everywhere"))]) - (emacsc . [(20230326 1852) nil "helper for emacsc(1)" tar ((:commit . "b4afd616c4ef160c58fc9a9682d3431b30a9d434") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainers ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:keywords "tools") (:url . "https://github.com/knu/emacsc"))]) + (elx . [(20240101 2213) ((emacs (25 1)) (compat (29 1 4 1)) (llama (0 2 0))) "Extract information from Emacs Lisp libraries" tar ((:commit . "2936dee72b2ef085c1c0a40817e67e868d44612c") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "docs" "libraries" "packages") (:url . "https://github.com/emacscollective/elx"))]) + (emacs-everywhere . [(20240128 921) ((emacs (26 3))) "System-wide popup windows for quick edits" tar ((:commit . "fbeff19825336777dccaefedf3f376dd622cd294") (:authors ("TEC ")) (:maintainers ("TEC" . "contact@tecosaur.net")) (:maintainer "TEC" . "contact@tecosaur.net") (:keywords "convenience" "frames") (:url . "https://github.com/tecosaur/emacs-everywhere"))]) + (emacsc . [(20240104 634) nil "helper for emacsc(1)" tar ((:commit . "9bec453a4170dbcb409b884e3e8d30f388de7b8d") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainers ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:keywords "tools") (:url . "https://github.com/knu/emacsc"))]) (emacsist-view . [(20160426 1223) nil "Mode for viewing emacsist.com" tar ((:commit . "f67761259ed779a9bc95c9a4e0474522990c5c6b") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "convenience" "usability") (:url . "https://github.com/lujun9972/emacsist-view"))]) - (emacsql . [(20230417 1448) ((emacs (25 1))) "High-level SQL database front-end" tar ((:commit . "64012261f65fcdd7ea137d1973ef051af1dced42") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/magit/emacsql"))]) - (emacsql-mysql . [(20230225 2205) ((emacs (25 1)) (emacsql (20230220))) "EmacSQL back-end for MySQL" tar ((:commit . "b436adf09ebe058c28e0f473bed90ccd7084f6aa") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/magit/emacsql"))]) + (emacsql . [(20240124 1601) ((emacs (25 1))) "High-level SQL database front-end" tar ((:commit . "5aba772e562f0b22e36e34c9b4c256ffe439654c") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/magit/emacsql"))]) + (emacsql-mysql . [(20240119 2314) ((emacs (25 1)) (emacsql (20230220))) "EmacSQL back-end for MySQL" tar ((:commit . "1b8297b671a6e9df9554df5f62d7e0748a2200dd") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/magit/emacsql"))]) (emacsql-pg . [(20230224 1201) ((emacs (25 1)) (emacsql (20230220)) (pg (0 16))) "EmacSQL back-end for PostgreSQL via pg" tar ((:commit . "7c533fb6c27c3a10b6ab05bddf663e37c109e459") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/magit/emacsql"))]) - (emacsql-psql . [(20230225 2205) ((emacs (25 1)) (emacsql (20230220))) "EmacSQL back-end for PostgreSQL via psql" tar ((:commit . "b436adf09ebe058c28e0f473bed90ccd7084f6aa") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/magit/emacsql"))]) - (emacsql-sqlite . [(20230225 2205) ((emacs (25 1)) (emacsql (20230220))) "EmacSQL back-end for SQLite" tar ((:commit . "b436adf09ebe058c28e0f473bed90ccd7084f6aa") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/magit/emacsql"))]) - (emacsql-sqlite-builtin . [(20230409 1847) ((emacs (29)) (emacsql (20230220))) "EmacSQL back-end for SQLite using builtin support" tar ((:commit . "f25de357fee74aae7a538e8eae3d9be5eb55c20e") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/magit/emacsql"))]) - (emacsql-sqlite-module . [(20230409 1847) ((emacs (25)) (emacsql (20230220)) (sqlite3 (0 16))) "EmacSQL back-end for SQLite using a module" tar ((:commit . "f25de357fee74aae7a538e8eae3d9be5eb55c20e") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/magit/emacsql"))]) + (emacsql-psql . [(20240119 2314) ((emacs (25 1)) (emacsql (20230220))) "EmacSQL back-end for PostgreSQL via psql" tar ((:commit . "ffd501a588e4ca884f949119e7c79d214dfd2ffa") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/magit/emacsql"))]) + (emacsql-sqlite . [(20240119 2314) ((emacs (25 1)) (emacsql (20230220))) "EmacSQL back-end for SQLite" tar ((:commit . "777abb9e9ed47245636cdc7ea814ce12ad11e2ac") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/magit/emacsql"))]) + (emacsql-sqlite-builtin . [(20240119 2314) ((emacs (29)) (emacsql (20230220))) "EmacSQL back-end for SQLite using builtin support" tar ((:commit . "777abb9e9ed47245636cdc7ea814ce12ad11e2ac") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/magit/emacsql"))]) + (emacsql-sqlite-module . [(20240119 2314) ((emacs (25)) (emacsql (20230220)) (sqlite3 (0 16))) "EmacSQL back-end for SQLite using a module" tar ((:commit . "777abb9e9ed47245636cdc7ea814ce12ad11e2ac") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/magit/emacsql"))]) (emacsshot . [(20191206 944) ((emacs (24 4))) "Snapshot a frame or window from within" tar ((:commit . "fe958b11056f3c671ebdd604d5aa574323284ca5") (:authors ("Marco Wahl" . "marcowahlsoft@gmail.com")) (:maintainers ("Marco Wahl")) (:maintainer "Marco Wahl") (:keywords "convenience") (:url . "https://gitlab.com/marcowahl/emacsshot"))]) (emamux . [(20200315 1220) ((emacs (24 3))) "Interact with tmux" tar ((:commit . "6172131d78038f0b1490e24bac60534bf4ad3b30") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-emamux"))]) (emamux-ruby-test . [(20130812 1639) ((emamux (0 1)) (projectile (0 9 1))) "Ruby test with emamux" tar ((:commit . "785bfd44d097a46bb2ebe1e62ac7595fd4dc9ab5") (:url . "https://github.com/syohex/emamux-ruby-test"))]) (emaps . [(20200508 1759) ((dash (2 17 0)) (emacs (24))) "Utilities for working with keymaps" tar ((:commit . "7c561f3ded2015ed3774e5784059d6601082743e") (:authors ("Ben Moon" . "software@guiltydolphin.com")) (:maintainers ("Ben Moon" . "software@guiltydolphin.com")) (:maintainer "Ben Moon" . "software@guiltydolphin.com") (:keywords "convenience" "keyboard" "keymap" "utility") (:url . "https://github.com/GuiltyDolphin/emaps"))]) - (embark . [(20230828 645) ((emacs (27 1)) (compat (29 1 4 0))) "Conveniently act on minibuffer completions" tar ((:commit . "262070fd60e6f0bff68c5aa47ce45c21843f6408") (:authors ("Omar Antolín Camarena" . "omar@matem.unam.mx")) (:maintainers ("Omar Antolín Camarena" . "omar@matem.unam.mx")) (:maintainer "Omar Antolín Camarena" . "omar@matem.unam.mx") (:keywords "convenience") (:url . "https://github.com/oantolin/embark"))]) - (embark-consult . [(20230616 2243) ((emacs (27 1)) (embark (0 20)) (consult (0 17))) "Consult integration for Embark" tar ((:commit . "b48412f62c07e056425044e7d528a0aae2ee8d8b") (:authors ("Omar Antolín Camarena" . "omar@matem.unam.mx")) (:maintainers ("Omar Antolín Camarena" . "omar@matem.unam.mx")) (:maintainer "Omar Antolín Camarena" . "omar@matem.unam.mx") (:keywords "convenience") (:url . "https://github.com/oantolin/embark"))]) + (embark . [(20240320 1230) ((emacs (27 1)) (compat (29 1 4 0))) "Conveniently act on minibuffer completions" tar ((:commit . "30910d48e5779343c5c8c204b1a5ae63e8468354") (:authors ("Omar Antolín Camarena" . "omar@matem.unam.mx")) (:maintainers ("Omar Antolín Camarena" . "omar@matem.unam.mx")) (:maintainer "Omar Antolín Camarena" . "omar@matem.unam.mx") (:keywords "convenience") (:url . "https://github.com/oantolin/embark"))]) + (embark-consult . [(20240205 2122) ((emacs (27 1)) (compat (29 1 4 0)) (embark (1 0)) (consult (1 0))) "Consult integration for Embark" tar ((:commit . "60139db8794f7e4a08076d9f7597d08f6c8083d1") (:authors ("Omar Antolín Camarena" . "omar@matem.unam.mx")) (:maintainers ("Omar Antolín Camarena" . "omar@matem.unam.mx")) (:maintainer "Omar Antolín Camarena" . "omar@matem.unam.mx") (:keywords "convenience") (:url . "https://github.com/oantolin/embark"))]) + (embark-org-roam . [(20240303 335) ((emacs (27 1)) (embark (0 23)) (org-roam (2 2 0))) "Embark export buffer for org roam nodes" tar ((:commit . "5bc9efc33e74eb47becbc2f6467141864cb6ecea") (:authors ("Bram Adams" . "bram.adams@queensu.ca")) (:maintainers ("Bram Adams" . "bram.adams@queensu.ca")) (:maintainer "Bram Adams" . "bram.adams@queensu.ca") (:keywords "outlines" "hypermedia") (:url . "https://github.com/bramadams/embark-org-roam"))]) (embark-vc . [(20230212 1920) ((emacs (27 1)) (embark (0 21 1)) (forge (0 3)) (compat (29 1 3 0))) "Embark actions for various version control integrations" tar ((:commit . "070666b0de8fc2832aa2510b9ba492565cb5e35e") (:authors ("Ellis Kenyő ")) (:maintainers ("Ellis Kenyő" . "me@elken.dev")) (:maintainer "Ellis Kenyő" . "me@elken.dev") (:keywords "convenience" "matching" "terminals" "tools" "unix" "vc") (:url . "https://github.com/elken/embark-vc"))]) - (ember-mode . [(20200208 1423) ((cl-lib (0 5))) "Ember navigation mode for emacs" tar ((:commit . "a587c423041b2fcb065fd5b6a03b2899b764e462") (:authors ("Aad Versteden" . "madnificent@gmail.com")) (:maintainers ("Aad Versteden" . "madnificent@gmail.com")) (:maintainer "Aad Versteden" . "madnificent@gmail.com") (:keywords "ember" "ember.js" "emberjs"))]) + (ember-mode . [(20240301 1056) ((cl-lib (0 5))) "Ember navigation mode for emacs" tar ((:commit . "2fd5da9e360db134232d373edf09373fa762e092") (:authors ("Aad Versteden" . "madnificent@gmail.com")) (:maintainers ("Aad Versteden" . "madnificent@gmail.com")) (:maintainer "Aad Versteden" . "madnificent@gmail.com") (:keywords "ember" "ember.js" "emberjs"))]) (ember-yasnippets . [(20160526 1658) ((yasnippet (0 8 0))) "Snippets for Ember.js development" tar ((:commit . "3b5bd01569646237bf1b540d097e12f9118b67f4") (:authors ("Ron White" . "ronco@costite.com")) (:maintainers ("Ron White" . "ronco@costite.com")) (:maintainer "Ron White" . "ronco@costite.com") (:keywords "tools" "abbrev" "languages"))]) - (embrace . [(20171031 1833) ((cl-lib (0 5)) (expand-region (0 10 0))) "Add/Change/Delete pairs based on `expand-region'" tar ((:commit . "dd5da196e5bcc5e6d87e1937eca0c21da4334ef2") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainers ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions"))]) + (embrace . [(20231027 419) ((cl-lib (0 5)) (expand-region (0 10 0))) "Add/Change/Delete pairs based on `expand-region'" tar ((:commit . "c7e748603151d7d91c237fd2d9cdf56e9f3b1ea8") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainers ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions"))]) (emidje . [(20190209 1726) ((emacs (25)) (cider (0 17 0)) (seq (2 16)) (magit-popup (2 4 0))) "Test runner and report viewer for Midje" tar ((:commit . "7e92f053964d925c97dc8cca8d4d70a3030021db") (:authors ("Alan Ghelardi" . "alan.ghelardi@nubank.com.br")) (:maintainers ("Alan Ghelardi" . "alan.ghelardi@nubank.com.br")) (:maintainer "Alan Ghelardi" . "alan.ghelardi@nubank.com.br") (:keywords "tools") (:url . "https://github.com/nubank/emidje"))]) (emmet-mode . [(20221111 329) nil "Unofficial Emmet's support for emacs" tar ((:commit . "63b6932603184956b5ea8919036d2b307b48d7fd") (:authors ("Shin Aoyama" . "smihica@gmail.com")) (:maintainers ("Shin Aoyama" . "smihica@gmail.com")) (:maintainer "Shin Aoyama" . "smihica@gmail.com") (:keywords "convenience") (:url . "https://github.com/smihica/emmet-mode"))]) - (emms . [(20230818 1438) ((cl-lib (0 5)) (nadvice (0 3)) (seq (0))) "The Emacs Multimedia System" tar ((:commit . "4567938c2c4182ba1ad01e7b3133d32a10095fb5") (:authors ("Jorgen Schäfer" . "forcer@forcix.cx")) (:maintainers ("Yoni Rabkin" . "yrk@gnu.org")) (:maintainer "Yoni Rabkin" . "yrk@gnu.org") (:keywords "emms" "mp3" "ogg" "flac" "music" "mpeg" "video" "multimedia") (:url . "https://www.gnu.org/software/emms/"))]) + (emms . [(20240318 2011) ((cl-lib (0 5)) (nadvice (0 3)) (seq (0))) "The Emacs Multimedia System" tar ((:commit . "38417250833e14914d3cff65ebf8b51a1b9c1da5") (:authors ("Jorgen Schäfer" . "forcer@forcix.cx")) (:maintainers ("Yoni Rabkin" . "yrk@gnu.org")) (:maintainer "Yoni Rabkin" . "yrk@gnu.org") (:keywords "emms" "mp3" "ogg" "flac" "music" "mpeg" "video" "multimedia") (:url . "https://www.gnu.org/software/emms/"))]) (emms-info-mediainfo . [(20131223 1300) ((emms (0))) "Info-method for EMMS using medianfo" tar ((:commit . "bce16eae9eacd38719fea62a9755225a888da59d") (:authors ("Fabián Ezequiel Gallina" . "fgallina@gnu.org")) (:maintainers ("Fabián Ezequiel Gallina" . "fgallina@gnu.org")) (:maintainer "Fabián Ezequiel Gallina" . "fgallina@gnu.org") (:keywords "multimedia" "processes"))]) (emms-mark-ext . [(20130529 327) ((emms (3 0))) "Extra functions for emms-mark-mode and emms-tag-edit-mode" tar ((:commit . "ec68129e3e9e469e5bf160c6a1b7030e322f3541") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainers ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com") (:keywords "convenience" "multimedia") (:url . "https://github.com/vapniks/emms-mark-ext"))]) (emms-mode-line-cycle . [(20160221 1120) ((emacs (24)) (emms (4 0))) "Display the emms mode line as a ticker" tar ((:commit . "2c2f395e484a1d345050ddd61ff5fab71a92a6bc") (:authors ("momomo5717")) (:maintainers ("momomo5717")) (:maintainer "momomo5717") (:keywords "emms" "mode-line") (:url . "https://github.com/momomo5717/emms-mode-line-cycle"))]) (emms-player-mpv-jp-radios . [(20180325 1117) ((emacs (24)) (cl-lib (0 5)) (emms (4 0)) (emms-player-simple-mpv (0 1 7))) "EMMS players and stream lists of Japan radio stations" tar ((:commit . "f6b37f5878c741124d5fca43c5b80af873541edd") (:keywords "emms" "mpv" "radio") (:url . "https://github.com/momomo5717/emms-player-mpv-jp-radios"))]) (emms-player-simple-mpv . [(20180316 1549) ((emacs (24)) (cl-lib (0 5)) (emms (4 0))) "An extension of emms-player-simple.el for mpv JSON IPC" tar ((:commit . "101d120ccdee1c2c213fd2f0423c858b21649c00") (:authors ("momomo5717")) (:maintainers ("momomo5717")) (:maintainer "momomo5717") (:keywords "emms" "mpv") (:url . "https://github.com/momomo5717/emms-player-simple-mpv"))]) + (emms-player-spotify . [(20240302 2106) ((emacs (26 1)) (compat (29 1)) (emms (18)) (s (1 13 0))) "Spotify player for EMMS" tar ((:commit . "3b1e8e5b5306173940d311191b13e2ace4d048b9") (:authors ("Sergey Trofimov" . "sarg@sarg.org.ru")) (:maintainers ("Sergey Trofimov" . "sarg@sarg.org.ru")) (:maintainer "Sergey Trofimov" . "sarg@sarg.org.ru") (:url . "https://github.com/sarg/emms-spotify"))]) (emms-soundcloud . [(20131221 1145) ((emms (20131016)) (json (1 2))) "EMMS source for Soundcloud audio sharing platform" tar ((:commit . "87e5cbf9609d1f26c24dc834fdeb78b33d453c2b") (:authors ("Ozan Sener" . "ozan@ozansener.com")) (:maintainers ("Ozan Sener" . "ozan@ozansener.com")) (:maintainer "Ozan Sener" . "ozan@ozansener.com") (:keywords "emms" "soundcloud") (:url . "http://github.com/osener/emms-soundcloud"))]) (emms-state . [(20211023 1942) ((emms (0))) "Display track description and playing time in the mode line" tar ((:commit . "cdb3ee85369758727b3c082e4ade1ae2b559b334") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainers ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:keywords "emms") (:url . "https://github.com/alezost/emms-state.el"))]) (emoji-cheat-sheet-plus . [(20200202 1412) ((emacs (24)) (helm (1 6 4))) "emoji-cheat-sheet for emacs" tar ((:commit . "ffcc84d7060dfa000148e7f8be4fd6701593a74f") (:authors ("Sylvain Benner (based on the work of Shingo Fukuyama)")) (:maintainers ("Sylvain Benner (based on the work of Shingo Fukuyama)")) (:maintainer "Sylvain Benner (based on the work of Shingo Fukuyama)") (:keywords "emacs" "emoji") (:url . "https://github.com/syl20bnr/emacs-emoji-cheat-sheet-plus"))]) (emoji-display . [(20140117 1013) nil "emoji displaying module" tar ((:commit . "bb4217f6400151a9cfa6d4524b8427f01feb5193") (:authors ("Kazuhiro Ito" . "kzhr@d1.dion.ne.jp")) (:maintainers ("Kazuhiro Ito" . "kzhr@d1.dion.ne.jp")) (:maintainer "Kazuhiro Ito" . "kzhr@d1.dion.ne.jp") (:keywords "emoji") (:url . "https://github.com/ikazuhiro/emoji-display"))]) (emoji-fontset . [(20160726 1924) nil "Set font face for Emoji." tar ((:commit . "e460c9a08e48ec4103e38a7a04acae20880149a9") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "emoji" "font" "config"))]) - (emoji-github . [(20220704 648) ((emacs (24 4)) (emojify (1 0)) (request (0 3 0))) "Display list of GitHub's emoji. (cheat sheet)" tar ((:commit . "a25c5e4e41c32ee7b3f7707b3d1281929f810d92") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "list" "github" "emoji" "display") (:url . "https://github.com/jcs-elpa/emoji-github"))]) + (emoji-github . [(20240101 935) ((emacs (24 4)) (emojify (1 0)) (request (0 3 0))) "Display list of GitHub's emoji. (cheat sheet)" tar ((:commit . "0f42d10854239b751a2ae06caa43bcf387f43d4d") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "list" "github" "emoji" "display") (:url . "https://github.com/jcs-elpa/emoji-github"))]) (emoji-recall . [(20160723 2208) ((emacs (24))) "How many emoji can you recall from memory?" tar ((:commit . "1c12d18e5592eaa2138dd3034012dced277e6d99") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "game") (:url . "https://github.com/lujun9972/emoji-recall.el"))]) (emojify . [(20210108 1111) ((seq (1 11)) (ht (2 0)) (emacs (24 3))) "Display emojis in Emacs" tar ((:commit . "cfa00865388809363df3f884b4dd554a5d44f835") (:authors ("Iqbal Ansari" . "iqbalansari02@yahoo.com")) (:maintainers ("Iqbal Ansari" . "iqbalansari02@yahoo.com")) (:maintainer "Iqbal Ansari" . "iqbalansari02@yahoo.com") (:keywords "multimedia" "convenience") (:url . "https://github.com/iqbalansari/emacs-emojify"))]) (emojify-logos . [(20180814 917) ((emojify (0 4))) "Add logos to emojify" tar ((:commit . "a3e78bcbdf863092d4c9b026ac08bf7d1c7c0e8b") (:authors ("mxgoldstein" . "m_goldstein@gmx.net")) (:maintainers ("mxgoldstein" . "m_goldstein@gmx.net")) (:maintainer "mxgoldstein" . "m_goldstein@gmx.net") (:url . "https://github.com/mxgoldstein/emojify-logos"))]) (empos . [(20151011 1916) nil "Locate bibtex citations from within emacs" tar ((:commit . "7b99ad30e56937adb7e6349777e5a2045597d564") (:authors ("Dimitris Alikaniotis ")) (:maintainers ("Dimitris Alikaniotis ")) (:maintainer "Dimitris Alikaniotis ") (:keywords "citations" "reference" "bibtex" "reftex") (:url . "http://github.com/dimalik/empos/"))]) - (empv . [(20230820 1340) ((emacs (28 1)) (s (1 13 0))) "A multimedia player/manager, YouTube interface" tar ((:commit . "1721a581d68f211a7f0104554858ea2afb1723ff") (:authors ("Isa Mert Gurbuz" . "isamertgurbuz@gmail.com")) (:maintainers ("Isa Mert Gurbuz" . "isamertgurbuz@gmail.com")) (:maintainer "Isa Mert Gurbuz" . "isamertgurbuz@gmail.com") (:url . "https://github.com/isamert/empv.el"))]) + (empv . [(20240310 28) ((emacs (28 1)) (s (1 13 0)) (compat (29 1 4 4))) "A multimedia player/manager, YouTube interface" tar ((:commit . "cb284929a6a1364d1200677de38a75d90edc6fb2") (:authors ("Isa Mert Gurbuz" . "isamertgurbuz@gmail.com")) (:maintainers ("Isa Mert Gurbuz" . "isamertgurbuz@gmail.com")) (:maintainer "Isa Mert Gurbuz" . "isamertgurbuz@gmail.com") (:url . "https://github.com/isamert/empv.el"))]) (emr . [(20220108 548) ((s (1 3 1)) (dash (1 2 0)) (cl-lib (0 2)) (popup (0 5 0)) (emacs (24 1)) (list-utils (0 3 0)) (paredit (24 0 0)) (projectile (0 9 1)) (clang-format (0 0 1)) (iedit (0 97))) "Emacs refactoring system." tar ((:commit . "cac1b52932926f56d7f6d2923732d20bbd20670d") (:authors ("Chris Barrett" . "chris.d.barrett@me.com")) (:maintainers ("Chris Barrett" . "chris.d.barrett@me.com")) (:maintainer "Chris Barrett" . "chris.d.barrett@me.com") (:keywords "tools" "convenience" "refactoring") (:url . "https://github.com/Wilfred/emacs-refactor"))]) (enclose . [(20121008 1614) nil "Enclose cursor within punctuation pairs." tar ((:commit . "2fff3d4fcc1089f87647042d7164ba04282766ae") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:keywords "speed" "convenience") (:url . "http://github.com/rejeep/enclose"))]) (encourage-mode . [(20151128 905) ((emacs (24 4))) "Encourages you in your work. :D" tar ((:commit . "ca411e6bfd3d0edffe95852127bd995730b942e3") (:authors ("Patrick Mosby" . "patrick@schreiblogade.de")) (:maintainers ("Patrick Mosby" . "patrick@schreiblogade.de")) (:maintainer "Patrick Mosby" . "patrick@schreiblogade.de") (:keywords "fun") (:url . "https://github.com/halbtuerke/encourage-mode.el"))]) @@ -1357,13 +1404,13 @@ (eno . [(20191013 1239) ((dash (2 12 1)) (edit-at-point (1 0))) "Goto/copy/cut any word/symbol/line in view, similar to ace-jump/easymotion" tar ((:commit . "c5c6193687c0bede1ddf507c430cf8b0a6d272d9") (:authors (nil . "")) (:maintainers (nil . "")) (:maintainer nil . "") (:url . "http://github.com/enoson/eno.el"))]) (enotify . [(20130407 1348) nil "A networked notification system for emacs" tar ((:commit . "7fd2f48ef4ff32c8f013c634ea2dd6b1d1409f80") (:authors ("Alessandro Piras" . "laynor@gmail.com")) (:maintainer "Alessandro Piras" . "laynor@gmail.com") (:keywords "tools"))]) (environ . [(20230518 1310) ((emacs (24 1)) (dash (2 17 0)) (f (0 20 0)) (s (1 12 0))) "API for environment variables and env files" tar ((:commit . "9530e2f1ead5bd37aca4d298514800f73b3cc0a7") (:authors ("Chris Clark" . "cfclrk@gmail.com")) (:maintainers ("Chris Clark" . "cfclrk@gmail.com")) (:maintainer "Chris Clark" . "cfclrk@gmail.com") (:keywords "tools") (:url . "https://github.com/cfclrk/environ"))]) - (envrc . [(20230809 600) ((seq (2)) (emacs (25 1)) (inheritenv (0 1))) "Support for `direnv' that operates buffer-locally" tar ((:commit . "dbb8f3e580909d1942fa4e27381b6f97b668b3c2") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "processes" "tools") (:url . "https://github.com/purcell/envrc"))]) + (envrc . [(20231023 1521) ((seq (2)) (emacs (25 1)) (inheritenv (0 1))) "Support for `direnv' that operates buffer-locally" tar ((:commit . "4f9ae5d4d1fcb32c844b50ccda34305884d68be3") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "processes" "tools") (:url . "https://github.com/purcell/envrc"))]) (eopengrok . [(20230114 1413) ((s (1 9 0)) (dash (2 10 0)) (magit (2 1 0)) (cl-lib (0 5))) "opengrok interface for emacs" tar ((:commit . "83b1695774f8bdc322e528ade9dffe9b2e93f32a") (:authors ("Youngjoo Lee" . "youngker@gmail.com")) (:maintainers ("Youngjoo Lee" . "youngker@gmail.com")) (:maintainer "Youngjoo Lee" . "youngker@gmail.com") (:keywords "tools"))]) (epc . [(20140610 534) ((concurrent (0 3 1)) (ctable (0 1 2))) "A RPC stack for the Emacs Lisp" tar ((:commit . "94cd36a3bec752263ac9b1b3a9dd2def329d2af7") (:authors ("SAKURAI Masashi ")) (:maintainers ("SAKURAI Masashi ")) (:maintainer "SAKURAI Masashi ") (:keywords "lisp" "rpc") (:url . "https://github.com/kiwanami/emacs-epc"))]) (epic . [(20170210 23) ((htmlize (1 47))) "Evernote Picker for Cocoa Emacs" tar ((:commit . "a41826c330eb0ea061d58a08cc861b0c4ac8ec4e") (:authors ("Yoshinari Nomura" . "nom@quickhack.net")) (:maintainers ("Yoshinari Nomura" . "nom@quickhack.net")) (:maintainer "Yoshinari Nomura" . "nom@quickhack.net") (:keywords "evernote" "applescript") (:url . "https://github.com/yoshinari-nomura/epic"))]) (eping . [(20201027 2149) ((emacs (25 1))) "Ping websites to check internet connectivity" tar ((:commit . "004496ee06c0b8ead4a4f49e17109e8eb32eb49d") (:authors ("Sean Hutchings" . "seanhut@yandex.com")) (:maintainers ("Sean Hutchings" . "seanhut@yandex.com")) (:maintainer "Sean Hutchings" . "seanhut@yandex.com") (:keywords "comm" "processes" "terminals" "unix") (:url . "https://github.com/sean-hut/eping"))]) - (epkg . [(20230810 1304) ((emacs (25 1)) (compat (29 1 4 1)) (closql (20230407)) (emacsql (20230409)) (llama (0 2 0))) "Browse the Emacsmirror package database" tar ((:commit . "b22da65653418290dc93f7c8b167e8600cdaedb0") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "tools") (:url . "https://github.com/emacscollective/epkg"))]) - (epkg-marginalia . [(20230603 1401) ((emacs (27 1)) (compat (29 1 4 1)) (epkg (3 3 3)) (llama (0 3 0)) (marginalia (1 2))) "Show Epkg information in completion annotations" tar ((:commit . "f5eda857a99d02aad9e89bd80c327930e815fc8a") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "tools") (:url . "https://github.com/emacscollective/epkg-marginalia"))]) + (epkg . [(20240212 1731) ((emacs (25 1)) (compat (29 1 4 1)) (closql (20230407)) (emacsql (20230409)) (llama (0 2 0))) "Browse the Emacsmirror package database" tar ((:commit . "4a245349047f48507fc28f7077061bca3dfcedea") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "tools") (:url . "https://github.com/emacscollective/epkg"))]) + (epkg-marginalia . [(20240101 2215) ((emacs (27 1)) (compat (29 1 4 1)) (epkg (3 3 3)) (llama (0 3 0)) (marginalia (1 2))) "Show Epkg information in completion annotations" tar ((:commit . "b8c9fb165ec832b2e930092ce8abe039d415a117") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "tools") (:url . "https://github.com/emacscollective/epkg-marginalia"))]) (epl . [(20180205 2049) ((cl-lib (0 3))) "Emacs Package Library" tar ((:commit . "78ab7a85c08222cd15582a298a364774e3282ce6") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainers ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:keywords "convenience") (:url . "http://github.com/cask/epl"))]) (epm . [(20190509 443) ((emacs (24 3)) (epl (0 8))) "Emacs Package Manager" tar ((:commit . "6375ddbf93c5f25647f6ebb25b54045b3c93a5be") (:authors ("Chunyang Xu" . "xuchunyang.me@gmail.com")) (:maintainers ("Chunyang Xu" . "xuchunyang.me@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang.me@gmail.com") (:url . "https://github.com/xuchunyang/epm"))]) (epresent . [(20160411 201) ((org (8)) (cl-lib (0 5))) "Simple presentation mode for Emacs Org-mode" tar ((:commit . "bc3443879bb0111dcde2abd2f9c578e2cd438186") (:keywords "gui") (:url . "https://github.com/dakrone/epresent"))]) @@ -1390,18 +1437,19 @@ (ereader . [(20170810 501) ((emacs (24 4)) (dash (2 12 1)) (s (1 10 0)) (xml+ (0 0 0))) "Major mode for reading ebooks with org-mode integration" tar ((:commit . "f3bbd3f13195f8fba3e3c880aab0e4c60430dcf3") (:authors ("Ben Dean" . "bendean837@gmail.com")) (:maintainers ("Ben Dean" . "bendean837@gmail.com")) (:maintainer "Ben Dean" . "bendean837@gmail.com") (:keywords "epub" "ebook") (:url . "https://github.com/bddean/emacs-ereader"))]) (eredis . [(20181119 131) ((dash (0))) "eredis, a Redis client in emacs lisp" tar ((:commit . "cfbfc25832f6fbc507bdd56b02e3a0b851a3c368") (:authors ("Justin Heyes-Jones" . "justinhj@gmail.com")) (:maintainers ("Justin Heyes-Jones" . "justinhj@gmail.com")) (:maintainer "Justin Heyes-Jones" . "justinhj@gmail.com") (:keywords "redis" "api" "tools" "org") (:url . "http://github.com/justinhj/eredis/"))]) (erefactor . [(20200513 1252) ((cl-lib (0 3))) "Emacs-Lisp refactoring utilities" tar ((:commit . "bfe27a1b8c7cac0fe054e76113e941efa3775fe8") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "extensions" "tools" "maint") (:url . "https://github.com/mhayashi1120/Emacs-erefactor"))]) - (ergoemacs-mode . [(20230207 1551) ((emacs (24 1)) (cl-lib (0 5)) (nadvice (0 4))) "Emacs mode based on common modern interface and ergonomics." tar ((:commit . "c2a918c6ab13e29dba2caf2bd06496babd0dfca6") (:authors ("Xah Lee" . "xah@xahlee.org") ("David Capello" . "davidcapello@gmail.com") ("Matthew L. Fidler" . "matthew.fidler@gmail.com") ("Kim F. Storm" . "storm@cua.dk")) (:maintainers ("Matthew L. Fidler" . "matthew.fidler@gmail.com")) (:maintainer "Matthew L. Fidler" . "matthew.fidler@gmail.com") (:keywords "convenience") (:url . "https://github.com/ergoemacs/ergoemacs-mode"))]) + (ergoemacs-mode . [(20240129 1407) ((emacs (24 1)) (cl-lib (0 5)) (nadvice (0 4))) "Emacs mode based on common modern interface and ergonomics." tar ((:commit . "095129648e9846fbda1f585806de39c12e82f37e") (:authors ("Xah Lee" . "xah@xahlee.org") ("David Capello" . "davidcapello@gmail.com") ("Matthew L. Fidler" . "matthew.fidler@gmail.com") ("Kim F. Storm" . "storm@cua.dk")) (:maintainers ("Matthew L. Fidler" . "matthew.fidler@gmail.com")) (:maintainer "Matthew L. Fidler" . "matthew.fidler@gmail.com") (:keywords "convenience") (:url . "https://github.com/ergoemacs/ergoemacs-mode"))]) (ergoemacs-status . [(20160318 538) ((powerline (2 3)) (mode-icons (0 1 0))) "Adaptive Status Bar / Mode Line" tar ((:commit . "d952cc2361adf6eb4d6af60950ad4ab699c81320") (:authors ("Matthew Fidler")) (:maintainers ("Matthew Fidler")) (:maintainer "Matthew Fidler"))]) - (eri . [(20200914 644) nil "Enhanced relative indentation (eri)" tar ((:commit . "aa5e3a127bf17a8c80d947f3c286758a36dadc36") (:url . "https://github.com/agda/agda"))]) - (erk . [(20230511 251) ((emacs (28 1)) (auto-compile (1 2 0)) (dash (2 18 0))) "Elisp (GitHub) Repository Kit" tar ((:commit . "f6cca4647538c4dc659f07669938f7e795dba4ee") (:authors ("")) (:maintainers ("")) (:maintainer "") (:keywords "convenience") (:url . "http://github.com/positron-solutions/elisp-repo-kit"))]) - (erlang . [(20230628 1002) ((emacs (24 1))) "Erlang major mode" tar ((:commit . "d051172925a5c84b2f21850a188a533f885f201c") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "erlang" "languages" "processes"))]) + (eri . [(20240220 2129) nil "Enhanced relative indentation (eri)" tar ((:commit . "d4ac6d038e25bb8d4912da7a4c5df91a856e1c9c") (:url . "https://github.com/agda/agda"))]) + (erk . [(20231227 1449) ((emacs (28 1)) (auto-compile (1 2 0)) (dash (2 18 0)) (license-templates (0 1 3))) "Elisp (GitHub) Repository Kit" tar ((:commit . "0d9906415a649caff2df7b4b1b3f8f6cc337032a") (:authors ("Positron Solutions" . "contact@positron.solutions")) (:maintainers ("Positron Solutions" . "contact@positron.solutions")) (:maintainer "Positron Solutions" . "contact@positron.solutions") (:keywords "convenience" "programming") (:url . "http://github.com/positron-solutions/elisp-repo-kit"))]) + (erlang . [(20240318 1506) ((emacs (24 1))) "Erlang major mode" tar ((:commit . "01f90162f3cb3323d4fc5e0088b73cce3e052ad9") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "erlang" "languages" "processes"))]) (erlstack-mode . [(20230608 909) ((emacs (25 1)) (dash (2 12 0))) "Minor mode for analysing Erlang stacktraces" tar ((:commit . "51e3cd10a2fe77eb8eb60643aba6f8178374b069") (:authors ("k32")) (:maintainers ("k32")) (:maintainer "k32") (:keywords "tools" "erlang") (:url . "https://github.com/k32/erlstack-mode"))]) (eros . [(20230309 615) ((emacs (24 4))) "Evaluation Result OverlayS for Emacs Lisp" tar ((:commit . "a9a92bdc6be0521a6a06eb464be55ed61946639c") (:authors ("Tianxiang Xiong" . "tianxiang.xiong@gmail.com")) (:maintainers ("Tianxiang Xiong" . "tianxiang.xiong@gmail.com")) (:maintainer "Tianxiang Xiong" . "tianxiang.xiong@gmail.com") (:keywords "convenience" "lisp") (:url . "https://github.com/xiongtx/eros"))]) (ert-async . [(20200105 1031) ((emacs (24 1))) "Async support for ERT" tar ((:commit . "948cf2faa10e085bda3739034ca5ea1912893433") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainers ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:keywords "lisp" "test") (:url . "http://github.com/rejeep/ert-async.el"))]) (ert-expectations . [(20121009 734) nil "The simplest unit test framework in the world" tar ((:commit . "aed70e002c4305b66aed7f6d0d48e9addd2dc1e6") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "test" "unittest" "ert" "expectations") (:url . "http://www.emacswiki.org/emacs/download/ert-expectations.el"))]) (ert-junit . [(20190802 2232) ((ert (0)) (emacs (23 4))) "JUnit XML reports from ert results" tar ((:commit . "65f91c35b088b87943dbbbe7e1ce354bc9bc0992") (:authors ("Ola Nilsson" . "ola.nilsson@gmail.com")) (:maintainers ("Ola Nilsson" . "ola.nilsson@gmail.com")) (:maintainer "Ola Nilsson" . "ola.nilsson@gmail.com") (:keywords "tools" "test" "unittest" "ert") (:url . "http://bitbucket.org/olanilsson/ert-junit"))]) (ert-modeline . [(20140115 1015) ((s (1 3 1)) (dash (1 2 0)) (emacs (24 1)) (projectile (0 9 1))) "displays ert test results in the modeline." tar ((:commit . "7c6340834387f749519616f9601821cb73fd657b") (:authors ("Chris Barrett" . "chris.d.barrett@me.com")) (:maintainers ("Chris Barrett" . "chris.d.barrett@me.com")) (:maintainer "Chris Barrett" . "chris.d.barrett@me.com") (:keywords "tools" "tests" "convenience"))]) - (ert-runner . [(20220513 1142) ((s (1 6 1)) (dash (1 8 0)) (f (0 10 0)) (commander (0 2 0)) (ansi (0 1 0)) (shut-up (0 1 0))) "Opinionated Ert testing workflow" tar ((:commit . "69d66b934223d5f1801ba3a4c8dbfb3453f2a041") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainers ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:keywords "test") (:url . "http://github.com/rejeep/ert-runner.el"))]) + (ert-results . [(20240108 1358) ((emacs (24 1))) "Filter ERT test results display" tar ((:commit . "32200a195f68c25a013497329d85ae0703ab475d") (:authors ("Robert Weiner" . "rsw@gnu.org")) (:maintainers ("Robert Weiner" . "rsw@gnu.org")) (:maintainer "Robert Weiner" . "rsw@gnu.org") (:keywords "lisp" "maint" "tools") (:url . "https://github.com/rswgnu/ert-results"))]) + (ert-runner . [(20231110 1358) ((s (1 6 1)) (dash (1 8 0)) (f (0 10 0)) (commander (0 2 0)) (ansi (0 1 0)) (shut-up (0 1 0))) "Opinionated Ert testing workflow" tar ((:commit . "98a5a6f683663f9f0357459d75ce1dc36c987e4a") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainers ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:keywords "test") (:url . "http://github.com/rejeep/ert-runner.el"))]) (es-lib . [(20141111 1830) ((cl-lib (0 3))) "A collection of emacs utilities" tar ((:commit . "753b27363e39c10edc9e4e452bdbbbe4d190df4a") (:authors ("sabof")) (:maintainers ("sabof")) (:maintainer "sabof") (:url . "https://github.com/sabof/es-lib"))]) (es-mode . [(20221026 1103) ((dash (2 11 0)) (cl-lib (0 5)) (spark (1 0)) (s (1 11 0)) (request (0 3 0))) "A major mode for editing and executing Elasticsearch queries" tar ((:commit . "e82465fd785688bb58918ea62ca4de06a2a23a1e") (:authors ("Lee Hinman" . "lee@writequit.org")) (:maintainers ("Lee Hinman" . "lee@writequit.org")) (:maintainer "Lee Hinman" . "lee@writequit.org") (:keywords "elasticsearch") (:url . "http://www.github.com/dakrone/es-mode"))]) (es-windows . [(20140211 904) ((cl-lib (0 3)) (emacs (24))) "Window-management utilities" tar ((:commit . "7ebe6c6e0831373847d7adbedeaa2e506b54b2af") (:authors ("sabof")) (:maintainers ("sabof")) (:maintainer "sabof") (:url . "https://github.com/sabof/es-windows"))]) @@ -1417,16 +1465,16 @@ (eshell-git-prompt . [(20220830 2000) ((emacs (24 1)) (cl-lib (0 5)) (dash (2 11 0))) "Some Eshell prompt for Git users" tar ((:commit . "dfcf9cd93add6763e2c46603b0323274d4c22906") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainers ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me") (:keywords "eshell" "git") (:url . "https://github.com/xuchunyang/eshell-git-prompt"))]) (eshell-info-banner . [(20220728 1006) ((emacs (25 1)) (s (1))) "System information as your Eshell banner" tar ((:commit . "987e69a66276ca057798896c606e5c5d5fb9ee5c") (:authors ("Lucien Cartier-Tilet" . "lucien@phundrak.com")) (:maintainers ("Lucien Cartier-Tilet" . "lucien@phundrak.com")) (:maintainer "Lucien Cartier-Tilet" . "lucien@phundrak.com") (:url . "https://github.com/Phundrak/eshell-info-banner.el"))]) (eshell-outline . [(20201121 620) ((emacs (25 1))) "Enhanced outline-mode for Eshell" tar ((:commit . "6f917afa5b3d36764d76d7864589094647d8c3b4") (:authors ("Jamie Beardslee" . "jdb@jamzattack.xyz")) (:maintainers ("Jamie Beardslee" . "jdb@jamzattack.xyz")) (:maintainer "Jamie Beardslee" . "jdb@jamzattack.xyz") (:keywords "unix" "eshell" "outline" "convenience") (:url . "https://git.jamzattack.xyz/eshell-outline"))]) - (eshell-prompt-extras . [(20230815 1251) ((emacs (25))) "Display extra information for your eshell prompt." tar ((:commit . "f490ab511a36166f09b97811495b09d72c9d37f9") (:authors ("zwild" . "judezhao@outlook.com")) (:maintainers ("Xu Chunyang" . "xuchunyang56@gmail.com")) (:maintainer "Xu Chunyang" . "xuchunyang56@gmail.com") (:keywords "eshell" "prompt") (:url . "https://github.com/zwild/eshell-prompt-extras"))]) - (eshell-syntax-highlighting . [(20230601 246) ((emacs (25 1))) "Highlight eshell commands" tar ((:commit . "8bf0494ca71944b9d4bfb8ec3c93ea29d46bc2f9") (:authors ("Alex Kreisher" . "akreisher18@gmail.com")) (:maintainers ("Alex Kreisher" . "akreisher18@gmail.com")) (:maintainer "Alex Kreisher" . "akreisher18@gmail.com") (:keywords "convenience") (:url . "https://github.com/akreisher/eshell-syntax-highlighting"))]) + (eshell-prompt-extras . [(20231019 1405) ((emacs (25))) "Display extra information for your eshell prompt." tar ((:commit . "14eabe593e110ed6937ac3b95f7979263d716a26") (:authors ("zwild" . "judezhao@outlook.com")) (:maintainers ("Xu Chunyang" . "xuchunyang56@gmail.com")) (:maintainer "Xu Chunyang" . "xuchunyang56@gmail.com") (:keywords "eshell" "prompt") (:url . "https://github.com/zwild/eshell-prompt-extras"))]) + (eshell-syntax-highlighting . [(20231108 2313) ((emacs (25 1))) "Highlight eshell commands" tar ((:commit . "4ac27eec6595ba116a6151dfaf0b0e0440101e10") (:authors ("Alex Kreisher" . "akreisher18@gmail.com")) (:maintainers ("Alex Kreisher" . "akreisher18@gmail.com")) (:maintainer "Alex Kreisher" . "akreisher18@gmail.com") (:keywords "convenience") (:url . "https://github.com/akreisher/eshell-syntax-highlighting"))]) (eshell-toggle . [(20220718 729) ((emacs (25 1)) (dash (2 11 0))) "Show/hide eshell under active window." tar ((:commit . "d4e884624f02e68b267b0044322ad17baa6780f8") (:authors ("Dmitry Cherkassov" . "dcherkassov@gmail.com")) (:maintainers ("Dmitry Cherkassov" . "dcherkassov@gmail.com")) (:maintainer "Dmitry Cherkassov" . "dcherkassov@gmail.com") (:keywords "processes") (:url . "https://github.com/4da/eshell-toggle"))]) - (eshell-up . [(20170425 1737) ((emacs (24))) "Quickly go to a specific parent directory in eshell" tar ((:commit . "b00e447ad7941ab31bcbb6bc0205fd492e887e7d") (:authors ("Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com")) (:maintainers ("Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com")) (:maintainer "Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com") (:keywords "eshell") (:url . "https://github.com/peterwvj/eshell-up"))]) - (eshell-vterm . [(20221229 1328) ((emacs (27 1)) (vterm (0 0 1))) "Vterm for visual commands in eshell" tar ((:commit . "e96c30ad5e7d63b778fc3232e81b090b63b13277") (:authors ("Illia Ostapyshyn" . "ilya.ostapyshyn@gmail.com")) (:maintainers ("Illia Ostapyshyn" . "ilya.ostapyshyn@gmail.com")) (:maintainer "Illia Ostapyshyn" . "ilya.ostapyshyn@gmail.com") (:keywords "eshell" "vterm" "terminals" "shell" "visual" "tools" "processes") (:url . "https://github.com/iostapyshyn/eshell-vterm"))]) + (eshell-up . [(20240226 1747) ((emacs (24))) "Quickly go to a specific parent directory in eshell" tar ((:commit . "1999afaa509204b780db44e99ac9648fe7d92d32") (:authors ("Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com")) (:maintainers ("Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com")) (:maintainer "Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com") (:keywords "eshell") (:url . "https://github.com/peterwvj/eshell-up"))]) + (eshell-vterm . [(20240305 1149) ((emacs (27 1)) (vterm (0 0 1))) "Vterm for visual commands in eshell" tar ((:commit . "20f4b246fa605a1533cdfbe3cb7faf31a24e3d2e") (:authors ("Illia Ostapyshyn" . "ilya.ostapyshyn@gmail.com")) (:maintainers ("Illia Ostapyshyn" . "ilya.ostapyshyn@gmail.com")) (:maintainer "Illia Ostapyshyn" . "ilya.ostapyshyn@gmail.com") (:keywords "eshell" "vterm" "terminals" "shell" "visual" "tools" "processes") (:url . "https://github.com/iostapyshyn/eshell-vterm"))]) (eshell-z . [(20191116 333) ((cl-lib (0 5))) "cd to frequent directory in eshell" tar ((:commit . "337cb241e17bd472bd3677ff166a0800f684213c") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainers ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me") (:keywords "convenience") (:url . "https://github.com/xuchunyang/eshell-z"))]) - (eslint-disable-rule . [(20220811 1006) ((emacs (27 2))) "Commands to add JS comments disabling eslint rules" tar ((:commit . "642ead124172dd470e8ab59fd0645597dc9d8e66") (:url . "https://github.com/DamienCassou/eslint-disable-rule"))]) + (eslint-disable-rule . [(20230904 1821) ((emacs (27 2))) "Commands to add JS comments disabling eslint rules" tar ((:commit . "54771405e09e2cf5cb8f47aab2818e77d3046f53") (:url . "https://github.com/DamienCassou/eslint-disable-rule"))]) (eslint-fix . [(20211005 221) nil "Fix JavaScript files using ESLint" tar ((:commit . "636bf8d8797bdd58f1b543c9d3f4910e3ce879ab") (:authors ("Neri Marschik" . "marschik_neri@cyberagent.co.jp")) (:maintainers ("Neri Marschik" . "marschik_neri@cyberagent.co.jp")) (:maintainer "Neri Marschik" . "marschik_neri@cyberagent.co.jp") (:keywords "tools" "javascript" "eslint" "lint" "formatting" "style") (:url . "https://github.com/codesuki/eslint-fix"))]) (eslint-rc . [(20220328 800) ((emacs (24 3)) (eslint-fix (0 1 0))) "Use local rc rules with ESLint" tar ((:commit . "eb6f3e715792952bc957d5dc8ab1a607f3dbbd55") (:authors ("Joel Bryan Juliano ")) (:maintainers ("Joel Bryan Juliano ")) (:maintainer "Joel Bryan Juliano ") (:keywords "convenience" "edit" "js" "ts" "rc" "eslintrc" "eslint-rc" "eslint" "eslint-fix") (:url . "https://github.com/jjuliano/eslint-rc-emacs"))]) - (eslintd-fix . [(20210731 1649) ((dash (2 12 0)) (emacs (26 3))) "use eslint_d to automatically fix js files" tar ((:commit . "3897d8a679a6e98e3f5054aaefe07f6b55f8f128") (:authors ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainers ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainer "Aaron Jensen" . "aaronjensen@gmail.com") (:url . "https://github.com/aaronjensen/eslintd-fix"))]) + (eslintd-fix . [(20240224 1517) ((dash (2 12 0)) (emacs (26 3))) "use eslint_d to automatically fix js files" tar ((:commit . "99665b66686cc5974499cec4aff1e29faef1c028") (:authors ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainers ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainer "Aaron Jensen" . "aaronjensen@gmail.com") (:url . "https://github.com/aaronjensen/eslintd-fix"))]) (esmond-theme . [(20230526 124) nil "Esmond dark theme" tar ((:commit . "22b414599fbda46f90a210e846ca64b8427dd3f2") (:authors ("Çağan Korkmaz" . "cagankorkmaz35@gmail.com")) (:maintainers ("Çağan Korkmaz" . "cagankorkmaz35@gmail.com")) (:maintainer "Çağan Korkmaz" . "cagankorkmaz35@gmail.com") (:url . "https://github.com/xcatalyst/esmond-theme"))]) (esonify . [(20190110 1621) ((deferred (0 3 1)) (cl-lib (0 5))) "Sonify your code" tar ((:commit . "bdc79d4ab2e3c449b5bef46e5cabc552beeed5c6") (:authors ("Oliver Flatt" . "oflatt@gmail.com")) (:maintainers ("Oliver Flatt" . "oflatt@gmail.com")) (:maintainer "Oliver Flatt" . "oflatt@gmail.com") (:url . "https://github.com/oflatt/esonify"))]) (espotify . [(20220121 2057) ((emacs (26 1))) "Spotify access library" tar ((:commit . "ea6d6021e5acc550560325db2f09198839ee702f") (:authors ("Jose A Ortega Ruiz" . "jao@gnu.org")) (:maintainers ("Jose A Ortega Ruiz")) (:maintainer "Jose A Ortega Ruiz") (:keywords "multimedia") (:url . "https://codeberg.org/jao/espotify"))]) @@ -1435,13 +1483,13 @@ (espy . [(20200317 2333) ((emacs (24))) "Emacs Simple Password Yielder" tar ((:commit . "2c01be937a5e5bde62921684a0b27300705fb4e0") (:authors ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainers ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainer "Sebastian Wålinder" . "s.walinder@gmail.com") (:keywords "convenience") (:url . "https://github.com/walseb/espy"))]) (esqlite . [(20151206 1206) ((pcsv (1 3 3))) "Manipulate sqlite file from Emacs" tar ((:commit . "fae9826cbc255b0f0686a801288f1441bda5f631") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "data") (:url . "https://github.com/mhayashi1120/Emacs-esqlite"))]) (esqlite-helm . [(20151116 850) ((esqlite (0 2 0)) (helm (20131207 845))) "Define helm source for sqlite database" tar ((:commit . "84d5b16198f30949c544affba751ee0d58a000d9") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "data") (:url . "https://github.com/mhayashi1120/Emacs-esqlite"))]) - (ess . [(20230807 1422) ((emacs (25 1))) "Emacs Speaks Statistics" tar ((:commit . "d8914196ceb2061d850cc899aed79342519972ff") (:authors ("David Smith" . "dsmith@stats.adelaide.edu.au") ("A.J. Rossini" . "blindglobe@gmail.com") ("Richard M. Heiberger" . "rmh@temple.edu") ("Kurt Hornik" . "Kurt.Hornik@R-project.org") ("Martin Maechler" . "maechler@stat.math.ethz.ch") ("Rodney A. Sparapani" . "rsparapa@mcw.edu") ("Stephen Eglen" . "stephen@gnu.org") ("Sebastian P. Luque" . "spluque@gmail.com") ("Henning Redestig" . "henning.red@googlemail.com") ("Vitalie Spinu" . "spinuvit@gmail.com") ("Lionel Henry" . "lionel.hry@gmail.com") ("J. Alexander Branham" . "alex.branham@gmail.com")) (:maintainers ("ESS Core Team" . "ESS-core@r-project.org")) (:maintainer "ESS Core Team" . "ESS-core@r-project.org") (:url . "https://ess.r-project.org/"))]) + (ess . [(20240229 2054) ((emacs (25 1))) "Emacs Speaks Statistics" tar ((:commit . "cf237253049583a547bafc16edb9eb9a52e1ebf6") (:authors ("David Smith" . "dsmith@stats.adelaide.edu.au") ("A.J. Rossini" . "blindglobe@gmail.com") ("Richard M. Heiberger" . "rmh@temple.edu") ("Kurt Hornik" . "Kurt.Hornik@R-project.org") ("Martin Maechler" . "maechler@stat.math.ethz.ch") ("Rodney A. Sparapani" . "rsparapa@mcw.edu") ("Stephen Eglen" . "stephen@gnu.org") ("Sebastian P. Luque" . "spluque@gmail.com") ("Henning Redestig" . "henning.red@googlemail.com") ("Vitalie Spinu" . "spinuvit@gmail.com") ("Lionel Henry" . "lionel.hry@gmail.com") ("J. Alexander Branham" . "alex.branham@gmail.com")) (:maintainers ("ESS Core Team" . "ESS-core@r-project.org")) (:maintainer "ESS Core Team" . "ESS-core@r-project.org") (:url . "https://ess.r-project.org/"))]) (ess-R-data-view . [(20130509 1158) ((ctable (20130313 1743)) (popup (20130324 1305)) (ess (20130225 1754))) "Data viewer for GNU R" tar ((:commit . "d6e98d3ae1e2a2ea39a56eebcdb73e99d29562e9") (:authors ("myuhe ")) (:maintainers ("myuhe")) (:maintainer "myuhe") (:keywords "convenience") (:url . "https://github.com/myuhe/ess-R-data-view.el"))]) (ess-r-insert-obj . [(20220610 1406) ((emacs (26 1)) (ess (18 10 1))) "Insert objects in ESS-R" tar ((:commit . "2ded9c23d0af2a7f6c0e02f9ea4af0e5b3cb7fb4") (:authors ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainers ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainer "Shuguang Sun" . "shuguang79@qq.com") (:keywords "tools") (:url . "https://github.com/ShuguangSun/ess-r-insert-obj"))]) (ess-smart-equals . [(20210411 1333) ((emacs (25 1)) (ess (18 10))) "flexible, context-sensitive assignment key for R/S" tar ((:commit . "fea9eea4b59c3e9559b379508e3500076ca99ef1") (:authors ("Christopher R. Genovese" . "genovese@cmu.edu")) (:maintainers ("Christopher R. Genovese" . "genovese@cmu.edu")) (:maintainer "Christopher R. Genovese" . "genovese@cmu.edu") (:keywords "r" "s" "ess" "convenience") (:url . "https://github.com/genovese/ess-smart-equals"))]) (ess-smart-underscore . [(20190309 101) ((ess (0))) "Ess Smart Underscore" tar ((:commit . "aa871c5b0448515db439ea9bed6a8574e82ddb47") (:authors ("Matthew L. Fidler")) (:maintainers ("Matthew Fidler")) (:maintainer "Matthew Fidler") (:keywords "ess" "underscore") (:url . "http://github.com/mlf176f2/ess-smart-underscore.el"))]) (ess-view . [(20181001 1730) ((ess (15)) (s (1 8 0)) (f (0 16 0))) "View R dataframes in a spreadsheet software" tar ((:commit . "d4e5a340b7bcc58c434867b97923094bd0680283") (:authors ("Bocci Gionata" . "boccigionata@gmail.com")) (:maintainers ("Bocci Gionata" . "boccigionata@gmail.com")) (:maintainer "Bocci Gionata" . "boccigionata@gmail.com") (:keywords "extensions" "ess") (:url . "https://github.com/GioBo/ess-view"))]) - (ess-view-data . [(20230503 643) ((emacs (26 1)) (ess (18 10 1)) (csv-mode (1 12))) "View Data" tar ((:commit . "c0b20e503c772eebbef6bbc6c89a707ba6ec42ec") (:authors ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainers ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainer "Shuguang Sun" . "shuguang79@qq.com") (:keywords "tools") (:url . "https://github.com/ShuguangSun/ess-view-data"))]) + (ess-view-data . [(20240127 1701) ((emacs (26 1)) (ess (18 10 1)) (csv-mode (1 12))) "View Data" tar ((:commit . "c077741bc3386a469635ca7438db4cf58b7541b9") (:authors ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainers ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainer "Shuguang Sun" . "shuguang79@qq.com") (:keywords "tools") (:url . "https://github.com/ShuguangSun/ess-view-data"))]) (esup . [(20220202 2335) ((cl-lib (0 5)) (s (1 2)) (emacs (25 1))) "The Emacs StartUp Profiler (ESUP)" tar ((:commit . "4b49c8d599d4cc0fbf994e9e54a9c78e5ab62a5f") (:authors ("Joe Schafer" . "joe@jschaf.com")) (:maintainers ("Serghei Iakovlev" . "egrep@protonmail.ch")) (:maintainer "Serghei Iakovlev" . "egrep@protonmail.ch") (:keywords "convenience" "processes") (:url . "https://github.com/jschaf/esup"))]) (esxml . [(20230308 2254) ((emacs (24 1)) (kv (0 0 5)) (cl-lib (0 5))) "Library for working with xml via esxml and sxml" tar ((:commit . "225693096a587492d76bf696d1f0c25c61f7d531") (:authors ("Vanya Izaksonas-Smith ")) (:maintainer "Vanya Izaksonas-Smith") (:keywords "tools" "lisp" "comm") (:url . "https://github.com/tali713/esxml"))]) (eta . [(20210115 1655) ((emacs (25 1)) (ht (2 2)) (dash (2 17))) "standard and multi dispatch key bind" tar ((:commit . "651f96c46eeb7ff8a0f0efcfacad5b4d25bfaa4b") (:authors ("Chris Zheng")) (:maintainers ("Chris Zheng")) (:maintainer "Chris Zheng") (:keywords "convenience" "usability") (:url . "https://www.github.com/zcaudate/eta"))]) @@ -1460,20 +1508,20 @@ (evalator-clojure . [(20160208 2148) ((cider (0 10 0)) (evalator (1 0 0))) "Clojure evaluation context for evalator via CIDER." tar ((:commit . "caa4e0a137bdfada86593128a654e16aa617ad50") (:authors ("Sean Irby")) (:maintainers ("Sean Irby" . "sean.t.irby@gmail.com")) (:maintainer "Sean Irby" . "sean.t.irby@gmail.com") (:keywords "languages" "clojure" "cider" "helm") (:url . "http://www.github.com/seanirby/evalator-clojure"))]) (eve-mode . [(20170822 2231) ((emacs (25)) (polymode (1 0)) (markdown-mode (2 0))) "Major mode for editing Eve documents." tar ((:commit . "a4661114d9c18725691b76321d72167ca5a9070a") (:authors ("Joshua Cole" . "joshuafcole@gmail.com")) (:maintainers ("Joshua Cole" . "joshuafcole@gmail.com")) (:maintainer "Joshua Cole" . "joshuafcole@gmail.com") (:keywords "languages" "wp" "tools") (:url . "https://github.com/witheve/emacs-eve-mode"))]) (everlasting-scratch . [(20230105 507) ((emacs (25 1))) "The *scratch* that lasts forever" tar ((:commit . "1b7dac779501dcd988552aa6455a5be89e8b0562") (:authors ("Huming Chen" . "chenhuming@gmail.com")) (:maintainers ("Huming Chen" . "chenhuming@gmail.com")) (:maintainer "Huming Chen" . "chenhuming@gmail.com") (:keywords "convenience" "tool") (:url . "https://github.com/beacoder/everlasting-scratch"))]) - (evil . [(20230828 1342) ((emacs (24 1)) (goto-chg (1 6)) (cl-lib (0 5))) "Extensible Vi layer for Emacs." tar ((:commit . "d6d2e5d2b170eb0ab3bec488868702009a0ee3b6") (:maintainer "Tom Dalziel" . "tom.dalziel@gmail.com") (:keywords "emulations") (:url . "https://github.com/emacs-evil/evil"))]) + (evil . [(20240222 652) ((emacs (24 1)) (goto-chg (1 6)) (cl-lib (0 5))) "Extensible Vi layer for Emacs." tar ((:commit . "a7ffa73bbdc523c0e473d79c0ded7c6457bcb65c") (:maintainer "Tom Dalziel" . "tom.dalziel@gmail.com") (:keywords "emulations") (:url . "https://github.com/emacs-evil/evil"))]) (evil-anzu . [(20220911 1939) ((evil (1 0 0)) (anzu (0 46))) "anzu for evil-mode" tar ((:commit . "d1e98ee6976437164627542909a25c6946497899") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com") ("Fredrik Bergroth" . "fbergroth@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-evil-anzu"))]) - (evil-args . [(20220125 1626) ((evil (1 0 8))) "Motions and text objects for delimited arguments in Evil." tar ((:commit . "2671071a4a57eaee7cc8c27b9e4b6fc60fd2ccd3") (:authors ("Connor Smith" . "wconnorsmith@gmail.com")) (:maintainers ("Connor Smith" . "wconnorsmith@gmail.com")) (:maintainer "Connor Smith" . "wconnorsmith@gmail.com") (:keywords "evil" "vim-emulation") (:url . "http://github.com/wcsmith/evil-args"))]) + (evil-args . [(20240210 504) ((evil (1 0 8))) "Motions and text objects for delimited arguments in Evil." tar ((:commit . "a8151556f63c9d45d0c44c8a7ef9e5a542f3cdc7") (:authors ("Connor Smith" . "wconnorsmith@gmail.com")) (:maintainers ("Connor Smith" . "wconnorsmith@gmail.com")) (:maintainer "Connor Smith" . "wconnorsmith@gmail.com") (:keywords "evil" "vim-emulation") (:url . "http://github.com/wcsmith/evil-args"))]) (evil-avy . [(20150908 748) ((emacs (24 1)) (cl-lib (0 5)) (avy (0 3 0)) (evil (1 2 3))) "set-based completion" tar ((:commit . "2dd955cc3ecaa7ddeb67b295298abdc6d16dd3a5") (:authors ("Yufan Lou" . "loganlyf@gmail.com")) (:maintainers ("Yufan Lou" . "loganlyf@gmail.com")) (:maintainer "Yufan Lou" . "loganlyf@gmail.com") (:keywords "point" "location" "evil" "vim") (:url . "https://github.com/louy2/evil-avy"))]) (evil-better-visual-line . [(20200123 2045) ((evil (1 2 13))) "gj and gk visual line mode fix" tar ((:commit . "7a65dfb17ab93857eb4c7a39d4018d9399705293") (:authors ("")) (:maintainers ("")) (:maintainer "") (:keywords "evil" "vim" "motion") (:url . "https://github.com/yourfin/evil-better-visual-line"))]) - (evil-cleverparens . [(20230529 2117) ((evil (1 0)) (paredit (1)) (smartparens (1 6 1)) (emacs (24 4)) (dash (2 12 0))) "Evil friendly minor-mode for editing lisp." tar ((:commit . "9ee249509281c387500e397df625ccb759804df4") (:authors ("Olli Piepponen" . "opieppo@gmail.com")) (:maintainers ("Olli Piepponen" . "opieppo@gmail.com")) (:maintainer "Olli Piepponen" . "opieppo@gmail.com") (:keywords "convenience" "emulations") (:url . "https://github.com/emacs-evil/evil-cleverparens"))]) + (evil-cleverparens . [(20240308 751) ((evil (1 0)) (paredit (1)) (smartparens (1 6 1)) (emacs (24 4)) (dash (2 12 0))) "Evil friendly minor-mode for editing lisp." tar ((:commit . "aa19ed6fec73c883442fb4ffd8d300355d5a8580") (:authors ("Olli Piepponen" . "opieppo@gmail.com")) (:maintainers ("Olli Piepponen" . "opieppo@gmail.com")) (:maintainer "Olli Piepponen" . "opieppo@gmail.com") (:keywords "convenience" "emulations") (:url . "https://github.com/emacs-evil/evil-cleverparens"))]) (evil-colemak-basics . [(20221230 1443) ((emacs (24 3)) (evil (1 2 12)) (evil-snipe (2 0 3))) "Basic Colemak key bindings for evil-mode" tar ((:commit . "ea519b962f051cabced8aadaf6ed0134b861225c") (:authors ("Wouter Bolsterlee" . "wouter@bolsterl.ee")) (:maintainers ("Wouter Bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "Wouter Bolsterlee" . "wouter@bolsterl.ee") (:keywords "convenience" "emulations" "colemak" "evil") (:url . "https://github.com/wbolster/evil-colemak-basics"))]) (evil-colemak-minimal . [(20171006 1317) ((emacs (24)) (evil (1 2 12))) "Minimal Colemak key bindings for evil-mode" tar ((:commit . "6d98b6da60f414524a0d718f76024c26dce742b3") (:authors ("Bryan Allred" . "bryan@revolvingcow.com")) (:maintainers ("Bryan Allred" . "bryan@revolvingcow.com")) (:maintainer "Bryan Allred" . "bryan@revolvingcow.com") (:keywords "colemak" "evil") (:url . "https://github.com/bmallred/evil-colemak-minimal"))]) - (evil-collection . [(20230828 1555) ((emacs (26 3)) (evil (1 2 13)) (annalist (1 0))) "A set of keybindings for Evil mode" tar ((:commit . "1a8fefc32d79929ad2f280e83df691a6f70a9118") (:authors ("James Nguyen" . "james@jojojames.com")) (:maintainers ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com") (:keywords "evil" "tools") (:url . "https://github.com/emacs-evil/evil-collection"))]) + (evil-collection . [(20240319 1815) ((emacs (26 3)) (evil (1 2 13)) (annalist (1 0))) "A set of keybindings for Evil mode" tar ((:commit . "f1bb4733def5a1b75d3a9d1b4d2226b6fc90407a") (:authors ("James Nguyen" . "james@jojojames.com")) (:maintainers ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com") (:keywords "evil" "tools") (:url . "https://github.com/emacs-evil/evil-collection"))]) (evil-commentary . [(20230610 1006) ((evil (1 0 0))) "Comment stuff out. A port of vim-commentary." tar ((:commit . "c5945f28ce47644c828aac1f5f6ec335478d17fb") (:authors ("Quang Linh LE" . "linktohack@gmail.com")) (:maintainers ("Quang Linh LE" . "linktohack@gmail.com")) (:maintainer "Quang Linh LE" . "linktohack@gmail.com") (:keywords "evil" "comment" "commentary" "evil-commentary") (:url . "http://github.com/linktohack/evil-commentary"))]) (evil-dvorak . [(20160416 1841) ((evil (1 0 8))) "evil keybindings for that work with dvorak mode" tar ((:commit . "e7b80077d6f332452049eb3d7ea51f6c8fbf5947") (:authors ("Joshua Branson")) (:maintainer "Joshua Branson") (:keywords "dvorak" "evil" "vim"))]) (evil-easymotion . [(20200424 135) ((emacs (24)) (avy (0 3 0)) (cl-lib (0 5))) "A port of vim's easymotion to emacs" tar ((:commit . "f96c2ed38ddc07908db7c3c11bcd6285a3e8c2e9") (:authors ("PythonNut" . "pythonnut@pythonnut.com")) (:maintainers ("PythonNut" . "pythonnut@pythonnut.com")) (:maintainer "PythonNut" . "pythonnut@pythonnut.com") (:keywords "convenience" "evil") (:url . "https://github.com/pythonnut/evil-easymotion"))]) (evil-embrace . [(20230820 445) ((emacs (24 4)) (embrace (0 1 0)) (evil-surround (0))) "Evil integration of embrace.el" tar ((:commit . "3081d37811b6a3dfaaf01d578c7ab7a746c6064d") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainers ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions"))]) - (evil-escape . [(20221010 2116) ((emacs (24)) (evil (1 0 9)) (cl-lib (0 5))) "Escape from anything with a customizable key sequence" tar ((:commit . "3c335a5709b1abb08687960038746b36add465f9") (:authors ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainers ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainer "Sylvain Benner" . "sylvain.benner@gmail.com") (:keywords "convenience" "editing" "evil") (:url . "https://github.com/emacsorphanage/evil-escape"))]) + (evil-escape . [(20231122 2114) ((emacs (26)) (evil (1 14 0)) (cl-lib (0 5))) "Escape from anything with a customizable key sequence" tar ((:commit . "bdb1e69971520cbd65fe61830a1cdea5734d743c") (:authors ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainers ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainer "Sylvain Benner" . "sylvain.benner@gmail.com") (:keywords "convenience" "editing" "evil") (:url . "https://github.com/emacsorphanage/evil-escape"))]) (evil-ex-fasd . [(20180903 612) ((emacs (24 4)) (evil (1 1 0)) (fasd (0))) "using fasd right from evil-ex" tar ((:commit . "ed8fbbe23a8a268d9dcbf1a6132e928ba2c655c5") (:authors ("Rashawn Zhang" . "namy.19@gmail.com")) (:maintainers ("Rashawn Zhang" . "namy.19@gmail.com")) (:maintainer "Rashawn Zhang" . "namy.19@gmail.com") (:keywords "tools" "fasd" "evil" "navigation") (:url . "https://github.com/yqrashawn/evil-ex-fasd"))]) (evil-ex-shell-command . [(20181226 226) ((emacs (24 4)) (evil (1 1 0))) "invoke shell-command right from evil-ex" tar ((:commit . "a6ca6d27c07f6a0807abfb5b8f8865f1d17f54aa") (:authors ("Rashawn Zhang" . "namy.19@gmail.com")) (:maintainers ("Rashawn Zhang" . "namy.19@gmail.com")) (:maintainer "Rashawn Zhang" . "namy.19@gmail.com") (:keywords "tools" "shell-command" "evil") (:url . "https://github.com/yqrashawn/evil-ex-shell-command"))]) (evil-exchange . [(20200118 252) ((evil (1 2 8)) (cl-lib (0 3))) "Exchange text more easily within Evil" tar ((:commit . "3030e21ee16a42dfce7f7cf86147b778b3f5d8c1") (:authors ("Dewdrops" . "v_v_4474@126.com")) (:maintainers ("Dewdrops" . "v_v_4474@126.com")) (:maintainer "Dewdrops" . "v_v_4474@126.com") (:keywords "evil" "plugin") (:url . "http://github.com/Dewdrops/evil-exchange"))]) @@ -1482,17 +1530,17 @@ (evil-find-char-pinyin . [(20160514 2041) ((evil (1 2 12)) (pinyinlib (0 1 0))) "Evil's f/F/t/T/evil-snipe commands with Pinyin support" tar ((:commit . "04e277946d658f1a73c68dcbbadea9c21097a31c") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainers ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions"))]) (evil-fringe-mark . [(20190320 453) ((emacs (24 3)) (evil (1 0 0)) (fringe-helper (0 1 1)) (goto-chg (1 6))) "Display evil-mode marks in the fringe" tar ((:commit . "a1689fddb7ee79aaa720a77aada1208b8afd5c20") (:authors ("Andrew Smith" . "andy.bill.smith@gmail.com")) (:maintainers ("Andrew Smith" . "andy.bill.smith@gmail.com")) (:maintainer "Andrew Smith" . "andy.bill.smith@gmail.com") (:url . "https://github.com/Andrew-William-Smith/evil-fringe-mark"))]) (evil-god-state . [(20141117 255) ((evil (1 0 8)) (god-mode (2 12 0))) "use god-mode keybindings in evil-mode" tar ((:commit . "3d44197dc0a1fb40e7b7ff8717f8a8c339ce1d40") (:authors ("Eric Seidel")) (:maintainers ("Eric Seidel")) (:maintainer "Eric Seidel") (:keywords "evil" "leader" "god-mode") (:url . "https://github.com/gridaphobe/evil-god-state"))]) - (evil-goggles . [(20230630 754) ((emacs (24 4)) (evil (1 0 0))) "Add a visual hint to evil operations" tar ((:commit . "0070c9d8447e1696f8713d0c13ff64ef0979d580") (:authors ("edkolev" . "evgenysw@gmail.com")) (:maintainers ("edkolev" . "evgenysw@gmail.com")) (:maintainer "edkolev" . "evgenysw@gmail.com") (:keywords "emulations" "evil" "vim" "visual") (:url . "http://github.com/edkolev/evil-goggles"))]) + (evil-goggles . [(20231021 738) ((emacs (24 4)) (evil (1 0 0))) "Add a visual hint to evil operations" tar ((:commit . "34ca276a85f615d2b45e714c9f8b5875bcb676f3") (:authors ("edkolev" . "evgenysw@gmail.com")) (:maintainers ("edkolev" . "evgenysw@gmail.com")) (:maintainer "edkolev" . "evgenysw@gmail.com") (:keywords "emulations" "evil" "vim" "visual") (:url . "http://github.com/edkolev/evil-goggles"))]) (evil-iedit-state . [(20220219 1432) ((evil (1 0 9)) (iedit (0 9 9 9))) "Evil states to interface iedit mode." tar ((:commit . "44c64c71692e5b2f608ad3e3c537ec0a0e0ea0f8") (:authors ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainers ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainer "Sylvain Benner" . "sylvain.benner@gmail.com") (:keywords "convenience" "editing" "evil" "iedit" "mnemonic") (:url . "https://github.com/syl20bnr/evil-iedit-state"))]) - (evil-indent-plus . [(20220106 931) ((evil (0)) (cl-lib (0 5))) "Evil textobjects based on indentation" tar ((:commit . "b4dacbfdb57f474f798bfbf5026d434d549eb65c") (:authors ("Eivind Fonn" . "evfonn@gmail.com")) (:maintainers ("Eivind Fonn" . "evfonn@gmail.com")) (:maintainer "Eivind Fonn" . "evfonn@gmail.com") (:keywords "convenience" "evil") (:url . "http://github.com/TheBB/evil-indent-plus"))]) + (evil-indent-plus . [(20230927 1513) ((evil (0)) (cl-lib (0 5))) "Evil textobjects based on indentation" tar ((:commit . "f392696e4813f1d3a92c7eeed333248914ba6dae") (:authors ("Eivind Fonn" . "evfonn@gmail.com")) (:maintainers ("Eivind Fonn" . "evfonn@gmail.com")) (:maintainer "Eivind Fonn" . "evfonn@gmail.com") (:keywords "convenience" "evil") (:url . "http://github.com/TheBB/evil-indent-plus"))]) (evil-indent-textobject . [(20130831 2219) ((evil (0))) "evil textobjects based on indentation" tar ((:commit . "70a1154a531b7cfdbb9a31d6922482791e20a3a7") (:authors ("Michael Markert" . "markert.michael@gmail.com")) (:maintainers ("Michael Markert" . "markert.michael@gmail.com")) (:maintainer "Michael Markert" . "markert.michael@gmail.com") (:keywords "convenience" "evil") (:url . "http://github.com/cofi/evil-indent-textobject"))]) (evil-leader . [(20140606 1243) ((evil (0))) "let there be " tar ((:commit . "39f7014bcf8b36463e0c7512c638bda4bac6c2cf") (:authors ("Michael Markert" . "markert.michael@googlemail.com")) (:maintainers ("Michael Markert" . "markert.michael@googlemail.com")) (:maintainer "Michael Markert" . "markert.michael@googlemail.com") (:keywords "evil" "vim-emulation" "leader") (:url . "http://github.com/cofi/evil-leader"))]) (evil-ledger . [(20180802 1612) ((emacs (24 4)) (evil (1 2 12)) (ledger-mode (0))) "Make `ledger-mode' more `evil'." tar ((:commit . "7a9f9f5d39c42fffdba8004f8982642351f2b233") (:authors ("Aaron Jacobs" . "atheriel@gmail.com")) (:maintainers ("Aaron Jacobs" . "atheriel@gmail.com")) (:maintainer "Aaron Jacobs" . "atheriel@gmail.com") (:keywords "convenience" "evil" "languages" "ledger" "vim-emulation") (:url . "https://github.com/atheriel/evil-ledger"))]) (evil-lion . [(20220317 1030) ((emacs (24 3)) (evil (1 0 0))) "Evil align operator, port of vim-lion" tar ((:commit . "4da660e124731ed65e7aaa6c067c30e876619429") (:authors ("edkolev" . "evgenysw@gmail.com")) (:maintainers ("edkolev" . "evgenysw@gmail.com")) (:maintainer "edkolev" . "evgenysw@gmail.com") (:keywords "emulations" "evil" "vim") (:url . "http://github.com/edkolev/evil-lion"))]) (evil-lisp-state . [(20160404 248) ((evil (1 0 9)) (bind-map (0)) (smartparens (1 6 1))) "An evil state to edit Lisp code" tar ((:commit . "3c65fecd9917a41eaf6460f22187e2323821f3ce") (:authors ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainers ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainer "Sylvain Benner" . "sylvain.benner@gmail.com") (:keywords "convenience" "editing" "evil" "smartparens" "lisp" "mnemonic") (:url . "https://github.com/syl20bnr/evil-lisp-state"))]) (evil-lispy . [(20190502 739) ((lispy (0 26 0)) (evil (1 2 12)) (hydra (0 13 5))) "precision Lisp editing with Evil and Lispy" tar ((:commit . "ed317f7fccbdbeea8aa04a91b1b1f48a0e2ddc4e") (:authors ("Brandon Carrell , Mika Vilpas" . "mika.vilpas@gmail.com")) (:maintainers ("Brandon Carrell , Mika Vilpas" . "mika.vilpas@gmail.com")) (:maintainer "Brandon Carrell , Mika Vilpas" . "mika.vilpas@gmail.com") (:keywords "lisp") (:url . "https://github.com/sp3ctum/evil-lispy"))]) - (evil-mark-replace . [(20200630 940) ((evil (1 14 0))) "replace the thing in marked area" tar ((:commit . "d4fec7b10e93cca149163324cd2b2b2dcc211047") (:authors ("Chen Bin ")) (:maintainers ("Chen Bin ")) (:maintainer "Chen Bin ") (:keywords "convenience") (:url . "http://github.com/redguardtoo/evil-mark-replace"))]) - (evil-matchit . [(20230625 302) ((emacs (25 1))) "Vim matchit ported to Evil" tar ((:commit . "f27b2a87bab75e3b8a87c277049a4363cdfcbf61") (:authors ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainers ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainer "Chen Bin" . "chenbin.sh@gmail.com") (:keywords "matchit" "vim" "evil") (:url . "http://github.com/redguardtoo/evil-matchit"))]) + (evil-mark-replace . [(20240303 1416) ((evil (1 14 0))) "replace the thing in marked area" tar ((:commit . "217d5b507aa11dd0b334d5c3e1f74ac1fc2f66a4") (:authors ("Chen Bin ")) (:maintainers ("Chen Bin ")) (:maintainer "Chen Bin ") (:keywords "convenience") (:url . "http://github.com/redguardtoo/evil-mark-replace"))]) + (evil-matchit . [(20240216 1304) ((emacs (25 1))) "Vim matchit ported to Evil" tar ((:commit . "1c4fefa9bb11cc4b1d7f10614d2021c12ed12e89") (:authors ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainers ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainer "Chen Bin" . "chenbin.sh@gmail.com") (:keywords "matchit" "vim" "evil") (:url . "http://github.com/redguardtoo/evil-matchit"))]) (evil-mc . [(20230529 210) ((emacs (24 3)) (evil (1 2 14)) (cl-lib (0 5))) "Multiple cursors for evil-mode" tar ((:commit . "bdf893ea6f52fd0f10bece8ddae813658e17bbb4") (:authors ("Gabriel Adomnicai" . "gabesoft@gmail.com")) (:maintainers ("Gabriel Adomnicai" . "gabesoft@gmail.com")) (:maintainer "Gabriel Adomnicai" . "gabesoft@gmail.com") (:keywords "evil" "editing" "multiple-cursors" "vim" "evil-multiple-cursors" "evil-mc" "evil-mc") (:url . "https://github.com/gabesoft/evil-mc"))]) (evil-mc-extras . [(20170202 1649) ((emacs (24 3)) (evil (1 2 12)) (cl-lib (0 5)) (evil-mc (0 0 2)) (evil-numbers (0 4))) "Extra functionality for evil-mc" tar ((:commit . "ba3252ae129c3b79aeb70ec3d276cbda32b00421") (:authors ("Gabriel Adomnicai" . "gabesoft@gmail.com")) (:maintainers ("Gabriel Adomnicai" . "gabesoft@gmail.com")) (:maintainer "Gabriel Adomnicai" . "gabesoft@gmail.com") (:keywords "evil" "editing" "multiple-cursors" "vim" "evil-multiple-cursors" "evil-mc" "evil-mc-extras") (:url . "https://github.com/gabesoft/evil-mc-extras"))]) (evil-mu4e . [(20180613 1039) ((emacs (24 4)) (evil (1 2 10))) "evil-based key bindings for mu4e" tar ((:commit . "f4b387ccbd2c49f3bbb5401e93bfcc050ca128ef") (:authors ("Joris Engbers" . "info@jorisengbers.nl")) (:maintainers ("Joris Engbers" . "info@jorisengbers.nl")) (:maintainer "Joris Engbers" . "info@jorisengbers.nl") (:url . "https://github.com/JorisE/evil-mu4e"))]) @@ -1504,7 +1552,7 @@ (evil-org . [(20221001 2335) ((emacs (24 4)) (evil (1 0))) "evil keybindings for org-mode" tar ((:commit . "b1f309726b1326e1a103742524ec331789f2bf94") (:maintainers ("Somelauw")) (:maintainer "Somelauw") (:keywords "evil" "vim-emulation" "org-mode" "key-bindings" "presets") (:url . "https://github.com/Somelauw/evil-org-mode.git"))]) (evil-owl . [(20210416 1700) ((emacs (25 1)) (evil (1 2 13))) "Preview evil registers and marks before using them" tar ((:commit . "a41a6d28e26052b25f3d21da37ccf1d8fde1e6aa") (:authors ("Daniel Phan" . "daniel.phan36@gmail.com")) (:maintainers ("Daniel Phan" . "daniel.phan36@gmail.com")) (:maintainer "Daniel Phan" . "daniel.phan36@gmail.com") (:keywords "emulations" "evil" "visual") (:url . "https://github.com/mamapanda/evil-owl"))]) (evil-paredit . [(20150413 2048) ((evil (1 0 9)) (paredit (25 -2))) "Paredit support for evil keybindings" tar ((:commit . "e058fbdcf9dbf7ad6cc77f0172d7517ef233d55f") (:authors ("Roman Gonzalez" . "romanandreg@gmail.com")) (:maintainers ("Roman Gonzalez" . "romanandreg@gmail.com")) (:maintainer "Roman Gonzalez" . "romanandreg@gmail.com") (:keywords "paredit" "evil") (:url . "https://github.com/roman/evil-paredit"))]) - (evil-pinyin . [(20200927 849) ((emacs (25)) (names (0 5)) (evil (1))) "Evil search Chinese characters by pinyin" tar ((:commit . "3e9e501ded86f88e01a4edec5d526ab0fab879d7") (:keywords "extensions") (:url . "https://github.com/laishulu/evil-pinyin"))]) + (evil-pinyin . [(20231016 1558) ((emacs (25)) (names (0 5)) (evil (1))) "Evil search Chinese characters by pinyin" tar ((:commit . "0fae5ad8761417f027b33230382a50f826ad3bfb") (:keywords "extensions") (:url . "https://github.com/laishulu/evil-pinyin"))]) (evil-python-movement . [(20180724 1420) ((emacs (25 1)) (cl-lib (0 5)) (dash (2 13 0)) (evil (1 0)) (s (1 12 0))) "Port Neovim's python movement to Evil" tar ((:commit . "9936b3b7f8d96415d517c1f3604637889484a637") (:authors ("Felipe Lema ")) (:maintainers ("Felipe Lema ")) (:maintainer "Felipe Lema ") (:url . "https://bitbucket.org/FelipeLema/evil-python-movement.el/"))]) (evil-quickscope . [(20160202 1924) ((evil (0))) "Highlight unique characters in words for f,F,t,T navigation" tar ((:commit . "37a20e4c56c6058abf186ad4013c155e695e876f") (:authors ("Michael Chen" . "blorbx@gmail.com")) (:maintainers ("Michael Chen" . "blorbx@gmail.com")) (:maintainer "Michael Chen" . "blorbx@gmail.com") (:keywords "faces" "emulation" "vim" "evil") (:url . "http://github.com/blorbx/evil-quickscope"))]) (evil-rails . [(20190512 1517) ((evil (1 0)) (projectile-rails (1 0))) "Rails support for Evil Mode" tar ((:commit . "b0f1c5de6720714febeb76c4b569b71bb891938c") (:authors ("Antono Vasiljev" . "antono.vasiljev@gmail.com")) (:maintainers ("Antono Vasiljev" . "antono.vasiljev@gmail.com")) (:maintainer "Antono Vasiljev" . "antono.vasiljev@gmail.com") (:keywords "ruby" "rails" "vim" "project" "convenience" "web" "evil" "projectile") (:url . "https://github.com/antono/evil-rails"))]) @@ -1517,10 +1565,10 @@ (evil-snipe . [(20230821 1602) ((emacs (24 4)) (evil (1 2 12)) (cl-lib (0 5))) "emulate vim-sneak & vim-seek" tar ((:commit . "c2108d3932fcd2f75ac3e48250d6badd668f5b4f") (:authors ("Henrik Lissner ")) (:maintainers ("Henrik Lissner" . "contact@henrik.io")) (:maintainer "Henrik Lissner" . "contact@henrik.io") (:keywords "emulation" "vim" "evil" "sneak" "seek") (:url . "https://github.com/hlissner/evil-snipe"))]) (evil-space . [(20151208 1228) ((evil (1 0 0))) "Repeat motion in Evil. Correct the behaviour of what SPC should do." tar ((:commit . "a9c07284d308425deee134c9d88a2d538dd229e6") (:authors ("Quang Linh LE" . "linktohack@gmail.com")) (:maintainers ("Quang Linh LE" . "linktohack@gmail.com")) (:maintainer "Quang Linh LE" . "linktohack@gmail.com") (:keywords "space" "repeat" "motion") (:url . "http://github.com/linktohack/evil-space"))]) (evil-string-inflection . [(20200524 1402) ((emacs (24)) (evil (1 2 13)) (string-inflection (1 0 6))) "snake_case -> CamelCase -> etc. for text objects" tar ((:commit . "d22a90ab807afa7f27f3815b5b5ea47d52d05218") (:authors ("Filipe Silva" . "filipe.silva@gmail.com")) (:maintainers ("Filipe Silva" . "filipe.silva@gmail.com")) (:maintainer "Filipe Silva" . "filipe.silva@gmail.com") (:url . "https://github.com/ninrod/evil-string-inflection"))]) - (evil-surround . [(20230819 836) ((evil (1 2 12))) "emulate surround.vim from Vim" tar ((:commit . "8fad8540c490d94a820004f227552ca08e3e3857") (:authors ("Tim Harper ") ("Vegard Øye ")) (:maintainers ("Tom Dalziel" . "tom.dalziel@gmail.com")) (:maintainer "Tom Dalziel" . "tom.dalziel@gmail.com") (:keywords "emulation" "vi" "evil"))]) + (evil-surround . [(20230917 1541) ((evil (1 2 12))) "emulate surround.vim from Vim" tar ((:commit . "bd98f7f5492446885dc4c6b0a7579c75c22ac829") (:authors ("Tim Harper ") ("Vegard Øye ")) (:maintainers ("Tom Dalziel" . "tom.dalziel@gmail.com")) (:maintainer "Tom Dalziel" . "tom.dalziel@gmail.com") (:keywords "emulation" "vi" "evil"))]) (evil-swap-keys . [(20191105 1426) ((emacs (24 4))) "Intelligently swap keys on text input with evil" tar ((:commit . "b5ef105499f998b5667da40da30c073229a213ea") (:authors ("Wouter Bolsterlee" . "wouter@bolsterl.ee")) (:maintainers ("Wouter Bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "Wouter Bolsterlee" . "wouter@bolsterl.ee") (:keywords "convenience" "data" "languages" "tools") (:url . "https://github.com/wbolster/evil-swap-keys"))]) (evil-tabs . [(20160217 1520) ((evil (0 0 0)) (elscreen (0 0 0))) "Integrating Vim-style tabs for Evil mode users." tar ((:commit . "53d3314a810017b6056ab6796aef671f5ea1c063") (:authors ("Kris Jenkins" . "krisajenkins@gmail.com")) (:maintainers ("Kris Jenkins" . "krisajenkins@gmail.com")) (:maintainer "Kris Jenkins" . "krisajenkins@gmail.com") (:keywords "evil" "tab" "tabs" "vim") (:url . "https://github.com/krisajenkins/evil-tabs"))]) - (evil-terminal-cursor-changer . [(20230827 118) nil "Change cursor shape and color by evil state in terminal" tar ((:commit . "380de63bbb32dda00434d50f47e187f9cbf89b32") (:authors ("7696122")) (:maintainers ("7696122")) (:maintainer "7696122") (:keywords "evil" "terminal" "cursor") (:url . "https://github.com/7696122/evil-terminal-cursor-changer"))]) + (evil-terminal-cursor-changer . [(20231031 852) nil "Change cursor shape and color by evil state in terminal" tar ((:commit . "2358f3e27d89128361cf80fcfa092fdfe5b52fd8") (:authors ("7696122")) (:maintainers ("7696122")) (:maintainer "7696122") (:keywords "evil" "terminal" "cursor") (:url . "https://github.com/7696122/evil-terminal-cursor-changer"))]) (evil-test-helpers . [(20230820 2246) ((evil (1 15 0))) "unit test helpers for Evil" tar ((:commit . "4beec94d14fc4180c41314edff997dbb9c422a23") (:authors ("Vegard Øye ")) (:maintainers ("Vegard Øye ")) (:maintainer "Vegard Øye "))]) (evil-tex . [(20230715 1752) ((emacs (26 1)) (evil (1 0)) (auctex (11 88))) "Useful features for editing LaTeX in evil-mode" tar ((:commit . "5dd1e852c8fb9e6efa2b748e89786526483e7619") (:keywords "tex" "emulation" "vi" "evil" "wp") (:url . "https://github.com/iyefrat/evil-tex"))]) (evil-text-object-python . [(20191010 1328) ((emacs (25)) (evil (1 2 14)) (dash (2 16 0))) "Python specific evil text objects" tar ((:commit . "39d22fc524f0413763f291267eaab7f4e7984318") (:authors ("Wouter Bolsterlee" . "wouter@bolsterl.ee")) (:maintainers ("Wouter Bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "Wouter Bolsterlee" . "wouter@bolsterl.ee") (:keywords "convenience" "languages" "tools") (:url . "https://github.com/wbolster/evil-text-object-python"))]) @@ -1528,13 +1576,13 @@ (evil-textobj-column . [(20170905 1905) ((names (0 5)) (emacs (24)) (evil (0))) "Provides column text objects." tar ((:commit . "835d7036d0bc9a6e44fc9b7c54ccf2a7c01428cd") (:authors ("Fox Kiester" . "noct@openmailbox.org")) (:maintainers ("Fox Kiester" . "noct@openmailbox.org")) (:maintainer "Fox Kiester" . "noct@openmailbox.org") (:keywords "evil" "column" "text-object") (:url . "https://github.com/noctuid/evil-textobj-column"))]) (evil-textobj-entire . [(20150422 1254) ((emacs (24)) (evil (1 0 0))) "text object for entire lines of buffer for evil" tar ((:commit . "5b3a98f3a69edc3a788f539f6ffef4a0ef5e853d") (:authors ("supermomonga")) (:maintainers ("supermomonga")) (:maintainer "supermomonga") (:keywords "convenience" "emulations") (:url . "https://github.com/supermomonga/evil-textobj-entire"))]) (evil-textobj-line . [(20211101 1429) ((evil (1 0 0))) "Line text object for Evil" tar ((:commit . "9eaf9a5485c2b5c05e16552b34632ca520cd681d") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com"))]) - (evil-textobj-syntax . [(20181210 1213) ((names (0 5)) (emacs (24)) (evil (0))) "Provides syntax text objects." tar ((:commit . "2d9ba8c75c754b409aea7469f46a5cfa52a872f3") (:keywords "evil" "syntax" "highlight" "text-object") (:url . "https://github.com/laishulu/evil-textobj-syntax"))]) - (evil-textobj-tree-sitter . [(20230817 557) ((emacs (25 1))) "Provides evil textobjects using tree-sitter" tar ((:commit . "19979843f5fc437917f9a4dae977f5e6d4793726") (:keywords "evil" "tree-sitter" "text-object" "convenience") (:url . "https://github.com/meain/evil-textobj-tree-sitter"))]) + (evil-textobj-syntax . [(20231119 1633) ((emacs (24)) (evil (0))) "Provides syntax text objects." tar ((:commit . "64252ded690a2e65b71a1c84aa3acd24e704d02f") (:keywords "evil" "syntax" "highlight" "text-object") (:url . "https://github.com/laishulu/evil-textobj-syntax"))]) + (evil-textobj-tree-sitter . [(20240213 522) ((emacs (25 1))) "Provides evil textobjects using tree-sitter" tar ((:commit . "856773515072bdce88c8420f44bc84fbcbf96af4") (:keywords "evil" "tree-sitter" "text-object" "convenience") (:url . "https://github.com/meain/evil-textobj-tree-sitter"))]) (evil-traces . [(20230820 2255) ((emacs (25 1)) (evil (1 2 13))) "Visual hints for `evil-ex'" tar ((:commit . "3b4e08c522d1a4c6f458ab5dc21914fd307333a1") (:authors ("Daniel Phan" . "daniel.phan36@gmail.com")) (:maintainers ("Daniel Phan" . "daniel.phan36@gmail.com")) (:maintainer "Daniel Phan" . "daniel.phan36@gmail.com") (:keywords "emulations" "evil" "visual") (:url . "https://github.com/mamapanda/evil-traces"))]) - (evil-tree-edit . [(20230419 1753) ((emacs (27 1)) (tree-edit (0 1 0)) (tree-sitter (0 15 0)) (evil (1 0 0)) (avy (0 5 0)) (s (0 0 0))) "Evil structural editing for any language!" tar ((:commit . "96631e26d96645172934011abb2a53ab1e5861d4") (:authors ("Ethan Leba" . "ethanleba5@gmail.com")) (:maintainers ("Ethan Leba" . "ethanleba5@gmail.com")) (:maintainer "Ethan Leba" . "ethanleba5@gmail.com") (:url . "https://github.com/ethan-leba/tree-edit"))]) + (evil-tree-edit . [(20231206 1836) ((emacs (29 1)) (tree-edit (0 1 0)) (tree-sitter (0 15 0)) (evil (1 0 0)) (avy (0 5 0)) (s (0 0 0))) "Evil structural editing for any language!" tar ((:commit . "9e3635e3fd0449bf259d42ea29c93e46ef623fe7") (:authors ("Ethan Leba" . "ethanleba5@gmail.com")) (:maintainers ("Ethan Leba" . "ethanleba5@gmail.com")) (:maintainer "Ethan Leba" . "ethanleba5@gmail.com") (:url . "https://github.com/ethan-leba/tree-edit"))]) (evil-tutor . [(20150103 653) ((evil (1 0 9))) "Vimtutor adapted to Evil and wrapped in a major-mode" tar ((:commit . "909273bac88b98a565f1b89bbb13d523b7edce2b") (:authors ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainers ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainer "Sylvain Benner" . "sylvain.benner@gmail.com") (:keywords "convenience" "editing" "evil") (:url . "https://github.com/syl20bnr/evil-tutor"))]) (evil-tutor-ja . [(20160917 132) ((evil (1 0 9)) (evil-tutor (0 1))) "Japanese Vimtutor adapted to Evil and wrapped in a major-mode" tar ((:commit . "06b9ad853a15ce6f2c53c2cf379b9ff358369f2d") (:authors ("Kenji Miyazaki" . "kenjizmyzk@gmail.com")) (:maintainers ("Kenji Miyazaki" . "kenjizmyzk@gmail.com")) (:maintainer "Kenji Miyazaki" . "kenjizmyzk@gmail.com") (:keywords "convenience" "editing" "evil" "japanese") (:url . "https://github.com/kenjimyzk/evil-tutor-ja"))]) - (evil-tutor-sc . [(20230705 656) ((evil (1 0 9)) (evil-tutor (0 1))) "Simplified Chinese tutor for Evil" tar ((:commit . "1a1bc93eeb432159591b6dbe6684068311c89a46") (:authors ("clsty" . "celestial.y@outlook.com")) (:maintainers ("clsty" . "celestial.y@outlook.com")) (:maintainer "clsty" . "celestial.y@outlook.com") (:keywords "convenience" "editing" "evil" "chinese") (:url . "https://github.com/clsty/evil-tutor-sc"))]) + (evil-tutor-sc . [(20240319 233) ((evil (1 0 9)) (evil-tutor (0 1))) "Simplified Chinese tutor for Evil" tar ((:commit . "fcf8a588068c8fe591320d9e7161bf2d09b2e337") (:authors ("clsty" . "celestial.y@outlook.com")) (:maintainers ("clsty" . "celestial.y@outlook.com")) (:maintainer "clsty" . "celestial.y@outlook.com") (:keywords "convenience" "editing" "evil" "chinese") (:url . "https://github.com/clsty/evil-tutor-sc"))]) (evil-vimish-fold . [(20200122 117) ((emacs (24 4)) (evil (1 0 0)) (vimish-fold (0 2 0))) "Integrate vimish-fold with evil" tar ((:commit . "b6e0e6b91b8cd047e80debef1a536d9d49eef31a") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainers ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com") (:url . "https://github.com/alexmurray/evil-vimish-fold"))]) (evil-visual-mark-mode . [(20230202 318) ((evil (1 0 9)) (dash (2 10))) "Display evil marks on buffer" tar ((:commit . "2bbaaae56ae53e68a8bcc7bc2cfe830a14843b4d") (:authors ("Roman Gonzalez" . "romanandreg@gmail.com")) (:maintainers ("Roman Gonzalez" . "romanandreg@gmail.com")) (:maintainer "Roman Gonzalez" . "romanandreg@gmail.com") (:keywords "evil"))]) (evil-visual-replace . [(20171016 613) ((evil (1 0 0))) "search/replace commands for evil visual state, inc. blocks" tar ((:commit . "163fc827a1ffc106475da470c37fb26f4cc9b008") (:authors ("Troy Pracy")) (:maintainers ("Troy Pracy")) (:maintainer "Troy Pracy") (:keywords "evil" "search" "replace" "regexp" "block" "rectangular" "region" "visual") (:url . "https://github.com/troyp/evil-visual-replace"))]) @@ -1548,35 +1596,35 @@ (ewmctrl . [(20170922 217) nil "Use `wmctrl' to manage desktop windows via EWMH/NetWM." tar ((:commit . "3d0217c4d6cdb5c308b6cb4293574f470d4faacf") (:authors ("Alexis" . "flexibeast@gmail.com") ("Adam Plaice" . "plaice.adam@gmail.com")) (:maintainers ("Alexis" . "flexibeast@gmail.com")) (:maintainer "Alexis" . "flexibeast@gmail.com") (:keywords "desktop" "windows" "ewmh" "netwm") (:url . "https://github.com/flexibeast/ewmctrl"))]) (eww-lnum . [(20150102 1512) nil "Conkeror-like functionality for eww" tar ((:commit . "4b0ecec769919ecb05ca4fb15ec51911ba589929") (:authors ("Andrey Kotlarski" . "m00naticus@gmail.com")) (:maintainers ("Andrey Kotlarski" . "m00naticus@gmail.com")) (:maintainer "Andrey Kotlarski" . "m00naticus@gmail.com") (:keywords "eww" "browse" "conkeror") (:url . "https://github.com/m00natic/eww-lnum"))]) (exato . [(20200524 1319) ((evil (1 2 13)) (emacs (24))) "EXATO: Evil XML/HTML Attributes Text Object" tar ((:commit . "5e7b5721bf48aa49c6cdb5d41b908ef7d513b2a8") (:authors ("Filipe Silva" . "filipe.silva@gmail.com")) (:maintainers ("Filipe Silva" . "filipe.silva@gmail.com")) (:maintainer "Filipe Silva" . "filipe.silva@gmail.com") (:url . "https://github.com/ninrod/exato"))]) - (exec-path-from-shell . [(20230804 645) ((emacs (24 1)) (cl-lib (0 6))) "Get environment variables such as $PATH from the shell" tar ((:commit . "03fc0a38af9e396c98f5a30c392cf757b3a34feb") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "unix" "environment") (:url . "https://github.com/purcell/exec-path-from-shell"))]) + (exec-path-from-shell . [(20240216 1606) ((emacs (24 1)) (cl-lib (0 6))) "Get environment variables such as $PATH from the shell" tar ((:commit . "d95677ad608c214647b87bc20df1642763e3b400") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "unix" "environment") (:url . "https://github.com/purcell/exec-path-from-shell"))]) (execline . [(20190711 2010) ((emacs (26 1)) (s (1 6 0))) "Major mode for editing execline scripts" tar ((:commit . "c75dd9b2c54d8e59fc35fd4bd98d8e213948a3f5") (:authors ("Dmitry Bogatov" . "KAction@debian.org")) (:maintainers ("Dmitry Bogatov" . "KAction@debian.org")) (:maintainer "Dmitry Bogatov" . "KAction@debian.org") (:keywords "tools" "unix" "languages") (:url . "https://gitlab.com/KAction/emacs-execline"))]) - (exercism . [(20230822 1147) ((emacs (27 1)) (dash (2 19 1)) (a (1 0 0)) (s (1 13 1)) (request (0 3 2)) (async (1 9 6)) (async-await (1 1)) (persist (0 5)) (transient (0 3 7))) "Unofficial https://exercism.org integration" tar ((:commit . "6b3d7ba0347aeb17098eb6d7656176a91280f88b") (:authors ("Rafael Nicdao ")) (:maintainers ("Rafael Nicdao" . "nicdaoraf@gmail.com")) (:maintainer "Rafael Nicdao" . "nicdaoraf@gmail.com") (:keywords "exercism" "convenience") (:url . "https://github.com/anonimitoraf/exercism.el"))]) + (exercism . [(20231007 1253) ((emacs (27 1)) (dash (2 19 1)) (a (1 0 0)) (s (1 13 1)) (request (0 3 2)) (async (1 9 6)) (async-await (1 1)) (persist (0 5)) (transient (0 3 7))) "Unofficial https://exercism.org integration" tar ((:commit . "9d164a54fd7be933e6f65d4cc7112c99bd957b26") (:authors ("Rafael Nicdao ")) (:maintainers ("Rafael Nicdao" . "nicdaoraf@gmail.com")) (:maintainer "Rafael Nicdao" . "nicdaoraf@gmail.com") (:keywords "exercism" "convenience") (:url . "https://github.com/anonimitoraf/exercism.el"))]) (exiftool . [(20190520 1106) ((emacs (25))) "Elisp wrapper around ExifTool" tar ((:commit . "e043df1bcef40cd5934a74c210e1e35d5eb0e5a6") (:authors ("Arun I" . "arunisaac@systemreboot.net")) (:maintainers ("Arun I" . "arunisaac@systemreboot.net")) (:maintainer "Arun I" . "arunisaac@systemreboot.net") (:keywords "data") (:url . "https://git.systemreboot.net/exiftool.el"))]) (exotica-theme . [(20180212 2329) ((emacs (24))) "A dark theme with vibrant colors" tar ((:commit . "ff3ef4f6fa38c93b99becad977c7810c990a4d2f") (:authors ("Bharat Joshi" . "jbharat@outlook.com")) (:maintainers ("Bharat Joshi" . "jbharat@outlook.com")) (:maintainer "Bharat Joshi" . "jbharat@outlook.com") (:keywords "faces" "theme" "dark" "vibrant colors") (:url . "https://github.com/jbharat/exotica-theme"))]) (expand-line . [(20151006 207) nil "Expand selection by line" tar ((:commit . "75a5d0241f35dd0748ab8ecb4ff16891535be372") (:authors ("Kai Yu" . "yeannylam@gmail.com")) (:maintainers ("Kai Yu" . "yeannylam@gmail.com")) (:maintainer "Kai Yu" . "yeannylam@gmail.com"))]) - (expand-region . [(20221030 957) nil "Increase selected region by semantic units." tar ((:commit . "b70feaa644310dc2d599dc277cd20a1f2b6446ac") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:keywords "marking" "region"))]) - (expenses . [(20230516 929) ((emacs (28 1)) (dash (2 19 1)) (ht (2 3))) "Record and view expenses" tar ((:commit . "843d1907f3bae0c76c555856b656b87544057c2d") (:authors ("Md Arif Shaikh" . "arifshaikh.astro@gmail.com")) (:maintainers ("Md Arif Shaikh" . "arifshaikh.astro@gmail.com")) (:maintainer "Md Arif Shaikh" . "arifshaikh.astro@gmail.com") (:keywords "expense tracking" "convenience") (:url . "https://github.com/md-arif-shaikh/expenses"))]) + (expand-region . [(20240119 1039) ((emacs (24 4))) "Increase selected region by semantic units." tar ((:commit . "e8f4e0fe9c9a80a6a26e2b438502aba9a799d580") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainers ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:keywords "marking" "region") (:url . "https://github.com/magnars/expand-region.el"))]) + (expenses . [(20230903 306) ((emacs (28 1)) (dash (2 19 1)) (ht (2 3))) "Record and view expenses" tar ((:commit . "1c89ed3969fef7d733a0f52084cfe07d33200104") (:authors ("Md Arif Shaikh" . "arifshaikh.astro@gmail.com")) (:maintainers ("Md Arif Shaikh" . "arifshaikh.astro@gmail.com")) (:maintainer "Md Arif Shaikh" . "arifshaikh.astro@gmail.com") (:keywords "expense tracking" "convenience") (:url . "https://github.com/md-arif-shaikh/expenses"))]) (express . [(20140508 2041) ((string-utils (0 3 2))) "Alternatives to `message'" tar ((:commit . "6c301e8a4b6b58a5fe59ba607865238e38cee8fd") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "extensions" "message" "interface") (:url . "http://github.com/rolandwalker/express"))]) (exsqlaim-mode . [(20170607 1003) ((s (1 10 0))) "Use variables inside sql queries" tar ((:commit . "a2e0a62ec8b87193d8eaa695774bfd689324b06c") (:authors ("Ahmad Nazir Raja" . "ahmadnazir@gmail.com")) (:maintainers ("Ahmad Nazir Raja" . "ahmadnazir@gmail.com")) (:maintainer "Ahmad Nazir Raja" . "ahmadnazir@gmail.com") (:url . "https://github.com/ahmadnazir/exsqlaim-mode"))]) (extempore-mode . [(20220704 2241) ((emacs (24 4))) "Emacs major mode for Extempore source files" tar ((:commit . "92e0fff482a0a4dc2971c39581c5ea9e84ae5e1c") (:authors ("Ben Swift" . "ben@benswift.me")) (:maintainers ("Ben Swift" . "ben@benswift.me")) (:maintainer "Ben Swift" . "ben@benswift.me") (:keywords "extempore") (:url . "http://github.com/extemporelang/extempore-emacs-mode"))]) (extend-dnd . [(20151122 1850) nil "R drag and Drop" tar ((:commit . "80c966c93b82c9bb5c6225a432557c39144fc602") (:authors ("Matthew L. Fidler")) (:maintainers ("Matthew L. Fidler")) (:maintainer "Matthew L. Fidler") (:keywords "extend" "drag and drop") (:url . "https://github.com/mlf176f2/extend-dnd"))]) - (external-dict . [(20230313 118) ((emacs (25 1))) "Query external dictionary like goldendict, Bob.app etc" tar ((:commit . "7ef87709c09792dfa6332fb41a6ec1edd917120a") (:keywords "wp" "processes") (:url . "https://repo.or.cz/external-dict.el.git"))]) - (extmap . [(20211023 1904) ((emacs (24 1))) "Externally-stored constant mapping for Elisp" tar ((:commit . "5875a4ab27831eb81af6246b12a174c765d52a78") (:authors ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainers ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainer "Paul Pogonyshev" . "pogonyshev@gmail.com") (:keywords "lisp") (:url . "https://github.com/doublep/extmap"))]) - (exunit . [(20230730 445) ((s (1 11 0)) (emacs (24 3)) (f (0 20 0)) (transient (0 3 6))) "ExUnit test runner" tar ((:commit . "e008c89e01e5680473278c7e7bab42842e294e4d") (:authors ("Anantha kumaran" . "ananthakumaran@gmail.com")) (:maintainers ("Anantha kumaran" . "ananthakumaran@gmail.com")) (:maintainer "Anantha kumaran" . "ananthakumaran@gmail.com") (:keywords "processes" "elixir" "exunit") (:url . "http://github.com/ananthakumaran/exunit.el"))]) - (exwm-edit . [(20220414 106) ((emacs (25 1))) "Edit mode for EXWM" tar ((:commit . "b5b7e950f57e30befd68d51df34540b70e6ac28f") (:authors ("Ag Ibragimov")) (:maintainers ("Ag Ibragimov")) (:maintainer "Ag Ibragimov") (:keywords "convenience") (:url . "https://github.com/agzam/exwm-edit"))]) + (external-dict . [(20231129 1043) ((emacs (25 1))) "Query external dictionary like goldendict, Bob.app etc" tar ((:commit . "17807ac7e671b44da495e7e3fac5b8cb72a25feb") (:keywords "wp" "processes") (:url . "https://repo.or.cz/external-dict.el.git"))]) + (extmap . [(20230907 1959) ((emacs (24 4))) "Externally-stored constant mapping for Elisp" tar ((:commit . "3b0f898057082a1c01584ff2bbaf5fd4d22c1400") (:authors ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainers ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainer "Paul Pogonyshev" . "pogonyshev@gmail.com") (:keywords "lisp") (:url . "https://github.com/doublep/extmap"))]) + (exunit . [(20240303 1106) ((s (1 11 0)) (emacs (24 3)) (f (0 20 0)) (transient (0 3 6))) "ExUnit test runner" tar ((:commit . "5e8f6b681d4745ef23bd8f7ddafba80d6285f26e") (:authors ("Anantha kumaran" . "ananthakumaran@gmail.com")) (:maintainers ("Anantha kumaran" . "ananthakumaran@gmail.com")) (:maintainer "Anantha kumaran" . "ananthakumaran@gmail.com") (:keywords "processes" "elixir" "exunit") (:url . "http://github.com/ananthakumaran/exunit.el"))]) + (exwm-edit . [(20240221 124) ((emacs (27 1))) "Edit mode for EXWM" tar ((:commit . "19ce910a9183aac78365d674cbeb630464ff1836") (:authors ("Ag Ibragimov")) (:maintainers ("Ag Ibragimov")) (:maintainer "Ag Ibragimov") (:keywords "convenience") (:url . "https://github.com/agzam/exwm-edit"))]) (exwm-firefox-core . [(20190812 2110) ((emacs (24 4)) (exwm (0 16))) "Firefox hotkeys to functions" tar ((:commit . "e2fe2a895e8f973307ef52f8c9976b26e701cbd0") (:authors ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainers ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainer "Sebastian Wålinder" . "s.walinder@gmail.com") (:keywords "extensions") (:url . "https://github.com/walseb/exwm-firefox-core"))]) - (exwm-firefox-evil . [(20220318 1958) ((emacs (24 4)) (exwm (0 16)) (evil (1 0 0)) (exwm-firefox-core (1 0))) "evil-mode implementation of exwm-firefox-core" tar ((:commit . "a377326e2e4ac386a0abb3fc9b1b356a0d955b61") (:authors ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainers ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainer "Sebastian Wålinder" . "s.walinder@gmail.com") (:keywords "extensions") (:url . "https://github.com/walseb/exwm-firefox-evil"))]) + (exwm-firefox-evil . [(20231026 309) ((emacs (24 4)) (exwm (0 16)) (evil (1 0 0)) (exwm-firefox-core (1 0))) "evil-mode implementation of exwm-firefox-core" tar ((:commit . "ec9e14eca25aea9b7c7169be23843898f46696e7") (:authors ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainers ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainer "Sebastian Wålinder" . "s.walinder@gmail.com") (:keywords "extensions") (:url . "https://github.com/walseb/exwm-firefox-evil"))]) (exwm-float . [(20210207 2035) ((emacs (25 1)) (xelb (0 18)) (exwm (0 24)) (popwin (1 0 2))) "Convenient modes and bindings for floating EXWM frames" tar ((:commit . "047c83aa6b54bfb6ca8cac4d3ea18542611cef77") (:authors ("Mehmet Tekman")) (:maintainers ("Mehmet Tekman")) (:maintainer "Mehmet Tekman") (:keywords "outlines") (:url . "https://gitlab.com/mtekman/exwm-float.el"))]) (exwm-mff . [(20210603 1723) ((emacs (25 1))) "Mouse Follows Focus" tar ((:commit . "89206f2e3189f589c27c56bd2b6203e906ee7100") (:authors ("Ian Eure" . "public@lowbar.fyi")) (:maintainers ("Ian Eure" . "public@lowbar.fyi")) (:maintainer "Ian Eure" . "public@lowbar.fyi") (:keywords "unix") (:url . "https://github.com/ieure/exwm-mff"))]) - (exwm-modeline . [(20230331 1747) ((emacs (27 1)) (exwm (0 26))) "A modeline segment for EXWM workspaces" tar ((:commit . "852a88a58714e3e59675b79b185f036f7b0300e8") (:authors ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainers ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainer "Korytov Pavel" . "thexcloud@gmail.com") (:url . "https://github.com/SqrtMinusOne/exwm-modeline"))]) + (exwm-modeline . [(20231225 2340) ((emacs (27 1)) (exwm (0 26))) "A modeline segment for EXWM workspaces" tar ((:commit . "f72e65818f90c754edb8d0dcff47e8248a7f0a56") (:authors ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainers ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainer "Korytov Pavel" . "thexcloud@gmail.com") (:url . "https://github.com/SqrtMinusOne/exwm-modeline"))]) (exwm-surf . [(20171204 1140) ((emacs (24 4)) (exwm (0 16))) "Interface for Surf (surf.suckless.org) under exwm" tar ((:commit . "6c17e2c1597fe4b7b454a1dac23b9127ac951e94") (:authors ("Peter" . "craven@gmx.net")) (:maintainers ("Peter" . "craven@gmx.net")) (:maintainer "Peter" . "craven@gmx.net") (:keywords "extensions") (:url . "https://github.com/ecraven/exwm-surf"))]) (exwm-x . [(20230119 624) ((cl-lib (0 5)) (async (1 6)) (exwm (0 22))) "A derivative wm based on EXWM (emacs x window manager)" tar ((:commit . "1e2bbfca872ad76eaa8f1c00d17762bed256881a") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainers ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:keywords "window-manager" "exwm") (:url . "https://github.com/tumashu/exwm-x"))]) (eyebrowse . [(20201107 955) ((dash (2 7 0)) (emacs (24 3 1))) "Easy window config switching" tar ((:commit . "bdc626f88ab8e3d88bf5bf2e929707606675ef92") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainers ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de") (:keywords "convenience") (:url . "https://depp.brause.cc/eyebrowse"))]) - (eyebrowse-restore . [(20230312 1821) ((emacs (26 3)) (eyebrowse (0 7 8)) (dash (2 19 1)) (s (1 13 0))) "Persistent Eyebrowse for all frames" tar ((:commit . "50e8a2cb3c4a64f7fadd0303d178de8a57bb37db") (:authors ("Jakub Kadlčík" . "frostyx@email.cz")) (:maintainers ("Jakub Kadlčík" . "frostyx@email.cz")) (:maintainer "Jakub Kadlčík" . "frostyx@email.cz") (:keywords "convenience" "eyebrowse" "helm" "persistent") (:url . "https://github.com/FrostyX/eyebrowse-restore"))]) + (eyebrowse-restore . [(20240304 2338) ((emacs (26 3)) (eyebrowse (0 7 8)) (dash (2 19 1)) (s (1 13 0))) "Persistent Eyebrowse for all frames" tar ((:commit . "abb3877e12b41740305741deec37ca681b896e82") (:authors ("Jakub Kadlčík" . "frostyx@email.cz")) (:maintainers ("Jakub Kadlčík" . "frostyx@email.cz")) (:maintainer "Jakub Kadlčík" . "frostyx@email.cz") (:keywords "convenience" "eyebrowse" "helm" "persistent") (:url . "https://github.com/FrostyX/eyebrowse-restore"))]) (eyuml . [(20141028 2227) ((request (0 2 0)) (s (1 8 0))) "Write textual uml diagram from emacs using yuml.me" tar ((:commit . "2f259c201c6cc63ee608f75cd85c1ae27f9d2532") (:authors ("Anthony HAMON" . "hamon.anth@gmail.com")) (:maintainers ("Anthony HAMON" . "hamon.anth@gmail.com")) (:maintainer "Anthony HAMON" . "hamon.anth@gmail.com") (:keywords "uml") (:url . "http://github.com/antham/eyuml"))]) (ez-query-replace . [(20210724 2247) ((dash (1 2 0)) (s (1 11 0))) "a smarter context-sensitive query-replace that can be reapplied" tar ((:commit . "2b68472f4007a73908c3b242e83ac5a7587967ff") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))]) (eziam-themes . [(20230820 917) nil "The mostly monochrome Eziam theme family." tar ((:commit . "8223acc0218130ad2493c1476ad3736ee4fdbb8f") (:authors ("Thibault Polge" . "thibault@thb.lt")) (:maintainer "Thibault Polge" . "thibault@thb.lt") (:keywords "faces") (:url . "https://github.com/thblt/eziam-theme-emacs"))]) - (f . [(20230823 1159) ((emacs (24 1)) (s (1 7 0)) (dash (2 2 0))) "Modern API for working with files and directories" tar ((:commit . "ab3ee3811c53f9c2144ff45130361f3da242ffa2") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainers ("Lucien Cartier-Tilet" . "lucien@phundrak.com")) (:maintainer "Lucien Cartier-Tilet" . "lucien@phundrak.com") (:keywords "files" "directories") (:url . "http://github.com/rejeep/f.el"))]) + (f . [(20240308 906) ((emacs (24 1)) (s (1 7 0)) (dash (2 2 0))) "Modern API for working with files and directories" tar ((:commit . "1e7020dc0d4c52d3da9bd610d431cab13aa02d8c") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainers ("Lucien Cartier-Tilet" . "lucien@phundrak.com")) (:maintainer "Lucien Cartier-Tilet" . "lucien@phundrak.com") (:keywords "files" "directories") (:url . "http://github.com/rejeep/f.el"))]) (f3 . [(20180130 1158) ((emacs (24 3)) (helm (2 8 8)) (cl-lib (0 5))) "a helm interface to find" tar ((:commit . "000009ce4adf7a57eae80512f29c4ec2a1391ce5") (:authors ("Danny McClanahan")) (:maintainers ("Danny McClanahan")) (:maintainer "Danny McClanahan") (:keywords "find" "file" "files" "helm" "fast" "finder") (:url . "https://github.com/cosmicexplorer/f3"))]) (fabric . [(20171116 656) nil "Launch Fabric using Emacs" tar ((:commit . "df79be341d0b34ed23850f9894136092fa5fea8c") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@chmouel.com")) (:maintainers ("Nicolas Lamirault" . "nicolas.lamirault@chmouel.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@chmouel.com") (:keywords "python" "fabric") (:url . "https://github.com/nlamirault/fabric.el"))]) (face-explorer . [(20190517 1857) nil "Library and tools for faces and text properties" tar ((:commit . "ad1300e13e5643e4c246cabfd91f833d39113052") (:authors ("Anders Lindgren")) (:maintainers ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "faces") (:url . "https://github.com/Lindydancer/face-explorer"))]) @@ -1585,12 +1633,12 @@ (faff-theme . [(20230531 1920) nil "Light Emacs color theme on cornsilk3 background" tar ((:commit . "cba6906f6f4f33cbf229a300d83f0e0d925e8f42") (:authors ("James Ferguson <(concat \"wjcferguson\" at-sign \"gmail.com\")>")) (:maintainers ("James Ferguson <(concat \"wjcferguson\" at-sign \"gmail.com\")>")) (:maintainer "James Ferguson <(concat \"wjcferguson\" at-sign \"gmail.com\")>") (:keywords "color" "theme") (:url . "https://github.com/WJCFerguson/emacs-faff-theme"))]) (fakir . [(20140729 1652) ((noflet (0 0 8)) (dash (1 3 2)) (kv (0 0 19))) "fakeing bits of Emacs" tar ((:commit . "1fca406ad7de80fece6319ff75d4230b648534b0") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainers ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:keywords "lisp" "tools") (:url . "http://github.com/nicferrier/emacs-fakir"))]) (fancy-battery . [(20150101 1204) ((emacs (24 1))) "Fancy battery display" tar ((:commit . "bcc2d7960ba207b5b4db96fe40f7d72670fdbb68") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainers ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn.com") (:keywords "convenience" "tools" "hardware") (:url . "https://github.com/lunaryorn/fancy-battery.el"))]) - (fancy-compilation . [(20230824 22) ((emacs (26 1))) "Enhanced compilation output" tar ((:commit . "32dc801a921428e4abaeb826449c86fc3c96c0f8") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.org/ideasman42/emacs-fancy-compilation"))]) + (fancy-compilation . [(20231228 2247) ((emacs (26 1))) "Enhanced compilation output" tar ((:commit . "74833d618024cee47c24aabdc6e9daa4009d0690") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.org/ideasman42/emacs-fancy-compilation"))]) (fancy-dabbrev . [(20220211 633) ((emacs (25 1)) (popup (0 5 3))) "Like dabbrev-expand with preview and popup menu" tar ((:commit . "cf4a2f7e3e43e07ab9aa9db16532a21010e9fc8c") (:authors ("Joel Rosdahl" . "joel@rosdahl.net")) (:maintainers ("Joel Rosdahl" . "joel@rosdahl.net")) (:maintainer "Joel Rosdahl" . "joel@rosdahl.net") (:url . "https://github.com/jrosdahl/fancy-dabbrev"))]) (fancy-narrow . [(20171031 16) nil "narrow-to-region with more eye candy." tar ((:commit . "9f4a587f6a5a387271fb665e13f59d41fd42504c") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainers ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com") (:keywords "faces" "convenience") (:url . "http://github.com/Bruce-Connor/fancy-narrow"))]) (fantom-mode . [(20221227 218) ((emacs (24 3))) "A major mode for the Fantom programming language" tar ((:commit . "51cd82d29a7dca7bfd043971ba1d0fd21ed11693") (:authors ("XXIV")) (:maintainers ("XXIV")) (:maintainer "XXIV") (:keywords "files" "fantom") (:url . "https://github.com/thechampagne/fantom-mode"))]) (fantom-theme . [(20200328 604) ((emacs (24 1))) "Dark theme based on Phantom Code for VSCode" tar ((:commit . "2c1c7fd53086c2ff86ee0961642c3b58e2343c08") (:authors ("Adam Svanberg")) (:maintainers ("Adam Svanberg")) (:maintainer "Adam Svanberg") (:url . "https://github.com/adsva/fantom-emacs-theme"))]) - (fanyi . [(20230619 1600) ((emacs (27 1)) (s (1 12 0))) "Not only English-Chinese translator" tar ((:commit . "72f6a7d038507203bbc1cd2d4e4b8cf00efeb3ed") (:authors ("Zhiwei Chen" . "condy0919@gmail.com")) (:maintainers ("Zhiwei Chen" . "condy0919@gmail.com")) (:maintainer "Zhiwei Chen" . "condy0919@gmail.com") (:keywords "convenience" "tools") (:url . "https://github.com/condy0919/fanyi.el"))]) + (fanyi . [(20230926 1849) ((emacs (27 1)) (s (1 12 0))) "Not only English-Chinese translator" tar ((:commit . "df91f2d69b7dbd9b7ebb8f54085aee74f22ad3f5") (:authors ("Zhiwei Chen" . "condy0919@gmail.com")) (:maintainers ("Zhiwei Chen" . "condy0919@gmail.com")) (:maintainer "Zhiwei Chen" . "condy0919@gmail.com") (:keywords "convenience" "tools") (:url . "https://github.com/condy0919/fanyi.el"))]) (farmhouse-themes . [(20221025 2054) nil "Farmhouse Themes, dark and light versions" tar ((:commit . "30c763d01611dad88f1a1ff88451431e2629016d") (:authors ("Matthew Lyon" . "matthew@lyonheart.us")) (:maintainers ("Matthew Lyon" . "matthew@lyonheart.us")) (:maintainer "Matthew Lyon" . "matthew@lyonheart.us"))]) (fasd . [(20210104 738) nil "Emacs integration for the command-line productivity booster `fasd'" tar ((:commit . "c1d92553f33ebb018135c698db1a6d7f86731a26") (:authors ("steckerhalter")) (:maintainers ("steckerhalter")) (:maintainer "steckerhalter") (:keywords "cli" "bash" "zsh" "autojump") (:url . "https://framagit.org/steckerhalter/emacs-fasd"))]) (fast-scroll . [(20191016 327) ((emacs (25 1)) (cl-lib (0 6 1))) "Some utilities for faster scrolling over large buffers." tar ((:commit . "3f6ca0d5556fe9795b74714304564f2295dcfa24") (:authors ("Matthew Carter" . "m@ahungry.com")) (:maintainers ("Matthew Carter" . "m@ahungry.com")) (:maintainer "Matthew Carter" . "m@ahungry.com") (:keywords "ahungry" "convenience" "fast" "scroll" "scrolling") (:url . "https://github.com/ahungry/fast-scroll"))]) @@ -1599,29 +1647,28 @@ (faust-mode . [(20201004 1353) nil "Faust syntax colorizer for Emacs." tar ((:commit . "2a56cda14b152d5471f21a5d82f23c141dc7134c") (:authors ("rukano" . "rukano@gmail.com")) (:maintainers ("Yassin Philip" . "xaccrocheur@gmail.com")) (:maintainer "Yassin Philip" . "xaccrocheur@gmail.com") (:keywords "languages" "faust") (:url . "https://github.com/rukano/emacs-faust-mode"))]) (faustine . [(20171122 1202) ((emacs (24 3)) (faust-mode (0 3))) "Edit, visualize, build and run Faust code" tar ((:commit . "07a38963111518f86123802f9d477be0d4689a3f") (:authors ("Yassin Philip" . "xaccrocheur@gmail.com")) (:maintainers ("Yassin Philip" . "xaccrocheur@gmail.com")) (:maintainer "Yassin Philip" . "xaccrocheur@gmail.com") (:keywords "languages" "faust") (:url . "https://bitbucket.org/yphil/faustine"))]) (fb2-reader . [(20230805 29) ((emacs (26 2)) (f (0 17)) (s (1 11 0)) (dash (2 12 0)) (visual-fill-column (2 2)) (async (1 9 4))) "Read FB2 and FB2.ZIP documents" tar ((:commit . "85777f99483b84f02c1abd6fe0ddbbac7f1258af") (:authors ("Dmitriy Pshonko" . "jumper047@gmail.com")) (:maintainers ("Dmitriy Pshonko" . "jumper047@gmail.com")) (:maintainer "Dmitriy Pshonko" . "jumper047@gmail.com") (:keywords "multimedia" "ebook" "fb2") (:url . "https://github.com/jumper047/fb2-reader"))]) - (fcitx . [(20190806 1923) nil "Make fcitx better in Emacs" tar ((:commit . "12dc2638ddd15c8f6cfaecb20e1f428ab2bb5624") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainers ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions") (:url . "https://github.com/cute-jumper/fcitx.el"))]) + (fcitx . [(20240121 1829) nil "Make fcitx better in Emacs" tar ((:commit . "b399482ed8db5893db2701df01db4c38cccda495") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainers ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions") (:url . "https://github.com/cute-jumper/fcitx.el"))]) (fcopy . [(20150304 1403) nil "Funny Copy, set past point HERE then search copy text" tar ((:commit . "e355f6ec889d8ecbdb096019c2dc660b1cec4941") (:authors ("Masayuki Ataka" . "masayuki.ataka@gmail.com")) (:maintainers ("Masayuki Ataka" . "masayuki.ataka@gmail.com")) (:maintainer "Masayuki Ataka" . "masayuki.ataka@gmail.com") (:keywords "convenience") (:url . "https://github.com/ataka/fcopy"))]) (fd-dired . [(20210723 549) ((emacs (25))) "find-dired alternative using fd" tar ((:commit . "458464771bb220b6eb87ccfd4c985c436e57dc7e") (:authors ("Rashawn Zhang" . "namy.19@gmail.com")) (:maintainers ("Rashawn Zhang" . "namy.19@gmail.com")) (:maintainer "Rashawn Zhang" . "namy.19@gmail.com") (:keywords "tools" "fd" "find" "dired") (:url . "https://github.com/yqrashawn/fd-dired"))]) - (feather . [(20200321 1237) ((emacs (26 3)) (async (1 9)) (async-await (1 0)) (ppp (1 0)) (page-break-lines (0 1))) "Parallel thread modern package manager" tar ((:commit . "529b7ec69f1694d7dc8aacb5066cf4ddcf24cc58") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "convenience" "package") (:url . "https://github.com/conao3/feather.el"))]) (feature-mode . [(20220418 848) nil "Major mode for editing Gherkin (i.e. Cucumber) user stories" tar ((:commit . "e204d9e204b767cf95d6a051ff283f05dc51e9d3") (:authors ("Michael Klishin")) (:maintainer "Michael Klishin") (:url . "https://github.com/michaelklishin/cucumber.el"))]) - (fedi . [(20230828 1341) ((emacs (28 1))) "Helper functions for fediverse clients" tar ((:commit . "132229e6634b64d01eb7e332c5f086fdc973a876") (:authors ("Marty Hiatt" . "martianhiatus@riseup.net")) (:maintainers ("Marty Hiatt" . "martianhiatus@riseup.net")) (:maintainer "Marty Hiatt" . "martianhiatus@riseup.net") (:url . "https://codeberg.org/martianh/fedi.el"))]) + (fedi . [(20240311 1417) ((emacs (28 1)) (markdown-mode (2 5))) "Helper functions for fediverse clients" tar ((:commit . "b4996a467868b11e7f4ee9c53354131a99bc6bad") (:authors ("Marty Hiatt" . "martianhiatus@riseup.net")) (:maintainers ("Marty Hiatt" . "martianhiatus@riseup.net")) (:maintainer "Marty Hiatt" . "martianhiatus@riseup.net") (:url . "https://codeberg.org/martianh/fedi.el"))]) (feebleline . [(20190822 1401) nil "Replace modeline with a slimmer proxy" tar ((:commit . "b2f2db25cac77817bf0c49ea2cea6383556faea0") (:authors ("Benjamin Lindqvist" . "benjamin.lindqvist@gmail.com")) (:maintainers ("Benjamin Lindqvist" . "benjamin.lindqvist@gmail.com")) (:maintainer "Benjamin Lindqvist" . "benjamin.lindqvist@gmail.com") (:url . "https://github.com/tautologyclub/feebleline"))]) (feed-discovery . [(20200714 1118) ((emacs (25 1)) (dash (2 16 0))) "Discover feed url by RSS/Atom autodiscovery" tar ((:commit . "3812439c845c184eaf164d3ac8935de135259855") (:authors ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainers ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainer "Hiroki YAMAKAWA" . "s06139@gmail.com") (:url . "https://github.com/HKey/feed-discovery"))]) (feline . [(20230315 1821) ((emacs (28 1))) "A modeline with very little" tar ((:commit . "3f9247f48058285d3e03957680e011ecf58d6feb") (:authors ("chee" . "emacs@chee.party")) (:maintainers ("chee" . "emacs@chee.party")) (:maintainer "chee" . "emacs@chee.party") (:url . "https://opensource.chee.party/chee/feline-mode"))]) - (fennel-mode . [(20230825 1315) ((emacs (26 1))) "A major-mode for editing Fennel code" tar ((:commit . "6afdcbaa7880fe2b0e4c3088d530d844f9af8f9a") (:authors ("Phil Hagelberg")) (:maintainers ("Phil Hagelberg")) (:maintainer "Phil Hagelberg") (:keywords "languages" "tools") (:url . "https://git.sr.ht/~technomancy/fennel-mode"))]) + (fennel-mode . [(20240313 32) ((emacs (26 1))) "A major-mode for editing Fennel code" tar ((:commit . "4cdf20b673ed1eb14342d7a470ef75cbe165b0c4") (:authors ("Phil Hagelberg")) (:maintainers ("Phil Hagelberg")) (:maintainer "Phil Hagelberg") (:keywords "languages" "tools") (:url . "https://git.sr.ht/~technomancy/fennel-mode"))]) (fetch . [(20131201 730) nil "Fetch and unpack resources" tar ((:commit . "3f2793afcbbc32f320e572453166f9354ecc6d06") (:authors ("Christian 'crshd' Brassat" . "christian.brassat@gmail.com")) (:maintainers ("Christian 'crshd' Brassat" . "christian.brassat@gmail.com")) (:maintainer "Christian 'crshd' Brassat" . "christian.brassat@gmail.com") (:url . "https://github.com/crshd/fetch.el"))]) - (ffmpeg-player . [(20220704 641) ((emacs (24 4)) (s (1 12 0)) (f (0 20 0))) "Play video using ffmpeg" tar ((:commit . "2c41d715b012f399e661a816376824a8dea0b941") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "multimedia" "video" "ffmpeg" "buffering" "images") (:url . "https://github.com/jcs-elpa/ffmpeg-player"))]) + (ffmpeg-player . [(20240101 926) ((emacs (24 4)) (s (1 12 0)) (f (0 20 0))) "Play video using ffmpeg" tar ((:commit . "c3808dc1c39499a81e1b9463526fda924fd1f062") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "multimedia" "video" "ffmpeg" "buffering" "images") (:url . "https://github.com/jcs-elpa/ffmpeg-player"))]) (ffmpeg-utils . [(20230305 709) ((emacs (25 1)) (alert (1 2)) (transient (0 1 0))) "FFmpeg command utilities wrappers" tar ((:commit . "064d61527bc6b6a1d0fb0065f8a7bae3bbd4cefc") (:keywords "multimedia") (:url . "https://repo.or.cz/ffmpeg-utils.git"))]) (fic-mode . [(20180603 2035) nil "Show FIXME/TODO/BUG(...) in special face only in comments and strings" tar ((:commit . "a05fc36ed54ba0c6dc22ac216a6a72cf191ca13d") (:url . "https://github.com/lewang/fic-mode"))]) (fifo-class . [(20160425 558) nil "First in first out abstract class" tar ((:commit . "8fe4cf690727f4ac7b67f29c55f845df023c3f21") (:authors ("Mola-T" . "Mola@molamola.xyz")) (:maintainers ("Mola-T" . "Mola@molamola.xyz")) (:maintainer "Mola-T" . "Mola@molamola.xyz") (:keywords "lisp") (:url . "https://github.com/mola-T/fifo-class"))]) (figlet . [(20160218 2237) nil "Annoy people with big, ascii art text" tar ((:commit . "19a38783a90e151faf047ff233a21a729db0cea9") (:authors ("Philip Jackson" . "phil@shellarchive.co.uk")) (:maintainers ("Philip Jackson" . "phil@shellarchive.co.uk")) (:maintainer "Philip Jackson" . "phil@shellarchive.co.uk"))]) - (file-info . [(20230822 1634) ((emacs (28 1)) (hydra (0 15 0)) (browse-at-remote (0 15 0))) "Show pretty information about current file" tar ((:commit . "5dcf0df5be52a264690e81d9911306879371e4d9") (:authors ("Artur Yaroshenko" . "artawower@protonmail.com")) (:maintainers ("Artur Yaroshenko" . "artawower@protonmail.com")) (:maintainer "Artur Yaroshenko" . "artawower@protonmail.com") (:url . "https://github.com/artawower/file-info.el"))]) + (file-info . [(20231207 2041) ((emacs (28 1)) (hydra (0 15 0)) (browse-at-remote (0 15 0))) "Show pretty information about current file" tar ((:commit . "158524c92f37eeccf55e096f3090db2baa12fbae") (:authors ("Artur Yaroshenko" . "artawower@protonmail.com")) (:maintainers ("Artur Yaroshenko" . "artawower@protonmail.com")) (:maintainer "Artur Yaroshenko" . "artawower@protonmail.com") (:url . "https://github.com/artawower/file-info.el"))]) (filelock . [(20180524 2215) ((emacs (24)) (cl-lib (0)) (f (0))) "Functions for manipulating file locks" tar ((:commit . "17a5ca6e0dee14d2e7d92c84be91143bca9d9663") (:authors ("Ryan C. Thompson")) (:maintainers ("Ryan C. Thompson")) (:maintainer "Ryan C. Thompson") (:keywords "extensions" "files" "tools") (:url . "https://github.com/DarwinAwardWinner/emacs-filelock"))]) (filetags . [(20190706 804) ((emacs (24 4))) "Package to manage filetags in filename" tar ((:commit . "71667a819e46eb1f6e30e2fa61321acb7c6ccb3d") (:authors ("Max Beutelspacher")) (:maintainers ("Max Beutelspacher")) (:maintainer "Max Beutelspacher") (:keywords "convenience" "files") (:url . "https://github.com/DerBeutlin/filetags.el"))]) (filetree . [(20221108 236) ((dash (2 12 0)) (helm (3 7 0)) (seq (2 23)) (transient (0 3 6))) "File tree view/manipulatation package" tar ((:commit . "1c48ef63a639bfe1ae4d5095725ef88a3f2c590d") (:authors ("Ketan Patel" . "knpatel401@gmail.com")) (:maintainers ("Ketan Patel" . "knpatel401@gmail.com")) (:maintainer "Ketan Patel" . "knpatel401@gmail.com") (:url . "https://github.com/knpatel401/filetree"))]) (fill-column-indicator . [(20200806 2239) nil "Graphically indicate the fill column" tar ((:commit . "c35f9de072c241699b57bcb46da84bed5af29cfe") (:authors ("Alp Aker" . "alp.tekin.aker@gmail.com")) (:maintainers ("Alp Aker" . "alp.tekin.aker@gmail.com")) (:maintainer "Alp Aker" . "alp.tekin.aker@gmail.com") (:keywords "convenience"))]) - (fill-function-arguments . [(20210617 1538) ((emacs (24 4))) "Convert function arguments to/from single line" tar ((:commit . "60a5a3c3004cffa111202b42217d604f63d72e70") (:authors ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainers ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainer "David Shepherd" . "davidshepherd7@gmail.com") (:keywords "convenience") (:url . "https://github.com/davidshepherd7/fill-function-arguments"))]) - (fill-page . [(20220704 650) ((emacs (24 4))) "Fill buffer so you don't see empty lines at the end" tar ((:commit . "916f4ee74d4290575795042ed09a1c81eb66ba8f") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "fill" "page" "buffer") (:url . "https://github.com/jcs-elpa/fill-page"))]) + (fill-function-arguments . [(20240213 2249) ((emacs (24 4))) "Convert function arguments to/from single line" tar ((:commit . "9def8ced5241b10067ae85c89ae34359c2e4847a") (:authors ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainers ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainer "David Shepherd" . "davidshepherd7@gmail.com") (:keywords "convenience") (:url . "https://github.com/davidshepherd7/fill-function-arguments"))]) + (fill-page . [(20240101 930) ((emacs (24 4))) "Fill buffer so you don't see empty lines at the end" tar ((:commit . "c2bf4d4661c7f618e3c3334dbfd9a142371806d6") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "fill" "page" "buffer") (:url . "https://github.com/jcs-elpa/fill-page"))]) (fillcode . [(20200524 2226) nil "Fill (wrap) function calls and expressions in source code" tar ((:commit . "4d206982b6aaa493d709c84aea206cabb8b4038c") (:authors ("Ryan Barrett" . "fillcode@ryanb.org")) (:maintainers ("Ryan Barrett" . "fillcode@ryanb.org")) (:maintainer "Ryan Barrett" . "fillcode@ryanb.org") (:url . "https://snarfed.org/fillcode"))]) (filldent . [(20220423 2216) ((emacs (24 1))) "Fill or indent" tar ((:commit . "2f32e0cf5e27c613f962fa41bf3427bbdc04e6c0") (:authors ("Case Duckworth" . "acdw@acdw.net")) (:maintainers ("Case Duckworth" . "acdw@acdw.net")) (:maintainer "Case Duckworth" . "acdw@acdw.net") (:url . "https://github.com/duckwork/filldent.el"))]) (finalize . [(20170418 1945) ((emacs (24 1)) (cl-generic (0 3)) (cl-lib (0 3)) (eieio (1 4))) "finalizers for Emacs Lisp" tar ((:commit . "0f7d47c4d50f1c76fc3b43bfc2d4886dd3e8ca27") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/elisp-finalize"))]) @@ -1634,15 +1681,15 @@ (find-things-fast . [(20150519 2226) nil "Find things fast, leveraging the power of git" tar ((:commit . "281dcb5a2e2db1013246dcac5111808352a8ea95") (:authors ("Elvio Toccalino and Elliot Glaysher and Phil Hagelberg and Doug Alcorn")) (:maintainers ("Elvio Toccalino and Elliot Glaysher and Phil Hagelberg and Doug Alcorn")) (:maintainer "Elvio Toccalino and Elliot Glaysher and Phil Hagelberg and Doug Alcorn") (:keywords "project" "convenience"))]) (findr . [(20130127 2032) nil "Breadth-first file-finding facility for (X)Emacs" tar ((:commit . "1ddbc0464bb05dcda392b62666ad17239a2152d3") (:authors ("David Bakhash" . "cadet@bu.edu")) (:maintainers ("David Bakhash" . "cadet@bu.edu")) (:maintainer "David Bakhash" . "cadet@bu.edu") (:keywords "files"))]) (fingers . [(20160817 829) nil "Modal editing with universal text manipulation helpers." tar ((:commit . "7de351448a6f5ea7aa7a25db6c90d5138f87eb16") (:authors ("Felix Geller" . "fgeller@gmail.com")) (:maintainers ("Felix Geller" . "fgeller@gmail.com")) (:maintainer "Felix Geller" . "fgeller@gmail.com") (:keywords "fingers" "modal" "editing" "workman") (:url . "http://github.com/fgeller/fingers.el"))]) - (finito . [(20230730 834) ((emacs (27 1)) (dash (2 17 0)) (request (0 3 2)) (f (0 2 0)) (s (1 12 0)) (transient (0 3 0)) (graphql (0 1 1)) (async (1 9 3))) "View and collect books" tar ((:commit . "b19bc85657c3d0d12a7f828b668cda23f1524fdb") (:authors ("Laurence Warne")) (:maintainers ("Laurence Warne")) (:maintainer "Laurence Warne") (:keywords "outlines") (:url . "https://github.com/LaurenceWarne/finito.el"))]) + (finito . [(20240219 2059) ((emacs (27 1)) (dash (2 17 0)) (request (0 3 2)) (f (0 2 0)) (s (1 12 0)) (transient (0 3 0)) (graphql (0 1 1)) (async (1 9 3))) "View and collect books" tar ((:commit . "b4f1c776e3a6cda2f51dd71e55f72de6fd3c1dcf") (:authors ("Laurence Warne")) (:maintainers ("Laurence Warne")) (:maintainer "Laurence Warne") (:keywords "outlines") (:url . "https://github.com/LaurenceWarne/finito.el"))]) (fiplr . [(20140724 645) ((grizzl (0 1 0)) (cl-lib (0 1))) "Fuzzy Search for Files in Projects" tar ((:commit . "bb6b90ba3c558988c195048c4c40140b2ee17530") (:authors ("Chris Corbyn" . "chris@w3style.co.uk")) (:maintainer "Chris Corbyn" . "chris@w3style.co.uk") (:keywords "convenience" "usability" "project") (:url . "https://github.com/d11wtq/fiplr"))]) - (fira-code-mode . [(20220531 1555) ((emacs (24 4))) "Minor mode for Fira Code ligatures using prettify-symbols" tar ((:commit . "7b469ca0c22b7e6a907cd65eebdfa9723998a131") (:authors ("Jonathan Ming" . "jming422@gmail.com")) (:maintainers ("Jonathan Ming" . "jming422@gmail.com")) (:maintainer "Jonathan Ming" . "jming422@gmail.com") (:keywords "faces" "ligatures" "fonts" "programming-ligatures") (:url . "https://github.com/jming422/fira-code-mode"))]) + (fira-code-mode . [(20240228 1728) ((emacs (24 4))) "Minor mode for Fira Code ligatures using prettify-symbols" tar ((:commit . "c48f3f16a4b497b9e455966561bbb6638efe4900") (:authors ("Jonathan Ming" . "jming422@gmail.com")) (:maintainers ("Jonathan Ming" . "jming422@gmail.com")) (:maintainer "Jonathan Ming" . "jming422@gmail.com") (:keywords "faces" "ligatures" "fonts" "programming-ligatures") (:url . "https://github.com/jming422/fira-code-mode"))]) (firecode-theme . [(20170808 1311) ((emacs (24 0))) "an Emacs 24 theme based on FireCode (tmTheme)" tar ((:commit . "8b7b03ecdd41e70dab145b98906017e1392eaef4") (:authors ("Jason Milkins")) (:maintainers ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/tmtheme-to-deftheme"))]) (fireplace . [(20200402 2206) nil "A cozy fireplace for emacs" tar ((:commit . "f6c23e259349922aae25cf2898ba815a7d8f2527") (:authors ("Johan Sivertsen" . "johanvts@gmail.com")) (:maintainers ("Johan Sivertsen" . "johanvts@gmail.com")) (:maintainer "Johan Sivertsen" . "johanvts@gmail.com") (:keywords "games") (:url . "https://github.com/johanvts/emacs-fireplace"))]) (firestarter . [(20210508 1626) ((emacs (24 1))) "Execute (shell) commands on save" tar ((:commit . "76070c9074aa363350abe6ad06143e90b3e12ab1") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainers ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de") (:keywords "convenience") (:url . "https://depp.brause.cc/firestarter"))]) - (firrtl-mode . [(20230815 1312) ((emacs (24 3))) "mode for working with FIRRTL files" tar ((:commit . "45ec466d2945c2893ca4d6b24ff3816fceb8f1b2") (:authors ("Schuyler Eldridge" . "schuyler.eldridge@ibm.com")) (:maintainers ("Schuyler Eldridge" . "schuyler.eldridge@ibm.com")) (:maintainer "Schuyler Eldridge" . "schuyler.eldridge@ibm.com") (:keywords "languages" "firrtl") (:url . "https://github.com/ibm/firrtl-mode"))]) - (fish-completion . [(20191103 1210) ((emacs (25 1))) "Fish completion for pcomplete (shell and Eshell)" tar ((:commit . "10384881817b5ae38cf6197a077a663420090d2c") (:authors ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainers ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") (:url . "https://gitlab.com/Ambrevar/emacs-fish-completion"))]) - (fish-mode . [(20230326 1604) ((emacs (24))) "Major mode for fish shell scripts" tar ((:commit . "6869efbc05cdb628209338bf57fe52742e53d956") (:authors ("Tony Wang" . "wwwjfy@gmail.com")) (:maintainers ("Tony Wang" . "wwwjfy@gmail.com")) (:maintainer "Tony Wang" . "wwwjfy@gmail.com") (:keywords "fish" "shell"))]) + (firrtl-mode . [(20231127 1237) ((emacs (24 3))) "mode for working with FIRRTL files" tar ((:commit . "0c7d971899f93367b78e13d70d64cfb89d80b45c") (:authors ("Schuyler Eldridge" . "schuyler.eldridge@ibm.com")) (:maintainers ("Schuyler Eldridge" . "schuyler.eldridge@ibm.com")) (:maintainer "Schuyler Eldridge" . "schuyler.eldridge@ibm.com") (:keywords "languages" "firrtl") (:url . "https://github.com/ibm/firrtl-mode"))]) + (fish-completion . [(20240310 1442) ((emacs (25 1))) "Fish completion for pcomplete (shell and Eshell)" tar ((:commit . "5e081b3c061cfd91a98aceb035bdc80240e6ff92") (:authors ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainers ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") (:url . "https://gitlab.com/Ambrevar/emacs-fish-completion"))]) + (fish-mode . [(20240129 1213) ((emacs (24))) "Major mode for fish shell scripts" tar ((:commit . "2526b1803b58cf145bc70ff6ce2adb3f6c246f89") (:authors ("Tony Wang" . "wwwjfy@gmail.com")) (:maintainers ("Tony Wang" . "wwwjfy@gmail.com")) (:maintainer "Tony Wang" . "wwwjfy@gmail.com") (:keywords "fish" "shell"))]) (fit-text-scale . [(20211230 2002) ((emacs (25 1))) "Fit text by scaling" tar ((:commit . "c53c8ce606380088643463848a9ee3502b0c64f4") (:authors ("Marco Wahl" . "marcowahlsoft@gmail.com")) (:maintainers ("Marco Wahl" . "marcowahlsoft@gmail.com")) (:maintainer "Marco Wahl" . "marcowahlsoft@gmail.com") (:keywords "convenience") (:url . "https://gitlab.com/marcowahl/fit-text-scale"))]) (fix-input . [(20230606 1523) ((emacs (24 4))) "Make input methods play nicely with alternative layouts" tar ((:commit . "439c1ce8c0a66ecdee4a4b25a1b96197d926b1c3") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainers ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:keywords "convenience" "input") (:url . "https://github.com/mrkkrp/fix-input"))]) (fix-muscle-memory . [(20210702 1755) nil "Simple hacks to fix muscle memory problems" tar ((:commit . "b8d4b8025d758762f4459c70c3a7a209ead865ed") (:authors ("Jonathan Arkell" . "jonnay@jonnay.net")) (:maintainers ("Jonathan Arkell" . "jonnay@jonnay.net")) (:maintainer "Jonathan Arkell" . "jonnay@jonnay.net") (:keywords "spelling" "typing"))]) @@ -1661,9 +1708,10 @@ (flatui-theme . [(20160619 127) nil "A color theme for Emacs based on flatuicolors.com" tar ((:commit . "9c15db5526c15c8dba55023f5698372b19c2a780") (:authors ("John Louis Del Rosario" . "john2x@gmail.com")) (:maintainers ("John Louis Del Rosario" . "john2x@gmail.com")) (:maintainer "John Louis Del Rosario" . "john2x@gmail.com") (:url . "https://github.com/john2x/flatui-theme.el"))]) (fleetish-theme . [(20230407 1438) ((emacs (24))) "A take on the JetBrains Fleet theme" tar ((:commit . "482513562b6691c7f3440b62a31033d22378ed96") (:authors ("Scott Raine" . "scott@raine.sh")) (:maintainers ("Scott Raine" . "scott@raine.sh")) (:maintainer "Scott Raine" . "scott@raine.sh") (:url . "https://github.com/nylar/fleetish-emacs-theme"))]) (flex-autopair . [(20120809 1218) nil "Automatically insert pair braces and quotes, insertion conditions & actions are highly customizable." tar ((:commit . "55d128749cc070551a1624a4508d1c4f6d76f7cf") (:authors ("Yuuki Arisawa" . "yuuki.ari@gmail.com")) (:maintainers ("Yuuki Arisawa" . "yuuki.ari@gmail.com")) (:maintainer "Yuuki Arisawa" . "yuuki.ari@gmail.com") (:keywords "keyboard" "input") (:url . "https://github.com/uk-ar/flex-autopair.el"))]) - (flex-compile . [(20230808 1453) ((emacs (26 1)) (dash (2 17 0)) (buffer-manage (1 1))) "Run, evaluate and compile across many languages" tar ((:commit . "17b2b16f8867312a868f338a49ba8615d2d23461") (:authors ("Paul Landes")) (:maintainers ("Paul Landes")) (:maintainer "Paul Landes") (:keywords "compilation" "integration" "processes") (:url . "https://github.com/plandes/flex-compile"))]) + (flex-compile . [(20231219 2113) ((emacs (26 1)) (dash (2 17 0)) (buffer-manage (1 1))) "Run, evaluate and compile across many languages" tar ((:commit . "817dd32411748682c13f752786b901041a470504") (:authors ("Paul Landes")) (:maintainers ("Paul Landes")) (:maintainer "Paul Landes") (:keywords "compilation" "integration" "processes") (:url . "https://github.com/plandes/flex-compile"))]) (flex-isearch . [(20170308 2010) nil "Flex matching (like ido) in isearch." tar ((:commit . "b1f7e04de762282c276343cc2709af9ff4abc9d2") (:authors ("Jonathan Kotta" . "jpkotta@gmail.com")) (:maintainers ("Jonathan Kotta" . "jpkotta@gmail.com")) (:maintainer "Jonathan Kotta" . "jpkotta@gmail.com") (:keywords "convenience" "search") (:url . "https://bitbucket.org/jpkotta/flex-isearch"))]) - (flim . [(20230808 1153) ((emacs (24 5)) (apel (10 8)) (oauth2 (0 11))) "A library to provide basic features about message representation or encoding." tar ((:commit . "80b8121f05a5a0d7fcfe3e54085467a646dd2028"))]) + (flexoki-themes . [(20240109 607) ((emacs (27 1))) "An inky color scheme for prose and code" tar ((:commit . "9339a2a1a8052159916e9913b14ec062c0a3f506") (:authors ("Andrew Jose" . "arnav.jose@gmail.com")) (:maintainers ("Andrew Jose" . "arnav.jose@gmail.com")) (:maintainer "Andrew Jose" . "arnav.jose@gmail.com") (:keywords "faces" "theme") (:url . "https://github.com/crmsnbleyd/flexoki-emacs-theme"))]) + (flim . [(20240221 1353) ((emacs (24 5)) (apel (10 8)) (oauth2 (0 11))) "A library to provide basic features about message representation or encoding." tar ((:commit . "23bb29d70a13cada2eaab425ef80071564586a6d"))]) (flimenu . [(20200810 1510) ((emacs (24 4))) "Flatten imenu automatically" tar ((:commit . "4c0ff37cf3bd6c836bd136b5f6c450560a6c92b9") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainers ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:keywords "imenu" "browse" "structure" "hook" "mode" "matching" "tools" "convenience" "files") (:url . "https://github.com/IvanMalison/flimenu"))]) (fliptext . [(20171124 2056) nil "Input method for flipping characters upside down" tar ((:commit . "fd821f645ffebae6ae3894afa7ba7fc06f91afc6") (:authors ("André Riemann" . "andre.riemann@web.de")) (:maintainers ("André Riemann" . "andre.riemann@web.de")) (:maintainer "André Riemann" . "andre.riemann@web.de") (:keywords "games" "i18n"))]) (floobits . [(20211018 550) ((json (1 2)) (highlight (0))) "Floobits plugin for real-time collaborative editing" tar ((:commit . "93b3317fb6c842efe165e54c8a32bf51d436837d") (:authors ("Matt Kaniaris") ("Geoff Greer")) (:maintainers ("Matt Kaniaris")) (:maintainer "Matt Kaniaris") (:keywords "comm" "tools") (:url . "http://github.com/Floobits/floobits-emacs"))]) @@ -1671,61 +1719,62 @@ (flow-minor-mode . [(20200905 1730) ((emacs (25 1))) "Flow type mode based on web-mode." tar ((:commit . "804217a15a28f6918fba93c91d495ed7d50b0495") (:url . "https://github.com/an-sh/flow-minor-mode"))]) (flower . [(20220416 1744) ((emacs (24 4)) (clomacs (0 0 4))) "Emacs task tracker client." tar ((:commit . "047846409867b2dd0ba4e2047a414b498680cd9c") (:authors ("Sergey Sobko" . "flower@tpg.am")) (:maintainers ("Sergey Sobko" . "flower@tpg.am")) (:maintainer "Sergey Sobko" . "flower@tpg.am") (:keywords "hypermedia" "outlines" "tools" "vc") (:url . "https://github.com/FlowerAutomation/flower"))]) (flucui-themes . [(20200815 2103) ((emacs (24))) "Custom theme inspired by the Flat UI palette" tar ((:commit . "6591b5093e6e8f0e720e3995a16a91835b2e7a48") (:authors ("MetroWind" . "chris.corsair@gmail.com")) (:maintainers ("MetroWind" . "chris.corsair@gmail.com")) (:maintainer "MetroWind" . "chris.corsair@gmail.com") (:keywords "lisp") (:url . "https://github.com/MetroWind/flucui-theme"))]) - (flutter . [(20230811 458) ((emacs (25 1))) "Tools for working with Flutter SDK" tar ((:commit . "64b3f50a2008357359f1c4eea0e97c93070df7d4") (:authors ("Aaron Madlon-Kay")) (:maintainers ("Aaron Madlon-Kay")) (:maintainer "Aaron Madlon-Kay") (:keywords "languages") (:url . "https://github.com/amake/flutter.el"))]) + (flutter . [(20240202 1241) ((emacs (25 1))) "Tools for working with Flutter SDK" tar ((:commit . "004c91e070a9b4a2a5042f5bb20015ec65453acf") (:authors ("Aaron Madlon-Kay")) (:maintainers ("Aaron Madlon-Kay")) (:maintainer "Aaron Madlon-Kay") (:keywords "languages") (:url . "https://github.com/amake/flutter.el"))]) (flutter-l10n-flycheck . [(20220502 50) ((emacs (25 1)) (flycheck (30)) (flutter (0 1 0))) "Flycheck checker for intl_translation" tar ((:commit . "a2cb56015f5716d6dc0e38fecb7c5b4906a5ba74") (:authors ("Aaron Madlon-Kay")) (:maintainers ("Aaron Madlon-Kay")) (:maintainer "Aaron Madlon-Kay") (:keywords "languages") (:url . "https://github.com/amake/flutter.el"))]) (fluxus-mode . [(20210715 58) ((osc (0 1)) (emacs (24 4))) "Major mode for interfacing with Fluxus" tar ((:commit . "a14578640c578a4fd09cb7e25da1e87d637719ae") (:authors ("modula t." . "defaultxr@gmail.com")) (:maintainers ("modula t." . "defaultxr@gmail.com")) (:maintainer "modula t." . "defaultxr@gmail.com") (:keywords "languages") (:url . "https://github.com/defaultxr/fluxus-mode"))]) - (flx . [(20221213 542) ((cl-lib (0 3))) "fuzzy matching with good sorting" tar ((:commit . "7b44a5abb254bbfbeca7a29336f7f4ebd8aabbf2") (:authors ("Le Wang")) (:maintainers ("Le Wang")) (:maintainer "Le Wang") (:url . "https://github.com/lewang/flx"))]) - (flx-ido . [(20221213 542) ((flx (0 1)) (cl-lib (0 3))) "flx integration for ido" tar ((:commit . "7b44a5abb254bbfbeca7a29336f7f4ebd8aabbf2") (:authors ("Le Wang")) (:maintainers ("Le Wang")) (:maintainer "Le Wang") (:url . "https://github.com/lewang/flx"))]) + (flx . [(20240205 356) ((cl-lib (0 3))) "fuzzy matching with good sorting" tar ((:commit . "4b1346eb9a8a76ee9c9dede69738c63ad97ac5b6") (:authors ("Le Wang")) (:maintainers ("Le Wang")) (:maintainer "Le Wang") (:url . "https://github.com/lewang/flx"))]) + (flx-ido . [(20240205 356) ((flx (0 1)) (cl-lib (0 3))) "flx integration for ido" tar ((:commit . "4b1346eb9a8a76ee9c9dede69738c63ad97ac5b6") (:authors ("Le Wang")) (:maintainers ("Le Wang")) (:maintainer "Le Wang") (:url . "https://github.com/lewang/flx"))]) (flx-isearch . [(20191119 515) ((emacs (24)) (flx (20140821)) (cl-lib (0 5))) "Fuzzy incremental searching for emacs" tar ((:commit . "a44097fb8f539a193c2f09a37ea52a68f2c51839") (:authors ("PythonNut" . "pythonnut@pythonnut.com")) (:maintainers ("PythonNut" . "pythonnut@pythonnut.com")) (:maintainer "PythonNut" . "pythonnut@pythonnut.com") (:keywords "convenience" "search" "flx") (:url . "https://github.com/pythonnut/flx-isearch"))]) - (flycheck . [(20230813 620) ((emacs (25 1)) (dash (2 12 1)) (pkg-info (0 4)) (let-alist (1 0 4)) (seq (1 11))) "On-the-fly syntax checking" tar ((:commit . "773c3eb31ebeb6bb2f9f57d28177882ca7073df0") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainers ("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) (:maintainer "Clément Pit-Claudel" . "clement.pitclaudel@live.com") (:keywords "convenience" "languages" "tools") (:url . "http://www.flycheck.org"))]) + (flycheck . [(20240317 606) ((emacs (26 1))) "On-the-fly syntax checking" tar ((:commit . "0c8de6de03bb1639552007f70a9c66ebdd382496") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainers ("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) (:maintainer "Clément Pit-Claudel" . "clement.pitclaudel@live.com") (:keywords "convenience" "languages" "tools") (:url . "https://www.flycheck.org"))]) (flycheck-actionlint . [(20230802 913) ((emacs (26)) (flycheck (32))) "Flycheck integration for actionlint" tar ((:commit . "f3baf396b534f8b874d3ae885cc1dd53b5098dff") (:authors ("Theodor-Alexandru Irimia")) (:maintainers ("Theodor-Alexandru Irimia")) (:maintainer "Theodor-Alexandru Irimia") (:keywords "convenience" "github" "linter" "flycheck") (:url . "https://github.com/tirimia/flycheck-actionlint"))]) (flycheck-ameba . [(20191226 1011) ((emacs (24 4)) (flycheck (30))) "Add support for Ameba to Flycheck" tar ((:commit . "b129dbd8e4c43077521d1c77cc94bb3d52d5ee6d") (:keywords "tools" "crystal" "ameba") (:url . "https://github.com/crystal-ameba/ameba.el"))]) (flycheck-apertium . [(20181211 1038) ((flycheck (0 25))) "Apertium checkers in flycheck" tar ((:commit . "22b60a17836477ac1edd15dc85b14f88ca871ba9") (:authors ("Kevin Brubeck Unhammer" . "unhammer+apertium@mm.st")) (:maintainers ("Kevin Brubeck Unhammer" . "unhammer+apertium@mm.st")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer+apertium@mm.st") (:keywords "convenience" "tools" "xml") (:url . "http://wiki.apertium.org/wiki/Emacs"))]) - (flycheck-aspell . [(20230408 957) ((flycheck (28 0)) (emacs (25 1))) "Aspell checker for flycheck" tar ((:commit . "45cd22c52b676abbdf405d9fe16b7073b954ed77") (:authors ("Leo Gaskin" . "leo.gaskin@le0.gs")) (:maintainers ("Leo Gaskin" . "leo.gaskin@le0.gs")) (:maintainer "Leo Gaskin" . "leo.gaskin@le0.gs") (:keywords "wp" "flycheck" "spell" "aspell") (:url . "https://github.com/leotaku/flycheck-aspell"))]) + (flycheck-aspell . [(20240101 1945) ((flycheck (28 0)) (emacs (25 1))) "Aspell checker for flycheck" tar ((:commit . "aa73874abc60a43fcf615af9bdd85d3008bfe687") (:authors ("Leo Gaskin" . "leo.gaskin@le0.gs")) (:maintainers ("Leo Gaskin" . "leo.gaskin@le0.gs")) (:maintainer "Leo Gaskin" . "leo.gaskin@le0.gs") (:keywords "wp" "flycheck" "spell" "aspell") (:url . "https://github.com/leotaku/flycheck-aspell"))]) (flycheck-ats2 . [(20170225 1636) ((emacs (24 1)) (flycheck (0 22))) "Flycheck: ATS2 support" tar ((:commit . "9f77add8408462af35bdddf87e37a661880255e3") (:authors ("Mark Laws" . "mdl@60hz.org")) (:maintainers ("Mark Laws" . "mdl@60hz.org")) (:maintainer "Mark Laws" . "mdl@60hz.org") (:keywords "convenience" "tools" "languages") (:url . "http://github.com/drvink/flycheck-ats2"))]) (flycheck-bashate . [(20200625 642) ((flycheck (0 24)) (emacs (24 4))) "Integrate bashate with flycheck" tar ((:commit . "69e53e84f712bafffd785d84d9304598c2df5615") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainers ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com") (:url . "https://github.com/alexmurray/flycheck-bashate"))]) (flycheck-buf-lint . [(20230724 1501) ((emacs (26 1)) (flycheck (0 22)) (s (1 12 0))) "Flycheck checker for protobuf with buf.build" tar ((:commit . "51c439dcb9fa40966256d8cce835f7b7aabf44d0") (:authors ("Aaron Ji" . "shuxiao9058@gmail.com")) (:maintainers ("Aaron Ji" . "shuxiao9058@gmail.com")) (:maintainer "Aaron Ji" . "shuxiao9058@gmail.com") (:keywords "convenience" "tools" "buf" "protobuf") (:url . "https://github.com/shuxiao9058/flycheck-buf-lint"))]) - (flycheck-cask . [(20200926 1502) ((emacs (24 3)) (flycheck (0 14)) (dash (2 4 0))) "Cask support in Flycheck" tar ((:commit . "4b2ede6362ded4a45678dfbef1876faa42edbd58") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainers ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn.com") (:keywords "tools" "convenience") (:url . "https://github.com/flycheck/flycheck-cask"))]) - (flycheck-cfn . [(20220221 1029) ((emacs (26 1)) (flycheck (31))) "Flycheck backend for AWS cloudformation" tar ((:commit . "4cf56affe3035fda364109836e26499431095185") (:authors ("William Orr" . "will@worrbase.com")) (:maintainers ("William Orr" . "will@worrbase.com")) (:maintainer "William Orr" . "will@worrbase.com") (:keywords "convenience") (:url . "https://gitlab.com/worr/cfn-mode"))]) + (flycheck-cask . [(20240205 1721) ((emacs (24 3)) (flycheck (0 14)) (dash (2 4 0))) "Cask support in Flycheck" tar ((:commit . "0eeec5197e9d31bfcfc39380b262d65259a87d91") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainers ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn.com") (:keywords "tools" "convenience") (:url . "https://github.com/flycheck/flycheck-cask"))]) + (flycheck-cfn . [(20231030 1003) ((emacs (26 1)) (flycheck (31))) "Flycheck backend for AWS cloudformation" tar ((:commit . "0eb3dd630391e4d8a26e09c9032cfb9f4bd71e08") (:authors ("William Orr" . "will@worrbase.com")) (:maintainers ("William Orr" . "will@worrbase.com")) (:maintainer "William Orr" . "will@worrbase.com") (:keywords "convenience") (:url . "https://gitlab.com/worr/cfn-mode"))]) (flycheck-checkbashisms . [(20230313 1418) ((emacs (24)) (flycheck (0 25))) "checkbashisms checker for flycheck" tar ((:commit . "ca8f11679c77d6702f34e773bdde185ceb47a05d") (:authors ("Cuong Le" . "cuong.manhle.vn@gmail.com")) (:maintainers ("Cuong Le" . "cuong.manhle.vn@gmail.com")) (:maintainer "Cuong Le" . "cuong.manhle.vn@gmail.com") (:keywords "convenience" "tools" "sh" "unix") (:url . "https://github.com/cuonglm/flycheck-checkbashisms"))]) (flycheck-checkpatch . [(20170217 1025) ((emacs (25)) (flycheck (30))) "Flycheck support for checkpatch.pl tool" tar ((:commit . "6461fc7b0d493eb9863814055f8bce5fa35739de") (:authors ("Alexander Yarygin" . "yarygin.alexander@gmail.com")) (:maintainers ("Alexander Yarygin" . "yarygin.alexander@gmail.com")) (:maintainer "Alexander Yarygin" . "yarygin.alexander@gmail.com") (:url . "https://github.com/zpp0/flycheck-checkpatch"))]) (flycheck-clang-analyzer . [(20211214 648) ((flycheck (0 24)) (emacs (24 4))) "Integrate Clang Analyzer with flycheck" tar ((:commit . "646d9f3a80046ab231a07526778695d5decad92d") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainers ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com") (:url . "https://github.com/alexmurray/flycheck-clang-analyzer"))]) (flycheck-clang-tidy . [(20201115 1232) ((flycheck (0 30))) "Flycheck syntax checker using clang-tidy" tar ((:commit . "3bd947fb0dcc1e97617eab7be9e1b6e57db5e091") (:authors (nil . "Sebastian Nagel")) (:maintainers ("tastytea" . "tastytea@tastytea.de")) (:maintainer "tastytea" . "tastytea@tastytea.de") (:keywords "convenience" "languages" "tools") (:url . "https://github.com/ch1bo/flycheck-clang-tidy"))]) (flycheck-clangcheck . [(20150712 710) ((cl-lib (0 5)) (seq (1 7)) (flycheck (0 17))) "A Flycheck checker difinition for ClangCheck." tar ((:commit . "24a9424c484420073a24443a829fd5779752362b") (:authors ("kumar8600" . "kumar8600@gmail.com")) (:maintainers ("kumar8600" . "kumar8600@gmail.com")) (:maintainer "kumar8600" . "kumar8600@gmail.com") (:url . "https://github.com/kumar8600/flycheck-clangcheck"))]) - (flycheck-clj-kondo . [(20211227 2226) ((emacs (24 3)) (flycheck (0 18))) "Add clj-kondo linter to flycheck" tar ((:commit . "d8a6ee9a16aa24b5be01f1edf9843d41bdc75555") (:authors ("Michiel Borkent" . "michielborkent@gmail.com")) (:maintainers ("Michiel Borkent" . "michielborkent@gmail.com")) (:maintainer "Michiel Borkent" . "michielborkent@gmail.com") (:url . "https://github.com/borkdude/flycheck-clj-kondo"))]) + (flycheck-clj-kondo . [(20240218 2215) ((emacs (26 1)) (flycheck (34))) "Add clj-kondo linter to flycheck" tar ((:commit . "e38c67ba9db1ea1cbe1b61ab39b506c05efdcdbf") (:authors ("Michiel Borkent" . "michielborkent@gmail.com")) (:maintainers ("Michiel Borkent" . "michielborkent@gmail.com")) (:maintainer "Michiel Borkent" . "michielborkent@gmail.com") (:url . "https://github.com/borkdude/flycheck-clj-kondo"))]) (flycheck-clojure . [(20191215 2227) ((cider (0 22 0)) (flycheck (32 -4)) (let-alist (1 0 1)) (emacs (25))) "Flycheck: Clojure support" tar ((:commit . "bc85f9dfe1bcfa66a98d2ca5da955e7eab4ae00d") (:authors ("Peter Fraenkel" . "pnf@podsnap.com") ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainers ("Peter Fraenkel" . "pnf@podsnap.com")) (:maintainer "Peter Fraenkel" . "pnf@podsnap.com") (:url . "https://github.com/clojure-emacs/squiggly-clojure"))]) (flycheck-clolyze . [(20190422 2134) ((flycheck (0 25)) (emacs (24))) "Add Clolyze to to flycheck" tar ((:commit . "9a3300eac22a7ff96accf37fa2d761c13cc38020") (:authors ("Daniel Laps" . "daniel.laps@hhu.de")) (:maintainers ("Daniel Laps" . "daniel.laps@hhu.de")) (:maintainer "Daniel Laps" . "daniel.laps@hhu.de") (:url . "https://github.com/DLaps/flycheck-clolyze"))]) (flycheck-color-mode-line . [(20230106 1829) ((flycheck (0 15)) (emacs (24 3))) "Change mode line color with Flycheck status" tar ((:commit . "df9be4c5bf26c4dc5ddaeed8179c4d66bdaa91f5") (:authors ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainers ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainer "Sylvain Benner" . "sylvain.benner@gmail.com") (:keywords "convenience" "language" "tools") (:url . "https://github.com/flycheck/flycheck-color-mode-line"))]) (flycheck-coverity . [(20170704 59) ((flycheck (0 24)) (dash (2 12 0)) (emacs (24 4))) "Integrate Coverity with flycheck" tar ((:commit . "cb211e3dd50413a5042eb20175be518214591c9d") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainers ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com") (:url . "https://github.com/alexmurray/flycheck-coverity"))]) - (flycheck-credo . [(20170526 1545) ((flycheck (29))) "flycheck checker for elixir credo" tar ((:commit . "e88f11ead53805c361ec7706e44c3dfee1daa19f") (:authors ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainers ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainer "Aaron Jensen" . "aaronjensen@gmail.com") (:url . "https://github.com/aaronjensen/flycheck-credo"))]) + (flycheck-credo . [(20240105 1655) ((flycheck (29))) "flycheck checker for elixir credo" tar ((:commit . "e285bd042a535d0f13e0b4c5226df404cdda4033") (:authors ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainers ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainer "Aaron Jensen" . "aaronjensen@gmail.com") (:url . "https://github.com/aaronjensen/flycheck-credo"))]) (flycheck-crystal . [(20200805 2344) ((flycheck (30))) "Add support for Crystal to Flycheck" tar ((:commit . "f9e4db16ff9fdc6a296363aa35d19cfb4926e472") (:keywords "tools" "crystal") (:url . "https://github.com/crystal-lang-tools/emacs-crystal-mode"))]) (flycheck-css-colorguard . [(20161031 1122) ((flycheck (0 22)) (emacs (24))) "Detect similar colors in CSS" tar ((:commit . "ae94fa0396acd99f9ec36d9572459df793f37fe8") (:authors ("Saša Jovanić" . "info@simplify.ba")) (:maintainers ("Saša Jovanić" . "info@simplify.ba")) (:maintainer "Saša Jovanić" . "info@simplify.ba") (:keywords "flycheck" "css" "colorguard") (:url . "https://github.com/Simplify/flycheck-css-colorguard/"))]) (flycheck-cstyle . [(20160905 2341) ((flycheck (0 24)) (emacs (24 4))) "Integrate cstyle with flycheck" tar ((:commit . "002699f83253ea8e1a509a9ab6d0fce1a1650f73") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainers ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com") (:url . "https://github.com/alexmurray/flycheck-cstyle"))]) (flycheck-cython . [(20170724 958) ((flycheck (0 25))) "Support Cython in flycheck" tar ((:commit . "ecc4454d35ab5317ab66a04406f36f0c1dbc0b76") (:authors ("Lorenzo Bolla" . "lbolla@gmail.com")) (:maintainers ("Lorenzo Bolla" . "lbolla@gmail.com")) (:maintainer "Lorenzo Bolla" . "lbolla@gmail.com"))]) (flycheck-d-unittest . [(20160522 417) ((flycheck (0 21 -4 1)) (dash (1 4 0))) "Add D unittest support to flycheck" tar ((:commit . "3e614f23cb4a5566fd7988dbcaaf254af81c7718") (:authors ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainers ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainer "Tomoya Tanjo" . "ttanjo@gmail.com") (:keywords "flycheck" "d") (:url . "https://github.com/tom-tan/flycheck-d-unittest/"))]) (flycheck-dedukti . [(20171103 1212) ((flycheck (0 19)) (dedukti-mode (0 1))) "Flycheck integration of Dedukti" tar ((:commit . "3dbff5646355f39d57a3ec514f560a6b0082a1cd") (:authors ("Raphaël Cauderlier")) (:maintainers ("Raphaël Cauderlier")) (:maintainer "Raphaël Cauderlier") (:keywords "convenience" "languages" "tools" "flycheck" "dedukti") (:url . "https://github.com/rafoo/flycheck-dedukti"))]) - (flycheck-deno . [(20230212 1754) ((emacs (26 1)) (flycheck (0 14))) "Flycheck for deno-lint" tar ((:commit . "e7cd15a6a05be73d1f83a16d2efa6b49a105a9cd") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "lisp" "deno") (:url . "https://github.com/flycheck/flycheck-deno"))]) + (flycheck-deno . [(20240101 833) ((emacs (26 1)) (flycheck (0 14))) "Flycheck for deno-lint" tar ((:commit . "5e4d66865d7d91e7af3b1b69b02dd540c9ea5aca") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "lisp" "deno") (:url . "https://github.com/flycheck/flycheck-deno"))]) (flycheck-dialyxir . [(20170515 1525) ((flycheck (29))) "flycheck checker for elixir dialyxir" tar ((:commit . "adfb73374cb2bee75724822972f405f2ec371199") (:authors ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainers ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainer "Aaron Jensen" . "aaronjensen@gmail.com") (:url . "https://github.com/aaronjensen/flycheck-dialyxir"))]) (flycheck-dialyzer . [(20160326 1430) ((flycheck (0 18))) "Support dialyzer in flycheck" tar ((:commit . "a5df0db95ac69f397b5f85d325a6d88cf8974f64") (:authors ("Lorenzo Bolla" . "lbolla@gmail.com")) (:maintainers ("Lorenzo Bolla" . "lbolla@gmail.com")) (:maintainer "Lorenzo Bolla" . "lbolla@gmail.com"))]) (flycheck-dmd-dub . [(20210412 1608) ((flycheck (0 24)) (f (0 18 2))) "Sets flycheck-dmd-include-paths from dub package information" tar ((:commit . "818bfed45ac8597b6ad568c71eb9428138a125c8") (:authors ("Atila Neves" . "atila.neves@gmail.com")) (:maintainers ("Atila Neves" . "atila.neves@gmail.com")) (:maintainer "Atila Neves" . "atila.neves@gmail.com") (:keywords "languages") (:url . "http://github.com/atilaneves/flycheck-dmd-dub"))]) (flycheck-dogma . [(20170125 721) ((flycheck (29))) "flycheck checker for elixir dogma" tar ((:commit . "7e14207a7da67dc5524a8949cb37a3d11de1db6e") (:authors ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainers ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainer "Aaron Jensen" . "aaronjensen@gmail.com") (:url . "https://github.com/aaronjensen/flycheck-dogma"))]) (flycheck-drstring . [(20200210 1903) ((emacs (25 1)) (flycheck (0 25)) (swift-mode (8 0))) "Doc linting for Swift using DrString" tar ((:commit . "d8d5a560e792a6657ef5ac69934c74f1ed51372d") (:authors ("Daniel Martín" . "mardani29@yahoo.es")) (:maintainers ("Daniel Martín" . "mardani29@yahoo.es")) (:maintainer "Daniel Martín" . "mardani29@yahoo.es") (:keywords "tools" "flycheck") (:url . "https://github.com/danielmartin/flycheck-drstring"))]) (flycheck-dtrace . [(20180903 1630) ((emacs (25 1)) (flycheck (0 22))) "Flycheck: DTrace support" tar ((:commit . "951fab3a15c11d92b9fac1ea4791a80dfe034a00") (:authors ("Jürgen Hötzel" . "juergen@hoetzel.info")) (:maintainers ("Jürgen Hötzel" . "juergen@hoetzel.info")) (:maintainer "Jürgen Hötzel" . "juergen@hoetzel.info") (:keywords "languages" "convenience" "tools"))]) - (flycheck-eglot . [(20230630 1803) ((emacs (28 1)) (eglot (1 9)) (flycheck (32))) "Flycheck support for eglot" tar ((:commit . "9ff8d0068be59b1450964b390349d75a68af21ed") (:authors ("Sergey Firsov" . "intramurz@gmail.com")) (:maintainers ("Sergey Firsov" . "intramurz@gmail.com")) (:maintainer "Sergey Firsov" . "intramurz@gmail.com") (:keywords "convenience" "language" "tools") (:url . "https://github.com/intramurz/flycheck-eglot"))]) - (flycheck-eldev . [(20210305 2231) ((flycheck (32)) (dash (2 17)) (emacs (24 4))) "Eldev support in Flycheck" tar ((:commit . "9c605a579186a27ba0ff2b0486d84381a9b73f49") (:authors ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainers ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainer "Paul Pogonyshev" . "pogonyshev@gmail.com") (:keywords "tools" "convenience") (:url . "https://github.com/flycheck/flycheck-eldev"))]) + (flycheck-eask . [(20240223 1023) ((emacs (26 1)) (flycheck (0 14))) "Eask support in Flycheck" tar ((:commit . "c1c82b359bb94cbca29f2f0fb29b7f5132691d04") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "lisp" "eask") (:url . "https://github.com/flycheck/flycheck-eask"))]) + (flycheck-eglot . [(20240214 1937) ((emacs (28 1)) (eglot (1 9)) (flycheck (32))) "Flycheck support for eglot" tar ((:commit . "a38101634c55ef6cfcfc74b4fd9a50b541b42457") (:authors ("Sergey Firsov" . "intramurz@gmail.com")) (:maintainers ("Sergey Firsov" . "intramurz@gmail.com")) (:maintainer "Sergey Firsov" . "intramurz@gmail.com") (:keywords "convenience" "language" "tools") (:url . "https://github.com/flycheck/flycheck-eglot"))]) + (flycheck-eldev . [(20230905 1754) ((flycheck (32)) (dash (2 17)) (emacs (24 4))) "Eldev support in Flycheck" tar ((:commit . "e3d5cdaf8183bd9d1cf66857d21bf86052b1d703") (:authors ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainers ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainer "Paul Pogonyshev" . "pogonyshev@gmail.com") (:keywords "tools" "convenience") (:url . "https://github.com/flycheck/flycheck-eldev"))]) (flycheck-elixir . [(20210413 612) ((flycheck (0 25))) "Support Elixir in flycheck" tar ((:commit . "b57a77a21d6cf9621b3387831cba34135c4fa35d") (:authors ("Lorenzo Bolla" . "lbolla@gmail.com")) (:maintainers ("Lorenzo Bolla" . "lbolla@gmail.com")) (:maintainer "Lorenzo Bolla" . "lbolla@gmail.com"))]) (flycheck-elm . [(20181107 146) ((flycheck (0 29 -4)) (emacs (24 4)) (let-alist (1 0 5)) (seq (2 20))) "Flycheck support for the elm language" tar ((:commit . "debd0af563cb6c2944367a691c7fa3021d9378c1") (:authors ("Brian Sermons")) (:maintainers ("Brian Sermons")) (:maintainer "Brian Sermons") (:url . "https://github.com/bsermons/flycheck-elm"))]) (flycheck-elsa . [(20230217 1640) ((emacs (25)) (flycheck (0 14)) (seq (2 0))) "Flycheck for Elsa" tar ((:commit . "d60db9544d0c4213f2478bcea0fd0e668e31cf34") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "convenience") (:url . "https://github.com/emacs-elsa/flycheck-elsa"))]) - (flycheck-falco-rules . [(20230302 2340) ((emacs (24 3)) (flycheck (0 25)) (let-alist (1 0 1))) "On-the-fly syntax checking for falco rules files" tar ((:commit . "1ad301d497ade9556327053ca571ee51bf0c0633") (:authors ("The Falco Developers (https://falco.org)")) (:maintainers ("The Falco Developers (https://falco.org)")) (:maintainer "The Falco Developers (https://falco.org)") (:keywords "tools" "convenience") (:url . "https://github.com/falcosecurity/flycheck-falco-rules"))]) + (flycheck-falco-rules . [(20231020 1534) ((emacs (24 3)) (flycheck (0 25)) (let-alist (1 0 1))) "On-the-fly syntax checking for falco rules files" tar ((:commit . "4bdc576abb13569354281badeaafe4abeee7fb3d") (:authors ("The Falco Developers (https://falco.org)")) (:maintainers ("The Falco Developers (https://falco.org)")) (:maintainer "The Falco Developers (https://falco.org)") (:keywords "tools" "convenience") (:url . "https://github.com/falcosecurity/flycheck-falco-rules"))]) (flycheck-flawfinder . [(20211214 647) ((flycheck (0 24)) (emacs (24 4))) "Integrate flawfinder with flycheck" tar ((:commit . "85701b849ea1ed8438ed4b7ae236e99d0f5528c7") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainers ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com") (:url . "https://github.com/alexmurray/flycheck-flawfinder"))]) (flycheck-flow . [(20190304 1459) ((flycheck (0 18)) (json (1 4))) "Support Flow in flycheck" tar ((:commit . "9e8e52cfc98af6a23fd906f9cb5d5d470d8cf82d") (:authors ("Lorenzo Bolla" . "lbolla@gmail.com")) (:maintainers ("Lorenzo Bolla" . "lbolla@gmail.com")) (:maintainer "Lorenzo Bolla" . "lbolla@gmail.com"))]) (flycheck-ghcmod . [(20150114 632) ((flycheck (0 21 -4 1)) (dash (2 0))) "A flycheck checker for Haskell using ghcmod" tar ((:commit . "6bb7b7d879f05bbae54e99eb04806c877adf3ccc") (:authors ("Shen Chao" . "scturtle@gmail.com")) (:maintainers ("Shen Chao" . "scturtle@gmail.com")) (:maintainer "Shen Chao" . "scturtle@gmail.com") (:keywords "convenience" "languages" "tools") (:url . "https://github.com/scturtle/flycheck-ghcmod"))]) (flycheck-golangci-lint . [(20230523 1855) ((emacs (24)) (flycheck (0 22))) "Flycheck checker for golangci-lint" tar ((:commit . "9def093e416e9a6ddd3cae8590dbb7ff6314925a") (:authors ("Wei Jian Gan" . "weijiangan@outlook.com")) (:maintainers ("Wei Jian Gan" . "weijiangan@outlook.com")) (:maintainer "Wei Jian Gan" . "weijiangan@outlook.com") (:keywords "convenience" "tools" "go") (:url . "https://github.com/weijiangan/flycheck-golangci-lint"))]) (flycheck-gometalinter . [(20180424 941) ((emacs (24)) (flycheck (0 22))) "flycheck checker for gometalinter" tar ((:commit . "422f6e4b77b27fd7370f0c88437ac5072c9d3413") (:authors ("Diep Pham" . "me@favadi.com")) (:maintainers ("Diep Pham" . "me@favadi.com")) (:maintainer "Diep Pham" . "me@favadi.com") (:keywords "convenience" "tools" "go") (:url . "https://github.com/favadi/flycheck-gometalinter"))]) - (flycheck-google-cpplint . [(20230816 734) ((flycheck (0 20 -4 1))) "Help to comply with the Google C++ Style Guide" tar ((:commit . "59feb38c47cf95176636afc65325741a2d9ae6f3") (:authors ("Akiha Senda" . "senda.akiha@gmail.com")) (:maintainers ("Jen-Chieh Shen" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh Shen" . "jcs090218@gmail.com") (:keywords "flycheck" "c" "c++") (:url . "https://github.com/flycheck/flycheck-google-cpplint/"))]) + (flycheck-google-cpplint . [(20240101 833) ((flycheck (0 20 -4 1))) "Help to comply with the Google C++ Style Guide" tar ((:commit . "2330e8ed99d89010b652dcb8e9a9a546a9e6da3a") (:authors ("Akiha Senda" . "senda.akiha@gmail.com")) (:maintainers ("Jen-Chieh Shen" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh Shen" . "jcs090218@gmail.com") (:keywords "flycheck" "c" "c++") (:url . "https://github.com/flycheck/flycheck-google-cpplint/"))]) (flycheck-gradle . [(20190315 234) ((emacs (25 1)) (flycheck (0 25))) "Flycheck extension for Gradle." tar ((:commit . "1ca08bbc343362a923cbdc2010f66e41655e92ab") (:maintainers ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com") (:keywords "languages" "gradle") (:url . "https://github.com/jojojames/flycheck-gradle"))]) (flycheck-grammalecte . [(20230605 1035) ((emacs (26 1)) (flycheck (26))) "Integrate Grammalecte with Flycheck" tar ((:commit . "76aca865992d828af54d77c1cf9a70663747e080") (:authors ("Guilhem Doulcier" . "guilhem.doulcier@espci.fr") ("Étienne Deparis" . "etienne@depar.is")) (:maintainers ("Étienne Deparis" . "etienne@depar.is")) (:maintainer "Étienne Deparis" . "etienne@depar.is") (:keywords "i18n" "text") (:url . "https://git.umaneti.net/flycheck-grammalecte/"))]) - (flycheck-grammarly . [(20221231 1654) ((emacs (25 1)) (flycheck (0 14)) (grammarly (0 3 0)) (s (1 12 0))) "Grammarly support for Flycheck" tar ((:commit . "d4a788acc3875a1ffdd7460ab3377a887413c582") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "grammar" "check") (:url . "https://github.com/emacs-grammarly/flycheck-grammarly"))]) + (flycheck-grammarly . [(20240101 847) ((emacs (25 1)) (flycheck (0 14)) (grammarly (0 3 0)) (s (1 12 0))) "Grammarly support for Flycheck" tar ((:commit . "cb011efcc05b111bb4638cc42c24c5b11fc5f378") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "grammar" "check") (:url . "https://github.com/emacs-grammarly/flycheck-grammarly"))]) (flycheck-guile . [(20230405 1154) ((emacs (25 1)) (flycheck (0 22)) (geiser (0 20))) "A Flycheck checker for GNU Guile" tar ((:commit . "dd7bbdc48fd21cf8d270c913c56cd580f8ec3d03") (:authors ("Ricardo Wurmus" . "rekado@elephly.net")) (:maintainers ("Andrew Whatson" . "whatson@tailcall.au")) (:maintainer "Andrew Whatson" . "whatson@tailcall.au") (:url . "https://notabug.org/flatwhatson/flycheck-guile"))]) (flycheck-haskell . [(20230706 1439) ((emacs (24 3)) (flycheck (0 25)) (haskell-mode (13 7)) (dash (2 4 0)) (seq (1 11)) (let-alist (1 0 1))) "Flycheck: Automatic Haskell configuration" tar ((:commit . "b7c4861aa754220b7d0cfc05aa0895bb35665683") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainers ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn.com") (:keywords "tools" "convenience") (:url . "https://github.com/flycheck/flycheck-haskell"))]) (flycheck-hdevtools . [(20160926 702) ((flycheck (0 21 -4 1)) (dash (2 0))) "A flycheck checker for Haskell using hdevtools" tar ((:commit . "53829f0c57800615718cfce27ffa16d8ba286cee") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "convenience" "languages" "tools") (:url . "https://github.com/flycheck/flycheck-hdevtools"))]) @@ -1741,7 +1790,7 @@ (flycheck-julia . [(20170729 2141) ((emacs (24)) (flycheck (0 22))) "Julia support for Flycheck" tar ((:commit . "213b60a5a9a1cb7887260e1d159b5bb27167cbb6") (:authors ("Guido Kraemer" . "guido.kraemer@gmx.de")) (:maintainers ("Guido Kraemer" . "guido.kraemer@gmx.de")) (:maintainer "Guido Kraemer" . "guido.kraemer@gmx.de") (:keywords "convenience" "tools" "languages") (:url . "https://github.com/gdkrmr/flycheck-julia"))]) (flycheck-keg . [(20200726 218) ((emacs (24 3)) (keg (0 1)) (flycheck (0 1))) "Flycheck for Keg projects" tar ((:commit . "926de8f43842380e7150d99971eb73ff84cb59cb") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "convenience") (:url . "https://github.com/conao3/keg.el"))]) (flycheck-kotlin . [(20230111 1907) ((flycheck (0 20))) "Support kotlin in flycheck" tar ((:commit . "a2a6abb9a7f85c6fb15ce327459ec3c8ff780188") (:authors ("Elric Milon" . "whirm_REMOVETHIS__@gmx.com")) (:maintainers ("Elric Milon" . "whirm_REMOVETHIS__@gmx.com")) (:maintainer "Elric Milon" . "whirm_REMOVETHIS__@gmx.com"))]) - (flycheck-languagetool . [(20230329 1246) ((emacs (25 1)) (flycheck (0 14))) "Flycheck support for LanguageTool" tar ((:commit . "04195838e21da84ec46d2940c2b3ee82d8beda70") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com") ("Peter Oliver" . "git@mavit.org.uk")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "grammar" "check") (:url . "https://github.com/emacs-languagetool/flycheck-languagetool"))]) + (flycheck-languagetool . [(20240101 851) ((emacs (25 1)) (flycheck (0 14))) "Flycheck support for LanguageTool" tar ((:commit . "e80a23bcdc91df09f6013b553d60a813481086ff") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com") ("Peter Oliver" . "git@mavit.org.uk")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "grammar" "check") (:url . "https://github.com/emacs-languagetool/flycheck-languagetool"))]) (flycheck-ledger . [(20200304 2204) ((emacs (24 1)) (flycheck (0 15))) "Flycheck integration for ledger files" tar ((:commit . "628e25ba66604946085571652a94a54f4d1ad96f") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "convenience" "languages" "tools") (:url . "https://github.com/purcell/flycheck-ledger"))]) (flycheck-lilypond . [(20211006 2102) ((emacs (24 3)) (flycheck (0 22))) "LilyPond support in Flycheck" tar ((:commit . "78f8c16cd67f9f6d3f1806e1fd403222723ba400") (:authors ("Hinrik Örn Sigurðsson" . "hinrik.sig@gmail.com")) (:maintainers ("Hinrik Örn Sigurðsson" . "hinrik.sig@gmail.com")) (:maintainer "Hinrik Örn Sigurðsson" . "hinrik.sig@gmail.com") (:keywords "tools" "convenience") (:url . "https://github.com/hinrik/flycheck-lilypond"))]) (flycheck-liquidhs . [(20170412 2326) ((flycheck (0 15))) "A flycheck checker for Haskell using liquid (i.e. liquidhaskell)" tar ((:commit . "c27252ac24d77f4b6eec76a4ba9cd61761a3fba9") (:authors ("Ranjit Jhala" . "jhala@cs.ucsd.edu")) (:maintainers ("Ranjit Jhala" . "jhala@cs.ucsd.edu")) (:maintainer "Ranjit Jhala" . "jhala@cs.ucsd.edu") (:keywords "convenience" "languages" "tools") (:url . "https://github.com/ucsd-progsys/liquidhaskell/flycheck-liquid.el"))]) @@ -1767,12 +1816,12 @@ (flycheck-prospector . [(20180524 450) ((flycheck (0 22))) "Support prospector in flycheck" tar ((:commit . "d5b81adb5c8261b935baf0a614dd4b776280392e") (:authors ("Carlos Coelho" . "carlospecter@gmail.com")) (:maintainers ("Carlos Coelho" . "carlospecter@gmail.com")) (:maintainer "Carlos Coelho" . "carlospecter@gmail.com") (:url . "https://github.com/chocoelho/flycheck-prospector"))]) (flycheck-psalm . [(20211002 1555) ((emacs (24 3)) (flycheck (26)) (psalm (0 6 0))) "Flycheck integration for Psalm" tar ((:commit . "28d546a79cb865a78b94cd7e929d66d720505faa") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "tools" "php") (:url . "https://github.com/emacs-php/psalm.el"))]) (flycheck-pycheckers . [(20220923 2250) ((flycheck (0 18))) "multiple syntax checker for Python, using Flycheck" tar ((:commit . "897fba15787df94c1ce6a48551f1b149940ffc25") (:keywords "convenience" "tools" "languages") (:url . "https://github.com/msherry/flycheck-pycheckers"))]) - (flycheck-pyflakes . [(20170330 2311) ((flycheck (0 18))) "Support pyflakes in flycheck" tar ((:commit . "61b045939e3743b2162b7e4e73249c66fc2b8f65") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))]) + (flycheck-pyflakes . [(20240124 101) ((flycheck (0 18))) "Support pyflakes in flycheck" tar ((:commit . "60db5908747faf3831f055eddc6d3b5deafa7384") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))]) (flycheck-pyre . [(20190215 1222) ((emacs (24)) (flycheck (29)) (cl-lib (0 6))) "Support Pyre in flycheck" tar ((:commit . "0560122caae207d99d8af1ac2b4e5d6f6a1ce444") (:authors ("Vyacheslav Linnik" . "vyacheslav.linnik@gmail.com")) (:maintainers ("Vyacheslav Linnik" . "vyacheslav.linnik@gmail.com")) (:maintainer "Vyacheslav Linnik" . "vyacheslav.linnik@gmail.com") (:url . "https://github.com/linnik/flycheck-pyre"))]) (flycheck-raku . [(20220420 732) ((emacs (26 3)) (flycheck (0 22))) "Raku support in Flycheck" tar ((:commit . "4da1970a75396aff1957b07f7579c1de6b817e6b") (:authors ("Hinrik Örn Sigurðsson" . "hinrik.sig@gmail.com") ("Johnathon Weare" . "jrweare@gmail.com") ("Siavash Askari Nasr" . "siavash.askari.nasr@gmail.com")) (:maintainers ("Hinrik Örn Sigurðsson" . "hinrik.sig@gmail.com")) (:maintainer "Hinrik Örn Sigurðsson" . "hinrik.sig@gmail.com") (:keywords "tools" "convenience") (:url . "https://github.com/Raku/flycheck-raku"))]) (flycheck-relint . [(20200721 2217) ((emacs (26 1)) (flycheck (0 22)) (relint (1 15))) "A Flycheck checker for elisp regular expressions" tar ((:commit . "d1e54d4bfdb12d0b60a1b9a8c2b11799426ddc57") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "lisp") (:url . "https://github.com/purcell/flycheck-relint"))]) (flycheck-rtags . [(20191222 920) ((emacs (24)) (flycheck (0 23)) (rtags (2 10))) "RTags Flycheck integration" tar ((:commit . "595055b5316a7c92ba1d638f324f98842a0f41a5") (:authors ("Christian Schwarzgruber" . "c.schwarzgruber.cs@gmail.com")) (:maintainers ("Christian Schwarzgruber" . "c.schwarzgruber.cs@gmail.com")) (:maintainer "Christian Schwarzgruber" . "c.schwarzgruber.cs@gmail.com") (:url . "https://github.com/Andersbakken/rtags"))]) - (flycheck-rust . [(20190319 1546) ((emacs (24 1)) (flycheck (28)) (dash (2 13 0)) (seq (2 3)) (let-alist (1 0 4))) "Flycheck: Rust additions and Cargo support" tar ((:commit . "a139cd53c5062697e9ed94ad80b803c37d999600") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainers ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn.com") (:keywords "tools" "convenience") (:url . "https://github.com/flycheck/flycheck-rust"))]) + (flycheck-rust . [(20240205 1018) ((emacs (24 1)) (flycheck (28)) (dash (2 13 0)) (seq (2 3)) (let-alist (1 0 4))) "Flycheck: Rust additions and Cargo support" tar ((:commit . "4d365ed1c9e8b8ac43561eb365d37ab555a6e617") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainers ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn.com") (:keywords "tools" "convenience") (:url . "https://github.com/flycheck/flycheck-rust"))]) (flycheck-stan . [(20211129 2051) ((emacs (25 1)) (flycheck (0 16 0)) (stan-mode (10 3 0))) "Add Stan support for Flycheck" tar ((:commit . "150bbbe5fd3ad2b5a3dbfba9d291e66eeea1a581") (:authors ("Jeffrey Arnold" . "jeffrey.arnold@gmail.com") ("Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu")) (:maintainers ("Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu")) (:maintainer "Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu") (:keywords "c" "languages") (:url . "https://github.com/stan-dev/stan-mode/tree/master/flycheck-stan"))]) (flycheck-status-emoji . [(20180516 229) ((cl-lib (0 1)) (emacs (24)) (flycheck (0 20)) (let-alist (1 0))) "Show flycheck status using cute, compact emoji" tar ((:commit . "4bd113ab42dec9544b66e0a27ed9008ce8148433") (:authors ("Ben Liblit" . "liblit@acm.org")) (:maintainers ("Ben Liblit" . "liblit@acm.org")) (:maintainer "Ben Liblit" . "liblit@acm.org") (:keywords "convenience" "languages" "tools") (:url . "https://github.com/liblit/flycheck-status-emoji"))]) (flycheck-swift . [(20170129 549) ((emacs (24 4)) (flycheck (0 25))) "Flycheck extension for Apple's Swift." tar ((:commit . "c6c416a1b7a7d346e5c040e4e4065abc68d3a844") (:keywords "languages" "swift"))]) @@ -1788,26 +1837,29 @@ (flycheck-yamllint . [(20170326 1309) ((flycheck (30))) "Flycheck integration for YAMLLint" tar ((:commit . "aa211b1243168a4f752888c0014c5b9d2da178b1") (:authors ("Krzysztof Magosa" . "krzysztof@magosa.pl")) (:maintainers ("Krzysztof Magosa" . "krzysztof@magosa.pl")) (:maintainer "Krzysztof Magosa" . "krzysztof@magosa.pl") (:keywords "convenience" "languages" "tools") (:url . "https://github.com/krzysztof-magosa/flycheck-yamllint"))]) (flycheck-yang . [(20180312 1831) ((yang-mode (0 9 4)) (flycheck (0 18))) "YANG flycheck checker" tar ((:commit . "47881fc42ef0163c47064b72b5d6dbef4f83d778") (:authors (nil . "Andrew Fort (@andaru)")) (:maintainers (nil . "Andrew Fort (@andaru)")) (:maintainer nil . "Andrew Fort (@andaru)"))]) (flycheck-ycmd . [(20181016 618) ((emacs (24)) (dash (2 13 0)) (flycheck (0 22)) (ycmd (1 2)) (let-alist (1 0 5))) "flycheck integration for ycmd" tar ((:commit . "ef87d020d3314efbac2e8925c115d0ac5c128c2a") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainers ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:url . "https://github.com/abingham/emacs-ycmd"))]) - (flymake-actionlint . [(20230731 753) ((emacs (24 1)) (flymake-easy (0 0 0))) "A Flymake handler for actionlint" tar ((:commit . "98a47bc6ae2d31f699e98caf8093d5bb8cc04771") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainers ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com") (:keywords "convenience") (:url . "https://github.com/ROCKTAKEY/flymake-actionlint"))]) - (flymake-aspell . [(20230408 957) ((emacs (26 1))) "Aspell checker for flymake" tar ((:commit . "45cd22c52b676abbdf405d9fe16b7073b954ed77") (:authors ("Leo Gaskin" . "leo.gaskin@le0.gs")) (:maintainers ("Leo Gaskin" . "leo.gaskin@le0.gs")) (:maintainer "Leo Gaskin" . "leo.gaskin@le0.gs") (:keywords "wp" "flymake" "spell" "aspell") (:url . "https://github.com/leotaku/flycheck-aspell"))]) - (flymake-clippy . [(20230826 1702) ((emacs (26 1))) "Flymake backend for Clippy" tar ((:commit . "d0774403fe96d88bd629d0825ffca46a1786d697") (:authors ("Graham Marlow" . "info@mgmarlow.com")) (:maintainers ("Graham Marlow" . "info@mgmarlow.com")) (:maintainer "Graham Marlow" . "info@mgmarlow.com") (:keywords "tools") (:url . "https://sr.ht/~mgmarlow/flymake-clippy/"))]) + (flymake-actionlint . [(20231104 239) ((emacs (24 1)) (flymake-easy (0 0 0))) "A Flymake handler for actionlint" tar ((:commit . "17ee78db1e1639ac8272d5c0919b82865b638aaf") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainers ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com") (:keywords "convenience") (:url . "https://github.com/ROCKTAKEY/flymake-actionlint"))]) + (flymake-aspell . [(20240101 1945) ((emacs (26 1))) "Aspell checker for flymake" tar ((:commit . "aa73874abc60a43fcf615af9bdd85d3008bfe687") (:authors ("Leo Gaskin" . "leo.gaskin@le0.gs")) (:maintainers ("Leo Gaskin" . "leo.gaskin@le0.gs")) (:maintainer "Leo Gaskin" . "leo.gaskin@le0.gs") (:keywords "wp" "flymake" "spell" "aspell") (:url . "https://github.com/leotaku/flycheck-aspell"))]) + (flymake-clippy . [(20231102 1616) ((emacs (26 1))) "Flymake backend for Clippy" tar ((:commit . "62c670c19e575a0d7dd723cbd195c18de60bb494") (:authors ("Graham Marlow" . "info@mgmarlow.com")) (:maintainers ("Graham Marlow" . "info@mgmarlow.com")) (:maintainer "Graham Marlow" . "info@mgmarlow.com") (:keywords "tools") (:url . "https://sr.ht/~mgmarlow/flymake-clippy/"))]) (flymake-coffee . [(20170723 146) ((flymake-easy (0 1))) "A flymake handler for coffee script" tar ((:commit . "dee295acf30820ed15fe0de17137d50bc27fc80c") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flymake-coffee"))]) - (flymake-collection . [(20230606 2002) ((emacs (28 1)) (let-alist (1 0)) (flymake (1 2 1))) "Collection of checkers for flymake, bringing flymake to the level of flycheck" tar ((:commit . "845c52a1aead7485450c62b48a92096160d99a25") (:authors ("Mohsin Kaleem" . "mohkale@kisara.moe")) (:maintainers ("Mohsin Kaleem" . "mohkale@kisara.moe")) (:maintainer "Mohsin Kaleem" . "mohkale@kisara.moe") (:keywords "language" "tools") (:url . "https://github.com/mohkale/flymake-collection"))]) - (flymake-cspell . [(20230208 2155) ((emacs (26 1))) "A Flymake backend for CSpell" tar ((:commit . "c68bf7eef99ddb2fbd780f175e869df2db5d768f") (:authors ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainers ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainer "Fritz Grabo" . "hello@fritzgrabo.com") (:keywords "wp") (:url . "https://github.com/fritzgrabo/flymake-cspell"))]) + (flymake-collection . [(20240316 2135) ((emacs (28 1)) (let-alist (1 0)) (flymake (1 2 1))) "Collection of checkers for flymake, bringing flymake to the level of flycheck" tar ((:commit . "f1d889f166934a4d8ec0f0e159e179314c2e8791") (:authors ("Mohsin Kaleem" . "mohkale@kisara.moe")) (:maintainers ("Mohsin Kaleem" . "mohkale@kisara.moe")) (:maintainer "Mohsin Kaleem" . "mohkale@kisara.moe") (:keywords "language" "tools") (:url . "https://github.com/mohkale/flymake-collection"))]) + (flymake-cspell . [(20240304 1349) ((emacs (26 1))) "A Flymake backend for CSpell" tar ((:commit . "a573c07142cd0142c4cc1affd57f96b4d5c229b3") (:authors ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainers ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainer "Fritz Grabo" . "hello@fritzgrabo.com") (:keywords "wp") (:url . "https://github.com/fritzgrabo/flymake-cspell"))]) (flymake-css . [(20170723 146) ((flymake-easy (0 1))) "Flymake support for css using csslint" tar ((:commit . "de090163ba289910ceeb61b13368ce42d0f2dfd8") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flymake-css"))]) (flymake-cursor . [(20220506 1458) ((flymake (0 3))) "Show flymake messages in the minibuffer after delay" tar ((:commit . "95806594cacddbbc0c3aa2351a6a7cf28e73a8bf") (:authors ("Unknown Original Author") ("Dino Chiesa" . "dpchiesa@hotmail.com") ("Sam Graham ")) (:maintainers ("Sam Graham ")) (:maintainer "Sam Graham ") (:keywords "languages" "mode" "flymake") (:url . "https://github.com/flymake/emacs-flymake-cursor"))]) (flymake-diagnostic-at-point . [(20180815 1004) ((emacs (26 1)) (popup (0 5 3))) "Display flymake diagnostics at point" tar ((:commit . "379616b1c6f5ebeaf08fbe54ae765008a78b3be7") (:authors ("Ricardo Martins" . "ricardo@scarybox.net")) (:maintainers ("Ricardo Martins" . "ricardo@scarybox.net")) (:maintainer "Ricardo Martins" . "ricardo@scarybox.net") (:keywords "convenience" "languages" "tools") (:url . "https://github.com/meqif/flymake-diagnostic-at-point"))]) + (flymake-eask . [(20240223 1022) ((emacs (26 1)) (flymake-easy (0 1))) "Eask support in Flymake" tar ((:commit . "0e83cec77aab54365ef8d604151888bb1f61049c") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "lisp" "eask") (:url . "https://github.com/flymake/flymake-eask"))]) (flymake-easy . [(20141022 1828) nil "Helpers for easily building flymake checkers" tar ((:commit . "2a24f260cdc3b9c8f9263b653a475d90efa1d392") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "convenience" "internal") (:url . "https://github.com/purcell/flymake-easy"))]) + (flymake-eldev . [(20240115 1927) ((dash (2 17)) (emacs (28 1))) "Eldev support in Flymake" tar ((:commit . "901b2837c7d575f929f87aa83b8e725841927584") (:authors ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainers ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainer "Paul Pogonyshev" . "pogonyshev@gmail.com") (:keywords "tools" "convenience") (:url . "https://github.com/emacs-eldev/flymake-eldev"))]) (flymake-elisp-config . [(20230711 1833) ((emacs (28 1))) "Setup load-path for flymake on Emacs Lisp mode" tar ((:commit . "3607b1ee738141f67ae803b4daadd4e2906ff324") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainers ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com") (:keywords "lisp") (:url . "https://github.com/ROCKTAKEY/flymake-elisp-config"))]) (flymake-elixir . [(20130810 1417) nil "A flymake handler for elixir-mode .ex files." tar ((:commit . "3810566cffe35d04cc3f01e27fe397d68d52f802") (:authors ("Sylvain Benner" . "syl20bnr@gmail.com")) (:maintainers ("Sylvain Benner" . "syl20bnr@gmail.com")) (:maintainer "Sylvain Benner" . "syl20bnr@gmail.com"))]) - (flymake-eslint . [(20230301 1441) ((emacs (26 1))) "A Flymake backend for Javascript using eslint" tar ((:commit . "82b1345c699172b6092e13be2c4cc10551d88b90") (:authors ("Dan Orzechowski")) (:maintainers ("Dan Orzechowski")) (:maintainer "Dan Orzechowski") (:keywords "languages" "tools") (:url . "https://github.com/orzechowskid/flymake-eslint"))]) + (flymake-eslint . [(20240202 1548) ((emacs (26 1))) "A Flymake backend for Javascript using eslint" tar ((:commit . "c783788fc1b6fa9703c623f651f4a72c11923d30") (:authors ("Dan Orzechowski")) (:maintainers ("Dan Orzechowski")) (:maintainer "Dan Orzechowski") (:keywords "languages" "tools") (:url . "https://github.com/orzechowskid/flymake-eslint"))]) + (flymake-fennel . [(20231118 1858) ((emacs (26 1))) "Flymake backend for Fennel" tar ((:commit . "f62be1505152d0adec0aa7927e674db8cef58b28") (:authors ("Graham Marlow" . "info@mgmarlow.com")) (:maintainers ("Graham Marlow" . "info@mgmarlow.com")) (:maintainer "Graham Marlow" . "info@mgmarlow.com") (:keywords "tools") (:url . "https://git.sr.ht/~mgmarlow/flymake-fennel"))]) (flymake-flycheck . [(20230826 749) ((flycheck (31)) (emacs (26 1))) "Use flycheck checkers as flymake backends" tar ((:commit . "cc50a97ee1384d260c56aca257a1dbf770084330") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "convenience" "languages" "tools") (:url . "https://github.com/purcell/flymake-flycheck"))]) (flymake-gjshint . [(20130327 1232) nil "A flymake handler for javascript using both jshint and gjslint" tar ((:commit . "71495ee5303de18293decd57ab9f9abdbaabfa05") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainers ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com") (:keywords "flymake" "javascript" "jshint" "gjslint"))]) (flymake-go . [(20150714 733) nil "A flymake handler for go-mode files" tar ((:commit . "ae83761aa908c1a50ff34af04f00dcc46bca2ce9") (:authors ("Michael Fellinger" . "michael@iron.io") ("Robert Zaremba" . "robert.marek.zaremba@wp.eu")) (:maintainers ("Michael Fellinger" . "michael@iron.io")) (:maintainer "Michael Fellinger" . "michael@iron.io") (:keywords "go" "flymake") (:url . "https://github.com/robert-zaremba/flymake-go"))]) (flymake-go-staticcheck . [(20220804 1907) ((emacs (26 1))) "Go staticcheck linter for flymake" tar ((:commit . "9098f7e07ea6513667dc6af6d9ad2fa854464d20") (:authors ("Sergey Kostyaev" . "feo.me@ya.ru")) (:maintainers ("Sergey Kostyaev" . "feo.me@ya.ru")) (:maintainer "Sergey Kostyaev" . "feo.me@ya.ru") (:keywords "languages" "tools") (:url . "https://github.com/s-kostyaev/flymake-go-staticcheck"))]) (flymake-golangci . [(20191028 1927) ((flymake-easy (0 1)) (emacs (24))) "A flymake handler for go-mode files using Golang CI lint" tar ((:commit . "dfc31a1a6ae3f087b49fe6f5f21b3866780aa91c") (:authors ("Jorge Javier Araya Navarro" . "jorgejavieran@yahoo.com.mx")) (:maintainers ("Jorge Javier Araya Navarro" . "jorgejavieran@yahoo.com.mx")) (:maintainer "Jorge Javier Araya Navarro" . "jorgejavieran@yahoo.com.mx") (:url . "https://gitlab.com/shackra/flymake-golangci"))]) (flymake-gradle . [(20190315 233) ((emacs (26 1))) "Flymake extension for Gradle." tar ((:commit . "dbedd29b78d4828ef57d4de20867be5df3eaab99") (:maintainers ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com") (:keywords "languages" "gradle") (:url . "https://github.com/jojojames/flymake-gradle"))]) - (flymake-grammarly . [(20221231 1655) ((emacs (26 1)) (grammarly (0 3 0)) (s (1 12 0))) "Flymake support for Grammarly" tar ((:commit . "078edd6e083067f2ad3b3beaa0098c16cebe3994") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "grammar" "check") (:url . "https://github.com/emacs-grammarly/flymake-grammarly"))]) + (flymake-grammarly . [(20240101 846) ((emacs (26 1)) (grammarly (0 3 0)) (s (1 12 0))) "Flymake support for Grammarly" tar ((:commit . "b0041adb03ba1e9a3f20656a475042451868aa19") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "grammar" "check") (:url . "https://github.com/emacs-grammarly/flymake-grammarly"))]) (flymake-hadolint . [(20220328 823) ((emacs (26 1))) "Flymake backend for hadolint, a Dockerfile linter" tar ((:commit . "82a6df7f6cc95e1ab95c5d28f2edcd8c1d4c7382") (:authors ("Taiki Sugawara" . "buzz.taiki@gmail.com")) (:maintainers ("Taiki Sugawara" . "buzz.taiki@gmail.com")) (:maintainer "Taiki Sugawara" . "buzz.taiki@gmail.com") (:keywords "convenience" "processes" "docker" "flymake") (:url . "https://github.com/buzztaiki/flymake-hadolint"))]) (flymake-haml . [(20170723 146) ((flymake-easy (0 1))) "A flymake handler for haml files" tar ((:commit . "22a81e8484734552d461e7ae7305664dc244447e") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flymake-haml"))]) (flymake-haskell-multi . [(20170723 146) ((flymake-easy (0 1))) "Syntax-check haskell-mode using both ghc and hlint" tar ((:commit . "b564a94312259885b1380272eb867bf52a164020") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flymake-haskell-multi"))]) @@ -1819,16 +1871,16 @@ (flymake-json . [(20180511 911) ((flymake-easy (0 1))) "A flymake handler for json using jsonlint" tar ((:commit . "ae58795f948402e987cda4c15f10354f8ec2d0fd") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flymake-json"))]) (flymake-kondor . [(20211026 501) ((emacs (26 1))) "Linter with clj-kondo" tar ((:commit . "784e57f36812a37e323409b90b935ef3c6920a22") (:authors ("https://turbocafe.keybase.pub")) (:maintainers ("https://turbocafe.keybase.pub")) (:maintainer "https://turbocafe.keybase.pub") (:url . "https://github.com/turbo-cafe/flymake-kondor"))]) (flymake-ktlint . [(20180831 346) ((emacs (26 1))) "Flymake extension for Ktlint." tar ((:commit . "bea8bf350802c06756efd4e6dfba65f31dc41d78") (:maintainers ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com") (:keywords "languages" "ktlint") (:url . "https://github.com/jojojames/flymake-ktlint"))]) - (flymake-languagetool . [(20230122 1609) ((emacs (27 1))) "Flymake support for LanguageTool" tar ((:commit . "ad8c724147d5a3a9f6ee59e0c7581e68fba4a2f8") (:keywords "convenience" "grammar" "check") (:url . "https://github.com/emacs-languagetool/flymake-languagetool"))]) + (flymake-languagetool . [(20240307 419) ((emacs (27 1)) (compat (29 1 4 4))) "Flymake support for LanguageTool" tar ((:commit . "73a1814db4cc387854d72828c0e188c9f5b4c661") (:keywords "convenience" "grammar" "check") (:url . "https://github.com/emacs-languagetool/flymake-languagetool"))]) (flymake-less . [(20151111 738) ((less-css-mode (0 15)) (flymake-easy (0 1))) "Flymake handler for LESS stylesheets (lesscss.org)" tar ((:commit . "32d3c28a9a5c52b82d1741ff9d715013b6498421") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "languages"))]) (flymake-lua . [(20170129 154) nil "Flymake for Lua" tar ((:commit . "dcc32b62a285215898ae774ba63dbda0656f6f53") (:authors (nil . "Sébastien Roccaserra (format \"<%s%s@%s.%s>\" \"s\" \"roccaserra\" \"yahoo\" \"com\")")) (:maintainers (nil . "Sébastien Roccaserra (format \"<%s%s@%s.%s>\" \"s\" \"roccaserra\" \"yahoo\" \"com\")")) (:maintainer nil . "Sébastien Roccaserra (format \"<%s%s@%s.%s>\" \"s\" \"roccaserra\" \"yahoo\" \"com\")") (:keywords "lua"))]) (flymake-markdownlint . [(20220320 1208) ((emacs (27 1))) "Markdown linter with markdownlint" tar ((:commit . "59e3520668d9394c573e07b7980a2d48d9f6086c") (:authors ("Martin Kjær Jørgensen" . "mkj@gotu.dk")) (:maintainers ("Martin Kjær Jørgensen" . "mkj@gotu.dk")) (:maintainer "Martin Kjær Jørgensen" . "mkj@gotu.dk") (:url . "https://github.com/shaohme/flymake-markdownlint"))]) (flymake-nasm . [(20210310 1540) ((flymake-quickdef (1 0 0)) (emacs (26 1))) "A flymake handler for asm-mode files using nasm" tar ((:commit . "27e58d7f3a48ca6fc12238fe6c888a3fdffc3f75") (:authors ("Jürgen Hötzel" . "juergen@hoetzel.info")) (:maintainers ("Jürgen Hötzel")) (:maintainer "Jürgen Hötzel") (:keywords "tools" "languages") (:url . "http://github.com/juergenhoetzel/flymake-nasm"))]) - (flymake-perlcritic . [(20120328 814) ((flymake (0 3))) "Flymake handler for Perl to invoke Perl::Critic" tar ((:commit . "0692d6ad5495f6e5438bde0a10345829b8e1def8") (:authors ("Sam Graham ")) (:maintainers ("Sam Graham ")) (:maintainer "Sam Graham ") (:url . "https://github.com/illusori/emacs-flymake-perlcritic"))]) + (flymake-perlcritic . [(20240229 953) ((flymake (1 2))) "Flymake handler for Perl to invoke Perl::Critic" tar ((:commit . "f65ac37608b78ce785808c27fba86a8102a4ff95") (:authors ("Sam Graham ") ("gemmaro" . "gemmaro.dev@gmail.com")) (:maintainers ("Sam Graham ")) (:maintainer "Sam Graham ") (:url . "https://github.com/illusori/emacs-flymake-perlcritic"))]) (flymake-pest . [(20200710 2327) ((emacs (26 3)) (pest-mode (0 1))) "A flymake handler for Pest files" tar ((:commit . "43447a2c70f98edd1139005e32f437d3f142442b") (:authors ("ksqsf" . "i@ksqsf.moe") ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("ksqsf" . "i@ksqsf.moe")) (:maintainer "ksqsf" . "i@ksqsf.moe") (:keywords "languages" "flymake") (:url . "https://github.com/ksqsf/pest-mode"))]) (flymake-php . [(20170723 146) ((flymake-easy (0 1))) "A flymake handler for php-mode files" tar ((:commit . "c045d01e002ba5e09b05f40e25bf5068d02126bc") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flymake-php"))]) (flymake-phpcs . [(20210213 732) ((flymake-easy (0 9))) "making flymake work with PHP CodeSniffer" tar ((:commit . "f947ba3066c1fa903d2ec69d67bf84413f51eb3f") (:authors ("Akiha Senda")) (:maintainers ("Akiha Senda")) (:maintainer "Akiha Senda") (:keywords "flymake" "phpcs" "php") (:url . "https://github.com/senda-akiha/flymake-phpcs/"))]) - (flymake-phpstan . [(20230417 1142) ((emacs (26 1)) (phpstan (0 7 2))) "Flymake backend for PHP using PHPStan" tar ((:commit . "2dc25cb2f3d83484ea0eb063c9ffca8148828a2b") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "tools" "php") (:url . "https://github.com/emacs-php/phpstan.el"))]) + (flymake-phpstan . [(20231114 1120) ((emacs (26 1)) (phpstan (0 7 2))) "Flymake backend for PHP using PHPStan" tar ((:commit . "495e22f98e3075d0d9a14ebec87771eaf967b996") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "tools" "php") (:url . "https://github.com/emacs-php/phpstan.el"))]) (flymake-puppet . [(20170801 554) ((flymake-easy (0 9))) "Flymake handler using puppet-lint" tar ((:commit . "9579e5c736cb890195464fabf51df113313de88d") (:authors ("Ben Prew")) (:maintainers ("Ben Prew")) (:maintainer "Ben Prew") (:url . "https://github.com/benprew/flymake-puppet"))]) (flymake-python-pyflakes . [(20170723 146) ((flymake-easy (0 8))) "A flymake handler for python-mode files using pyflakes (or flake8)" tar ((:commit . "1d65c26bf65a5dcbd29fcd967e2feb90e1e7a33d") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flymake-python-pyflakes"))]) (flymake-quickdef . [(20200308 2342) ((emacs (26 1))) "Quickly define a new Flymake backend" tar ((:commit . "150c5839768a3d32f988f9dc08052978a68f2ad7") (:authors ("Karl Otness")) (:maintainers ("Karl Otness")) (:maintainer "Karl Otness") (:keywords "languages" "tools" "convenience" "lisp") (:url . "https://github.com/karlotness/flymake-quickdef"))]) @@ -1836,12 +1888,12 @@ (flymake-rakudo . [(20220424 637) ((emacs (28 1)) (flymake-collection (2 0 0)) (let-alist (1 0))) "Flymake syntax checker for Rakudo" tar ((:commit . "f8e3d03a7207876cd891174702efd572d74f2e49") (:authors ("Siavash Askari Nasr" . "ciavash@proton.me")) (:maintainers ("Siavash Askari Nasr" . "ciavash@proton.me")) (:maintainer "Siavash Askari Nasr" . "ciavash@proton.me") (:keywords "language" "tools" "convenience") (:url . "https://github.com/Raku/flymake-rakudo"))]) (flymake-relint . [(20230803 120) ((emacs (26 1)) (relint (1 23))) "A relint Flymake backend" tar ((:commit . "cded537b8208e87632e1fb5b9bdc819a736eb9a3") (:authors ("liuyinz" . "liuyinz95@gmail.com")) (:maintainers ("liuyinz" . "liuyinz95@gmail.com")) (:maintainer "liuyinz" . "liuyinz95@gmail.com") (:keywords "lisp") (:url . "https://github.com/liuyinz/flymake-relint"))]) (flymake-ruby . [(20170723 146) ((flymake-easy (0 1))) "A flymake handler for ruby-mode files" tar ((:commit . "6c320c6fb686c5223bf975cc35178ad6b195e073") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flymake-ruby"))]) - (flymake-ruff . [(20230620 115) ((emacs (26 1)) (project (0 3 0))) "A flymake plugin for python files using ruff" tar ((:commit . "7e3f88068b75d797e1efe0fc194f9725469f126e") (:authors ("Erick Navarro" . "erick@navarro.io")) (:maintainers ("Erick Navarro" . "erick@navarro.io")) (:maintainer "Erick Navarro" . "erick@navarro.io") (:url . "https://github.com/erickgnavar/flymake-ruff"))]) + (flymake-ruff . [(20240113 1518) ((emacs (26 1)) (project (0 3 0))) "A flymake plugin for python files using ruff" tar ((:commit . "165ee1fe7b9d154a316c332bf73f341177126d8c") (:authors ("Erick Navarro" . "erick@navarro.io")) (:maintainers ("Erick Navarro" . "erick@navarro.io")) (:maintainer "Erick Navarro" . "erick@navarro.io") (:url . "https://github.com/erickgnavar/flymake-ruff"))]) (flymake-sass . [(20170723 146) ((flymake-easy (0 1))) "Flymake handler for sass and scss files" tar ((:commit . "2de28148e92deb93bff3d55fe14e7c67ac476056") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flymake-sass"))]) (flymake-shell . [(20170723 146) ((flymake-easy (0 1))) "A flymake syntax-checker for shell scripts" tar ((:commit . "a16cf453056b9849cc7c912bb127fb0b08fc6dab") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flymake-shell"))]) (flymake-shellcheck . [(20220308 2218) ((emacs (26))) "A bash/sh Flymake backend powered by ShellCheck" tar ((:commit . "1ad9acb599e6be6aac57280b7c918b0e4a0f07de") (:authors ("Federico Tedin" . "federicotedin@gmail.com")) (:maintainers ("Federico Tedin" . "federicotedin@gmail.com")) (:maintainer "Federico Tedin" . "federicotedin@gmail.com") (:url . "https://github.com/federicotdn/flymake-shellcheck"))]) (flymake-solidity . [(20170805 644) ((flymake-easy (0 10))) "A flymake handler for solidity using solc" tar ((:commit . "48bfe9525f764d8a68cc0270905dbf45bfd00bb8") (:authors ("Pascal van Kooten" . "kootenpv@gmail.com")) (:maintainers ("Pascal van Kooten" . "kootenpv@gmail.com")) (:maintainer "Pascal van Kooten" . "kootenpv@gmail.com") (:url . "https://github.com/kootenvp/flymake-solidity"))]) - (flymake-sqlfluff . [(20230129 2035) ((emacs (27 1))) "A flymake plugin for SQL files using sqlfluff" tar ((:commit . "f7921a5b762eb0675b8fca7cfb00273a76eaee5b") (:authors ("Erick Navarro" . "erick@navarro.io")) (:maintainers ("Erick Navarro" . "erick@navarro.io")) (:maintainer "Erick Navarro" . "erick@navarro.io") (:url . "https://github.com/erickgnavar/flymake-sqlfluff"))]) + (flymake-sqlfluff . [(20231105 2009) ((emacs (27 1))) "A flymake plugin for SQL files using sqlfluff" tar ((:commit . "598dff268231f74ba902e2c607c85dd014fbee28") (:authors ("Erick Navarro" . "erick@navarro.io")) (:maintainers ("Erick Navarro" . "erick@navarro.io")) (:maintainer "Erick Navarro" . "erick@navarro.io") (:url . "https://github.com/erickgnavar/flymake-sqlfluff"))]) (flymake-swi-prolog . [(20220404 950) ((emacs (26 1))) "A Flymake backend for SWI-Prolog" tar ((:commit . "ae0e4b706a40b71c007ed6cb0ec5425d49bea4c3") (:authors ("Eshel Yaron")) (:maintainers ("Eshel Yaron")) (:maintainer "Eshel Yaron") (:keywords "languages") (:url . "https://git.sr.ht/~eshel/flymake-swi-prolog"))]) (flymake-vala . [(20150326 531) ((flymake-easy (0 1))) "A flymake handler for vala-mode files" tar ((:commit . "c3674f461fc84fb0300cd3a562fb903a59782745") (:authors ("Daniel Lawrence" . "dannyla@linux.com")) (:maintainers ("Daniel Lawrence" . "dannyla@linux.com")) (:maintainer "Daniel Lawrence" . "dannyla@linux.com") (:keywords "convenience" "vala") (:url . "https://github.com/daniellawrence/flymake-vala"))]) (flymake-vnu . [(20230310 440) ((emacs (26 1))) "Flymake extension for the v.Nu HTML validator." tar ((:commit . "e9c6038f69ad1523e603026155d9acd5fc3d5aac") (:maintainers ("Stefan Kuznetsov" . "skuznetsov@posteo.net")) (:maintainer "Stefan Kuznetsov" . "skuznetsov@posteo.net") (:keywords "languages") (:url . "https://github.com/theneosloth/flymake-vnu"))]) @@ -1857,6 +1909,7 @@ (flyspell-lazy . [(20210308 1253) nil "Improve flyspell responsiveness using idle timers" tar ((:commit . "0fc5996bcee20b46cbd227ae948d343c3bef7339") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "spelling") (:url . "http://github.com/rolandwalker/flyspell-lazy"))]) (flyspell-popup . [(20170529 815) ((popup (0 5 0))) "Correcting words with Flyspell in popup menus" tar ((:commit . "29311849bfd253b9b689bf331860b4c4d3bd4dde") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainers ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me") (:keywords "convenience") (:url . "https://github.com/xuchunyang/flyspell-popup"))]) (fm-bookmarks . [(20170104 1716) ((emacs (24 3)) (cl-lib (0 5))) "Use file manager bookmarks (eg Dolphin, Nautilus, PCManFM) in Dired" tar ((:commit . "11dacfd16a926bfecba96a94c6b13e162c7717f7") (:authors ("Ono Hiroko" . "azazabc123@gmail.com")) (:maintainers ("Ono Hiroko" . "azazabc123@gmail.com")) (:maintainer "Ono Hiroko" . "azazabc123@gmail.com") (:keywords "files" "convenience") (:url . "http://github.com/kuanyui/fm-bookmarks.el"))]) + (fmo-mode . [(20240306 1442) ((emacs (29 1)) (difflib (0 3 7)) (format-all (0 5 0))) "Format only changed lines" tar ((:commit . "eb63a36ee8ca0ec985e6fd043db974e6f9b38c83") (:authors ("Xichen Zhou" . "sichem.zh@gmail.com")) (:maintainers ("Xichen Zhou" . "sichem.zh@gmail.com")) (:maintainer "Xichen Zhou" . "sichem.zh@gmail.com") (:keywords "languages" "util") (:url . "https://github.com/xeechou/fmo-mode.el"))]) (fn . [(20210304 1812) ((emacs (24)) (cl-lib (0 5)) (dash (2 18 0))) "Concise anonymous functions for Emacs Lisp" tar ((:commit . "98e3fe1b4785e162d9aca978a2db106baa79260f") (:authors ("Troy Pracy")) (:maintainers ("Troy Pracy")) (:maintainer "Troy Pracy") (:keywords "functional"))]) (focus . [(20221016 1846) ((emacs (24 3)) (cl-lib (0 5))) "Dim the font color of text in surrounding sections" tar ((:commit . "2507ec4ec5a9402647ef85540669db1815520c15") (:authors ("Lars Tveito" . "larstvei@ifi.uio.no")) (:maintainers ("Lars Tveito" . "larstvei@ifi.uio.no")) (:maintainer "Lars Tveito" . "larstvei@ifi.uio.no") (:url . "http://github.com/larstvei/Focus"))]) (focus-autosave-mode . [(20160519 2116) ((emacs (24 4))) "Automatically save files in focus-out-hook." tar ((:commit . "e89ed22aa4dfc76e1b844b202aedd468ad58814a") (:authors ("Wojciech Siewierski" . "wojciech.siewierski@onet.pl")) (:maintainers ("Wojciech Siewierski" . "wojciech.siewierski@onet.pl")) (:maintainer "Wojciech Siewierski" . "wojciech.siewierski@onet.pl") (:keywords "convenience" "files" "frames" "mouse"))]) @@ -1864,7 +1917,7 @@ (fold-dwim . [(20140208 1637) nil "Unified user interface for Emacs folding modes" tar ((:commit . "c46f4bb2ce91b4e307136320e72c28dd50b6cd8b") (:authors ("Peter Heslin" . "p.j.heslin@dur.ac.uk")) (:maintainers ("Peter Heslin" . "p.j.heslin@dur.ac.uk")) (:maintainer "Peter Heslin" . "p.j.heslin@dur.ac.uk") (:url . "http://www.dur.ac.uk/p.j.heslin/Software/Emacs"))]) (fold-dwim-org . [(20131203 1351) ((fold-dwim (1 2))) "Fold DWIM bound to org key-strokes." tar ((:commit . "c09bb2b46d65afbd1d0febc6fded7495be7a3037") (:authors ("Matthew L. Fidler & Shane Celis")) (:maintainers ("Matthew L. Fidler")) (:maintainer "Matthew L. Fidler") (:keywords "folding" "emacs" "org-mode") (:url . "https://github.com/mlf176f2/fold-dwim-org"))]) (fold-this . [(20191107 1816) nil "Just fold this region please" tar ((:commit . "c3912c738cf0515f65162479c55999e2992afce5") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainers ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:keywords "convenience") (:url . "https://github.com/magnars/fold-this.el"))]) - (folding . [(20220110 1718) nil "A folding-editor-like minor mode." tar ((:commit . "1ce338b991c69358a607c37bfb16ffb7de7e91c4") (:maintainers ("Jari Aalto ")) (:maintainer "Jari Aalto ") (:keywords "tools"))]) + (folding . [(20240308 334) nil "A folding-editor-like minor mode." tar ((:commit . "b27c4a1d19e8b91777be0e346cc0ed7c73e2c446") (:maintainers ("Jari Aalto ")) (:maintainer "Jari Aalto ") (:keywords "tools"))]) (font-lock-profiler . [(20170208 2008) ((emacs (24 3))) "Coverage and timing tool for font-lock keywords." tar ((:commit . "6e096458416888a4f63cca0d6bc5965a052753c8") (:authors ("Anders Lindgren")) (:maintainers ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "faces" "tools") (:url . "https://github.com/Lindydancer/font-lock-profiler"))]) (font-lock-studio . [(20220629 1909) ((emacs (24 3))) "interactive debugger for Font Lock keywords." tar ((:commit . "78472ae1f65721b4da17756ee7e506f3d0487033") (:authors ("Anders Lindgren")) (:maintainers ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "faces" "tools") (:url . "https://github.com/Lindydancer/font-lock-studio"))]) (font-utils . [(20210405 1149) ((persistent-soft (0 8 8)) (pcache (0 2 3))) "Utility functions for working with fonts" tar ((:commit . "abc572eb0dc30a26584c0058c3fe6c7273a10003") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "extensions") (:url . "http://github.com/rolandwalker/font-utils"))]) @@ -1876,32 +1929,33 @@ (foreign-regexp . [(20200325 50) nil "search and replace by foreign regexp." tar ((:commit . "e2dd47f2160cadc194eb156e7c76c3c869e6706e") (:authors ("K-talo Miyazaki ")) (:maintainers ("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" tar ((:commit . "22b3bb13134b617870ed1e888af739f4818be929") (:authors ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainers ("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." tar ((:commit . "58096ce1a25615d2bae806c3775bae3e2775019d") (:authors ("olkinn")) (:maintainers ("olkinn")) (:maintainer "olkinn"))]) - (forge . [(20230808 2212) ((emacs (25 1)) (compat (29 1 4 1)) (closql (20230407)) (dash (2 19 1)) (emacsql (20230409)) (ghub (20220621)) (let-alist (1 0 6)) (magit (20230319)) (markdown-mode (2 4)) (transient (0 4 0)) (yaml (0 5 2))) "Access Git forges from Magit." tar ((:commit . "dc777b64ad33d0b70dc2067af8401a9598d21764") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "git" "tools" "vc") (:url . "https://github.com/magit/forge"))]) + (forge . [(20240312 1335) ((emacs (25 1)) (compat (29 1 4 4)) (closql (20240125)) (dash (2 19 1)) (emacsql (20240124)) (ghub (20240101)) (let-alist (1 0 6)) (magit (20240125)) (markdown-mode (2 6)) (seq (2 24)) (transient (20240201)) (yaml (0 5 5))) "Access Git forges from Magit." tar ((:commit . "68771ca4d53c3aea5c860eeb888cee8e9cb5ca37") (: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" tar ((:commit . "ac1f0ef30a11979f5dfe12d8c05a666739e486ff") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainers ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de") (:keywords "faces") (:url . "https://depp.brause.cc/form-feed"))]) - (format-all . [(20230722 1157) ((emacs (24 4)) (inheritenv (0 1)) (language-id (0 19))) "Auto-format C, C++, JS, Python, Ruby and 50 other languages" tar ((:commit . "2c780df8cf1bb4d464d94f9afe085b5b19036236") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "languages" "util") (:url . "https://github.com/lassik/emacs-format-all-the-code"))]) + (form-feed-st . [(20231002 2211) ((emacs (25 1))) "Display ^L glyphs as full-width horizontal lines" tar ((:commit . "f91c8daf35b7588e0aa24c8716c8cfd8ff0067c8") (:authors ("Leonardo Schripsema")) (:maintainers ("Leonardo Schripsema")) (:maintainer "Leonardo Schripsema") (:keywords "faces") (:url . "https://github.com/leodag/form-feed-st"))]) + (format-all . [(20240205 2153) ((emacs (24 4)) (inheritenv (0 1)) (language-id (0 20))) "Auto-format C, C++, JS, Python, Ruby and 50 other languages" tar ((:commit . "1f4a69811b4b6a00c74fa2566ef731b17b9a2ed1") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("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." tar ((:commit . "97f475c245cd6c81a72a265678e2087cee66ac7b") (:authors ("Friedrich Paetzke" . "paetzke@fastmail.fm")) (:maintainers ("Friedrich Paetzke" . "paetzke@fastmail.fm")) (:maintainer "Friedrich Paetzke" . "paetzke@fastmail.fm") (:url . "https://github.com/paetzke/format-sql.el"))]) (format-table . [(20181223 1616) ((emacs (25)) (dash (2 14 1))) "Parse and reformat tabular data." tar ((:commit . "dfcae3a867e574577fc09a43b045889ff155b58f") (:authors ("Jason Duncan" . "jasond496@msn.com")) (:maintainers ("Jason Duncan" . "jasond496@msn.com")) (:maintainer "Jason Duncan" . "jasond496@msn.com") (:keywords "data") (:url . "https://github.com/functionreturnfunction/format-table"))]) - (forth-mode . [(20220629 519) nil "Programming language mode for Forth" tar ((:commit . "162b79f005a64b1f91e60b8f4c022d1d90cd3d95") (:authors ("Lars Brinkhoff" . "lars@nocrew.org")) (:maintainers ("Lars Brinkhoff" . "lars@nocrew.org")) (:maintainer "Lars Brinkhoff" . "lars@nocrew.org") (:keywords "languages" "forth") (:url . "http://github.com/larsbrinkhoff/forth-mode"))]) + (forth-mode . [(20231206 1127) ((cl-lib (0 2))) "Programming language mode for Forth" tar ((:commit . "59c5ea89ca7593bd49cdde6caefa0893a8780105") (:authors ("Lars Brinkhoff" . "lars@nocrew.org")) (:maintainers ("Lars Brinkhoff" . "lars@nocrew.org")) (:maintainer "Lars Brinkhoff" . "lars@nocrew.org") (:keywords "languages" "forth") (:url . "http://github.com/larsbrinkhoff/forth-mode"))]) (fortpy . [(20150715 2032) ((epc (0 1 0)) (auto-complete (1 4)) (python-environment (0 0 2)) (pos-tip (0 4 5))) "a Fortran auto-completion for Emacs" tar ((:commit . "c614517e9396ef7a78be3b8786fbf303879cf43b") (:authors ("Conrad Rosenbrock ")) (:maintainers ("Conrad Rosenbrock ")) (:maintainer "Conrad Rosenbrock "))]) (fortune-cookie . [(20181223 842) nil "Print a fortune in your scratch buffer." tar ((:commit . "6c1c08f5be83822c0b762872ab25e3dbee96f333") (:authors ("Andrew Schwartzmeyer" . "andrew@schwartzmeyer.com")) (:maintainers ("Andrew Schwartzmeyer" . "andrew@schwartzmeyer.com")) (:maintainer "Andrew Schwartzmeyer" . "andrew@schwartzmeyer.com") (:keywords "fortune" "cowsay" "scratch" "startup") (:url . "https://github.com/andschwa/fortune-cookie"))]) - (fountain-mode . [(20230714 609) ((emacs (24 4)) (seq (2 20))) "Major mode for screenwriting in Fountain markup" tar ((:commit . "86e5c479c40a6c53b7032868946bbca4dbc561bb") (:authors ("Paul W. Rankin" . "hello@paulwrankin.com")) (:maintainers ("Paul W. Rankin" . "hello@paulwrankin.com")) (:maintainer "Paul W. Rankin" . "hello@paulwrankin.com") (:keywords "wp" "text") (:url . "https://github.com/rnkn/fountain-mode"))]) - (fpga . [(20230826 1703) ((emacs (28 1)) (ggtags (0 9 0)) (company (0 9 13))) "FPGA & ASIC Utils" tar ((:commit . "2c2998631e83489abeac5f4fc915c9590bc88142") (:authors ("Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com")) (:maintainers ("Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com")) (:maintainer "Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com") (:keywords "tools") (:url . "https://github.com/gmlarumbe/fpga"))]) + (fountain-mode . [(20240226 245) ((emacs (24 4)) (seq (2 20))) "Major mode for screenwriting in Fountain markup" tar ((:commit . "20e2fc4aa62d27a48c092761e77d65b64d55a3c5") (:authors ("Paul W. Rankin" . "hello@paulwrankin.com")) (:maintainers ("Paul W. Rankin" . "hello@paulwrankin.com")) (:maintainer "Paul W. Rankin" . "hello@paulwrankin.com") (:keywords "wp" "text") (:url . "https://www.fountain-mode.org"))]) + (fpga . [(20240211 213) ((emacs (29 1))) "FPGA & ASIC Utils" tar ((:commit . "bbd663f29e796ab010a5569f1cdbd706ff0f564a") (:authors ("Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com")) (:maintainers ("Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com")) (:maintainer "Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com") (:keywords "tools") (:url . "https://github.com/gmlarumbe/fpga"))]) (fraktur-mode . [(20160815 227) ((cl-lib (0 5))) "Easily insert Unicode mathematical Fraktur characters" tar ((:commit . "514baf5546aed12a0d9fa0fe66e87cdcc7843b08") (:authors ("Grant Rettke" . "gcr@wisdomandwonder.com")) (:maintainers (nil . "")) (:maintainer nil . "") (:keywords "unicode" "fraktur" "math" "mathematical") (:url . "https://github.com/grettke/fraktur-mode"))]) (frame-local . [(20180330 940) ((emacs (25 1))) "Variables local to a frame" tar ((:commit . "51c0889602626e2dcc6f1c1a812b058bc96df03c") (:authors ("Sebastien Chapuis" . "sebastien@chapu.is")) (:maintainers ("Sebastien Chapuis" . "sebastien@chapu.is")) (:maintainer "Sebastien Chapuis" . "sebastien@chapu.is") (:keywords "frames" "tools" "local" "lisp") (:url . "https://github.com/sebastiencs/frame-local"))]) (frame-mode . [(20230823 1850) ((s (1 9 0)) (emacs (24 4))) "Use frames instead of windows" tar ((:commit . "ab5e568a7c7259d31c252c263458bd76490241d0") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainers ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:keywords "frames") (:url . "https://github.com/IvanMalison/frame-mode"))]) (frame-purpose . [(20211011 1518) ((emacs (25 1)) (dash (2 18))) "Purpose-specific frames" tar ((:commit . "7d498147445cc0afb87b922a8225d2e163e5ed5a") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "buffers" "convenience" "frames") (:url . "http://github.com/alphapapa/frame-purpose.el"))]) (frame-tag . [(20170111 6) ((cl-lib (0 5))) "Minor mode that assigns a unique number to each frame for easy switching" tar ((:commit . "73d6163568c7d32952175e663318b872f995a4e5") (:authors ("Wong Liang Zan" . "zan@liangzan.net")) (:maintainers ("Wong Liang Zan" . "zan@liangzan.net")) (:maintainer "Wong Liang Zan" . "zan@liangzan.net") (:keywords "frame" "movement") (:url . "http://github.com/liangzan/frame-tag.el"))]) - (frames-only-mode . [(20210107 918) ((emacs (24 4)) (dash (2 13 0)) (s (1 11 0))) "Use frames instead of Emacs windows" tar ((:commit . "27a5116f36af14df39b92ee2ea1f8583f22484cf") (:authors ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainers ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainer "David Shepherd" . "davidshepherd7@gmail.com") (:keywords "frames" "windows") (:url . "https://github.com/davidshepherd7/frames-only-mode"))]) - (frameshot . [(20230515 944) ((emacs (25 3)) (compat (29 1 4 1))) "Take screenshots of a frame" tar ((:commit . "f74d99be64dc7afa4bdea106c0597c1fa59b9a3d") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "multimedia") (:url . "https://github.com/tarsius/frameshot"))]) + (frames-only-mode . [(20240213 2142) ((emacs (26 3)) (dash (2 13 0)) (s (1 11 0))) "Use frames instead of Emacs windows" tar ((:commit . "53b17d712e363991f070d790493cd3cbf1d8a9be") (:authors ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainers ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainer "David Shepherd" . "davidshepherd7@gmail.com") (:keywords "frames" "windows") (:url . "https://github.com/davidshepherd7/frames-only-mode"))]) + (frameshot . [(20240101 2216) ((emacs (25 3)) (compat (29 1 4 1))) "Take screenshots of a frame" tar ((:commit . "77e4f3ad1fd495d983e62a201f6c1f708b616648") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "multimedia") (:url . "https://github.com/tarsius/frameshot"))]) (framesize . [(20131017 2132) ((key-chord (0 5 20080915))) "change the size of frames in Emacs" tar ((:commit . "f2dbf5d2513b2bc45f2085370a55c1754b6025da") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainers ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:keywords "frames") (:url . "http://github.com/nicferrier/emacs-framesize"))]) - (frecency . [(20170909 631) ((emacs (25 1)) (a (0 1)) (dash (2 13 0))) "Library for sorting items by frequency and recency of access" tar ((:commit . "132130088ef5695cffed6fcacfa219cb0c389026") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "libraries" "recency" "recent" "frequency" "frequent") (:url . "http://github.com/alphapapa/frecency.el"))]) - (frecentf . [(20210330 1521) ((emacs (26 1)) (frecency (0 1 -1)) (persist (0 4)) (async (1 9 4))) "Pervasive recentf using frecency" tar ((:commit . "19e2c48a8b8c8ee8cae5c93b58b57a0aa81a8c46") (:authors ("Felipe Lema" . "felipel@mortemale.org")) (:maintainers ("Felipe Lema" . "felipel@mortemale.org")) (:maintainer "Felipe Lema" . "felipel@mortemale.org") (:keywords "files" "maint") (:url . "https://launchpad.net/frecentf.el"))]) + (frecency . [(20240111 628) ((emacs (25 1)) (a (0 1)) (dash (2 13 0))) "Library for sorting items by frequency and recency of access" tar ((:commit . "4293bf4c8d571b0914e16a5aa05a6d657fdff551") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "extensions") (:url . "http://github.com/alphapapa/frecency.el"))]) + (frecentf . [(20231125 201) ((emacs (26 1)) (frecency (0 1 -1)) (persist (0 4)) (async (1 9 4))) "Pervasive recentf using frecency" tar ((:commit . "ef788b2af412311fbc6f52d639810746e5c0fa93") (:authors ("Felipe Lema" . "felipel@mortemale.org")) (:maintainers ("Felipe Lema" . "felipel@mortemale.org")) (:maintainer "Felipe Lema" . "felipel@mortemale.org") (:keywords "files" "maint") (:url . "https://launchpad.net/frecentf.el"))]) (free-keys . [(20211116 1501) ((cl-lib (0 3))) "Show free keybindings for modkeys or prefixes" tar ((:commit . "7348ce68192871b8a69b687ec124d9f816d493ca") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com") (:keywords "convenience") (:url . "https://github.com/Fuco1/free-keys"))]) (freeradius-mode . [(20190401 1743) ((emacs (24 4))) "major mode for FreeRadius server config files" tar ((:commit . "cf8bf0359cf6c77848facbd24b764b3e111b4c2d") (:url . "https://github.com/VersBinarii/freeradius-mode"))]) (freeze-it . [(20220301 148) ((emacs (24 4))) "Minor mode to make your previous writing read-only" tar ((:commit . "ad92e33a7ebd860905da60d194833516bf61cbf5") (:authors ("Paul W. Rankin" . "pwr@bydasein.com")) (:maintainers ("Paul W. Rankin" . "pwr@bydasein.com")) (:maintainer "Paul W. Rankin" . "pwr@bydasein.com") (:keywords "wp" "text") (:url . "https://github.com/rnkn/freeze-it"))]) - (friendly-remote-shell . [(20200828 1218) ((emacs (24 1)) (cl-lib (0 6 1)) (with-shell-interpreter (0 2 3)) (friendly-tramp-path (0 1 0)) (friendly-shell (0 2 0))) "Human-friendly remote interactive shells" tar ((:commit . "1b1ba2033e59e5968380640280bd853701fbbb21") (:keywords "processes" "terminals") (:url . "https://github.com/p3r7/friendly-shell"))]) - (friendly-shell . [(20220309 1711) ((emacs (24 1)) (cl-lib (0 6 1)) (dash (2 17 0)) (with-shell-interpreter (0 2 4))) "Better shell-mode API" tar ((:commit . "e530e359848e8bdad09d26529f17eb25e5558b3e") (:keywords "processes" "terminals") (:url . "https://github.com/p3r7/friendly-shell"))]) - (friendly-shell-command . [(20200828 1218) ((emacs (24 1)) (cl-lib (0 6 1)) (dash (2 17 0)) (with-shell-interpreter (0 2 3))) "Better shell-command API" tar ((:commit . "1b1ba2033e59e5968380640280bd853701fbbb21") (:keywords "processes" "terminals") (:url . "https://github.com/p3r7/friendly-shell"))]) + (friendly-remote-shell . [(20230916 1426) ((emacs (24 1)) (cl-lib (0 6 1)) (with-shell-interpreter (0 2 5)) (friendly-tramp-path (0 1 0)) (friendly-shell (0 2 0))) "Human-friendly remote interactive shells" tar ((:commit . "5cafa3f6313ce04a47c8996ea1ac6b617d155d46") (:keywords "processes" "terminals") (:url . "https://github.com/p3r7/friendly-shell"))]) + (friendly-shell . [(20230916 1426) ((emacs (24 1)) (cl-lib (0 6 1)) (dash (2 17 0)) (with-shell-interpreter (0 2 5))) "Better shell-mode API" tar ((:commit . "5cafa3f6313ce04a47c8996ea1ac6b617d155d46") (:keywords "processes" "terminals") (:url . "https://github.com/p3r7/friendly-shell"))]) + (friendly-shell-command . [(20230916 1426) ((emacs (24 1)) (cl-lib (0 6 1)) (dash (2 17 0)) (with-shell-interpreter (0 2 5))) "Better shell-command API" tar ((:commit . "5cafa3f6313ce04a47c8996ea1ac6b617d155d46") (:keywords "processes" "terminals") (:url . "https://github.com/p3r7/friendly-shell"))]) (friendly-tramp-path . [(20200502 1032) ((cl-lib (0 6 1))) "Human-friendly TRAMP path construction" tar ((:commit . "be572b8953b9e5a3a35c30bb64c2936d3e9802ba") (:url . "https://github.com/p3r7/prf-tramp"))]) (frimacs . [(20230805 1731) ((emacs (26 1))) "An environment for the FriCAS computer algebra system" tar ((:commit . "0ff73440dcaced28cf35e5e542c8936702395185") (:authors ("Paul Onions" . "paul.onions@acm.org")) (:maintainers ("Paul Onions" . "paul.onions@acm.org")) (:maintainer "Paul Onions" . "paul.onions@acm.org") (:keywords "fricas" "computer algebra" "extensions" "tools") (:url . "https://github.com/pdo/frimacs"))]) (fringe-current-line . [(20140111 411) nil "show current line on the fringe." tar ((:commit . "0ef000bac76abae30601222e6f06c7d133ab4942") (:authors ("Kouhei Yanagita" . "yanagi@shakenbu.org")) (:maintainers ("Kouhei Yanagita" . "yanagi@shakenbu.org")) (:maintainer "Kouhei Yanagita" . "yanagi@shakenbu.org") (:url . "http://github.com/kyanagi/fringe-current-line/raw/master/fringe-current-line.el"))]) @@ -1910,7 +1964,7 @@ (frontside-javascript . [(20220315 1057) ((emacs (25 1)) (add-node-modules-path (1 2 0)) (company (0 9 2)) (flycheck (20201228 2104)) (js2-mode (20201220)) (js2-refactor (0 9 0)) (rjsx-mode (0 5 0)) (tide (4 0 2)) (web-mode (17)) (lsp-mode (20220124))) "JS development that just work™️" tar ((:commit . "18816534a977fbd28848389b58c22b6538cfdeec") (:authors ("Frontside Engineering" . "engineering@frontside.com")) (:maintainers ("Frontside Engineering" . "engineering@frontside.com")) (:maintainer "Frontside Engineering" . "engineering@frontside.com") (:keywords "files" "tools") (:url . "https://github.com/thefrontside/frontmacs"))]) (fsbot-data-browser . [(20220830 230) nil "browse the fsbot database using tabulated-list-mode" tar ((:commit . "27455860fec01ca47bf98b85f093cc24b9852bef") (:authors ("Benaiah Mischenko")) (:maintainers ("Benaiah Mischenko")) (:maintainer "Benaiah Mischenko") (:keywords "fsbot" "irc" "tabulated-list-mode") (:url . "http://github.com/benaiah/fsbot-data-browser"))]) (fsharp-mode . [(20230622 1854) ((emacs (25))) "Support for the F# programming language" tar ((:commit . "b4d31c3da018cfbb3d1f9e6fd416d8777f0835bd") (:authors ("1993-1997 Xavier Leroy, Jacques Garrigue and Ian T Zimmerman") ("2010-2011 Laurent Le Brun" . "laurent@le-brun.eu") ("2012-2014 Robin Neatherway" . "robin.neatherway@gmail.com") ("2017-2023 Jürgen Hötzel")) (:maintainers ("Jürgen Hötzel")) (:maintainer "Jürgen Hötzel") (:keywords "languages"))]) - (fstar-mode . [(20230506 1606) ((emacs (24 3)) (dash (2 11)) (company (0 8 12)) (quick-peek (1 0)) (yasnippet (0 11 0)) (flycheck (30 0)) (company-quickhelp (2 2 0))) "Support for F* programming" tar ((:commit . "56039769454d3b71cad7248d144d04bb6f97a522") (:authors ("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) (:maintainers ("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) (:maintainer "Clément Pit-Claudel" . "clement.pitclaudel@live.com") (:keywords "convenience" "languages") (:url . "https://github.com/FStarLang/fstar-mode.el"))]) + (fstar-mode . [(20240312 1632) ((emacs (24 3)) (dash (2 11)) (company (0 8 12)) (quick-peek (1 0)) (yasnippet (0 11 0)) (flycheck (30 0)) (company-quickhelp (2 2 0))) "Support for F* programming" tar ((:commit . "6e5d3ea858f3c8a9d01161d9089909c2b22fdfca") (:authors ("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) (:maintainers ("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) (:maintainer "Clément Pit-Claudel" . "clement.pitclaudel@live.com") (:keywords "convenience" "languages") (:url . "https://github.com/FStarLang/fstar-mode.el"))]) (fuel . [(20230824 1321) ((cl-lib (0 2)) (emacs (24 2))) "Major mode for the Factor programming language." tar ((:commit . "e10b64dbc53a8583098e73580a1eb9ff4ce0c709"))]) (fuff . [(20170202 1503) ((seq (2 3))) "Find files with findutils, recursively" tar ((:commit . "278e849913df87bd8756c59382282d87474802c3") (:authors ("Joel Moberg")) (:maintainers ("Joel Moberg")) (:maintainer "Joel Moberg") (:keywords "files" "project" "convenience") (:url . "https://github.com/joelmo/fuff"))]) (full-ack . [(20140223 1732) nil "a front-end for ack" tar ((:commit . "8345753e9569dabf6426a837f29387557e32f2af") (:authors ("Nikolaj Schumacher ")) (:maintainers ("Nikolaj Schumacher ")) (:maintainer "Nikolaj Schumacher ") (:keywords "tools" "matching") (:url . "http://nschum.de/src/emacs/full-ack/"))]) @@ -1918,48 +1972,49 @@ (function-args . [(20220516 1226) ((ivy (0 9 1))) "C++ completion for GNU Emacs" tar ((:commit . "beba049751fed78666c87bd146a6f1cf149bb819") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/function-args"))]) (fuo . [(20190812 927) ((emacs (24 4))) "feeluown client." tar ((:commit . "0e4122f94a336a50c02bc96652d25ac3d74bedeb") (:authors ("cosven" . "yinshaowen241@gmail.com")) (:maintainers ("cosven" . "yinshaowen241@gmail.com")) (:maintainer "cosven" . "yinshaowen241@gmail.com") (:keywords "feeluown" "multimedia" "unix") (:url . "http://github.com/cosven/emacs-fuo"))]) (furl . [(20150509 316) nil "Friendly URL retrieval" tar ((:commit . "014438271e0ef27333dfcd599cb247f12a20d870") (:authors ("Natalie Weizenbaum" . "nweiz@google.com")) (:maintainers ("Natalie Weizenbaum" . "nweiz@google.com")) (:maintainer "Natalie Weizenbaum" . "nweiz@google.com"))]) - (fussy . [(20230714 53) ((emacs (27 2)) (flx (0 5))) "Fuzzy completion style using `flx'" tar ((:commit . "9cd9fef9c0b319f7e33f687760cc6efe7e11faba") (:authors ("James Nguyen" . "james@jojojames.com")) (:maintainers ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com") (:keywords "matching") (:url . "https://github.com/jojojames/fussy"))]) + (fussy . [(20240224 1641) ((emacs (27 2)) (flx (0 5))) "Fuzzy completion style using `flx'" tar ((:commit . "0f58683355986e3f8d49734cb1f2ecdd71729439") (:authors ("James Nguyen" . "james@jojojames.com")) (:maintainers ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com") (:keywords "matching") (:url . "https://github.com/jojojames/fussy"))]) (futhark-mode . [(20230511 1235) ((emacs (24 3)) (cl-lib (0 5))) "major mode for editing Futhark source files" tar ((:commit . "8e830a65983c5175b0116360eddefa3ae4fea897") (:keywords "languages") (:url . "https://github.com/diku-dk/futhark-mode"))]) (fuz . [(20200104 524) ((emacs (25 1))) "Fast and precise fuzzy scoring/matching utils" tar ((:commit . "0b6b64cebde5675be3a28520ee16234db48d3b8b") (:authors ("Zhu Zihao" . "all_but_last@163.com")) (:maintainers ("Zhu Zihao" . "all_but_last@163.com")) (:maintainer "Zhu Zihao" . "all_but_last@163.com") (:keywords "lisp") (:url . "https://github.com/cireu/fuz.el"))]) - (fuzzy . [(20221231 1634) ((emacs (24 3))) "Fuzzy Matching" tar ((:commit . "fc7ca5bc81f1798596bc1d254d74a5ea95edc432") (:authors ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainers ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainer "Tomohiro Matsuyama" . "m2ym.pub@gmail.com") (:keywords "convenience") (:url . "https://github.com/auto-complete/fuzzy-el"))]) + (fuzzy . [(20240101 830) ((emacs (24 3))) "Fuzzy Matching" tar ((:commit . "295140da741ac02c1bd3dec69ccf7f6268d60ec5") (:authors ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainers ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainer "Tomohiro Matsuyama" . "m2ym.pub@gmail.com") (:keywords "convenience") (:url . "https://github.com/auto-complete/fuzzy-el"))]) (fuzzy-finder . [(20210906 217) ((emacs (24 4))) "Fuzzy Finder App Integration" tar ((:commit . "915a281fc8e50df84dcc205f9357e8314d60fa54") (:authors ("10sr" . "8.slashes@gmail.com")) (:maintainers ("10sr" . "8.slashes@gmail.com")) (:maintainer "10sr" . "8.slashes@gmail.com") (:keywords "matching") (:url . "https://github.com/10sr/fuzzy-finder-el"))]) (fvwm-mode . [(20230214 2149) nil "A major mode for editing Fvwm configuration files" tar ((:commit . "574c0370f6199c9a1492923bf0d35fdd26738d24") (:authors ("Bert Geens" . "bert@lair.be")) (:maintainers ("Bert Geens" . "bert@lair.be")) (:maintainer "Bert Geens" . "bert@lair.be") (:keywords "files") (:url . "https://github.com/theBlackDragon/fvwm-mode"))]) - (fwb-cmds . [(20230213 1143) ((emacs (25 1)) (compat (29 1 3 4))) "misc frame, window and buffer commands" tar ((:commit . "1b375c6890de61eaccc97c92f2b46de6f9205417") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience") (:url . "https://github.com/tarsius/fwb-cmds"))]) + (fwb-cmds . [(20240101 2216) ((emacs (25 1)) (compat (29 1 3 4))) "misc frame, window and buffer commands" tar ((:commit . "88e823809067983acfaeafa57d0bb6e889429ad2") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience") (:url . "https://github.com/tarsius/fwb-cmds"))]) (fxrd-mode . [(20170728 1801) ((s (1 2))) "Major mode for editing fixed field width files" tar ((:commit . "795b969346982b75e24b5c8619b46197982fbb4d") (:authors ("Marc Sherry" . "msherry@gmail.com")) (:maintainers ("Marc Sherry" . "msherry@gmail.com")) (:maintainer "Marc Sherry" . "msherry@gmail.com") (:keywords "convenience") (:url . "https://github.com/msherry/fxrd-mode"))]) (fyure . [(20130216 1314) nil "An interface to fix Japanese hyoki-yure" tar ((:commit . "b6977f1eb148e8b63259f7233b55bb050e44d9b8") (:authors ("Masafumi Oyamada" . "stillpedant@gmail.com")) (:maintainers ("Masafumi Oyamada" . "stillpedant@gmail.com")) (:maintainer "Masafumi Oyamada" . "stillpedant@gmail.com") (:keywords "languages"))]) (fzf . [(20230403 1304) ((emacs (24 4))) "A front-end for fzf." tar ((:commit . "3a55b983921c620fb5a2cc811f42aa4daaad8266") (:authors ("Bailey Ling")) (:maintainers ("Bailey Ling")) (:maintainer "Bailey Ling") (:keywords "fzf" "fuzzy" "search") (:url . "https://github.com/bling/fzf.el"))]) (gameoflife . [(20200614 1814) nil "Screensaver running Conway's Game of Life" tar ((:commit . "2483f3d98dbcf7f1633f551cc3691f5659b4b942") (:authors ("Anders Lindgren")) (:maintainers ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "games") (:url . "https://github.com/Lindydancer/gameoflife"))]) (gams-ac . [(20180423 926) ((emacs (24)) (auto-complete (1 0)) (gams-mode (4 0))) "auto-complete source file for GAMS mode" tar ((:commit . "66d04ff36033f54205c19bc1d893e926d4dbf02e") (:authors ("Shiro Takeda")) (:maintainers ("Shiro Takeda")) (:maintainer "Shiro Takeda") (:keywords "languages" "tools" "gams-mode" "auto-complete") (:url . "https://github.com/ShiroTakeda/gams-ac"))]) - (gams-mode . [(20230721 656) ((emacs (24 3))) "Major mode for General Algebraic Modeling System (GAMS)" tar ((:commit . "ac2d1ef9695e395b4410ef342bbfb75d7852c798") (:authors ("Shiro Takeda")) (:maintainers ("Shiro Takeda")) (:maintainer "Shiro Takeda") (:keywords "languages" "tools" "gams") (:url . "http://shirotakeda.org/en/gams/gams-mode/"))]) + (gams-mode . [(20231202 1410) ((emacs (24 3))) "Major mode for General Algebraic Modeling System (GAMS)" tar ((:commit . "03c24b19c270feca0d3fc9494698cf6d4c7f8152") (:authors ("Shiro Takeda")) (:maintainers ("Shiro Takeda")) (:maintainer "Shiro Takeda") (:keywords "languages" "tools" "gams") (:url . "http://shirotakeda.org/en/gams/gams-mode/"))]) (gandalf-theme . [(20130809 947) nil "Gandalf color theme" tar ((:commit . "4e472fc851431458537d458d09c1f5895e338536") (:authors ("Peter Vasil" . "mail@petervasil.net")) (:maintainers ("Peter Vasil" . "mail@petervasil.net")) (:maintainer "Peter Vasil" . "mail@petervasil.net") (:keywords "color" "theme"))]) - (gap-mode . [(20230802 108) nil "Major mode for editing files in the GAP programming language." tar ((:commit . "643f8a26ea1fe6aa3390c95e257718ed6b0b2149") (:authors ("Michael Smith" . "smith@pell.anu.edu.au") ("Gary Zablackis") ("Goetz Pfeiffer") ("Ivan Andrus" . "darthandrus@gmail.com")) (:maintainers ("Ivan Andrus" . "darthandrus@gmail.com")) (:maintainer "Ivan Andrus" . "darthandrus@gmail.com") (:keywords "gap") (:url . "https://gitlab.com/gvol/gap-mode"))]) + (gap-mode . [(20240126 359) nil "Major mode for editing files in the GAP programming language." tar ((:commit . "b816fcf70840887461764ebdbb34c8b37dd42ba2") (:authors ("Michael Smith" . "smith@pell.anu.edu.au") ("Gary Zablackis") ("Goetz Pfeiffer") ("Ivan Andrus" . "darthandrus@gmail.com")) (:maintainers ("Ivan Andrus" . "darthandrus@gmail.com")) (:maintainer "Ivan Andrus" . "darthandrus@gmail.com") (:keywords "gap") (:url . "https://gitlab.com/gvol/gap-mode"))]) (gather . [(20141230 1338) nil "Gather string in buffer." tar ((:commit . "8909c886d72a682710bb79ccfcfe4df54a399b7e") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "matching" "convenience" "tools") (:url . "https://github.com/mhayashi1120/Emacs-gather/raw/master/gather.el"))]) (gcmh . [(20201116 2251) ((emacs (24))) "the Garbage Collector Magic Hack" tar ((:commit . "0089f9c3a6d4e9a310d0791cf6fa8f35642ecfd9") (:authors ("Andrea Corallo" . "akrl@sdf.org")) (:maintainers (nil . "akrl@sdf.org")) (:maintainer nil . "akrl@sdf.org") (:keywords "internal") (:url . "https://gitlab.com/koral/gcmh"))]) (gcode-mode . [(20230823 2141) ((emacs (24 4))) "Simple G-Code major mode" tar ((:commit . "4b54553a698d81e52dde14037df94774c7f30b95") (:authors ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainers ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainer "Yuri D'Elia" . "wavexx@thregr.org") (:keywords "gcode" "languages" "highlight" "syntax") (:url . "https://gitlab.com/wavexx/gcode-mode.el"))]) - (gdscript-mode . [(20230527 2344) ((emacs (26 3))) "Major mode for Godot's GDScript language" tar ((:commit . "3e2ae19f036fedc4cc1c1382cd6bb4f12b1aeb76") (:authors ("Nathan Lovato , Fabián E. Gallina" . "fgallina@gnu.org")) (:maintainers (nil . "nathan@gdquest.com")) (:maintainer nil . "nathan@gdquest.com") (:keywords "languages") (:url . "https://github.com/godotengine/emacs-gdscript-mode/"))]) + (gdscript-mode . [(20231024 1150) ((emacs (26 3))) "Major mode for Godot's GDScript language" tar ((:commit . "8a28276daaa23f10e986367b80dc751c5d26829e") (:authors ("Nathan Lovato , Fabián E. Gallina" . "fgallina@gnu.org")) (:maintainers (nil . "nathan@gdquest.com")) (:maintainer nil . "nathan@gdquest.com") (:keywords "languages") (:url . "https://github.com/godotengine/emacs-gdscript-mode/"))]) (geben . [(20220827 105) ((emacs (24 3)) (cl-lib (0 5))) "DBGp protocol frontend, a script debugger" tar ((:commit . "8df1ed2c8ff13b0ca4ef241c95c46f60a5a4fe3c") (:authors ("Matthew Carter" . "m@ahungry.com")) (:maintainers ("Matthew Carter" . "m@ahungry.com")) (:maintainer "Matthew Carter" . "m@ahungry.com") (:keywords "c" "comm" "tools") (:url . "https://github.com/ahungry/geben"))]) (geben-helm-projectile . [(20170524 334) ((emacs (24)) (geben (0 26)) (helm-projectile (0 13 0))) "Integrate helm-projectile with geben" tar ((:commit . "31ce0faca5dcc71924884f03fd5a7a25d00ccd9b") (:authors ("Matthew Carter" . "m@ahungry.com")) (:maintainers ("Matthew Carter" . "m@ahungry.com")) (:maintainer "Matthew Carter" . "m@ahungry.com") (:keywords "ahungry" "emacs" "geben" "helm" "projectile" "debug") (:url . "https://github.com/ahungry/geben-helm-projectile"))]) (geeknote . [(20220213 612) ((emacs (24))) "Use Evernote in Emacs through geeknote" tar ((:commit . "ce2738aebeeda35f9d31027e9b7bad0813b975c3") (:authors ("Evan Dale Aromin")) (:maintainers ("Evan Dale Aromin")) (:maintainer "Evan Dale Aromin") (:keywords "evernote" "geeknote" "note" "emacs-evernote" "evernote-mode") (:url . "http://github.com/avendael/emacs-geeknote"))]) - (geiser . [(20230806 1857) ((emacs (27 1)) (project (0 8 1))) "GNU Emacs and Scheme talk to each other" tar ((:commit . "d743a8cd1df4101a6dc2226ccfc3b4883ec761c5") (:authors ("Jose Antonio Ortega Ruiz" . "jao@gnu.org")) (:maintainers ("Jose Antonio Ortega Ruiz" . "jao@gnu.org")) (:maintainer "Jose Antonio Ortega Ruiz" . "jao@gnu.org") (:keywords "languages" "scheme" "geiser") (:url . "https://gitlab.com/emacs-geiser/"))]) + (geiser . [(20240208 26) ((emacs (27 1)) (project (0 8 1))) "GNU Emacs and Scheme talk to each other" tar ((:commit . "4e64934bd2ae7c6f0e4acb9f2ed017844c187223") (:authors ("Jose Antonio Ortega Ruiz" . "jao@gnu.org")) (:maintainers ("Jose Antonio Ortega Ruiz" . "jao@gnu.org")) (:maintainer "Jose Antonio Ortega Ruiz" . "jao@gnu.org") (:keywords "languages" "scheme" "geiser") (:url . "https://gitlab.com/emacs-geiser/"))]) (geiser-chez . [(20230707 1334) ((emacs (26 1)) (geiser (0 19))) "Chez and Geiser talk to each other" tar ((:commit . "605a81ff7b2d2b275a3ec68e3ce7e5b50f85014d") (:authors ("Peter" . "craven@gmx.net")) (:maintainers ("Jose A Ortega Ruiz" . "jao@gnu.org")) (:maintainer "Jose A Ortega Ruiz" . "jao@gnu.org") (:keywords "languages" "chez" "scheme" "geiser") (:url . "https://gitlab.com/emacs-geiser/chez"))]) (geiser-chibi . [(20211204 1938) ((emacs (24 4)) (geiser (0 18))) "Chibi Scheme's implementation of the geiser protocols" tar ((:commit . "5a6a5a580ea45cd4974df21629a8d50cbe3d6e99") (:authors ("Peter" . "craven@gmx.net")) (:maintainers ("Jose A Ortega Ruiz" . "jao@gnu.org")) (:maintainer "Jose A Ortega Ruiz" . "jao@gnu.org") (:keywords "languages" "chibi" "scheme" "geiser") (:url . "https://gitlab.com/emacs-geiser/chibi"))]) (geiser-chicken . [(20220717 1130) ((emacs (24 4)) (geiser (0 19))) "Chicken's implementation of the geiser protocols" tar ((:commit . "a480598b5908c95bc8d3178a48f13e9072a9235b") (:authors ("Daniel Leslie")) (:maintainers ("Daniel Leslie")) (:maintainer "Daniel Leslie") (:keywords "languages" "chicken" "scheme" "geiser") (:url . "https://gitlab.com/emacs-geiser/chicken"))]) (geiser-gambit . [(20220208 1356) ((emacs (26 1)) (geiser (0 18))) "Gambit's implementation of the geiser protocols" tar ((:commit . "381d74ca5059b44fe3d8b5daf42214019c6d1a88") (:authors ("Daniel Leslie")) (:maintainers ("Jose A Ortega Ruiz" . "jao@gnu.org")) (:maintainer "Jose A Ortega Ruiz" . "jao@gnu.org") (:keywords "languages" "gambit" "scheme" "geiser") (:url . "https://gitlab.com/emacs-geiser/gambit"))]) (geiser-gauche . [(20220503 1700) ((emacs (26 1)) (geiser (0 11 2))) "Gauche scheme support for Geiser" tar ((:commit . "8ff743f6416f00751e24aef8b9791501a40f5421") (:authors ("András Simonyi" . "andras.simonyi@gmail.com")) (:maintainers ("András Simonyi" . "andras.simonyi@gmail.com")) (:maintainer "András Simonyi" . "andras.simonyi@gmail.com") (:keywords "languages" "gauche" "scheme" "geiser") (:url . "https://gitlab.com/emacs-geiser/gauche"))]) - (geiser-guile . [(20230425 1523) ((emacs (25 1)) (transient (0 3)) (geiser (0 28 1))) "Guile and Geiser talk to each other" tar ((:commit . "ee33af6b4ef8fdaccbdf93c62b50fe17c07a1ade") (:authors ("Jose Antonio Ortega Ruiz" . "jao@gnu.org")) (:maintainers ("Jose Antonio Ortega Ruiz" . "jao@gnu.org")) (:maintainer "Jose Antonio Ortega Ruiz" . "jao@gnu.org") (:keywords "languages" "guile" "scheme" "geiser") (:url . "https://gitlab.com/emacs-geiser/guile"))]) + (geiser-guile . [(20240314 1950) ((emacs (25 1)) (transient (0 3)) (geiser (0 28 1))) "Guile and Geiser talk to each other" tar ((:commit . "71a6be00433a157de3936f208c7a1bd0192b12cd") (:authors ("Jose Antonio Ortega Ruiz" . "jao@gnu.org")) (:maintainers ("Jose Antonio Ortega Ruiz" . "jao@gnu.org")) (:maintainer "Jose Antonio Ortega Ruiz" . "jao@gnu.org") (:keywords "languages" "guile" "scheme" "geiser") (:url . "https://gitlab.com/emacs-geiser/guile"))]) (geiser-kawa . [(20210920 1607) ((emacs (26 1)) (geiser (0 16))) "Kawa scheme support for Geiser" tar ((:commit . "5896b19642923f74f718eb68d447560b2d26d797") (:authors ("spellcard199" . "spellcard199@protonmail.com")) (:maintainers ("spellcard199" . "spellcard199@protonmail.com")) (:maintainer "spellcard199" . "spellcard199@protonmail.com") (:keywords "languages" "kawa" "scheme" "geiser") (:url . "https://gitlab.com/emacs-geiser/kawa"))]) (geiser-mit . [(20211204 1935) ((emacs (24 4)) (geiser (0 18))) "MIT/GNU Scheme's implementation of the geiser protocols" tar ((:commit . "4e90e9ae815e89f3540fb9644e6016c663ef5765") (:authors ("Peter" . "craven@gmx.net")) (:maintainers ("Jose A Ortega Ruiz" . "jao@gnu.org")) (:maintainer "Jose A Ortega Ruiz" . "jao@gnu.org") (:keywords "languages" "mit" "scheme" "geiser") (:url . "https://gitlab.com/emacs-geiser/mit"))]) (geiser-racket . [(20210421 125) ((emacs (26 1)) (geiser (0 16))) "Support for Racket in Geiser" tar ((:commit . "22e56ce80389544d3872cf4beb4008fb514b2218") (:authors ("Jose Antonio Ortega Ruiz" . "jao@gnu.org")) (:maintainers ("Jose Antonio Ortega Ruiz" . "jao@gnu.org")) (:maintainer "Jose Antonio Ortega Ruiz" . "jao@gnu.org") (:keywords "languages" "racket" "scheme" "geiser") (:url . "https://gitlab.com/emacs-geiser/racket"))]) - (geiser-stklos . [(20230707 237) ((emacs (24 4)) (geiser (0 16))) "STklos Scheme implementation of the geiser protocols" tar ((:commit . "3358d0cc01436bd8f71a500175db2716e75b2eed") (:authors ("Jeronimo Pellegrini" . "j_p@aleph0.info")) (:maintainers ("Jeronimo Pellegrini" . "j_p@aleph0.info")) (:maintainer "Jeronimo Pellegrini" . "j_p@aleph0.info") (:keywords "languages" "stklos" "scheme" "geiser") (:url . "https://gitlab.com/emacs-geiser/stklos"))]) + (geiser-stklos . [(20231004 2013) ((emacs (24 4)) (geiser (0 16))) "STklos Scheme implementation of the geiser protocols" tar ((:commit . "c634fc2049f1616b772f5e9cb78c6171dcc4c34d") (:authors ("Jeronimo Pellegrini" . "j_p@aleph0.info")) (:maintainers ("Jeronimo Pellegrini" . "j_p@aleph0.info")) (:maintainer "Jeronimo Pellegrini" . "j_p@aleph0.info") (:keywords "languages" "stklos" "scheme" "geiser") (:url . "https://gitlab.com/emacs-geiser/stklos"))]) (gemini-mode . [(20221127 1619) ((emacs (24 4))) "A simple highlighting package for text/gemini" tar ((:commit . "a7dd7c6ea4e036d0d5ecc4a5d284874c400f10ba") (:authors ("Jason McBrayer , tastytea , Étienne Deparis" . "etienne@depar.is")) (:maintainers ("Jason McBrayer , tastytea , Étienne Deparis" . "etienne@depar.is")) (:maintainer "Jason McBrayer , tastytea , Étienne Deparis" . "etienne@depar.is") (:keywords "languages") (:url . "https://git.carcosa.net/jmcbray/gemini.el"))]) (gemini-write . [(20211114 1032) ((emacs (26)) (elpher (2 8 0)) (gemini-mode (1 0 0))) "Elpher for Titan" tar ((:commit . "2a7d07d0ce4c5b8750f3ff1182ad94ee616734c8") (:authors ("Alex Schroeder" . "alex@gnu.org")) (:maintainers ("Alex Schroeder" . "alex@gnu.org")) (:maintainer "Alex Schroeder" . "alex@gnu.org") (:keywords "comm" "gemini") (:url . "https://alexschroeder.ch/cgit/gemini-write"))]) - (general . [(20230311 1229) ((emacs (24 4)) (cl-lib (0 5))) "Convenience wrappers for keybindings." tar ((:commit . "7ce8db297e3de258ec43802269438ac7f1918707") (:authors ("Fox Kiester" . "noct@posteo.net")) (:maintainers ("Fox Kiester" . "noct@posteo.net")) (:maintainer "Fox Kiester" . "noct@posteo.net") (:keywords "vim" "evil" "leader" "keybindings" "keys") (:url . "https://github.com/noctuid/general.el"))]) + (gemtext-mode . [(20231029 2010) ((emacs (29 1))) "Major mode for Gemtext-formatted text" tar ((:commit . "431b3b1d7c4310ef09ba16adbc870bc0af2c0e9b") (:authors ("Antoine Aubé" . "courriel@arjca.fr")) (:maintainers ("Antoine Aubé" . "courriel@arjca.fr")) (:maintainer "Antoine Aubé" . "courriel@arjca.fr") (:keywords "languages" "gemtext" "gemini") (:url . "https://sr.ht/~arjca/gemtext-mode.el/"))]) + (general . [(20240218 1029) ((emacs (24 4)) (cl-lib (0 5))) "Convenience wrappers for keybindings." tar ((:commit . "ced143c30de8e20f5a3761a465e684a1dc48471e") (:authors ("Fox Kiester" . "noct@posteo.net")) (:maintainers ("Fox Kiester" . "noct@posteo.net")) (:maintainer "Fox Kiester" . "noct@posteo.net") (:keywords "vim" "evil" "leader" "keybindings" "keys") (:url . "https://github.com/noctuid/general.el"))]) (genrnc . [(20140612 1237) ((deferred (0 3 1)) (concurrent (0 3)) (log4e (0 2 0)) (yaxception (0 1))) "generate RELAX NG Compact Schema from RELAX NG Schema, XML Schema and DTD." tar ((:commit . "da75b1966a73ad215ec2ced4522c25f4d0bf1f9a") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "xml") (:url . "https://github.com/aki2o/emacs-genrnc"))]) (geoip . [(20200310 911) ((emacs (25 1))) "Find out where an IP address is located via GeoIP2" tar ((:commit . "b4952890993642c7055f4bbbf05b0384740f8f51") (:authors ("Xu Chunyang")) (:maintainers ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:keywords "tools") (:url . "https://github.com/xuchunyang/geoip.el"))]) (geolocation . [(20200317 1559) ((request-deferred (0 3 2)) (deferred (0 5 1)) (emacs (25 1))) "Get your location on Earth" tar ((:commit . "08e3569024659f6f04cb269ad213d144fd8e2a95") (:authors ("Neil Okamoto" . "neil.okamoto+melpa@gmail.com")) (:maintainers ("Neil Okamoto" . "neil.okamoto+melpa@gmail.com")) (:maintainer "Neil Okamoto" . "neil.okamoto+melpa@gmail.com") (:keywords "hardware") (:url . "https://github.com/gonewest818/geolocation.el"))]) (german-holidays . [(20181213 644) nil "German holidays for Emacs calendar" tar ((:commit . "a8462dffccaf2b665f2032e646b5370e993a386a") (:authors ("Sebastian Christ" . "rudolfo.christ@gmail.com")) (:maintainers ("Sebastian Christ" . "rudolfo.christ@gmail.com")) (:maintainer "Sebastian Christ" . "rudolfo.christ@gmail.com") (:url . "https://github.com/rudolfochrist/german-holidays"))]) (germanium . [(20220716 1500) ((emacs (26 1))) "Generate image from source code using germanium" tar ((:commit . "7292aa6870cf8b0acb34a8750da32b44d83cd65c") (:authors ("Masaya Watanabe")) (:maintainers ("Masaya Watanabe")) (:maintainer "Masaya Watanabe") (:keywords "convenience") (:url . "https://github.com/matsuyoshi30/germanium-el"))]) - (gerrit . [(20230102 1714) ((emacs (25 1)) (magit (2 13 1)) (s (1 12 0)) (dash (0 2 15))) "Gerrit client" tar ((:commit . "76cc426d62f1b4964159706eafa8f5b50b8427ea") (:authors ("Thomas Hisch" . "t.hisch@gmail.com")) (:maintainers ("Thomas Hisch" . "t.hisch@gmail.com")) (:maintainer "Thomas Hisch" . "t.hisch@gmail.com") (:keywords "extensions") (:url . "https://github.com/thisch/gerrit.el"))]) + (gerrit . [(20240306 1947) ((emacs (25 1)) (magit (2 13 1)) (s (1 12 0)) (dash (0 2 15))) "Gerrit client" tar ((:commit . "8a98747155712d751239e5699e3a6fd090848b33") (:authors ("Thomas Hisch" . "t.hisch@gmail.com")) (:maintainers ("Thomas Hisch" . "t.hisch@gmail.com")) (:maintainer "Thomas Hisch" . "t.hisch@gmail.com") (:keywords "extensions") (:url . "https://github.com/thisch/gerrit.el"))]) (gerrit-download . [(20150714 1408) ((emacs (24 0)) (magit (2 1 0))) "Show gerrit reviews in a diff buffer." tar ((:commit . "d568acc7c5935188c9bc19ba72719a6092d9f6fd") (:authors ("Chmouel Boudjnah" . "chmouel@chmouel.com")) (:maintainers ("Chmouel Boudjnah" . "chmouel@chmouel.com")) (:maintainer "Chmouel Boudjnah" . "chmouel@chmouel.com") (:keywords "tools" "gerrit" "git") (:url . "https://github.com/chmouel/gerrit-download.el"))]) (gf . [(20181028 1542) ((s (1 0)) (ht (2 0))) "Major mode for editing GF code" tar ((:commit . "49fa46db67634530499be969ffd3c436a22d4404") (:authors ("Johan Bockgård" . "bojohan+mail@dd.chalmers.se")) (:maintainers ("bruno cuconato" . "bcclaro+emacs@gmail.com")) (:maintainer "bruno cuconato" . "bcclaro+emacs@gmail.com") (:keywords "languages") (:url . "https://github.com/GrammaticalFramework/gf-emacs-mode"))]) (ggo-mode . [(20210310 1345) nil "Gengetopt major mode" tar ((:commit . "6a7617b5af3d13029e4d680a375e8107c40d0fac") (:authors ("Matthew K. Junker" . "junker@alum.mit.edu")) (:maintainers ("Matthew K. Junker" . "junker@alum.mit.edu")) (:maintainer "Matthew K. Junker" . "junker@alum.mit.edu") (:keywords "extensions" "convenience" "local"))]) @@ -1972,7 +2027,7 @@ (gherkin-mode . [(20171224 1353) nil "An emacs major mode for editing gherkin files." tar ((:commit . "0313492e7da152f0aa73ddf96c0287ded8f51253") (:authors ("Craig Andera")) (:maintainers ("Craig Andera")) (:maintainer "Craig Andera") (:keywords "languages"))]) (ghost-blog . [(20171023 742) ((markdown-mode (1 0))) "A package to manage Ghost blog" tar ((:commit . "71b358643cc9a2db1bf752281ff94aba9b59e4cc") (:authors ("Javier Aguirre" . "hello@javaguirre.net")) (:maintainers ("Javier Aguirre" . "hello@javaguirre.net")) (:maintainer "Javier Aguirre" . "hello@javaguirre.net") (:keywords "ghost" "blog") (:url . "https://github.com/javaguirre/ghost-blog"))]) (ghq . [(20230510 332) ((emacs (26 1)) (dash (2 18 0)) (s (1 7 0))) "Ghq interface for emacs" tar ((:commit . "eb197c14e53ac57a136ea8d34eec7528487c3301") (:authors ("Roman Coedo" . "romancoedo@gmail.com")) (:maintainers ("Joseph LaFreniere" . "joseph@lafreniere.xyz")) (:maintainer "Joseph LaFreniere" . "joseph@lafreniere.xyz") (:keywords "convenience") (:url . "https://github.com/lafrenierejm/emacs-ghq"))]) - (ghub . [(20230513 1619) ((emacs (25 1)) (compat (29 1 4 1)) (let-alist (1 0 6)) (treepy (0 1 2))) "Client libraries for Git forge APIs." tar ((:commit . "0fd648f0529f34b5da441d54c9dbff7810477d12") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "tools") (:url . "https://github.com/magit/ghub"))]) + (ghub . [(20240311 1716) ((emacs (25 1)) (compat (29 1 4 4)) (let-alist (1 0 6)) (treepy (0 1 2))) "Client libraries for Git forge APIs." tar ((:commit . "132631529c2e3e75e15608658aed5adfbb6b7409") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "tools") (:url . "https://github.com/magit/ghub"))]) (ghub+ . [(20191229 1748) ((emacs (25)) (ghub (2 0)) (apiwrap (0 5))) "a thick GitHub API client built on ghub" tar ((:commit . "b1adef2402d7599911d4dd447a987a0cea04e6fe") (:authors ("Sean Allred" . "code@seanallred.com")) (:maintainers ("Sean Allred" . "code@seanallred.com")) (:maintainer "Sean Allred" . "code@seanallred.com") (:keywords "extensions" "multimedia" "tools") (:url . "https://github.com/vermiculus/ghub-plus"))]) (gif-screencast . [(20230728 1144) ((emacs (25 1))) "One-frame-per-action GIF recording" tar ((:commit . "6798656d3d3107d16e30cc26bc3928b00e50c1ca") (:authors ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainers ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") (:keywords "multimedia" "screencast") (:url . "https://gitlab.com/ambrevar/emacs-gif-screencast"))]) (gift-mode . [(20210528 1459) nil "major mode for editing GIFT format quizzes" tar ((:commit . "c93354e8fe1173b22f398f17b127875807f15b87") (:authors ("Christophe Rhodes" . "christophe@rhodes.io")) (:maintainers ("Christophe Rhodes" . "christophe@rhodes.io")) (:maintainer "Christophe Rhodes" . "christophe@rhodes.io") (:url . "https://github.com/csrhodes/gift-mode"))]) @@ -1984,10 +2039,11 @@ (git-attr . [(20180925 2003) ((emacs (24 3))) "Git attributes of buffer file" tar ((:commit . "3e43a0cf616b00a4bbd3c6b49fd2397f3103796f") (:authors ("Arne Jørgensen" . "arne@arnested.dk")) (:maintainers ("Arne Jørgensen" . "arne@arnested.dk")) (:maintainer "Arne Jørgensen" . "arne@arnested.dk") (:keywords "vc") (:url . "https://github.com/arnested/emacs-git-attr"))]) (git-auto-commit-mode . [(20200828 653) nil "Emacs Minor mode to automatically commit and push" tar ((:commit . "df07899acdb3f9c114b72fdab77107c924b3172c") (:authors ("Tom Willemse" . "tom@ryuslash.org")) (:maintainers ("Tom Willemse" . "tom@ryuslash.org")) (:maintainer "Tom Willemse" . "tom@ryuslash.org") (:keywords "vc") (:url . "https://github.com/ryuslash/git-auto-commit-mode"))]) (git-backup . [(20191209 2144) ((emacs (24 3)) (s (1 8 0))) "Backup each file change using git" tar ((:commit . "e28d7af2d1c58fa5b8068223eb83a73f044e6a6c") (:authors ("Anthony HAMON" . "hamon.anth@gmail.com")) (:maintainers ("Anthony HAMON" . "hamon.anth@gmail.com")) (:maintainer "Anthony HAMON" . "hamon.anth@gmail.com") (:keywords "backup" "files" "tools" "git") (:url . "http://github.com/antham/git-backup"))]) - (git-backup-ivy . [(20221015 431) ((ivy (0 12 0)) (git-backup (0 0 1)) (emacs (25 1))) "An ivy interface to git-backup" tar ((:commit . "e54a3c4b95023c58664a2c59b95a95a07759a1f8") (:authors ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainers ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainer "Sebastian Wålinder" . "s.walinder@gmail.com") (:keywords "backup" "convenience" "files" "tools" "vc") (:url . "https://github.com/walseb/git-backup-ivy"))]) + (git-backup-ivy . [(20231030 2155) ((ivy (0 12 0)) (git-backup (0 0 1)) (emacs (25 1))) "An ivy interface to git-backup" tar ((:commit . "8c825ac2fef586e2792e980003e5ae0deb908bbc") (:authors ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainers ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainer "Sebastian Wålinder" . "s.walinder@gmail.com") (:keywords "backup" "convenience" "files" "tools" "vc") (:url . "https://github.com/walseb/git-backup-ivy"))]) (git-blamed . [(20161028 1926) nil "Minor mode for incremental blame for Git" tar ((:commit . "cef196abf398e2dd11f775d1e6cd8690567408aa") (:keywords "git" "version control" "release management"))]) + (git-cliff . [(20240304 2323) ((emacs (29 1)) (transient (0 5 0))) "Generate and update changelog using git-cliff" tar ((:commit . "be4b22a2c0d638cf1e5d52acc96933a443d0ca23") (:authors ("liuyinz" . "liuyinz95@gmail.com")) (:maintainers ("liuyinz" . "liuyinz95@gmail.com")) (:maintainer "liuyinz" . "liuyinz95@gmail.com") (:keywords "tools") (:url . "https://github.com/liuyinz/git-cliff.el"))]) (git-command . [(20191028 333) ((term-run (0 1 4)) (with-editor (2 3 1))) "A Git Command-Line interface" tar ((:commit . "a773d40da39dfb1c6ecf2b0758aa370ddea8f06d") (:authors ("10sr <8slashes+el [at] gmail [dot] com>")) (:maintainers ("10sr <8slashes+el [at] gmail [dot] com>")) (:maintainer "10sr <8slashes+el [at] gmail [dot] com>") (:keywords "utility" "git") (:url . "https://github.com/10sr/git-command-el"))]) - (git-commit . [(20230821 1659) ((emacs (25 1)) (compat (29 1 3 4)) (transient (20230201)) (with-editor (20230118))) "Edit Git commit messages." tar ((:commit . "6f54443aaaa0a822cc245dc6c66d2033c7dc0900") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li") ("Sebastian Wiesner" . "lunaryorn@gmail.com") ("Florian Ragwitz" . "rafl@debian.org") ("Marius Vollmer" . "marius.vollmer@gmail.com")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "git" "tools" "vc") (:url . "https://github.com/magit/magit"))]) + (git-commit . [(20240229 1416) ((emacs (25 1)) (compat (29 1 4 4)) (transient (20231204)) (with-editor (20230917))) "Edit Git commit messages." tar ((:commit . "65ecb9c5fc7586a1c527b60d180a97ea230da99f") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li") ("Sebastian Wiesner" . "lunaryorn@gmail.com") ("Florian Ragwitz" . "rafl@debian.org") ("Marius Vollmer" . "marius.vollmer@gmail.com")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "git" "tools" "vc") (:url . "https://github.com/magit/magit"))]) (git-commit-insert-issue . [(20230512 1416) ((emacs (25)) (projectile (0)) (s (0)) (ghub (0)) (bitbucket (0))) "Get issues list when typing \"Fixes #\"" tar ((:commit . "df7ce0549d1db7bab27d401a351ea0d187c4a673") (:authors ("Vindarel")) (:maintainers ("Vindarel")) (:maintainer "Vindarel") (:keywords "tools" "vc" "github" "gitlab" "bitbucket" "commit" "issues") (:url . "https://gitlab.com/emacs-stuff/git-commit-insert-issue/"))]) (git-dwim . [(20170126 1214) nil "Context-aware git commands such as branch handling" tar ((:commit . "485c732130686c2f28a026e385366006435394b9") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "git" "tools" "convenience") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/git-dwim.el"))]) (git-grep . [(20200920 1751) ((projectile (0 10 0))) "Search tools using git grep" tar ((:commit . "12ff6045e9b6aa42f98abd4ddc44d670268a0849") (:authors ("Sam Kleinman")) (:maintainers ("tychoish" . "garen@tychoish.com")) (:maintainer "tychoish" . "garen@tychoish.com") (:keywords "matching" "files" "grep" "search" "using" "git-grep") (:url . "https://github.com/tychoish/git-grep.el"))]) @@ -1998,22 +2054,22 @@ (git-identity . [(20220721 912) ((emacs (25 1)) (dash (2 10)) (hydra (0 14)) (f (0 20))) "Identity management for (ma)git" tar ((:commit . "f920916a92fad0c551cd0739e48fc09d8709bd8d") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainers ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:keywords "git" "vc" "convenience") (:url . "https://github.com/akirak/git-identity.el"))]) (git-io . [(20230322 1038) ((emacs (24 4))) "Integration for git.io URL shortening in buffer" tar ((:commit . "fb25f9432e6454edd621a7512ee7abc6220151a5") (:authors ("Tejas Bubane" . "tejasbubane@gmail.com")) (:maintainers ("Tejas Bubane" . "tejasbubane@gmail.com")) (:maintainer "Tejas Bubane" . "tejasbubane@gmail.com") (:keywords "convenience" "files") (:url . "https://github.com/tejasbubane/emacs-git-io"))]) (git-lens . [(20220922 710) ((emacs (24 4))) "Show new, deleted or modified files in branch" tar ((:commit . "347832fbdb75a0930aa3eef628ec0069a335f3b7") (:authors ("Peter Stiernström" . "peter@stiernstrom.se")) (:maintainers ("Peter Stiernström" . "peter@stiernstrom.se")) (:maintainer "Peter Stiernström" . "peter@stiernstrom.se") (:keywords "vc" "convenience") (:url . "https://github.com/pidu/git-lens"))]) - (git-link . [(20230518 204) ((emacs (24 3))) "Get the GitHub/Bitbucket/GitLab URL for a buffer location" tar ((:commit . "aded95807f277f30e1607313bdf9ac9a016a2305") (:authors ("Skye Shaw" . "skye.shaw@gmail.com")) (:maintainers ("Skye Shaw" . "skye.shaw@gmail.com")) (:maintainer "Skye Shaw" . "skye.shaw@gmail.com") (:keywords "git" "vc" "github" "bitbucket" "gitlab" "sourcehut" "aws" "azure" "convenience") (:url . "http://github.com/sshaw/git-link"))]) + (git-link . [(20240303 1546) ((emacs (24 3))) "Get the GitHub/Bitbucket/GitLab URL for a buffer location" tar ((:commit . "14156291e0eb7156bd779a80c17e1935a7f8f5e5") (:authors ("Skye Shaw" . "skye.shaw@gmail.com")) (:maintainers ("Skye Shaw" . "skye.shaw@gmail.com")) (:maintainer "Skye Shaw" . "skye.shaw@gmail.com") (:keywords "git" "vc" "github" "bitbucket" "gitlab" "sourcehut" "aws" "azure" "convenience") (:url . "http://github.com/sshaw/git-link"))]) (git-messenger . [(20201202 1637) ((emacs (24 3)) (popup (0 5 3))) "Popup last commit of current line" tar ((:commit . "fb9a049ac3b5fba7369ef1f027b97881f1e377ec") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Neil Okamoto")) (:maintainer "Neil Okamoto") (:url . "https://github.com/emacsorphanage/git-messenger"))]) - (git-modes . [(20230511 2134) ((emacs (25 1)) (compat (29 1 4 1))) "Major modes for editing Git configuration files" tar ((:commit . "44d536ba637235c9dd203410281397417a3e60b6") (:authors ("Sebastian Wiesner" . "lunaryorn@gmail.com") ("Rüdiger Sonderfeld" . "ruediger@c-plusplus.net") ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience" "vc" "git") (:url . "https://github.com/magit/git-modes"))]) + (git-modes . [(20240101 2217) ((emacs (25 1)) (compat (29 1 4 1))) "Major modes for editing Git configuration files" tar ((:commit . "4a61a9b86df9c824a99c522f42d55e68faf85f91") (:authors ("Sebastian Wiesner" . "lunaryorn@gmail.com") ("Rüdiger Sonderfeld" . "ruediger@c-plusplus.net") ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience" "vc" "git") (:url . "https://github.com/magit/git-modes"))]) (git-msg-prefix . [(20191031 1304) ((emacs (24)) (s (1 10 0)) (dash (2 9 0))) "Insert commit message prefix (issue number)" tar ((:commit . "43f6b31c1090371260a2f15b2117a7666920bee7") (:authors ("Raimon Grau" . "raimonster@gmail.com")) (:maintainers ("Raimon Grau" . "raimonster@gmail.com")) (:maintainer "Raimon Grau" . "raimonster@gmail.com") (:keywords "vc" "tools") (:url . "http://github.com/kidd/git-msg-prefix.el"))]) (git-ps1-mode . [(20200113 704) nil "Global minor-mode to print __git_ps1 in mode-line" tar ((:commit . "6762a309bd593d26258dfbf43e7bc21254a70fbf") (:authors ("10sr <8slashes+el [at] gmail [dot] com>")) (:maintainers ("10sr <8slashes+el [at] gmail [dot] com>")) (:maintainer "10sr <8slashes+el [at] gmail [dot] com>") (:keywords "utility" "mode-line" "git") (:url . "https://github.com/10sr/git-ps1-mode-el"))]) (git-time-metric . [(20181116 2011) nil "Provide function to record time with gtm ( git time metric )" tar ((:commit . "287108ed1d6885dc795eb3bad4476aa08c626186") (:authors ("Anton Sivolapov" . "anton.sivolapov@gmail.com")) (:maintainers ("Anton Sivolapov" . "anton.sivolapov@gmail.com")) (:maintainer "Anton Sivolapov" . "anton.sivolapov@gmail.com") (:keywords "tools" "gtm" "productivity" "time") (:url . "https://github.com/c301/gtm-emacs-plugin"))]) - (git-timemachine . [(20230630 1214) ((emacs (24 3)) (transient (0 1 0))) "Walk through git revisions of a file" tar ((:commit . "ac933e5cd29583c131401f3bd991d98129c316df") (:authors ("Peter Stiernström" . "peter@stiernstrom.se")) (:maintainers ("Peter Stiernström" . "peter@stiernstrom.se")) (:maintainer "Peter Stiernström" . "peter@stiernstrom.se") (:keywords "vc") (:url . "https://gitlab.com/pidu/git-timemachine"))]) + (git-timemachine . [(20240309 1109) ((emacs (24 3)) (transient (0 1 0))) "Walk through git revisions of a file" tar ((:commit . "5ed73c3831cf6da10ba941e6abba708a86853e8f") (:authors ("Peter Stiernström" . "peter@stiernstrom.se")) (:maintainers ("Peter Stiernström" . "peter@stiernstrom.se")) (:maintainer "Peter Stiernström" . "peter@stiernstrom.se") (:keywords "vc") (:url . "https://gitlab.com/pidu/git-timemachine"))]) (git-walktree . [(20191101 302) ((emacs (26 1)) (git (0 1 1)) (cl-lib (0 5))) "Browse Git tree and blob objects" tar ((:commit . "a1a5490b89d193724ec637818baf2d8edf97c638") (:authors ("10sr <8.slashes [at] gmail [dot] com>")) (:maintainers ("10sr <8.slashes [at] gmail [dot] com>")) (:maintainer "10sr <8.slashes [at] gmail [dot] com>") (:keywords "vc" "utility" "git") (:url . "https://github.com/10sr/git-walktree-el"))]) (git-wip-timemachine . [(20150408 1006) ((s (1 9 0))) "Walk through git-wip revisions of a file" tar ((:commit . "1ce257e6c25117b01f1b899aca21e07eae084d40") (:authors ("Tim Krones" . "t.krones@gmx.net")) (:maintainers ("Tim Krones" . "t.krones@gmx.net")) (:maintainer "Tim Krones" . "t.krones@gmx.net") (:keywords "git") (:url . "https://github.com/itsjeyd/git-wip-timemachine"))]) (gitconfig . [(20130718 935) nil "Emacs lisp interface to work with git-config variables" tar ((:commit . "6c313a39e20702ddcebc12d146f69db1ce668901") (:authors ("Samuel Tonini")) (:maintainers ("Samuel Tonini")) (:maintainer "Samuel Tonini") (:keywords "git" "gitconfig" "git-config"))]) (github-browse-file . [(20160205 1427) ((cl-lib (0 5))) "View the file you're editing on GitHub" tar ((:commit . "177667b8dac640f3dabacc4395e09451c5e88c53") (:authors ("Ozan Sener" . "ozan@ozansener.com")) (:maintainers ("Ozan Sener" . "ozan@ozansener.com")) (:maintainer "Ozan Sener" . "ozan@ozansener.com") (:keywords "convenience" "vc" "git" "github") (:url . "https://github.com/osener/github-browse-file"))]) (github-clone . [(20210108 1920) ((gh (1 0 1)) (magit (3 0 0)) (emacs (25 1))) "Fork and clone github repos" tar ((:commit . "7b2ce0109f5aac0b65f3e6a5ba761e18bd86f093") (:authors ("Charles L.G. Comstock" . "dgtized@gmail.com")) (:maintainers ("Charles L.G. Comstock" . "dgtized@gmail.com")) (:maintainer "Charles L.G. Comstock" . "dgtized@gmail.com") (:keywords "vc" "tools") (:url . "https://github.com/dgtized/github-clone.el"))]) - (github-dark-vscode-theme . [(20220313 2040) ((emacs (24 1))) "The GitHub Dark Theme from Visual Studio Code" tar ((:commit . "2123bcd08fe42094b07180632be2cd2af606ee21") (:authors ("Justintime50")) (:maintainers ("Justintime50")) (:maintainer "Justintime50") (:keywords "faces") (:url . "https://github.com/justintime50/github-dark-vscode-emacs-theme"))]) - (github-elpa . [(20200129 417) ((package-build (1 0)) (commander (0 7 0)) (git (0 1 1))) "Build and publish ELPA repositories with GitHub Pages" tar ((:commit . "0e0fdbdd774b0866beccff6be7f302e5c8ee71da") (:authors (nil . "10sr<8slashes+el@gmail.com>")) (:maintainers (nil . "10sr<8slashes+el@gmail.com>")) (:maintainer nil . "10sr<8slashes+el@gmail.com>") (:url . "https://github.com/10sr/github-elpa"))]) + (github-dark-vscode-theme . [(20231011 2034) ((emacs (24 1))) "The GitHub Dark Theme from Visual Studio Code" tar ((:commit . "9906e1412d692ea0c115998c1809bcc135e263f6") (:authors ("Justintime50")) (:maintainers ("Justintime50")) (:maintainer "Justintime50") (:keywords "faces") (:url . "https://github.com/justintime50/github-dark-vscode-emacs-theme"))]) + (github-elpa . [(20231201 804) ((package-build (1 0)) (commander (0 7 0)) (git (0 1 1))) "Build and publish ELPA repositories with GitHub Pages" tar ((:commit . "c818883d9dc8d34eaee03691574e0408f18db28a") (:authors (nil . "10sr<8slashes+el@gmail.com>")) (:maintainers (nil . "10sr<8slashes+el@gmail.com>")) (:maintainer nil . "10sr<8slashes+el@gmail.com>") (:url . "https://github.com/10sr/github-elpa"))]) (github-explorer . [(20220305 1450) ((emacs (25)) (graphql (0))) "Explore a GitHub repository on the fly" tar ((:commit . "49e5c350169b556deaabdcb67e9440bd4d5b4f8b") (:authors ("Giap Tran" . "txgvnn@gmail.com")) (:maintainers ("Giap Tran" . "txgvnn@gmail.com")) (:maintainer "Giap Tran" . "txgvnn@gmail.com") (:keywords "comm") (:url . "https://github.com/TxGVNN/github-explorer"))]) - (github-linguist . [(20220928 2013) ((emacs (27 1)) (project (0 8)) (async (1 9)) (map (3))) "Run GitHub Linguist on projects to collect information" tar ((:commit . "73f9f52e1f626e866d8becc7a3671630449764c2") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainers ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:keywords "processes") (:url . "https://github.com/akirak/github-linguist.el"))]) + (github-linguist . [(20231105 736) ((emacs (28 1)) (project (0 8)) (async (1 9)) (map (3))) "Run GitHub Linguist on projects to collect information" tar ((:commit . "7e24d62266ff0c56b63dc8ca4bf6d39a88aa1d5b") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainers ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:keywords "processes") (:url . "https://github.com/akirak/github-linguist.el"))]) (github-modern-theme . [(20171109 1251) nil "The GitHub color theme for Emacs." tar ((:commit . "a7e7b8e5e9c122138e79e837caf9b7299e748d44") (:authors ("Philip Arvidsson" . "philip@philiparvidsson.com")) (:maintainers ("Philip Arvidsson" . "philip@philiparvidsson.com")) (:maintainer "Philip Arvidsson" . "philip@philiparvidsson.com") (:url . "https://github.com/philiparvidsson/GitHub-Theme-for-Emacs"))]) (github-notifier . [(20180421 316) ((emacs (24))) "Displays your GitHub notifications unread count in mode-line" tar ((:commit . "274f3812926ea371346f639fcee98066f6e8c96f") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainers ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me") (:keywords "github" "mode-line") (:url . "https://github.com/xuchunyang/github-notifier.el"))]) (github-pullrequest . [(20170116 616) ((emacs (24 4)) (request (0 2 0)) (dash (2 11 0)) (magit (2 10 0))) "Create and fetch Github Pull requests with ease" tar ((:commit . "471816e09d1e140a0975911fe020c6c659f71209") (:authors ("Jakob Lind" . "karl.jakob.lind@gmail.com")) (:maintainers ("Jakob Lind" . "karl.jakob.lind@gmail.com")) (:maintainer "Jakob Lind" . "karl.jakob.lind@gmail.com") (:keywords "tools") (:url . "https://github.com/jakoblind/github-pullrequest"))]) @@ -2040,11 +2096,12 @@ (gmail-message-mode . [(20160627 1847) ((ham-mode (1 0))) "A major-mode for editing gmail messages using markdown syntax." tar ((:commit . "ec36672a9dc93c09ebe2f77597b498d11883d008") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainers ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com") (:keywords "mail" "convenience" "emulation") (:url . "http://github.com/Bruce-Connor/gmail-message-mode"))]) (gmail2bbdb . [(20170423 1144) nil "import email and name into bbdb from vcard." tar ((:commit . "a84fa385cfaec7fc5f1518c368e52722da139f99") (:authors ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainers ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainer "Chen Bin" . "chenbin.sh@gmail.com") (:keywords "vcard" "bbdb" "email" "contact" "gmail") (:url . "http://github.com/redguardtoo/gmail2bbdb"))]) (gmpl-mode . [(20220121 631) ((emacs (24))) "Major mode for editing GMPL(MathProg) files" tar ((:commit . "97b103eea8b18f7e27b0f0be6cb4809a4156c032") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainers ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions"))]) - (gmsh-mode . [(20211204 826) ((emacs (26 1))) "Highlight GMSH mesh generator script syntax" tar ((:commit . "2b7c573f378f7e9210400115d4d9dfd879f8a4ad") (:authors ("Matsievskiy S.V.")) (:maintainers ("Matsievskiy S.V.")) (:maintainer "Matsievskiy S.V.") (:keywords "languages") (:url . "https://gitlab.com/matsievskiysv/gmsh-mode"))]) + (gmsh-mode . [(20240223 558) ((emacs (26 1))) "Highlight GMSH mesh generator script syntax" tar ((:commit . "324d09e6ef51ff9473cbfaf560979ed313df416b") (:authors ("Matsievskiy S.V.")) (:maintainers ("Matsievskiy S.V.")) (:maintainer "Matsievskiy S.V.") (:keywords "languages") (:url . "https://gitlab.com/matsievskiysv/gmsh-mode"))]) (gn-mode . [(20190428 1812) ((emacs (24)) (cl-lib (0 5))) "major mode for editing GN (generate ninja) files" tar ((:commit . "fcf8e1e500d953364e97e7ebc5708a2c00fa3cd2") (:authors ("Emily Backes" . "lucca@accela.net")) (:maintainers ("Emily Backes" . "lucca@accela.net")) (:maintainer "Emily Backes" . "lucca@accela.net") (:keywords "data") (:url . "http://github.com/lashtear/gn-mode"))]) (gnome-calendar . [(20161110 1256) nil "Integration with the GNOME Shell calendar" tar ((:commit . "668591bec95c23934c5e1ef100cec4824e7cb25d") (:authors ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainers ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr") (:keywords "gnome" "calendar"))]) (gnome-screencast . [(20210125 2001) ((emacs (25))) "Use Gnome screen recording functionality using elisp" tar ((:commit . "1f4ef60fe9d452320dc02f89e289bac04ef2ad1c") (:authors ("Jürgen Hötzel" . "juergen@hoetzel.info")) (:maintainers ("Jürgen Hötzel" . "juergen@hoetzel.info")) (:maintainer "Jürgen Hötzel" . "juergen@hoetzel.info") (:keywords "tools" "multimedia") (:url . "https://github.com/juergenhoetzel/emacs-gnome-screencast"))]) (gnomenm . [(20150316 1918) ((s (1 9 0)) (dash (2 3 0)) (kv (0 0 19))) "Emacs interface to Gnome nmcli command" tar ((:commit . "9065cda44ffc9e06239b8189a0154d31314c3b4d") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainers ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:keywords "processes" "hardware") (:url . "http://github.com/nicferrier/emacs-nm"))]) + (gnosis . [(20240314 612) ((emacs (27 2)) (emacsql (20240124)) (compat (29 1 4 2))) "Spaced Repetition System For Note Taking & Self Testing" tar ((:commit . "78e066b94809fb7746086a1ca6b7d7c39d353343") (:authors ("Thanos Apollo" . "public@thanosapollo.org")) (:maintainers ("Thanos Apollo" . "public@thanosapollo.org")) (:maintainer "Thanos Apollo" . "public@thanosapollo.org") (:keywords "extensions") (:url . "https://thanosapollo.org/projects/gnosis"))]) (gntp . [(20141025 250) nil "Growl Notification Protocol for Emacs" tar ((:commit . "767571135e2c0985944017dc59b0be79af222ef5") (:authors ("Engelke Eschner" . "tekai@gmx.li")) (:maintainers ("Engelke Eschner" . "tekai@gmx.li")) (:maintainer "Engelke Eschner" . "tekai@gmx.li"))]) (gnu-apl-mode . [(20220404 341) ((emacs (27))) "Integrate GNU APL with Emacs" tar ((:commit . "c8695b0d55b5167263a843252ffd21a589018427") (:authors ("Elias Mårtenson" . "lokedhs@gmail.com")) (:maintainer "Elias Mårtenson" . "lokedhs@gmail.com") (:keywords "languages") (:url . "http://www.gnu.org/software/apl/"))]) (gnu-indent . [(20221127 2112) ((emacs (25 1))) "Indent your code with GNU Indent" tar ((:commit . "f31dbe60478b6270bb57b6b05998df8eec56f801") (:authors ("Akib Azmain Turja" . "akib@disroot.org")) (:maintainers ("Akib Azmain Turja" . "akib@disroot.org")) (:maintainer "Akib Azmain Turja" . "akib@disroot.org") (:keywords "tools" "c") (:url . "https://codeberg.org/akib/emacs-gnu-indent"))]) @@ -2070,7 +2127,7 @@ (go-fill-struct . [(20230308 1034) ((emacs (24))) "Fill struct for golang." tar ((:commit . "9e2e4be5af716ecadba809e73ddc95d4c772b2d9") (:authors ("Sergey Kostyaev" . "feo.me@ya.ru")) (:maintainers ("Sergey Kostyaev" . "feo.me@ya.ru")) (:maintainer "Sergey Kostyaev" . "feo.me@ya.ru") (:keywords "tools") (:url . "https://github.com/s-kostyaev/go-fill-struct"))]) (go-gen-test . [(20230616 2053) ((emacs (24 4))) "Generate tests for go code with gotests" tar ((:commit . "af00a9abbaba2068502327ecdef574fd894a884b") (:authors ("Sergey Kostyaev" . "feo.me@ya.ru")) (:maintainers ("Sergey Kostyaev" . "feo.me@ya.ru")) (:maintainer "Sergey Kostyaev" . "feo.me@ya.ru") (:keywords "languages") (:url . "https://github.com/s-kostyaev/go-gen-test"))]) (go-gopath . [(20160705 1034) ((cl-lib (0 5))) "Will guess GOPATH using gb and projectile." tar ((:commit . "5172fc53f21edbf9347d5ee7d1d745da1ec88a15") (:authors ("Andrew Kirilenko" . "andrew.kirilenko.main@gmail.com")) (:maintainers ("Andrew Kirilenko" . "andrew.kirilenko.main@gmail.com")) (:maintainer "Andrew Kirilenko" . "andrew.kirilenko.main@gmail.com") (:url . "http://github.com/iced/go-gopath/"))]) - (go-guru . [(20220114 2239) ((go-mode (1 3 1)) (cl-lib (0 5))) "Integration of the Go 'guru' analysis tool into Emacs." tar ((:commit . "3273fcece5d9ab7edd4f15b2d6bce61f4e5a0666") (:keywords "tools"))]) + (go-guru . [(20240210 10) ((go-mode (1 3 1)) (cl-lib (0 5))) "Integration of the Go 'guru' analysis tool into Emacs." tar ((:commit . "6f4ff9ef874d151ed8d297a80f1bf27db5d9dbf0") (:keywords "tools"))]) (go-imenu . [(20181029 1029) ((emacs (24 3))) "Enhance imenu for go language" tar ((:commit . "00bb69c1c71453f43ab2d6622a74e3c8e6b454b9") (:authors ("Brantou" . "brantou89@gmail.com")) (:maintainers ("Brantou" . "brantou89@gmail.com")) (:maintainer "Brantou" . "brantou89@gmail.com") (:keywords "tools") (:url . "https://github.com/brantou/go-imenu.el"))]) (go-impl . [(20210621 743) ((emacs (24 3)) (go-mode (1 3 0))) "impl integration for go-mode" tar ((:commit . "1eebba6ccd02d11a5a82ad4540a8d562797bc3b3") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-go-impl"))]) (go-imports . [(20190715 1647) nil "Insert go import statement given package name" tar ((:commit . "55681e815da93b6f927213c4aa352ae33db97c37") (:authors ("Yaz Saito")) (:maintainers ("Yaz Saito")) (:maintainer "Yaz Saito") (:keywords "tools" "go" "import") (:url . "https://github.com/yasushi-saito/go-imports"))]) @@ -2084,13 +2141,14 @@ (go-snippets . [(20180113 611) ((yasnippet (0 8 0))) "Yasnippets for go" tar ((:commit . "d437df148879566ffe7f2e503a3cf2602aa9fb28") (:keywords "snippets"))]) (go-stacktracer . [(20150430 2142) nil "parse Go stack traces" tar ((:commit . "a2ac6d801b389f80ca4e2fcc1ab44513a9e55976") (:authors ("Samer Masterson" . "samer@samertm.com")) (:maintainers ("Samer Masterson" . "samer@samertm.com")) (:maintainer "Samer Masterson" . "samer@samertm.com") (:keywords "tools") (:url . "https://github.com/samertm/go-stacktracer.el"))]) (go-tag . [(20230111 651) ((emacs (24 0)) (go-mode (1 5 0))) "Edit Golang struct field tag" tar ((:commit . "33f2059551d5298ca228d90f525b99d1a8d70364") (:authors ("Brantou" . "brantou89@gmail.com")) (:maintainers ("Brantou" . "brantou89@gmail.com")) (:maintainer "Brantou" . "brantou89@gmail.com") (:keywords "tools") (:url . "https://github.com/brantou/emacs-go-tag"))]) - (go-translate . [(20230503 303) ((emacs (27 1))) "Translation framework supports multiple engines such as Google/Bing/DeepL" tar ((:commit . "59506f69503cca65291fa5ccd0a326e716338c23") (:authors ("lorniu" . "lorniu@gmail.com")) (:maintainers ("lorniu" . "lorniu@gmail.com")) (:maintainer "lorniu" . "lorniu@gmail.com") (:keywords "convenience") (:url . "https://github.com/lorniu/go-translate"))]) + (go-translate . [(20240313 356) ((emacs (27 1))) "Translation framework supports multiple engines such as Google/Bing/DeepL" tar ((:commit . "377375c87f64e7d069c8fc310ccfefd8771226f3") (:authors ("lorniu" . "lorniu@gmail.com")) (:maintainers ("lorniu" . "lorniu@gmail.com")) (:maintainer "lorniu" . "lorniu@gmail.com") (:keywords "convenience") (:url . "https://github.com/lorniu/go-translate"))]) (gobgen . [(20161020 1523) ((emacs (24 4))) "Generate GObject descendants using a detailed form" tar ((:commit . "ed2c2b0d217deae293096f3cf14aa492791ddd4f") (:authors ("Gergely Polonkai" . "gergely@polonkai.eu")) (:maintainers ("Gergely Polonkai" . "gergely@polonkai.eu")) (:maintainer "Gergely Polonkai" . "gergely@polonkai.eu") (:keywords "gobject" "glib" "gtk" "helper" "utilities"))]) (god-mode . [(20221230 708) ((emacs (25 1))) "Minor mode for God-like command entering" tar ((:commit . "607aff10a7b27a8aa0c1a15c2c39337ab17cfda7") (:authors ("Chris Done" . "chrisdone@gmail.com")) (:maintainers ("Chris Done" . "chrisdone@gmail.com")) (:maintainer "Chris Done" . "chrisdone@gmail.com") (:url . "https://github.com/emacsorphanage/god-mode"))]) (godoctor . [(20180710 2152) nil "Frontend for godoctor" tar ((:commit . "4b45ff3d0572f0e84056e4c3ba91fcc178199859") (:authors ("Sangho Na" . "microamp@protonmail.com")) (:maintainers ("Sangho Na" . "microamp@protonmail.com")) (:maintainer "Sangho Na" . "microamp@protonmail.com") (:keywords "go" "golang" "refactoring") (:url . "https://github.com/microamp/godoctor.el"))]) - (goggles . [(20230428 1547) ((emacs (27 1))) "Pulse modified regions" tar ((:commit . "4a22853a4ff18c1c1a2149945de9a5ed0a23a2c9") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainers ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:keywords "convenience" "wp") (:url . "https://github.com/minad/goggles"))]) + (gofmt-tag . [(20240111 2031) ((emacs (27))) "Format and align go struct tags" tar ((:commit . "b7cc315ac45342fc9c17dde779cc9c37aa309841") (:authors ("ybenel ")) (:maintainers ("ybenel" . "root@ybenel.cf")) (:maintainer "ybenel" . "root@ybenel.cf") (:keywords "tools" "wp" "matching") (:url . "https://github.com/m1ndo/gofmt-tag"))]) + (goggles . [(20240216 1542) ((emacs (27 1))) "Pulse modified regions" tar ((:commit . "41d3669d7ae7b73bd39d298e5373ece48b656ce3") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainers ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:keywords "convenience" "text") (:url . "https://github.com/minad/goggles"))]) (gold-mode . [(20140607 206) ((sws-mode (0))) "Major mode for editing .gold files" tar ((:commit . "6d3aa59602b1b835495271c8c9741ac344c2eab1") (:authors ("Yuta Yamada ")) (:maintainers ("Yuta Yamada ")) (:maintainer "Yuta Yamada ") (:keywords "golang" "template" "gold") (:url . "https://github.com/yuutayamada/gold-mode-el"))]) - (golden-ratio . [(20191028 1732) nil "Automatic resizing of Emacs windows to the golden ratio" tar ((:commit . "007911d8a431b72670f5fe5f0e5b4380c2777a31") (:authors ("Roman Gonzalez" . "romanandreg@gmail.com")) (:maintainers ("Roman Gonzalez" . "romanandreg@gmail.com")) (:maintainer "Roman Gonzalez" . "romanandreg@gmail.com") (:keywords "window" "resizing"))]) + (golden-ratio . [(20230912 1825) nil "Automatic resizing of Emacs windows to the golden ratio" tar ((:commit . "375c9f287dfad68829582c1e0a67d0c18119dab9") (:authors ("Roman Gonzalez" . "romanandreg@gmail.com")) (:maintainers ("Roman Gonzalez" . "romanandreg@gmail.com")) (:maintainer "Roman Gonzalez" . "romanandreg@gmail.com") (:keywords "window" "resizing"))]) (golden-ratio-scroll-screen . [(20221102 240) nil "Scroll half screen down or up, and highlight current line" tar ((:commit . "ed82ac7e9129c7be5983b44def0b9239b54d4dcf") (:authors ("纪秀峰 ")) (:maintainers ("纪秀峰 ")) (:maintainer "纪秀峰 ") (:keywords "scroll" "screen" "highlight") (:url . "https://github.com/jixiuf/golden-ratio-scroll-screen"))]) (golint . [(20180221 2015) nil "lint for the Go source code" tar ((:commit . "0562613f16a6ec439a4a68e817e69e0f7c405c87") (:url . "https://github.com/golang/lint"))]) (gom-mode . [(20131008 253) nil "Major mode for Gomfile" tar ((:commit . "972e33df1d38ff323bc97de87477305826013701") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-gom-mode"))]) @@ -2107,32 +2165,33 @@ (gorepl-mode . [(20170905 945) ((emacs (24)) (s (1 11 0)) (f (0 19 0)) (hydra (0 13 0))) "Go REPL Interactive Development in top of Gore" tar ((:commit . "bbd27f6a0a77f484e2a3f082d70dc69da63ae52a") (:authors ("Manuel Alonso" . "manuteali@gmail.com")) (:maintainers ("Manuel Alonso" . "manuteali@gmail.com")) (:maintainer "Manuel Alonso" . "manuteali@gmail.com") (:keywords "languages" "go" "golang" "gorepl") (:url . "http://www.github.com/manute/gorepl-mode"))]) (gotest . [(20230221 945) ((emacs (24 3)) (s (1 11 0)) (f (0 19 0))) "Launch GO unit tests" tar ((:commit . "490189e68d743a851bfb42d0017428a7550e8615") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainers ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "languages" "go" "tests") (:url . "https://github.com/nlamirault/gotest.el"))]) (gotham-theme . [(20220107 1730) ((emacs (24 1))) "A very dark Emacs color theme" tar ((:commit . "4b8214df0851bb69b44c3e864568b7e0030a95d2") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainers ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de") (:url . "https://depp.brause.cc/gotham-theme"))]) - (goto-char-preview . [(20230111 1525) ((emacs (24 3))) "Preview character when executing `goto-char` command" tar ((:commit . "feee79f83194155e67f5b16ca57b51b2d941b2ee") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "character" "navigation") (:url . "https://github.com/emacs-vs/goto-char-preview"))]) + (goto-char-preview . [(20240206 139) ((emacs (24 3))) "Preview character when executing `goto-char` command" tar ((:commit . "d40eb8c1e8844ab7d265197191a759f62bf1099c") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "character" "navigation") (:url . "https://github.com/emacs-vs/goto-char-preview"))]) (goto-chg . [(20220107 1733) ((emacs (24 1))) "Go to last change" tar ((:commit . "278cd3e6d5107693aa2bb33189ca503f22f227d0") (:authors ("David Andersson ")) (:maintainers ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de") (:keywords "convenience" "matching") (:url . "https://github.com/emacs-evil/goto-chg"))]) (goto-last-change . [(20150109 1823) nil "Move point through buffer-undo-list positions" tar ((:commit . "58b0928bc255b47aad318cd183a5dce8f62199cc") (:authors ("Kevin Rodgers" . "ihs_4664@yahoo.com")) (:maintainers ("Kevin Rodgers" . "ihs_4664@yahoo.com")) (:maintainer "Kevin Rodgers" . "ihs_4664@yahoo.com") (:keywords "convenience") (:url . "https://github.com/camdez/goto-last-change.el"))]) (goto-last-point . [(20230406 1822) ((emacs (24 3))) "Record and jump to the last point in the buffer" tar ((:commit . "2ad8ff095bc34b433803c824ec4f500ff51cd1b2") (:authors ("Manuel Uberti" . "manuel.uberti@inventati.org")) (:maintainers ("Manuel Uberti" . "manuel.uberti@inventati.org")) (:maintainer "Manuel Uberti" . "manuel.uberti@inventati.org") (:keywords "convenience") (:url . "https://github.com/manuel-uberti/goto-last-point"))]) - (goto-line-preview . [(20230111 1531) ((emacs (25))) "Preview line when executing `goto-line` command" tar ((:commit . "c6db484cf401351f7f2f57496b0466b774435947") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "line" "navigation") (:url . "https://github.com/emacs-vs/goto-line-preview"))]) - (govc . [(20221216 1712) ((emacs (24 3)) (dash (1 5 0)) (s (1 9 0)) (magit-popup (2 0 50)) (json-mode (1 6 0))) "Interface to govc for managing VMware ESXi and vCenter" tar ((:commit . "c82a709c50c0cd1ae560dd4c8da2d5b266114c50") (:authors ("The govc developers")) (:maintainers ("The govc developers")) (:maintainer "The govc developers") (:keywords "convenience") (:url . "https://github.com/vmware/govmomi/tree/main/govc/emacs"))]) + (goto-line-preview . [(20240206 138) ((emacs (25))) "Preview line when executing `goto-line` command" tar ((:commit . "4e712da4e5e90b02440bd1f435a89ad02ff5a894") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "line" "navigation") (:url . "https://github.com/emacs-vs/goto-line-preview"))]) + (govc . [(20240208 2356) ((emacs (24 3)) (dash (1 5 0)) (s (1 9 0)) (magit-popup (2 0 50)) (json-mode (1 6 0))) "Interface to govc for managing VMware ESXi and vCenter" tar ((:commit . "5d7849f71f7080873f4c7d75c999a5bf55d8486d") (:authors ("The govc developers")) (:maintainers ("The govc developers")) (:maintainer "The govc developers") (:keywords "convenience") (:url . "https://github.com/vmware/govmomi/tree/main/govc/emacs"))]) (govet . [(20170808 1724) nil "linter/problem finder for the Go source code" tar ((:commit . "1b8c044aa856f4b62a682bc57494af19d22a6053") (:url . "https://godoc.org/golang.org/x/tools/cmd/vet"))]) - (gpastel . [(20181229 1404) ((emacs (25 1))) "Integrates GPaste with the kill-ring" tar ((:commit . "8a5522b274f79d55d7c9a0b2aaf062526f9253c7") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:keywords "tools") (:url . "https://gitlab.petton.fr/DamienCassou/desktop-environment"))]) + (gpastel . [(20231030 713) ((emacs (25 1))) "Integrates GPaste with the kill-ring" tar ((:commit . "d35505abb1e38ddda61440b033ebd4decac7a25c") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:keywords "tools") (:url . "https://github.com/DamienCassou/gpastel"))]) (gpr-ts-mode . [(20230813 1727) ((emacs (29 1))) "Major mode for GNAT project files using Tree-Sitter" tar ((:commit . "2e4f89743b115b3e09f0574d0a6e67a7422c554c") (:authors ("Troy Brown" . "brownts@troybrown.dev")) (:maintainers ("Troy Brown" . "brownts@troybrown.dev")) (:maintainer "Troy Brown" . "brownts@troybrown.dev") (:keywords "gpr" "gnat" "ada" "languages" "tree-sitter") (:url . "https://github.com/brownts/gpr-ts-mode"))]) (gpr-yasnippets . [(20230516 627) ((emacs (24 4)) (yasnippet (0 14 0))) "Yasnippets for GNAT project files" tar ((:commit . "d66ea90e8e45f6d0c3bd62185967c26190117296") (:authors ("Troy Brown" . "brownts@troybrown.dev")) (:maintainers ("Troy Brown" . "brownts@troybrown.dev")) (:maintainer "Troy Brown" . "brownts@troybrown.dev") (:keywords "gpr" "gnat" "languages" "snippets") (:url . "https://github.com/brownts/gpr-yasnippets"))]) - (gpt . [(20230502 2319) ((emacs (24 4))) "Run instruction-following language models" tar ((:commit . "a38c152caa99ca30af86040907f70b027173c19d") (:authors ("Andreas Stuhlmueller" . "andreas@ought.org")) (:maintainers ("Andreas Stuhlmueller" . "andreas@ought.org")) (:maintainer "Andreas Stuhlmueller" . "andreas@ought.org") (:keywords "gpt3" "language" "copilot" "convenience" "tools") (:url . "https://github.com/stuhlmueller/gpt.el"))]) + (gpt . [(20231112 2012) ((emacs (24 4))) "Run instruction-following language models" tar ((:commit . "c1091d25db420320de4b121baba99d7ac2e23932") (:authors ("Andreas Stuhlmueller" . "andreas@ought.org")) (:maintainers ("Andreas Stuhlmueller" . "andreas@ought.org")) (:maintainer "Andreas Stuhlmueller" . "andreas@ought.org") (:keywords "gpt3" "language" "copilot" "convenience" "tools") (:url . "https://github.com/stuhlmueller/gpt.el"))]) (gpt-commit . [(20230716 331) ((emacs (27 1)) (magit (2 90)) (request (0 3 2))) "Commit messages with GPT in Emacs" tar ((:commit . "8a8883be2051eed499c5bc3035a75ff56d64d5ff") (:authors ("Youngwook Kim" . "youngwook.kim@gmail.com")) (:maintainers ("Youngwook Kim" . "youngwook.kim@gmail.com")) (:maintainer "Youngwook Kim" . "youngwook.kim@gmail.com") (:url . "https://github.com/ywkim/gpt-commit"))]) (gptai . [(20230530 1853) ((emacs (24 1))) "Integrate with the OpenAI API" tar ((:commit . "e7b8b91b425986868e8bc0edcac384ba47d4d4b7") (:authors ("Anton Hibl" . "antonhibl11@gmail.com")) (:maintainers ("Anton Hibl" . "antonhibl11@gmail.com")) (:maintainer "Anton Hibl" . "antonhibl11@gmail.com") (:keywords "comm" "convenience") (:url . "https://github.com/antonhibl/gptai"))]) - (gptel . [(20230813 1808) ((emacs (27 1)) (transient (0 4 0))) "A simple ChatGPT client" tar ((:commit . "f0b18c5f8bad3fb67f8e2c40b97ad0104aded723") (:authors ("Karthik Chikmagalur")) (:maintainers ("Karthik Chikmagalur")) (:maintainer "Karthik Chikmagalur") (:keywords "convenience") (:url . "https://github.com/karthink/gptel"))]) + (gptel . [(20240320 106) ((emacs (27 1)) (transient (0 4 0)) (compat (29 1 4 1))) "Interact with ChatGPT or other LLMs" tar ((:commit . "9bc54bed9ca457b801c937c3d7ea7e3017f3c912") (:authors ("Karthik Chikmagalur")) (:maintainers ("Karthik Chikmagalur")) (:maintainer "Karthik Chikmagalur") (:keywords "convenience") (:url . "https://github.com/karthink/gptel"))]) (grab-mac-link . [(20210511 1303) ((emacs (24))) "Grab link from Mac Apps and insert it into Emacs" tar ((:commit . "5fdb03bf57bc4a530374b896e0f8b5139dc794e3") (:authors ("Xu Chunyang")) (:maintainers ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:keywords "mac" "hyperlink") (:url . "https://github.com/xuchunyang/grab-mac-link.el"))]) (grab-x-link . [(20191113 848) ((emacs (24)) (cl-lib (0 5))) "Grab links from X11 apps and insert into Emacs" tar ((:commit . "d898db46e4864118359fdedfe915e180de3fe290") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainers ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:keywords "hyperlink") (:url . "https://github.com/xuchunyang/grab-x-link"))]) (gradle-mode . [(20150313 1905) ((s (1 8 0))) "Gradle integration with Emacs' compile" tar ((:commit . "579de06674551919cddac9cfe42129f4fb0155c9") (:authors ("Daniel Mijares" . "daniel.j.mijares@gmail.com")) (:maintainers ("Daniel Mijares" . "daniel.j.mijares@gmail.com")) (:maintainer "Daniel Mijares" . "daniel.j.mijares@gmail.com") (:keywords "gradle") (:url . "http://github.com/jacobono/emacs-gradle-mode"))]) (grails . [(20221110 929) ((emacs (24))) "Minor mode for Grails projects" tar ((:commit . "3019f86e555ee94388795a0475cfa213e3897bbb") (:url . "https://github.com/lifeisfoo/emacs-grails"))]) (grails-mode . [(20220407 1954) nil "minor-mode that adds some Grails project management to a grails project" tar ((:commit . "29210e5a969c02169b68e04f2e28e3bf2fc13363") (:authors ("Jim Morris" . "morris@wolfman.com")) (:maintainers ("Russel Winder" . "russel@winder.org.uk")) (:maintainer "Russel Winder" . "russel@winder.org.uk") (:keywords "languages") (:url . "http://blog.wolfman.com"))]) - (grammarly . [(20221231 1655) ((emacs (26 1)) (s (1 12 0)) (request (0 3 0)) (websocket (1 6))) "Grammarly API interface" tar ((:commit . "0d9fbee337cb8dd316e5dcf0bff91e44c115dd0d") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "grammar" "api" "interface" "english") (:url . "https://github.com/emacs-grammarly/grammarly"))]) + (grammarly . [(20240101 846) ((emacs (26 1)) (s (1 12 0)) (request (0 3 0)) (websocket (1 6))) "Grammarly API interface" tar ((:commit . "813944714a04ae2a3cdaca845c1c9d70ced462ca") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "grammar" "api" "interface" "english") (:url . "https://github.com/emacs-grammarly/grammarly"))]) (grandshell-theme . [(20180606 517) nil "Dark color theme for Emacs > 24 with intensive colors." tar ((:commit . "0ed8e4273607dd4fcaa742b4097259233b09eda6") (:authors ("steckerhalter")) (:maintainer "steckerhalter") (:keywords "color" "theme" "grand" "shell" "faces") (:url . "https://framagit.org/steckerhalter/grandshell-theme"))]) (graphene . [(20180529 1112) ((dash (2 10 0)) (exec-path-from-shell (1 9)) (ppd-sr-speedbar (0 0 6)) (sr-speedbar (20140505)) (ido-completing-read+ (4 3)) (smex (3 0)) (web-mode (11 2)) (smartparens (1 8 0)) (graphene-meta-theme (0 0 2)) (flycheck (0 23)) (company (0 8 12))) "Friendly Emacs defaults" tar ((:commit . "cc8477fcfb7771ea4e5bbaf3c01f9e679234c1c1") (:authors ("Robert Dallas Gray" . "mail@robertdallasgray.com")) (:maintainer "Robert Dallas Gray" . "mail@robertdallasgray.com") (:keywords "defaults") (:url . "https://github.com/rdallasgray/graphene"))]) - (graphene-meta-theme . [(20161204 1607) nil "Integrated theming for common packages" tar ((:commit . "62cc73fee31f1bd9474027b83a249feee050271e") (:authors ("Robert Dallas Gray" . "mail@robertdallasgray.com")) (:maintainers ("Robert Dallas Gray" . "mail@robertdallasgray.com")) (:maintainer "Robert Dallas Gray" . "mail@robertdallasgray.com") (:keywords "defaults") (:url . "https://github.com/rdallasgray/graphene"))]) + (graphene-meta-theme . [(20180615 1335) nil "Integrated theming for common packages" tar ((:commit . "a4deb38957ee2aeb861d5601b304bf28d9f867ec") (:authors ("Robert Dallas Gray" . "mail@robertdallasgray.com")) (:maintainers ("Robert Dallas Gray" . "mail@robertdallasgray.com")) (:maintainer "Robert Dallas Gray" . "mail@robertdallasgray.com") (:keywords "defaults") (:url . "https://github.com/rdallasgray/graphene"))]) (graphql . [(20221128 1106) ((emacs (25))) "GraphQL utilities" tar ((:commit . "b57b5ca5d2d0837e1fb4a4f30c051d5f3e643f0f") (:authors ("Sean Allred" . "code@seanallred.com")) (:maintainers ("Sean Allred" . "code@seanallred.com")) (:maintainer "Sean Allred" . "code@seanallred.com") (:keywords "hypermedia" "tools" "lisp") (:url . "https://github.com/vermiculus/graphql.el"))]) (graphql-doc . [(20220527 1721) ((emacs (26 1)) (request (0 3 2)) (promise (1 1))) "GraphQL Documentation Explorer" tar ((:commit . "d37140267e0c426c7c18aff31900aa1650257394") (:authors ("Ian Fitzpatrick")) (:maintainers ("Ian Fitzpatrick")) (:maintainer "Ian Fitzpatrick") (:url . "https://github.com/ifitzpatrick/graphql-doc.el"))]) - (graphql-mode . [(20230411 1943) ((emacs (24 3))) "Major mode for editing GraphQL schemas" tar ((:commit . "0ad4ae0160cabad46109dfbb394297a185eb2525") (:authors ("David Vazquez Pua" . "davazp@gmail.com")) (:maintainers ("David Vazquez Pua" . "davazp@gmail.com")) (:maintainer "David Vazquez Pua" . "davazp@gmail.com") (:keywords "languages") (:url . "https://github.com/davazp/graphql-mode"))]) + (graphql-mode . [(20240218 1603) ((emacs (25 1))) "Major mode for editing GraphQL schemas" tar ((:commit . "2183895ea7932359586c4bb99e8562c4aef3aaf7") (:authors ("David Vazquez Pua" . "davazp@gmail.com")) (:maintainers ("David Vazquez Pua" . "davazp@gmail.com")) (:maintainer "David Vazquez Pua" . "davazp@gmail.com") (:keywords "languages") (:url . "https://github.com/davazp/graphql-mode"))]) + (graphql-ts-mode . [(20240105 1236) ((emacs (29 1))) "Tree-sitter support for GraphQL" tar ((:commit . "e933f235408ea195762700fd07c2d828e8f09aac") (:authors ("Joram Schrijver" . "i@joram.io")) (:maintainers ("Joram Schrijver" . "i@joram.io")) (:maintainer "Joram Schrijver" . "i@joram.io") (:keywords "languages" "graphql" "tree-sitter") (:url . "https://sr.ht/~joram/graphql-ts-mode/"))]) (graphviz-dot-mode . [(20230325 1050) ((emacs (25 0))) "Mode for the dot-language used by graphviz (att)." tar ((:commit . "8ff793b13707cb511875f56e167ff7f980a31136") (:maintainers ("Pieter Pareit" . "pieter.pareit@gmail.com")) (:maintainer "Pieter Pareit" . "pieter.pareit@gmail.com") (:keywords "mode" "dot" "dot-language" "dotlanguage" "graphviz" "graphs" "att") (:url . "https://ppareit.github.io/graphviz-dot-mode/"))]) (grapnel . [(20131001 1534) nil "HTTP request lib with flexible callback dispatch" tar ((:commit . "7387234eb3f0285a490fddb1e06a4bf029719fb7") (:authors ("David Leatherman" . "leathekd@gmail.com")) (:maintainers ("David Leatherman" . "leathekd@gmail.com")) (:maintainer "David Leatherman" . "leathekd@gmail.com") (:url . "http://www.github.com/leathekd/grapnel"))]) (grass-mode . [(20170503 1500) ((cl-lib (0 2)) (dash (2 8 0))) "Provides Emacs modes for interacting with the GRASS GIS program" tar ((:commit . "f17e330dfde6a1b81a9b33d019fc0dff890f482d") (:authors ("Tyler Smith" . "tyler@plantarum.ca")) (:maintainers ("Tyler Smith" . "tyler@plantarum.ca")) (:maintainer "Tyler Smith" . "tyler@plantarum.ca") (:keywords "grass" "gis"))]) @@ -2149,10 +2208,10 @@ (grizzl . [(20160818 737) ((cl-lib (0 5)) (emacs (24 3))) "Fast fuzzy search index for Emacs." tar ((:commit . "d554d93afa8519ee3a41340ec8aa6b4555065446") (:authors ("Chris Corbyn" . "chris@w3style.co.uk")) (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.com")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.com") (:keywords "convenience" "usability") (:url . "https://github.com/grizzl/grizzl"))]) (groovy-imports . [(20210505 1807) ((emacs (24 4)) (s (1 10 0)) (pcache (0 3 2))) "Code for dealing with Groovy imports" tar ((:commit . "a60c3202973e3185091db623d960f71840a22205") (:authors ("Miro Bezjak")) (:maintainers ("Miro Bezjak")) (:maintainer "Miro Bezjak") (:keywords "groovy") (:url . "http://www.github.com/mbezjak/emacs-groovy-imports"))]) (groovy-mode . [(20230318 533) ((s (1 12 0)) (emacs (24 3)) (dash (2 13 0))) "Major mode for Groovy source files" tar ((:commit . "7b8520b2e2d3ab1d62b35c426e17ac25ed0120bb") (:authors ("Russel Winder" . "russel@winder.org.uk") ("Jim Morris" . "morris@wolfman.com") ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Russel Winder" . "russel@winder.org.uk")) (:maintainer "Russel Winder" . "russel@winder.org.uk") (:keywords "languages") (:url . "https://github.com/Groovy-Emacs-Modes/groovy-emacs-modes"))]) - (gruber-darker-theme . [(20221122 1143) nil "Gruber Darker color theme for Emacs 24." tar ((:commit . "6de7a37d7b18cf3f0ec51db799f4f2aa6e3e89ff") (:authors ("Alexey Kutepov" . "reximkut@gmail.com")) (:maintainers ("Alexey Kutepov" . "reximkut@gmail.com")) (:maintainer "Alexey Kutepov" . "reximkut@gmail.com") (:url . "http://github.com/rexim/gruber-darker-theme"))]) - (grugru . [(20230121 1825) ((emacs (24 4))) "Rotate text at point" tar ((:commit . "088f26330be161cfad4835e155595ec60dcb335a") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainers ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com") (:keywords "convenience" "abbrev" "tools") (:url . "https://github.com/ROCKTAKEY/grugru"))]) + (gruber-darker-theme . [(20231026 2031) nil "Gruber Darker color theme for Emacs 24." tar ((:commit . "2e9f99c41fe8ef0557e9ea0f3b94ef50c68b5557") (:authors ("Alexey Kutepov" . "reximkut@gmail.com")) (:maintainers ("Alexey Kutepov" . "reximkut@gmail.com")) (:maintainer "Alexey Kutepov" . "reximkut@gmail.com") (:url . "http://github.com/rexim/gruber-darker-theme"))]) + (grugru . [(20231202 250) ((emacs (24 4))) "Rotate text at point" tar ((:commit . "3f1bc431f4dc919a7b04e519f1c8add9fb2949f3") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainers ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com") (:keywords "convenience" "abbrev" "tools") (:url . "https://github.com/ROCKTAKEY/grugru"))]) (grunt . [(20160316 1528) ((dash (2 9 0)) (ansi-color (3 4 2)) (emacs (24 3))) "Some glue to stick Emacs and Gruntfiles together" tar ((:commit . "4c269e2738658643ec2ed9ef61a2a3d71b08d304") (:authors ("Daniel Gempesaw" . "dgempesaw@sharecare.com")) (:maintainers ("Daniel Gempesaw" . "dgempesaw@sharecare.com")) (:maintainer "Daniel Gempesaw" . "dgempesaw@sharecare.com") (:keywords "convenience" "grunt") (:url . "https://github.com/gempesaw/grunt.el"))]) - (gruvbox-theme . [(20230607 21) ((autothemer (0 2))) "A retro-groove colour theme for Emacs" tar ((:commit . "456060ed1b831c1edc6f3486be9a54247a08e39f") (:authors ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainers ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com") (:url . "https://github.com/greduan/emacs-theme-gruvbox"))]) + (gruvbox-theme . [(20230921 120) ((autothemer (0 2))) "A retro-groove colour theme for Emacs" tar ((:commit . "9ee1159acd15ee014d5643cdaa4e00e06efa6d63") (:authors ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainers ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com") (:url . "https://github.com/greduan/emacs-theme-gruvbox"))]) (gs-mode . [(20151202 1006) nil "Major mode for editing GrADS script files" tar ((:commit . "1a13051db21b999c7682a015b33a03096ff9d891") (:authors ("Joe Wielgosz" . "joew@cola.iges.org")) (:maintainers ("Joe Wielgosz" . "joew@cola.iges.org")) (:maintainer "Joe Wielgosz" . "joew@cola.iges.org") (:keywords "grads" "script" "major-mode"))]) (gscholar-bibtex . [(20190130 555) nil "Retrieve BibTeX from Google Scholar and other online sources(ACM, IEEE, DBLP)" tar ((:commit . "3b651e3de116860eb1f1aef9b547a561784871fe") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainers ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions"))]) (gsettings . [(20210407 2045) ((emacs (24 3)) (dash (2 16 0)) (gvariant (1 0 0)) (s (1 12 0))) "GSettings (Gnome) helpers" tar ((:commit . "9f9fb1fe946bbba46307c26355f355225ea7262a") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainers ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee") (:keywords "languages") (:url . "https://github.com/wbolster/emacs-gsettings"))]) @@ -2163,9 +2222,9 @@ (guess-language . [(20220408 1545) ((cl-lib (0 5)) (emacs (24))) "Robust automatic language detection" tar ((:commit . "b1fc363ca2c30b8a8ddaf2e366bca7770c8cfbec") (:authors ("Titus von der Malsburg" . "malsburg@posteo.de")) (:maintainers ("Titus von der Malsburg" . "malsburg@posteo.de")) (:maintainer "Titus von der Malsburg" . "malsburg@posteo.de") (:keywords "wp") (:url . "https://github.com/tmalsburg/guess-language.el"))]) (guide-key . [(20150108 635) ((dash (2 10 0)) (popwin (0 3 0)) (s (1 9 0))) "Guide the following key bindings automatically and dynamically" tar ((:commit . "9236d287a7272e307fb941237390a96037c8c0a2") (:authors ("Tsunenobu Kai" . "kai2nenobu@gmail.com")) (:maintainers ("Tsunenobu Kai" . "kai2nenobu@gmail.com")) (:maintainer "Tsunenobu Kai" . "kai2nenobu@gmail.com") (:keywords "help" "convenience") (:url . "https://github.com/kai2nenobu/guide-key"))]) (guide-key-tip . [(20161011 823) ((guide-key (1 2 3)) (pos-tip (0 4 5))) "Show guide-key.el hints using pos-tip.el" tar ((:commit . "02c5d4b0b65f3e91be5a47f0ff1ae5e86e00c64e") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "help" "convenience" "tooltip") (:url . "https://github.com/aki2o/guide-key-tip"))]) - (guix . [(20230309 955) ((emacs (24 3)) (dash (2 11 0)) (geiser (0 8)) (bui (1 2 0)) (magit-popup (2 1 0)) (edit-indirect (0 1 4))) "Interface for GNU Guix" tar ((:commit . "a85f070c18b915ec50f12cf5375b7a32830d66f9") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainers ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:keywords "tools") (:url . "https://emacs-guix.gitlab.io/website/"))]) + (guix . [(20231206 2147) ((emacs (24 3)) (dash (2 11 0)) (geiser (0 8)) (bui (1 2 0)) (magit-popup (2 1 0)) (edit-indirect (0 1 4))) "Interface for GNU Guix" tar ((:commit . "455272c5cc72ed4ba5bad13c669f024f51479a58") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainers ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:keywords "tools") (:url . "https://emacs-guix.gitlab.io/website/"))]) (gulp-task-runner . [(20170718 2041) nil "Gulp task runner" tar ((:commit . "877990e956b1d71e2d9c7c3e5a129ad199b9debb") (:authors ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainers ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr") (:keywords "convenience" "javascript"))]) - (gumshoe . [(20230302 457) ((emacs (25 1))) "Scoped spatial and temporal POINT movement tracking" tar ((:commit . "3b65ee2496d6de3c7c47a821b38a5a19e0b64c2a") (:authors ("overdr0ne")) (:maintainers ("overdr0ne")) (:maintainer "overdr0ne") (:keywords "tools") (:url . "https://github.com/Overdr0ne/gumshoe"))]) + (gumshoe . [(20240304 525) ((emacs (25 1))) "Scoped spatial and temporal POINT movement tracking" tar ((:commit . "223d19ffbd6296864a775d18025150ccbcbc7800") (:authors ("overdr0ne")) (:maintainers ("overdr0ne")) (:maintainer "overdr0ne") (:keywords "tools") (:url . "https://github.com/Overdr0ne/gumshoe"))]) (guru-mode . [(20211025 1157) nil "Become an Emacs guru" tar ((:commit . "a3370e547eab260d24774cd50ccbe865373c8631") (:authors ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev") (:keywords "convenience") (:url . "https://github.com/bbatsov/guru-mode"))]) (gvariant . [(20210507 1310) ((emacs (24)) (parsec (0 1 4))) "GVariant (GLib) helpers" tar ((:commit . "f2e87076845800cbaaeed67f175ad4e4a9c01e37") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainers ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee") (:keywords "languages") (:url . "https://github.com/wbolster/emacs-gvariant"))]) (gvpr-mode . [(20201007 2054) nil "A major mode offering basic syntax coloring for gvpr scripts." tar ((:commit . "a729fa4623a6d846ab860778842b38f685246c95") (:authors ("Rod Waldhoff" . "r.waldhoff@gmail.com")) (:maintainers ("Rod Waldhoff" . "r.waldhoff@gmail.com")) (:maintainer "Rod Waldhoff" . "r.waldhoff@gmail.com") (:keywords "graphviz" "gv" "dot" "gvpr" "graph") (:url . "https://raw.github.com/rodw/gvpr-lib/master/extra/gvpr-mode.el"))]) @@ -2175,30 +2234,32 @@ (habitica . [(20220215 1758) ((org (8 3 5)) (emacs (24 3))) "Interface for habitica.com" tar ((:commit . "9e1fde7f359f7f6a6976b857fbbdbc8dd4fd3327") (:authors ("Adrien Brochard")) (:maintainers ("Adrien Brochard")) (:maintainer "Adrien Brochard") (:keywords "habitica" "todo") (:url . "https://github.com/abrochard/emacs-habitica"))]) (hack-mode . [(20230227 1950) ((emacs (25 1)) (s (1 11 0))) "Major mode for the Hack programming language" tar ((:commit . "278e4cc4032bff92060496cf1179643cfc6f9c0f") (:authors ("John Allen , Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("John Allen , Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "John Allen , Wilfred Hughes" . "me@wilfred.me.uk") (:url . "https://github.com/hhvm/hack-mode"))]) (hacker-typer . [(20170206 1520) ((emacs (24))) "Pretend to write code like a pro" tar ((:commit . "d5a23714a4ccc5071580622f278597d5973f40bd") (:authors ("Diego A. Mundo" . "diegoamundo@gmail.com")) (:maintainers ("Diego A. Mundo" . "diegoamundo@gmail.com")) (:maintainer "Diego A. Mundo" . "diegoamundo@gmail.com") (:keywords "hacker" "typer" "multimedia" "games") (:url . "http://github.com/therockmandolinist/emacs-hacker-typer"))]) - (hackernews . [(20230127 1918) nil "Hacker News Client for Emacs" tar ((:commit . "dcb312194b60e9841a63455ba893d60856099c79") (:authors ("Lincoln de Sousa" . "lincoln@comum.org")) (:maintainers ("Basil L. Contovounesios" . "contovob@tcd.ie")) (:maintainer "Basil L. Contovounesios" . "contovob@tcd.ie") (:keywords "comm" "hypermedia" "news") (:url . "https://github.com/clarete/hackernews.el"))]) - (haki-theme . [(20230814 1414) ((emacs (27 1))) "An elegant, high-contrast dark theme in modern sense" tar ((:commit . "bfa02d87b8b56965fbcc84d2662799a8e78198f6") (:authors ("Dilip")) (:maintainers ("Dilip")) (:maintainer "Dilip") (:keywords "faces" "theme" "accessibility") (:url . "https://github.com/idlip/haki"))]) + (hackernews . [(20240214 1452) nil "Hacker News Client for Emacs" tar ((:commit . "34423948fd37e9f6904e4e3f6d103e311017ed09") (:authors ("Lincoln de Sousa" . "lincoln@clarete.li")) (:maintainers ("Basil L. Contovounesios" . "basil@contovou.net")) (:maintainer "Basil L. Contovounesios" . "basil@contovou.net") (:keywords "comm" "hypermedia" "news") (:url . "https://github.com/clarete/hackernews.el"))]) + (haki-theme . [(20240227 1029) ((emacs (27 1))) "An elegant, high-contrast dark theme in modern sense" tar ((:commit . "0854346035d9070d347e4de710af41b293b85fb2") (:authors ("Dilip")) (:maintainers ("Dilip")) (:maintainer "Dilip") (:keywords "faces" "theme" "accessibility") (:url . "https://github.com/idlip/haki"))]) (hal-mode . [(20160704 1746) nil "Major mode for editing HAL files" tar ((:commit . "cd2f66f219ee520198d4586fb6b169cef7ad3f21") (:authors ("Alexander Rössler")) (:maintainers ("Alexander Rössler")) (:maintainer "Alexander Rössler") (:keywords "language") (:url . "https://github.com/strahlex/hal-mode/"))]) + (halloweenie-theme . [(20231011 1252) ((emacs (27 1)) (autothemer (0 2))) "Dark and spooky Halloween color theme" tar ((:commit . "db39ff0516e071aa890585c39fe411ea355e8b06") (:authors ("Colin Okay" . "colin@cicadas.surf")) (:maintainers ("Colin Okay" . "colin@cicadas.surf")) (:maintainer "Colin Okay" . "colin@cicadas.surf") (:keywords "faces" "theme" "halloween" "pumpkin") (:url . "https://cicadas.surf/cgit/halloweenie-theme.git"))]) (ham-mode . [(20150811 1306) ((html-to-markdown (1 2)) (markdown-mode (2 0))) "Html As Markdown. Transparently edit an html file using markdown" tar ((:commit . "3a141986a21c2aa6eefb428983352abb8b7907d2") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainers ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com") (:keywords "convenience" "emulation" "wp") (:url . "http://github.com/Bruce-Connor/ham-mode"))]) (hamburg-theme . [(20160123 740) ((emacs (24))) "Color Theme with a dark blue background." tar ((:commit . "a05bf090e0c57c34cc59e301f95d9961280db244") (:authors ("Martin Haesler")) (:maintainers ("Martin Haesler")) (:maintainer "Martin Haesler"))]) (hamburger-menu . [(20220509 1341) ((emacs (28 1))) "Mode line hamburger menu" tar ((:commit . "06bc9d6872007a31226d7410d497a0acd98b272b") (:authors ("Iain Nicol")) (:maintainers ("Iain Nicol")) (:maintainer "Iain Nicol") (:keywords "hamburger" "menu") (:url . "https://gitlab.com/iain/hamburger-menu-mode"))]) (haml-mode . [(20230608 1833) ((emacs (24 1)) (cl-lib (0 5))) "Major mode for editing Haml files" tar ((:commit . "fe83c65c1f002f7c36480b758727c1afbad9a1b2") (:authors ("Natalie Weizenbaum")) (:maintainers ("Natalie Weizenbaum")) (:maintainer "Natalie Weizenbaum") (:keywords "markup" "languages" "html") (:url . "https://github.com/nex3/haml-mode"))]) (hamlet-mode . [(20131208 724) ((cl-lib (0 3)) (dash (2 3 0)) (s (1 7 0))) "Hamlet editing mode" tar ((:commit . "7362b955e556a3d007fa06945a27e5b99349527d") (:authors (nil . "Kata ")) (:maintainers ("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" tar ((:commit . "5982f3cb6ec9f460ebbe06ec0ce7b3590bca3118") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("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" tar ((:commit . "8ac044705d8620ee354a9cfa8cc1b865e83c0d55") (:authors ("Takahiro Noda" . "takahiro.noda+github@gmail.com")) (:maintainers ("Takahiro Noda" . "takahiro.noda+github@gmail.com")) (:maintainer "Takahiro Noda" . "takahiro.noda+github@gmail.com") (:keywords "comm"))]) (helm-ag . [(20221017 1528) ((emacs (25 1)) (helm (2 0))) "The silver searcher with helm interface" tar ((:commit . "2f5e41ae979394208989c25f4cdc73a0532fede9") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-helm-ag"))]) - (helm-apt . [(20210324 1929) ((helm (3 6)) (emacs (25 1))) "Helm interface for Debian/Ubuntu packages (apt-*)" tar ((:commit . "c952b5dc26015bc9c947973df99246212d276b63") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainers ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://github.com/emacs-helm/helm-apt"))]) + (helm-apt . [(20231005 423) ((helm (3 9 5)) (emacs (25 1))) "Helm interface for Debian/Ubuntu packages (apt-*)" tar ((:commit . "3ddbb62f483d2bbdbfcab4160040eaad22a82d67") (:authors ("Thierry Volpiatto" . "thievol@posteo.net")) (:maintainers ("Thierry Volpiatto" . "thievol@posteo.net")) (:maintainer "Thierry Volpiatto" . "thievol@posteo.net") (:url . "https://github.com/emacs-helm/helm-apt"))]) (helm-atoms . [(20201013 1723) ((emacs (25 1)) (helm (2 0))) "Reverse variable lookup using Helm" tar ((:commit . "7e6f91a16f556c96ae1b0d1f965ea56861bb6372") (:authors ("Dante Catalfamo")) (:maintainers ("Dante Catalfamo")) (:maintainer "Dante Catalfamo") (:keywords "help" "lisp" "maint" "helm" "tools" "matching") (:url . "https://github.com/dantecatalfamo/helm-atoms"))]) (helm-aws . [(20180514 1032) ((helm (1 5 3)) (cl-lib (0 5)) (s (1 9 0))) "Manage AWS EC2 server instances directly from Emacs" tar ((:commit . "b36c744b3f00f458635a91d1f5158fccbb5baef6") (:authors ("istib")) (:maintainers ("istib")) (:maintainer "istib") (:url . "https://github.com/istib/helm-aws"))]) (helm-backup . [(20180911 614) ((helm (1 5 5)) (s (1 8 0)) (cl-lib (0))) "Backup each file change using git" tar ((:commit . "691fe542f38fc7c8cca409997f6a0ff5d76ad6c2") (:authors ("Anthony HAMON" . "hamon.anth@gmail.com")) (:maintainers ("Anthony HAMON" . "hamon.anth@gmail.com")) (:maintainer "Anthony HAMON" . "hamon.anth@gmail.com") (:keywords "backup" "convenience" "files" "tools" "vc") (:url . "http://github.com/antham/helm-backup"))]) (helm-bbdb . [(20190728 1325) ((emacs (24 3)) (helm (1 5)) (bbdb (3 1 2))) "Helm interface for bbdb" tar ((:commit . "db69114ff1af8bf48b5a222242e3a8dd6e101e67") (:url . "https://github.com/emacs-helm/helm-bbdb"))]) - (helm-bibtex . [(20221114 1204) ((bibtex-completion (1 0 0)) (helm (1 5 5)) (cl-lib (0 5)) (emacs (24 1))) "A bibliography manager based on Helm" tar ((:commit . "8ebf50d5bd368082d0b7ab79d26a52f372cdef98") (:authors ("Titus von der Malsburg" . "malsburg@posteo.de")) (:maintainers ("Titus von der Malsburg" . "malsburg@posteo.de")) (:maintainer "Titus von der Malsburg" . "malsburg@posteo.de") (:url . "https://github.com/tmalsburg/helm-bibtex"))]) + (helm-bibtex . [(20231009 1014) ((bibtex-completion (1 0 0)) (helm (1 5 5)) (cl-lib (0 5)) (emacs (24 1))) "A bibliography manager based on Helm" tar ((:commit . "d8baeaa4c69fde4a179102c8271c1db804e5155e") (:authors ("Titus von der Malsburg" . "malsburg@posteo.de")) (:maintainers ("Titus von der Malsburg" . "malsburg@posteo.de")) (:maintainer "Titus von der Malsburg" . "malsburg@posteo.de") (:url . "https://github.com/tmalsburg/helm-bibtex"))]) (helm-bibtexkey . [(20140214 1504) ((helm (1 5 8))) "Bibtexkey source for helm" tar ((:commit . "aa1637ea5c8c5f1817e480fc2a3750cafab3d99f") (:authors ("TAKAGI Kentaro ")) (:maintainers ("TAKAGI Kentaro ")) (:maintainer "TAKAGI Kentaro ") (:keywords "bib" "tex") (:url . "https://github.com/kenbeese/helm-bibtexkey"))]) (helm-bind-key . [(20141109 515) ((bind-key (1 0)) (helm (1 6 4))) "helm-source for for bind-key." tar ((:commit . "9da6ad8b7530e72fb4ac67be8c6a482898dddc25") (:authors ("Yuhei Maeda ")) (:maintainers ("myuhe")) (:maintainer "myuhe") (:keywords "convenience" "emulation"))]) (helm-bitbucket . [(20220722 1538) ((emacs (24)) (helm-core (3 6 0))) "Search Bitbucket with Helm" tar ((:commit . "9d07a274584ad364a2620c6389f86d90502f2640") (:authors ("Peter Urbak" . "tolowercase@gmail.com")) (:maintainers ("Peter Urbak" . "tolowercase@gmail.com")) (:maintainer "Peter Urbak" . "tolowercase@gmail.com") (:keywords "matching") (:url . "https://github.com/dragonwasrobot/helm-bitbucket"))]) (helm-bm . [(20160321 1331) ((bm (1 0)) (cl-lib (0 5)) (helm (1 9 3)) (s (1 11 0))) "helm sources for bm.el" tar ((:commit . "d66341f5646c23178d4d8bffb6cfebe3fb73f1d7") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainers ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com") (:keywords "helm" "bookmark") (:url . "https://github.com/yasuyk/helm-bm"))]) (helm-books . [(20170325 631) ((helm (1 7 7))) "Helm interface for searching books" tar ((:commit . "6735e1787f99b5ef77b276fa5c43e565b4d3e792") (:authors ("grugrut" . "grugruglut+github@gmail.com")) (:maintainers ("grugrut" . "grugruglut+github@gmail.com")) (:maintainer "grugrut" . "grugruglut+github@gmail.com") (:url . "https://github.com/grugrut/helm-books"))]) - (helm-bufler . [(20210708 2217) ((emacs (26 3)) (bufler (0 2 -1)) (helm (1 9 4))) "Helm source for Bufler" tar ((:commit . "cb10234bc35fb3f2489c8bfd5b4e80fd1dc05c5e") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "convenience") (:url . "https://github.com/alphapapa/bufler.el"))]) + (helm-bufler . [(20230916 916) ((emacs (26 3)) (bufler (0 2 -1)) (helm (1 9 4))) "Helm source for Bufler" tar ((:commit . "938b186f09739196fe0e65e8e370f90b47008054") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "convenience") (:url . "https://github.com/alphapapa/bufler.el"))]) (helm-bundle-show . [(20190526 1401) ((emacs (24)) (helm (1 8 0))) "Bundle show with helm interface" tar ((:commit . "70f1ca7d1847c7d5cd5a3e488562cd4a295b809f") (:authors ("Takashi Masuda" . "masutaka.net@gmail.com")) (:maintainers ("Takashi Masuda" . "masutaka.net@gmail.com")) (:maintainer "Takashi Masuda" . "masutaka.net@gmail.com") (:url . "https://github.com/masutaka/emacs-helm-bundle-show"))]) (helm-c-moccur . [(20151230 924) ((helm (20120811)) (color-moccur (2 71))) "helm source for color-moccur.el" tar ((:commit . "b0a906f85fa352db091f88b91a9c510de607dfe9") (:authors ("Kenji.I (Kenji Imakado)" . "ken.imakaado@gmail.com")) (:maintainers ("Kenji.I (Kenji Imakado)" . "ken.imakaado@gmail.com")) (:maintainer "Kenji.I (Kenji Imakado)" . "ken.imakaado@gmail.com") (:keywords "convenience" "emulation"))]) - (helm-c-yasnippet . [(20210330 16) ((emacs (25 1)) (helm (1 7 7)) (yasnippet (0 8 0))) "helm source for yasnippet.el" tar ((:commit . "e214eec8b2875d8a7cd09006dfb6a8e15e9e4079") (:authors ("Kenji.I (Kenji Imakado)" . "ken.imakaado@gmail.com")) (:maintainers ("Kenji.I (Kenji Imakado)" . "ken.imakaado@gmail.com")) (:maintainer "Kenji.I (Kenji Imakado)" . "ken.imakaado@gmail.com") (:keywords "convenience" "emulation"))]) + (helm-c-yasnippet . [(20230911 444) ((emacs (25 1)) (helm (1 7 7)) (yasnippet (0 8 0))) "helm source for yasnippet.el" tar ((:commit . "c6c9a14a65d11de967be593e5bead3196c1f4ecf") (:authors ("Kenji.I (Kenji Imakado)" . "ken.imakaado@gmail.com")) (:maintainers ("Kenji.I (Kenji Imakado)" . "ken.imakaado@gmail.com")) (:maintainer "Kenji.I (Kenji Imakado)" . "ken.imakaado@gmail.com") (:keywords "convenience" "emulation"))]) (helm-catkin . [(20190425 1520) ((emacs (24 3)) (helm (0)) (xterm-color (0))) "Package for compile ROS workspaces with catkin-tools" tar ((:commit . "a3422346eb46e66a947a75f9e1b9975a672036be") (:authors ("Thore Goll" . "thoregoll@googlemail.com")) (:maintainers ("Thore Goll" . "thoregoll@googlemail.com")) (:maintainer "Thore Goll" . "thoregoll@googlemail.com") (:keywords "catkin" "helm" "build" "tools" "ros") (:url . "https://github.com/gollth/helm-catkin"))]) (helm-charinfo . [(20170810 1231) ((emacs (24)) (helm (1 7 0)) (cl-lib (0 5))) "A helm source for character information" tar ((:commit . "91798a49dc115342a7e01e48b264e9a0bf5ea414") (:authors ("Christian Wittern" . "cwittern@gmail.com")) (:maintainers ("Christian Wittern" . "cwittern@gmail.com")) (:maintainer "Christian Wittern" . "cwittern@gmail.com") (:keywords "convenience") (:url . "https://github.com/cwittern/helm-charinfo"))]) (helm-chrome . [(20160719 520) ((helm (1 5)) (cl-lib (0 3)) (emacs (24))) "Helm interface for Chrome bookmarks" tar ((:commit . "fd630ace4b4b4f33355a973743bbfe0c90ce4830") (:authors ("KAWABATA, Taichi ")) (:maintainers ("KAWABATA, Taichi ")) (:maintainer "KAWABATA, Taichi ") (:keywords "tools") (:url . "https://github.com/kawabata/helm-chrome"))]) @@ -2241,16 +2302,17 @@ (helm-circe . [(20160207 652) ((emacs (24)) (helm (0 0)) (circe (0 0)) (cl-lib (0 5))) "helm circe buffer management." tar ((:commit . "9091651d9fdd8d49d8ff6f9dcf3a2ae416c9f15a") (:authors ("Les Harris" . "les@lesharris.com")) (:maintainers ("Les Harris" . "les@lesharris.com")) (:maintainer "Les Harris" . "les@lesharris.com") (:keywords "helm" "circe") (:url . "https://github.com/lesharris/helm-circe"))]) (helm-clojuredocs . [(20160405 723) ((edn (1 1 2)) (helm (1 5 7))) "search for help in clojuredocs.org" tar ((:commit . "5a7f0f2cb401be0b09e73262a1c18265ab9a3cea") (:authors ("Michal Buczko" . "michal.buczko@gmail.com")) (:maintainers ("Michal Buczko" . "michal.buczko@gmail.com")) (:maintainer "Michal Buczko" . "michal.buczko@gmail.com") (:keywords "helm" "clojure") (:url . "https://github.com/mbuczko/helm-clojuredocs"))]) (helm-codesearch . [(20221219 1219) ((emacs (25 1)) (s (1 11 0)) (dash (2 12 0)) (helm (1 7 7)) (cl-lib (0 5))) "helm interface for codesearch" tar ((:commit . "bd5a7e3ece98f2940cb09be56d3e56da97d4c865") (:authors ("Youngjoo Lee" . "youngker@gmail.com")) (:maintainers ("Youngjoo Lee" . "youngker@gmail.com")) (:maintainer "Youngjoo Lee" . "youngker@gmail.com") (:keywords "tools"))]) + (helm-comint . [(20231102 2029) ((emacs (25 1)) (helm (3 9 4))) "Comint prompt navigation for helm" tar ((:commit . "9215b2aa8f42f62cbda66a1503832abb7f491549") (:authors ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainers ("Benedict Wang" . "foss@bhw.name")) (:maintainer "Benedict Wang" . "foss@bhw.name") (:keywords "processes" "matching") (:url . "https://github.com/benedicthw/helm-comint.git"))]) (helm-commandlinefu . [(20150611 545) ((emacs (24 1)) (helm (1 7 0)) (json (1 3)) (let-alist (1 0 3))) "Search and browse commandlinefu.com from helm" tar ((:commit . "9ee7e018c5db23ae9c8d1c8fa969876f15b7280d") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainers ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com") (:keywords "commandlinefu.com") (:url . "https://github.com/xuchunyang/helm-commandlinefu"))]) - (helm-company . [(20190812 1429) ((helm (1 5 9)) (company (0 6 13))) "Helm interface for company-mode" tar ((:commit . "6eb5c2d730a60e394e005b47c1db018697094dde") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainers ("Daniel Ralston" . "Sodel-the-Vociferous@users.noreply.github.com")) (:maintainer "Daniel Ralston" . "Sodel-the-Vociferous@users.noreply.github.com") (:url . "https://github.com/Sodel-the-Vociferous/helm-company"))]) - (helm-core . [(20230829 910) ((emacs (25 1)) (async (1 9 7))) "Development files for Helm" tar ((:commit . "5514c4a24f3124cabcdfdd97f19570b714910e74") (:authors ("Thierry Volpiatto" . "thievol@posteo.net")) (:maintainers ("Thierry Volpiatto" . "thievol@posteo.net")) (:maintainer "Thierry Volpiatto" . "thievol@posteo.net") (:url . "https://emacs-helm.github.io/helm/"))]) + (helm-company . [(20231113 701) ((helm (1 5 9)) (company (0 10 0))) "Helm interface for company-mode" tar ((:commit . "4622b82353220ee6cc33468f710fa5b6b253b7f1") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainers ("Daniel Ralston" . "Sodel-the-Vociferous@users.noreply.github.com")) (:maintainer "Daniel Ralston" . "Sodel-the-Vociferous@users.noreply.github.com") (:url . "https://github.com/Sodel-the-Vociferous/helm-company"))]) + (helm-core . [(20240316 1157) ((emacs (25 1)) (async (1 9 7))) "Development files for Helm" tar ((:commit . "4e4a3889e2b19fe871850254132153b349138f96") (:authors ("Thierry Volpiatto" . "thievol@posteo.net")) (:maintainers ("Thierry Volpiatto" . "thievol@posteo.net")) (:maintainer "Thierry Volpiatto" . "thievol@posteo.net") (:url . "https://emacs-helm.github.io/helm/"))]) (helm-cscope . [(20190615 41) ((xcscope (1 0)) (helm (1 6 7)) (cl-lib (0 5)) (emacs (24 1))) "Helm interface for xcscope.el." tar ((:commit . "af1d9e7f4460a88d7400b5a74d5da68084089ac1") (:authors ("alpha22jp" . "alpha22jp@gmail.com")) (:maintainers ("alpha22jp" . "alpha22jp@gmail.com")) (:maintainer "alpha22jp" . "alpha22jp@gmail.com") (:keywords "cscope" "helm") (:url . "https://github.com/alpha22jp/helm-cscope.el"))]) (helm-css-scss . [(20230522 1113) ((emacs (24 3)) (helm (1 0))) "CSS/SCSS/LESS Selectors with helm interface" tar ((:commit . "2169d83d8fdc661241df208cb3235112735d936e") (:authors ("Shingo Fukuyama - http://fukuyama.co")) (:maintainers ("Shingo Fukuyama - http://fukuyama.co")) (:maintainer "Shingo Fukuyama - http://fukuyama.co") (:keywords "convenience" "scss" "css" "less" "selector" "helm") (:url . "https://github.com/ShingoFukuyama/helm-css-scss"))]) (helm-ctest . [(20220721 400) ((s (1 9 0)) (dash (2 11 0)) (helm-core (3 6 0))) "Run ctest from within emacs" tar ((:commit . "48edc9fa862219da34feb423c06c33d8f6d43722") (:authors ("Dan LaManna" . "me@danlamanna.com")) (:maintainers ("Dan LaManna" . "me@danlamanna.com")) (:maintainer "Dan LaManna" . "me@danlamanna.com") (:keywords "helm" "ctest"))]) (helm-dash . [(20190527 1118) ((emacs (24 4)) (dash-docs (1 4 0)) (helm (1 9 2)) (cl-lib (0 5))) "Offline documentation browser for +150 APIs using Dash docsets." tar ((:commit . "6c76c794fec95586028633f24773451812af5df4") (:authors ("Raimon Grau" . "raimonster@gmail.com") ("Toni Reina " . "areina0@gmail.com") ("Bryan Gilbert" . "bryan@bryan.sh")) (:maintainers ("Raimon Grau" . "raimonster@gmail.com")) (:maintainer "Raimon Grau" . "raimonster@gmail.com") (:keywords "docs") (:url . "https://github.com/dash-docs-el/helm-dash"))]) - (helm-descbinds . [(20190501 935) ((helm (1 5))) "A convenient `describe-bindings' with `helm'" tar ((:commit . "b72515982396b6e336ad7beb6767e95a80fca192") (:authors ("Taiki SUGAWARA" . "buzz.taiki@gmail.com")) (:maintainers ("Taiki SUGAWARA" . "buzz.taiki@gmail.com")) (:maintainer "Taiki SUGAWARA" . "buzz.taiki@gmail.com") (:keywords "helm" "help") (:url . "https://github.com/emacs-helm/helm-descbinds"))]) + (helm-descbinds . [(20240216 1154) ((helm (1 5))) "A convenient `describe-bindings' with `helm'" tar ((:commit . "ca03f02da4e54a1d0a2d5498b86e1639aa808d8c") (:authors ("Taiki SUGAWARA" . "buzz.taiki@gmail.com")) (:maintainers ("Taiki SUGAWARA" . "buzz.taiki@gmail.com")) (:maintainer "Taiki SUGAWARA" . "buzz.taiki@gmail.com") (:keywords "helm" "help") (:url . "https://github.com/emacs-helm/helm-descbinds"))]) (helm-describe-modes . [(20160212 518) ((helm (1 9)) (cl-lib (0 5)) (emacs (24 1))) "Helm interface to major and minor modes." tar ((:commit . "d2253c7c2bf4f28b9ff8a2d281bd7527c0106527") (:authors ("Tianxiang Xiong" . "tianxiang.xiong@gmail.com")) (:maintainers ("Tianxiang Xiong" . "tianxiang.xiong@gmail.com")) (:maintainer "Tianxiang Xiong" . "tianxiang.xiong@gmail.com") (:keywords "docs" "convenience") (:url . "https://github.com/emacs-helm/helm-describe-modes"))]) - (helm-dictionary . [(20220514 714) ((helm (1 5 5))) "Helm source for looking up dictionaries" tar ((:commit . "65fdf36e9a5c6dd8dffa71dfb6c65bc03879abe2") (:authors ("Titus von der Malsburg" . "malsburg@posteo.de") ("Michael Heerdegen" . "michael_heerdegen@web.de")) (:maintainers ("Titus von der Malsburg" . "malsburg@posteo.de")) (:maintainer "Titus von der Malsburg" . "malsburg@posteo.de") (:url . "https://github.com/emacs-helm/helm-dictionary"))]) + (helm-dictionary . [(20230922 1111) ((helm (1 5 5))) "Helm source for looking up dictionaries" tar ((:commit . "fc1c097cc53dd3451bfb49ea7e99fdfc6d93bc16") (:authors ("Titus von der Malsburg" . "malsburg@posteo.de") ("Michael Heerdegen" . "michael_heerdegen@web.de")) (:maintainers ("Titus von der Malsburg" . "malsburg@posteo.de")) (:maintainer "Titus von der Malsburg" . "malsburg@posteo.de") (:url . "https://github.com/emacs-helm/helm-dictionary"))]) (helm-directory . [(20170709 1103) ((emacs (24 4)) (helm (2 0))) "selecting directory before select the file" tar ((:commit . "2c6d45404506ba744888dcdb65e9f63878f2da16") (:authors ("Masashı Mıyaura")) (:maintainers ("Masashı Mıyaura")) (:maintainer "Masashı Mıyaura") (:url . "https://github.com/masasam/emacs-helm-directory"))]) (helm-dired-history . [(20170524 1046) ((helm (1 9 8)) (cl-lib (0 5))) "Show dired history with helm.el support." tar ((:commit . "281523f9fc46cf00fafd670ba5cd16552a607212") (:authors ("Joseph(纪秀峰)" . "jixiuf@gmail.com")) (:maintainers ("Joseph(纪秀峰)" . "jixiuf@gmail.com")) (:maintainer "Joseph(纪秀峰)" . "jixiuf@gmail.com") (:keywords "helm" "dired history") (:url . "https://github.com/jixiuf/helm-dired-history"))]) (helm-dired-recent-dirs . [(20131228 1414) ((helm (1 0))) "Show recent dirs with helm.el support." tar ((:commit . "3bcd125b44f5a707588ae3868777d91192351523") (:authors ("Akisute" . "akisute3@gmail.com")) (:maintainers ("Akisute" . "akisute3@gmail.com")) (:maintainer "Akisute" . "akisute3@gmail.com") (:keywords "helm" "dired" "zsh"))]) @@ -2263,7 +2325,7 @@ (helm-eww . [(20190315 907) ((emacs (24 4)) (helm (2 8 6)) (seq (1 8))) "Helm UI wrapper for EWW." tar ((:commit . "76ba59fda8dd6f32a1bc7c6df0b43c6f76169911") (:authors ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainers ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") (:keywords "helm" "packages") (:url . "https://github.com/emacs-helm/helm-eww"))]) (helm-ext . [(20200722 107) ((emacs (24 4)) (helm (2 5 3))) "A few extensions to Helm" tar ((:commit . "c30f7772ec577a5ce1de3215f0507826e0725a69") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainers ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions"))]) (helm-exwm . [(20210215 858) ((emacs (25 2)) (helm (2 8 5)) (exwm (0 15))) "Helm for EXWM buffers" tar ((:commit . "5b35a42ff10fbcbf673268987df700ea6b6288e8") (:authors ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainers ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") (:keywords "helm" "exwm") (:url . "https://github.com/emacs-helm/helm-exwm"))]) - (helm-file-preview . [(20220720 531) ((emacs (25 1)) (helm (2 0))) "Preview the current helm file selection" tar ((:commit . "bebd4e9c42543c9003984442701db2c384c21f3e") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "file" "helm" "preview" "select" "selection") (:url . "https://github.com/jcs-elpa/helm-file-preview"))]) + (helm-file-preview . [(20240101 1005) ((emacs (25 1)) (helm (2 0))) "Preview the current helm file selection" tar ((:commit . "7cf9264bfd106975e90d92a94fe7f150f7d31b8c") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "file" "helm" "preview" "select" "selection") (:url . "https://github.com/jcs-elpa/helm-file-preview"))]) (helm-filesets . [(20140929 1835) ((helm (1 6 3)) (filesets+ (0))) "A helm source for emacs filesets" tar ((:commit . "b352910af4c3099267a8aa0169c7f743b35bb1fa") (:authors ("Graham Clark" . "grclark@gmail.com")) (:maintainers ("Graham Clark" . "grclark@gmail.com")) (:maintainer "Graham Clark" . "grclark@gmail.com") (:keywords "filesets") (:url . "https://github.com/gcla/helm-filesets"))]) (helm-firefox . [(20220420 1346) ((helm (1 5)) (cl-lib (0 5)) (emacs (24 1))) "Firefox bookmarks" tar ((:commit . "571cf8dfcbe43d91f9890eebefc88d7572c62e75") (:url . "https://github.com/emacs-helm/helm-firefox"))]) (helm-fish-completion . [(20200908 1504) ((emacs (25)) (helm (3)) (fish-completion (1 2))) "Helm interface for fish completion" tar ((:commit . "2a2001b3a876da3c468ffec8935572509c485aac") (:authors ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainers ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") (:url . "https://github.com/emacs-helm/helm-fish-completion"))]) @@ -2274,7 +2336,7 @@ (helm-frame . [(20220803 1528) ((emacs (24 4))) "open helm buffers in a dedicated frame" tar ((:commit . "1b5e895e9199deeea049010e5fe4de7a338f41f3") (:authors ("chee" . "yay@chee.party")) (:maintainers ("chee" . "yay@chee.party")) (:maintainer "chee" . "yay@chee.party") (:keywords "lisp" "helm" "popup" "frame"))]) (helm-fuz . [(20200812 1222) ((emacs (25 1)) (fuz (1 4 0)) (helm (3 6))) "Integrate Helm and Fuz" tar ((:commit . "fee874aa35d2ee6b12b836290b5c8eaa44175a28") (:authors ("Zhu Zihao" . "all_but_last@163.com")) (:maintainers ("Zhu Zihao" . "all_but_last@163.com")) (:maintainer "Zhu Zihao" . "all_but_last@163.com") (:keywords "convenience") (:url . "https://github.com/cireu/fuz.el"))]) (helm-fuzzier . [(20160605 2145) ((emacs (24 3)) (helm (1 7 0))) "Better fuzzy matching for Helm" tar ((:commit . "8798dcf3583b863df5b9dea7fe3b0179ba1c35bc") (:authors ("Ephram Perdition")) (:maintainers ("Ephram Perdition")) (:maintainer "Ephram Perdition") (:keywords "convenience" "helm" "fuzzy") (:url . "http://github.com/EphramPerdition/helm-fuzzier"))]) - (helm-fuzzy . [(20220704 651) ((emacs (24 4)) (helm (1 7 9)) (flx (0 5))) "Fuzzy matching for helm source" tar ((:commit . "f04b0023534e41c1399b74de393e6915a5f95ba5") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "matching" "fuzzy" "helm" "source") (:url . "https://github.com/jcs-elpa/helm-fuzzy"))]) + (helm-fuzzy . [(20240101 1005) ((emacs (24 4)) (helm (1 7 9)) (flx (0 5))) "Fuzzy matching for helm source" tar ((:commit . "6ae944c04464bf5984e4180c8353c7fdcf17f672") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "matching" "fuzzy" "helm" "source") (:url . "https://github.com/jcs-elpa/helm-fuzzy"))]) (helm-fuzzy-find . [(20171106 400) ((emacs (24 1)) (helm (1 7 0))) "Find file using Fuzzy Search" tar ((:commit . "de2abbf7ca13609587325bacd4a1ed4376b5c927") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainers ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com") (:keywords "helm" "fuzzy" "find" "file") (:url . "https://github.com/xuchunyang/helm-fuzzy-find"))]) (helm-ghq . [(20210724 744) ((emacs (24)) (helm (3 8 0))) "Ghq with helm interface" tar ((:commit . "7b47ac91e42762f2ecbbceeaadc05b86c9fe5f14") (:authors ("Takashi Masuda" . "masutaka.net@gmail.com")) (:maintainers ("Takashi Masuda" . "masutaka.net@gmail.com")) (:maintainer "Takashi Masuda" . "masutaka.net@gmail.com") (:url . "https://github.com/masutaka/emacs-helm-ghq"))]) (helm-ghs . [(20170715 541) ((emacs (24)) (helm (2 2 0))) "ghs with helm interface" tar ((:commit . "f9d4ab80e8a33b21cd635285289ec5779bbe629f") (:authors ("iory" . "ab.ioryz@gmail.com")) (:maintainers ("iory" . "ab.ioryz@gmail.com")) (:maintainer "iory" . "ab.ioryz@gmail.com") (:url . "https://github.com/iory/emacs-helm-ghs"))]) @@ -2293,7 +2355,7 @@ (helm-helm-commands . [(20130902 1748) ((helm (1 5 4))) "List all helm commands with helm" tar ((:commit . "1c37bb0d4cda6877162603cd1ddc9f596a7a5cb9") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainers ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com") (:keywords "convenience") (:url . "https://github.com/vapniks/helm-helm-commands"))]) (helm-hoogle . [(20161027 534) ((helm (1 6 2)) (emacs (24 4))) "Use helm to navigate query results from Hoogle" tar ((:commit . "73969a9d46d2121a849a01a9f7ed3636d01f7bbc") (:authors ("John Wiegley" . "jwiegley@gmail.com")) (:maintainers ("John Wiegley" . "jwiegley@gmail.com")) (:maintainer "John Wiegley" . "jwiegley@gmail.com") (:keywords "haskell" "programming" "hoogle") (:url . "https://github.com/jwiegley/haskell-config"))]) (helm-hunks . [(20171217 1933) ((emacs (24 4)) (helm (1 9 8))) "A helm interface for git hunks - browsing, staging, unstaging and killing" tar ((:commit . "6392bf716f618eac23ce81140aceb0dfacb9c6d0") (:authors ("@torgeir")) (:maintainers ("@torgeir")) (:maintainer "@torgeir") (:keywords "helm" "git" "hunks" "vc"))]) - (helm-icons . [(20230506 432) ((emacs (25 1)) (dash (2 14 1)) (f (0 20 0)) (treemacs (2 7))) "Helm icons" tar ((:commit . "dfefdb41c63217a1d6f57d4c8761b68f3def1a31") (:authors ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainers ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainer "Ivan Yonchovski" . "yyoncho@gmail.com") (:keywords "convenience") (:url . "https://github.com/yyoncho/helm-icons"))]) + (helm-icons . [(20231027 616) ((emacs (25 1)) (dash (2 14 1)) (f (0 20 0)) (treemacs (2 7))) "Helm icons" tar ((:commit . "0d113719ee72cb7b6bb7db29f7200d667bd86607") (:authors ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainers ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainer "Ivan Yonchovski" . "yyoncho@gmail.com") (:keywords "convenience") (:url . "https://github.com/yyoncho/helm-icons"))]) (helm-idris . [(20141202 1757) ((helm (0 0 0)) (idris-mode (0 9 14))) "A Helm datasource for Idris documentation, queried from the compiler" tar ((:commit . "a2f45d6817974f318b55ad9b7fd19d5df132d47e") (:authors ("David Raymond Christiansen" . "david@davidchristiansen.dk")) (:maintainers ("David Raymond Christiansen" . "david@davidchristiansen.dk")) (:maintainer "David Raymond Christiansen" . "david@davidchristiansen.dk") (:keywords "languages" "helm"))]) (helm-img . [(20151224 2321) ((helm (1 7 7)) (cl-lib (0 5))) "Utilities for making image sources for helm." tar ((:commit . "aa3f8a5dce8d0413bf07584f07153a39015c2bfc") (:authors ("Sho Matsumoto ")) (:maintainers ("l3msh0")) (:maintainer "l3msh0") (:keywords "convenience") (:url . "https://github.com/l3msh0/helm-img"))]) (helm-img-tiqav . [(20151224 2322) ((helm-img (0 0 1))) "An helm-source for joking." tar ((:commit . "33a7e9508bc8f37d53320b56c92b53d321a57bb0") (:authors ("Sho Matsumoto ")) (:maintainers ("l3msh0")) (:maintainer "l3msh0") (:keywords "convenience") (:url . "https://github.com/l3msh0/helm-img"))]) @@ -2309,7 +2371,7 @@ (helm-lib-babel . [(20180510 1324) ((cl-lib (0 5)) (helm (1 9 2)) (emacs (24 4))) "helm insertion of babel function references" tar ((:commit . "41bc0cdea8a604c6c8dc83ed5066644d33688fad") (:authors ("Derek Feichtinger" . "dfeich@gmail.com")) (:maintainers ("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" tar ((:commit . "f5ad178818d223f32a0bf60d370b50c01df5f3da") (:authors ("@torgeir")) (:maintainers ("@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 . [(20230820 1403) ((helm (1 0)) (cl-lib (0 5))) "helm front-end for lobste.rs" tar ((:commit . "3a1af0d063ca24fe0187daff12110171b942c7d3") (:authors ("Julien BLANCHARD" . "julien@sideburns.eu")) (:maintainers ("Julien BLANCHARD" . "julien@sideburns.eu")) (:maintainer "Julien BLANCHARD" . "julien@sideburns.eu") (:url . "https://github.com/julienXX/helm-lobste.rs"))]) - (helm-ls-git . [(20230819 1409) ((helm (1 7 8))) "list git files." tar ((:commit . "d48113dd727073d99c2dc4ac39d5daf1676133e5"))]) + (helm-ls-git . [(20240315 1721) ((helm (3 9 5)) (emacs (25 3))) "list git files." tar ((:commit . "8b0b9484d43153e0c1a1fb664a14b1a53874e60b") (:url . "https://github.com/emacs-helm/helm-ls-git"))]) (helm-ls-hg . [(20150909 543) ((helm (1 7 8))) "List hg files in hg project." tar ((:commit . "61b91a22fcfb62d0fc56e361ec01ce96973c7165"))]) (helm-ls-svn . [(20190316 2203) ((emacs (24 1)) (helm (1 7 0)) (cl-lib (0 5))) "helm extension to list svn files" tar ((:commit . "a6043e1187282f649e2cb9f0e722a42daf41294b") (:authors ("Chunyang Xu" . "chunyang@macports.org")) (:maintainers ("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" tar ((:commit . "c2c6974dadfac459b1a69a1217441283874cea92") (:authors ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainers ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainer "Ivan Yonchovski" . "yyoncho@gmail.com") (:keywords "languages" "debug") (:url . "https://github.com/yyoncho/helm-lsp"))]) @@ -2323,9 +2385,9 @@ (helm-nixos-options . [(20151013 2309) ((nixos-options (0 0 1)) (helm (1 5 6))) "Helm Interface for nixos-options" tar ((:commit . "f7709bb007ebafb4d6b32778c7764e2c44e0420d") (:authors ("Diego Berrocal" . "cestdiego@gmail.com") ("Travis B. Hartwell" . "nafai@travishartwell.net")) (:maintainers ("Diego Berrocal" . "cestdiego@gmail.com")) (:maintainer "Diego Berrocal" . "cestdiego@gmail.com") (:keywords "unix") (:url . "http://www.github.com/travisbhartwell/nix-emacs/"))]) (helm-notmuch . [(20190320 1048) ((helm (1 9 3)) (notmuch (0 21))) "Search emails with Notmuch and Helm" tar ((:commit . "97a01497e079a7b6505987e9feba6b603bbec288") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainers ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me") (:keywords "mail") (:url . "https://github.com/emacs-helm/helm-notmuch"))]) (helm-open-github . [(20220721 415) ((emacs (24 4)) (helm-core (3 6 0)) (gh (0 8 2))) "Utilities of Opening Github Page" tar ((:commit . "5e6d700d1b484bd6cd44bc30674e96d157870c3f") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-helm-open-github"))]) - (helm-org . [(20210324 1927) ((helm (3 3)) (emacs (24 4))) "Helm for org headlines and keywords completion" tar ((:commit . "d67186d3a64e610c03a5f3d583488f018fb032e4") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainers ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://github.com/emacs-helm/helm-org"))]) + (helm-org . [(20231022 620) ((helm (3 3)) (emacs (24 4))) "Helm for org headlines and keywords completion" tar ((:commit . "c80e53315ce6b096e2d0e630702df924bf00bf6a") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainers ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://github.com/emacs-helm/helm-org"))]) (helm-org-multi-wiki . [(20210228 1853) ((emacs (26 1)) (org (9 3)) (org-multi-wiki (0 4)) (org-ql (0 5)) (dash (2 18)) (helm-org-ql (0 5)) (helm (3 5))) "Helm interface to org-multi-wiki" tar ((:commit . "c85bcaafed749de3efa5e1f4d256e7ac9c5678e2") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainers ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:keywords "org" "outlines") (:url . "https://github.com/akirak/org-multi-wiki"))]) - (helm-org-ql . [(20230310 1225) ((emacs (26 1)) (dash (2 18 1)) (s (1 12 0)) (helm-org (1 0)) (org-ql (0 6 -1))) "Helm support for org-ql" tar ((:commit . "aadddc4d84a72fa80d3bf909c9a3a4cbce53cd93") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:url . "https://github.com/alphapapa/org-ql"))]) + (helm-org-ql . [(20240221 1146) ((emacs (26 1)) (dash (2 18 1)) (s (1 12 0)) (helm-org (1 0)) (org-ql (0 6 -1))) "Helm support for org-ql" tar ((:commit . "bfff0b5517d55d01bf12de27e10a73c9a077767b") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:url . "https://github.com/alphapapa/org-ql"))]) (helm-org-recent-headings . [(20211011 1519) ((emacs (26 1)) (org (9 0 5)) (dash (2 18 0)) (helm (1 9 4)) (org-recent-headings (0 2 -1)) (s (1 12 0))) "Helm source for org-recent-headings" tar ((:commit . "97418d581ea030f0718794e50b005e9bae44582e") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "hypermedia" "outlines" "org") (:url . "http://github.com/alphapapa/org-recent-headings"))]) (helm-org-rifle . [(20230821 1927) ((emacs (24 4)) (dash (2 12)) (f (0 18 1)) (helm (1 9 4)) (s (1 10 0))) "Rifle through your Org files" tar ((:commit . "03a52265040b8c6510a8269213d750c451779c38") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "hypermedia" "outlines") (:url . "http://github.com/alphapapa/helm-org-rifle"))]) (helm-orgcard . [(20220721 756) ((helm-core (3 6 0))) "browse the orgcard by helm" tar ((:commit . "d58d35627bb1714bb2cb095f696706b6881233ed") (:authors ("Yuhei Maeda ")) (:maintainers ("Yuhei Maeda")) (:maintainer "Yuhei Maeda") (:keywords "convenience" "helm" "org") (:url . "https://github.com/emacs-jp/helm-orgcard"))]) @@ -2339,13 +2401,13 @@ (helm-proc . [(20161006 305) ((helm (1 6 0))) "Helm interface for managing system processes" tar ((:commit . "576d31c2d74ba3897d56e2acd2b0993f52c2547c") (:authors ("Markus Hauck" . "markus1189@gmail.com")) (:maintainer "Markus Hauck" . "markus1189@gmail.com") (:keywords "helm"))]) (helm-project . [(20230608 1212) ((emacs (28 1)) (helm (3 9 0))) "Helm source for project management" tar ((:commit . "1e0cd563b2470ab7dbfc47a8cbe7dafd030dce70") (:authors ("Christopher McCloud")) (:maintainers ("Christopher McCloud")) (:maintainer "Christopher McCloud") (:url . "https://github.com/cmccloud/helm-project"))]) (helm-project-persist . [(20151210 1543) ((helm (1 5 2)) (project-persist (0 1 4))) "Helm integration for project-persist package" tar ((:commit . "357950fbac18090985a750e40d5d8b10ee9dcd53") (:authors ("Sliim" . "sliim@mailoo.org")) (:maintainers ("Sliim" . "sliim@mailoo.org")) (:maintainer "Sliim" . "sliim@mailoo.org") (:keywords "project-persist" "project" "helm"))]) - (helm-projectile . [(20221215 613) ((helm (1 9 9)) (projectile (2 2 0)) (cl-lib (0 3))) "Helm integration for Projectile" tar ((:commit . "35a2111d00c0c0c9d8743280d3f1243bb217118a") (:authors ("Bozhidar Batsov")) (:maintainers ("Bozhidar Batsov")) (:maintainer "Bozhidar Batsov") (:keywords "project" "convenience") (:url . "https://github.com/bbatsov/helm-projectile"))]) + (helm-projectile . [(20231023 1425) ((helm (1 9 9)) (projectile (2 2 0)) (cl-lib (0 3))) "Helm integration for Projectile" tar ((:commit . "e2e38825c975269a4971df25e79b2ae98929624e") (:authors ("Bozhidar Batsov")) (:maintainers ("Bozhidar Batsov")) (:maintainer "Bozhidar Batsov") (:keywords "project" "convenience") (:url . "https://github.com/bbatsov/helm-projectile"))]) (helm-prosjekt . [(20140129 717) ((prosjekt (0 3)) (helm (1 5 9))) "Helm integration for prosjekt." tar ((:commit . "f94f970c2d375e0973b66ba99b29c7aa42fd550f") (:authors ("Sohail Somani" . "sohail@taggedtype.net")) (:maintainers ("Sohail Somani" . "sohail@taggedtype.net")) (:maintainer "Sohail Somani" . "sohail@taggedtype.net") (:url . "https://github.com/abingham/prosjekt"))]) (helm-pt . [(20160214 2342) ((helm (1 5 6))) "Helm interface to the platinum searcher" tar ((:commit . "8acc52911dad1ed0c3975f134a468762afe0b76b") (:authors ("Rich Alesi")) (:maintainer "Rich Alesi") (:url . "https://github.com/ralesi/helm-pt"))]) (helm-purpose . [(20170114 1636) ((emacs (24)) (helm (1 9 2)) (window-purpose (1 4))) "Helm Interface for Purpose" tar ((:commit . "9ff4c21c1e9ebc7afb851b738f815df7343bb287") (:authors ("Bar Magal (2016)")) (:maintainers ("Bar Magal (2016)")) (:maintainer "Bar Magal (2016)") (:url . "https://github.com/bmag/helm-purpose"))]) (helm-pydoc . [(20220721 433) ((helm-core (3 6 0)) (emacs (24 4))) "pydoc with helm interface" tar ((:commit . "cac7b8953adcab85e898bc42b699c3afde5d33c6") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-helm-pydoc"))]) (helm-qiita . [(20190526 1359) ((emacs (24)) (helm (2 8 2))) "Qiita with helm interface" tar ((:commit . "5f82010c595f8e122aa3f68148ba8d8ccb1333d8") (:authors ("Takashi Masuda" . "masutaka.net@gmail.com")) (:maintainers ("Takashi Masuda" . "masutaka.net@gmail.com")) (:maintainer "Takashi Masuda" . "masutaka.net@gmail.com") (:url . "https://github.com/masutaka/emacs-helm-qiita"))]) - (helm-rage . [(20180118 1532) ((helm (1 9 8)) (emacs (24 4)) (dash (2 13 0)) (s (1 11 0))) "Helm command for rage characters." tar ((:commit . "5d0aefb53d859186181d4bdcfeff7d315339c7b8") (:keywords "helm" "rage" "meme") (:url . "https://github.com/bomgar/helm-rage"))]) + (helm-rage . [(20240202 822) ((helm (1 9 8)) (emacs (24 4)) (dash (2 13 0)) (s (1 11 0))) "Helm command for rage characters." tar ((:commit . "5b5316b92fd2b5319f7296c7ccaa93d471935076") (:keywords "helm" "rage" "meme") (:url . "https://github.com/bomgar/helm-rage"))]) (helm-rails . [(20130424 1519) ((helm (1 5 1)) (inflections (1 1))) "Helm extension for Rails projects." tar ((:commit . "723c2a27f3843570ec1039e3c526953e48b4ed40") (:authors ("Adam Sokolnicki" . "adam.sokolnicki@gmail.com")) (:maintainer "Adam Sokolnicki" . "adam.sokolnicki@gmail.com") (:keywords "helm" "rails" "git") (:url . "https://github.com/asok/helm-rails"))]) (helm-rdefs . [(20161130 536) ((emacs (24)) (helm (1 6 4))) "rdefs with helm interface" tar ((:commit . "cd3a6b3af3015ee58ef30cb7c81c79ebe5fc867b") (:authors ("Hiroshi Saito" . "monodie@gmail.com")) (:maintainers ("Hiroshi Saito" . "monodie@gmail.com")) (:maintainer "Hiroshi Saito" . "monodie@gmail.com") (:keywords "matching" "tools") (:url . "https://github.com/saidie/helm-rdefs"))]) (helm-recoll . [(20220920 1206) ((helm (3 3)) (emacs (24 4))) "helm interface for the recoll desktop search tool." tar ((:commit . "c054047ecca360c3e02281d8d0c021f654e63f37") (:authors ("Thierry Volpiatto ")) (:maintainers ("Thierry Volpiatto ")) (:maintainer "Thierry Volpiatto ") (:keywords "convenience") (:url . "https://github.com/emacs-helm/helm-recoll"))]) @@ -2358,7 +2420,7 @@ (helm-rubygems-org . [(20140826 1156) ((emacs (24)) (helm (1 6 3)) (cl-lib (0 5))) "Use helm to search rubygems.org" tar ((:commit . "6aaed984f698cbdf9f9aceb0221404563e28764d") (:authors ("Chad Albers" . "calbers@neomantic.com")) (:maintainers ("Chad Albers" . "calbers@neomantic.com")) (:maintainer "Chad Albers" . "calbers@neomantic.com") (:keywords "ruby" "rubygems" "gemfile" "helm") (:url . "https://github.com/neomantic/helm-rubygems-org"))]) (helm-safari . [(20160404 324) ((helm (1 9 1)) (emacs (24))) "Browse your Safari bookmarks and history" tar ((:commit . "664c7f4488829228eed7e90cd53002e14bec555b") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainers ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com") (:keywords "tools") (:url . "https://github.com/xuchunyang/helm-safari"))]) (helm-sage . [(20160514 745) ((cl-lib (0 5)) (helm (1 5 6)) (sage-shell-mode (0 1 0))) "A helm extension for sage-shell-mode." tar ((:commit . "f14e9281d8f2162df7d8f9c2ad9ad1248a24803b") (:authors ("Sho Takemori" . "stakemorii@gmail.com")) (:maintainers ("Sho Takemori" . "stakemorii@gmail.com")) (:maintainer "Sho Takemori" . "stakemorii@gmail.com") (:keywords "sage" "math" "helm") (:url . "https://github.com/stakemori/helm-sage"))]) - (helm-searcher . [(20221231 1632) ((emacs (25 1)) (helm (2 0)) (searcher (0 1 8)) (s (1 12 0)) (f (0 20 0))) "Helm interface to use searcher" tar ((:commit . "225480fa89d73eb53478576610f48d035b77cda9") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "replace" "grep" "ag" "rg") (:url . "https://github.com/emacs-helm/helm-searcher"))]) + (helm-searcher . [(20240101 827) ((emacs (25 1)) (helm (2 0)) (searcher (0 1 8)) (s (1 12 0)) (f (0 20 0))) "Helm interface to use searcher" tar ((:commit . "893ef3864596412093876657e590f61d4449b487") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "replace" "grep" "ag" "rg") (:url . "https://github.com/emacs-helm/helm-searcher"))]) (helm-selected . [(20171223 210) ((emacs (24 4)) (helm (2 8 6)) (selected (1 1))) "helm extension for selected.el" tar ((:commit . "d2609cdfce14052ab2d9c23761d4fe56966a8ed1") (:authors ("Takaaki ISHIKAWA ")) (:maintainers ("Takaaki ISHIKAWA ")) (:maintainer "Takaaki ISHIKAWA ") (:keywords "extensions" "convenience") (:url . "https://github.com/takaxp/helm-selected"))]) (helm-selector . [(20210125 857) ((emacs (26 1)) (helm (3))) "Helm buffer selector" tar ((:commit . "4da4711c4cfd14527abe20d66787beeb49171b26") (:authors ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainers ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") (:url . "https://github.com/emacs-helm/helm-selector"))]) (helm-sheet . [(20130630 1239) ((helm (1 0))) "helm sources for sheet" tar ((:commit . "d360b68d0ddb09aa1854e7b2f3cb39caeee26463") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainers ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com") (:keywords "helm" "sheet") (:url . "https://github.com/yasuyk/helm-sheet"))]) @@ -2372,7 +2434,7 @@ (helm-sql-connect . [(20170319 1251) ((helm (0 0 0))) "Choose a database to connect to via Helm." tar ((:commit . "5aead55b6f8636140945714d8c332b287ab9ef10") (:authors ("Eric Hansen" . "hansen.c.eric@gmail.com")) (:maintainers ("Eric Hansen" . "hansen.c.eric@gmail.com")) (:maintainer "Eric Hansen" . "hansen.c.eric@gmail.com") (:keywords "tools" "convenience" "comm") (:url . "https://github.com/eric-hansen/helm-sql-connect"))]) (helm-switch-shell . [(20210713 1440) ((emacs (25 1)) (helm (2 8 8))) "A Helm source for switching between shell buffers" tar ((:commit . "8d7ba1d99ff12a8f1d6ce3b9684ae8aebf494cf3") (:authors ("James N. V. Cash" . "james.cash@occasionallycogent.com")) (:maintainers ("James N. V. Cash" . "james.cash@occasionallycogent.com")) (:maintainer "James N. V. Cash" . "james.cash@occasionallycogent.com") (:keywords "matching" "processes" "terminals" "tools") (:url . "https://github.com/jamesnvc/helm-switch-shell"))]) (helm-switch-to-repl . [(20210206 844) ((emacs (26 1)) (helm (3))) "Helm action to switch directory in REPLs" tar ((:commit . "f0e732e7217fc0373b0805245fa15920cf676619") (:authors ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainers ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") (:url . "https://github.com/emacs-helm/helm-switch-to-repl"))]) - (helm-swoop . [(20210426 547) ((emacs (25 1)) (helm (3 6))) "Efficiently hopping squeezed lines powered by helm interface" tar ((:commit . "1b3285791f1dc1fde548fe67aec07214d698fd57") (:authors ("Shingo Fukuyama - http://fukuyama.co")) (:maintainers ("Shingo Fukuyama - http://fukuyama.co")) (:maintainer "Shingo Fukuyama - http://fukuyama.co") (:keywords "convenience" "helm" "swoop" "inner" "buffer" "search") (:url . "https://github.com/emacsorphanage/helm-swoop"))]) + (helm-swoop . [(20240104 2356) ((emacs (25 1)) (helm (3 6))) "Efficiently hopping squeezed lines powered by helm interface" tar ((:commit . "df90efd4476dec61186d80cace69276a95b834d2") (:authors ("Shingo Fukuyama - http://fukuyama.co")) (:maintainers ("Shingo Fukuyama - http://fukuyama.co")) (:maintainer "Shingo Fukuyama - http://fukuyama.co") (:keywords "convenience" "helm" "swoop" "inner" "buffer" "search") (:url . "https://github.com/emacsorphanage/helm-swoop"))]) (helm-system-packages . [(20220515 812) ((emacs (24 4)) (helm (2 8 7)) (seq (1 8))) "Helm UI wrapper for system package managers." tar ((:commit . "e93f4aeaa77b73c6e529141c3fa0ac49b40b6306") (:authors ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainers ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") (:keywords "helm" "packages") (:url . "https://github.com/emacs-helm/helm-system-packages"))]) (helm-systemd . [(20210105 542) ((emacs (24 4)) (helm (1 9 2)) (with-editor (2 5 0))) "helm's systemd interface" tar ((:commit . "8b26ab2d3a5b08c1e03c9312818512d7492bbc9a") (:authors (nil . "")) (:maintainers (nil . "")) (:maintainer nil . "") (:keywords "convenience"))]) (helm-tail . [(20220726 947) ((emacs (25 1)) (helm (2 7 0))) "Read recent output from various sources" tar ((:commit . "8dc44a87fa1a52199e43b73b55c8ef8fe8069e79") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainers ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:keywords "maint" "tools") (:url . "https://github.com/akirak/helm-tail"))]) @@ -2393,7 +2455,7 @@ (helm-zhihu-daily . [(20160625 1145) ((helm (1 0)) (cl-lib (0 5)) (emacs (24 4))) "Helm interface for 知乎日报 (http://daily.zhihu.com)" tar ((:commit . "be27dcc6be1eb97663b65581a9a5c0fc81cfaba7") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainers ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com") (:url . "https://github.com/xuchunyang/helm-zhihu-daily"))]) (help-find . [(20220929 822) ((emacs (25 2)) (dash (2 12))) "Additional help functions for working with keymaps" tar ((:commit . "ef7266fc480367c12bff64817c875af940d0c9c0") (:authors ("Duncan Burke" . "duncankburke@gmail.com")) (:maintainers ("Duncan Burke" . "duncankburke@gmail.com")) (:maintainer "Duncan Burke" . "duncankburke@gmail.com") (:keywords "help") (:url . "https://github.com/duncanburke/help-find"))]) (help-find-org-mode . [(20181204 234) ((emacs (24 4))) "Advise help to find org source over tangled code" tar ((:commit . "c6fa2c8a8e9381572190010a9fa01f2be78f2790") (:authors ("Eric Crosson" . "eric.s.crosson@utexas.com")) (:maintainers ("Eric Crosson" . "eric.s.crosson@utexas.com")) (:maintainer "Eric Crosson" . "eric.s.crosson@utexas.com") (:keywords "convenience") (:url . "https://github.com/EricCrosson/help-find-org-mode"))]) - (helpful . [(20230808 1519) ((emacs (25)) (dash (2 18 0)) (s (1 11 0)) (f (0 20 0)) (elisp-refs (1 2))) "A better *help* buffer" tar ((:commit . "c57ff0d284b50ff430fe1f13fd48deaa0d1a910e") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:keywords "help" "lisp") (:url . "https://github.com/Wilfred/helpful"))]) + (helpful . [(20231028 516) ((emacs (25)) (dash (2 18 0)) (s (1 11 0)) (f (0 20 0)) (elisp-refs (1 2))) "A better *help* buffer" tar ((:commit . "a32a5b3d959a7fccf09a71d97b3d7c888ac31c69") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:keywords "help" "lisp") (:url . "https://github.com/Wilfred/helpful"))]) (hemera-theme . [(20180916 924) ((emacs (24))) "Light theme" tar ((:commit . "b67c902b210b37b00cac68726822404543147ba8") (:authors ("Guido Schmidt")) (:maintainers ("Guido Schmidt" . "guido.schmidt.2912@gmail.com")) (:maintainer "Guido Schmidt" . "guido.schmidt.2912@gmail.com") (:keywords "themes" "light-theme") (:url . "https://github.com/GuidoSchmidt/emacs-hemera-theme"))]) (hemisu-theme . [(20130508 1844) nil "Hemisu for Emacs." tar ((:commit . "ae593ac58e6bffef97467259c1d1472840385e84") (:authors ("Andrzej Sliwa")) (:maintainers ("Andrzej Sliwa")) (:maintainer "Andrzej Sliwa") (:url . "http://github/anrzejsliwa/django-theme"))]) (hercules . [(20200420 747) ((emacs (24 4)) (which-key (3 3 2))) "An auto-magical, which-key-based hydra banisher." tar ((:commit . "557da39878d0637395fdded91243b340c37eff7b") (:authors ("Uros Perisic")) (:maintainers ("Uros Perisic")) (:maintainer "Uros Perisic") (:keywords "convenience") (:url . "https://gitlab.com/jjzmajic/hercules"))]) @@ -2417,7 +2479,7 @@ (highlight-defined . [(20210411 222) ((emacs (24))) "Syntax highlighting of known Elisp symbols" tar ((:commit . "4420bdda419875dacb065468aafe273b2022580e") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainers ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com") (:url . "https://github.com/Fanael/highlight-defined"))]) (highlight-doxygen . [(20200520 1713) nil "Highlight Doxygen comments" tar ((:commit . "eec4874e2e89d4eb39091aad89a67dff8f8ec84c") (:authors ("Anders Lindgren")) (:maintainers ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "faces") (:url . "https://github.com/Lindydancer/highlight-doxygen"))]) (highlight-escape-sequences . [(20201214 1730) nil "Highlight escape sequences" tar ((:commit . "fae976568c04b6fe8a9f2d854c8fe23b357a6878") (:authors ("Dmitry Gutov" . "dgutov@yandex.ru") ("Pavel Matcula" . "dev.plvlml@gmail.com")) (:maintainers ("Dmitry Gutov" . "dgutov@yandex.ru")) (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru") (:keywords "convenience") (:url . "https://github.com/dgutov/highlight-escape-sequences"))]) - (highlight-function-calls . [(20230416 445) ((emacs (24 4))) "Highlight function/macro calls" tar ((:commit . "e2ed2da188aea5879b59ffffefdc5eca10e7ba83") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "faces" "highlighting") (:url . "http://github.com/alphapapa/highlight-function-calls"))]) + (highlight-function-calls . [(20240112 731) ((emacs (24 4))) "Highlight function/macro calls" tar ((:commit . "dd9d78bff973bbf2dbc6bdbc3a18d5d6ebcee737") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "faces" "highlighting") (:url . "http://github.com/alphapapa/highlight-function-calls"))]) (highlight-indent-guides . [(20200820 2328) ((emacs (24 1))) "Minor mode to highlight indentation" tar ((:commit . "cf352c85cd15dd18aa096ba9d9ab9b7ab493e8f6") (:authors ("DarthFennec" . "darthfennec@derpymail.org")) (:maintainers ("DarthFennec" . "darthfennec@derpymail.org")) (:maintainer "DarthFennec" . "darthfennec@derpymail.org") (:url . "https://github.com/DarthFennec/highlight-indent-guides"))]) (highlight-indentation . [(20210221 1418) nil "Minor modes for highlighting indentation" tar ((:commit . "d88db4248882da2d4316e76ed673b4ac1fa99ce3") (:authors ("Anton Johansson" . "anton.johansson@gmail.com")) (:maintainers ("Anton Johansson" . "anton.johansson@gmail.com")) (:maintainer "Anton Johansson" . "anton.johansson@gmail.com") (:url . "https://github.com/antonj/Highlight-Indentation-for-Emacs"))]) (highlight-leading-spaces . [(20151216 1222) ((emacs (24 4))) "Highlight leading spaces" tar ((:commit . "840db19d863dd97993fd9f893f5be501627b6354") (:authors ("Thomas Winant" . "dewinant@gmail.com")) (:maintainers ("Thomas Winant" . "dewinant@gmail.com")) (:maintainer "Thomas Winant" . "dewinant@gmail.com") (:url . "https://github.com/mrBliss/highlight-leading-spaces"))]) @@ -2431,9 +2493,9 @@ (highlight-thing . [(20230217 728) nil "Minimalistic minor mode to highlight current thing under point." tar ((:commit . "ad788d7a7ee9eb287a8cca3adb21510b89270dca") (:authors ("Felix Geller" . "fgeller@gmail.com")) (:maintainers ("Felix Geller" . "fgeller@gmail.com")) (:maintainer "Felix Geller" . "fgeller@gmail.com") (:keywords "highlight" "thing" "symbol") (:url . "https://github.com/fgeller/highlight-thing.el"))]) (highlight-unique-symbol . [(20130612 542) ((deferred (0 3 2))) "highlight symbols which not appear in the repository" tar ((:commit . "d760015b4a5ce31d6da5a30890b599a8e1312be5") (:authors ("hitode909" . "hitode909@gmail.com")) (:maintainers ("hitode909" . "hitode909@gmail.com")) (:maintainer "hitode909" . "hitode909@gmail.com") (:url . "https://github.com/hitode909/emacs-highlight-unique-symbol"))]) (highlight2clipboard . [(20151020 1840) ((htmlize (1 47))) "Copy text to clipboard with highlighting." tar ((:commit . "6ce58a060d9c5843ccb8c79ec2bba7858c68ac15") (:authors ("Anders Lindgren")) (:maintainers ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "tools"))]) - (hima-theme . [(20230421 314) ((emacs (25 1))) "A minimal theme with pretty colors" tar ((:commit . "553541f1b66e0f00bada8273d1126d50de13bcd1") (:keywords "faces") (:url . "https://github.com/meain/hima-theme"))]) - (himalaya . [(20230711 925) ((emacs (27 1))) "Interface for the himalaya email client" tar ((:commit . "087c66964182221250c746f65584f332c97a4c86") (:authors ("Dante Catalfamo") ("soywod" . "clement.douin@posteo.net")) (:maintainers ("Dante Catalfamo")) (:maintainer "Dante Catalfamo") (:keywords "mail" "comm") (:url . "https://github.com/dantecatalfamo/himalaya-emacs"))]) - (hindent . [(20230517 1404) ((cl-lib (0 5))) "Indent haskell code using the \"hindent\" program" tar ((:commit . "e36786e7a54b0ebfd662bc6ddedea656d08a4033") (:authors ("Chris Done" . "chrisdone@gmail.com")) (:maintainers ("Chris Done" . "chrisdone@gmail.com")) (:maintainer "Chris Done" . "chrisdone@gmail.com") (:url . "https://github.com/chrisdone/hindent"))]) + (hima-theme . [(20240116 404) ((emacs (25 1))) "A minimal theme with pretty colors" tar ((:commit . "e928d62558ffaa9b2cca6d891069858d33535d59") (:keywords "faces") (:url . "https://github.com/meain/hima-theme"))]) + (himalaya . [(20240101 2203) ((emacs (27 1))) "Interface for the email client Himalaya CLI" tar ((:commit . "108e275f25ea35f2adeedbeb4af28c4a99c07fa7") (:authors ("Dante Catalfamo") ("soywod" . "clement.douin@posteo.net")) (:maintainers ("soywod" . "clement.douin@posteo.net")) (:maintainer "soywod" . "clement.douin@posteo.net") (:keywords "mail" "comm") (:url . "https://github.com/dantecatalfamo/himalaya-emacs"))]) + (hindent . [(20231112 1536) ((cl-lib (0 5))) "Indent haskell code using the \"hindent\" program" tar ((:commit . "a83adf2edc9503c0ee836beb7745bdfd4ba1ea50") (:authors ("Chris Done" . "chrisdone@gmail.com")) (:maintainers ("Chris Done" . "chrisdone@gmail.com")) (:maintainer "Chris Done" . "chrisdone@gmail.com") (:url . "https://github.com/chrisdone/hindent"))]) (hippie-exp-ext . [(20160502 2326) nil "Extension of hippie-expand" tar ((:commit . "4eda13f90da51ab217d024701f4c30f91ffcb90e") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "abbrev" "convenience" "completions" "hippie-expand") (:url . "http://www.emacswiki.org/emacs/download/hippie-exp-ext.el"))]) (hippie-expand-slime . [(20170723 146) nil "Hook slime's completion into hippie-expand" tar ((:commit . "39bbae94896a62854d31754debdfae71d35fec62") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/hippie-expand-slime"))]) (hippie-namespace . [(20140508 2041) nil "Special treatment for namespace prefixes in hippie-expand" tar ((:commit . "107d927634032062483e83c6de9b7698b64809d1") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "convenience" "lisp" "tools" "completion") (:url . "http://github.com/rolandwalker/hippie-namespace"))]) @@ -2447,10 +2509,10 @@ (hl-block-mode . [(20230521 2306) ((emacs (26 1))) "Highlighting nested blocks" tar ((:commit . "768d92aa93c1894afb6f79feb5eb6b070ab24e4f") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.org/ideasman42/emacs-hl-block-mode"))]) (hl-indent . [(20170429 2104) ((emacs (24)) (cl-lib (0 5))) "Highlight irregular indentation." tar ((:commit . "bdb2e0177a7c8b29af26998e688b856adc6ded93") (:authors ("Kirill Ignatiev ")) (:maintainers ("Kirill Ignatiev ")) (:maintainer "Kirill Ignatiev ") (:keywords "convenience" "faces") (:url . "https://github.com/ikirill/hl-indent"))]) (hl-indent-scope . [(20230801 344) ((emacs (26 1))) "Highlight indentation by scope" tar ((:commit . "7734b40be12ab2ca34038896ec6223ecc82d89b4") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.org/ideasman42/emacs-hl-indent-scope"))]) - (hl-prog-extra . [(20230820 39) ((emacs (26 2))) "Customizable highlighting for source-code" tar ((:commit . "b9a6a5d982b000d26ab365f16b4d5fdced2a3736") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:keywords "convenience") (:url . "https://codeberg.org/ideasman42/emacs-hl-prog-extra"))]) + (hl-prog-extra . [(20240209 218) ((emacs (26 2))) "Customizable highlighting for source-code" tar ((:commit . "f658eff775fea05fa6deabf59a5fecf99660fa26") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("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" tar ((:commit . "86ae38d3103bd20da5485cbdd59dfbd396c45ee4") (:authors ("Donald Ephraim Curtis" . "dcurtis@milkbox.net")) (:maintainers ("Donald Ephraim Curtis" . "dcurtis@milkbox.net")) (:maintainer "Donald Ephraim Curtis" . "dcurtis@milkbox.net") (:keywords "highlighting") (:url . "http://github.com/milkypostman/hl-sentence"))]) - (hl-todo . [(20230829 1854) ((emacs (25 1)) (compat (29 1 4 2))) "Highlight TODO and similar keywords" tar ((:commit . "70ce48470c85f1441de2c9428a240c3287995846") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience") (:url . "https://github.com/tarsius/hl-todo"))]) - (hledger-mode . [(20230721 1812) ((emacs (24 4)) (popup (0 5 3)) (async (1 9)) (htmlize (1 47))) "A mode for writing journal entries for hledger." tar ((:commit . "ae551c0601dc39e0f751fe52a97fab01f4844e0a") (:authors ("Narendra Joshi" . "narendraj9@gmail.com")) (:maintainers ("Narendra Joshi" . "narendraj9@gmail.com")) (:maintainer "Narendra Joshi" . "narendraj9@gmail.com") (:keywords "data") (:url . "https://github.com/narendraj9/hledger-mode.git"))]) + (hl-todo . [(20240101 2217) ((emacs (25 1)) (compat (29 1 4 2))) "Highlight TODO and similar keywords" tar ((:commit . "7146bbcab5248f3fb9d09acb981b8e63f0c73413") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience") (:url . "https://github.com/tarsius/hl-todo"))]) + (hledger-mode . [(20231001 834) ((emacs (24 4)) (popup (0 5 3)) (async (1 9)) (htmlize (1 47))) "A mode for writing journal entries for hledger." tar ((:commit . "1b9c65298c34933d6667773d7fa1e89c9841038d") (:authors ("Narendra Joshi" . "narendraj9@gmail.com")) (:maintainers ("Narendra Joshi" . "narendraj9@gmail.com")) (:maintainer "Narendra Joshi" . "narendraj9@gmail.com") (:keywords "data") (:url . "https://github.com/narendraj9/hledger-mode.git"))]) (hlint-refactor . [(20190115 900) nil "Apply HLint suggestions" tar ((:commit . "c4307f86aad6d02e32e9b30cb6edc115584c791c") (:keywords "haskell" "refactor") (:url . "https://github.com/mpickering/hlint-refactor-mode"))]) (hlinum . [(20180422 412) ((cl-lib (0 2))) "Extension for linum.el to highlight current line number" tar ((:commit . "f17360fe93de6df99a05b4b64b0a1ca4ee45abb6") (:authors ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainers ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainer "Tomoya Tanjo" . "ttanjo@gmail.com") (:keywords "convenience" "extensions") (:url . "https://github.com/tom-tan/hlinum-mode/"))]) (hmac . [(20201004 1819) ((emacs (25 1))) "Hash-based message authentication code" tar ((:commit . "f2b99a9a10becfff207cf9418c6dce78364b1a4b") (:authors ("Sean McAfee")) (:maintainers ("Sean McAfee")) (:maintainer "Sean McAfee") (:url . "https://github.com/grimnebulin/emacs-hmac"))]) @@ -2464,12 +2526,12 @@ (hookify . [(20141216 2209) ((s (1 9 0)) (dash (1 5 0))) "Interactive commands to create temporary hooks" tar ((:commit . "e76127230716f7fab6662410c03c3872d17a172b") (:authors ("Philippe Vaucher" . "philippe.vaucher@gmail.com")) (:maintainers ("Philippe Vaucher" . "philippe.vaucher@gmail.com")) (:maintainer "Philippe Vaucher" . "philippe.vaucher@gmail.com") (:keywords "hook" "convenience") (:url . "https://github.com/Silex/hookify"))]) (horizon-theme . [(20200720 1832) ((emacs (24 3))) "A beautifully warm dual theme" tar ((:commit . "9595549c514a9376c61d5d303405f6a6982e9e46") (:url . "https://github.com/aodhneine/horizon-theme.el"))]) (horoscope . [(20180409 641) ((emacs (24))) "generate horoscopes." tar ((:commit . "f4c683e991adce0a8f9023f15050f306f9b9a9ed") (:authors ("Bob Manson" . "manson@cygnus.com")) (:maintainers ("Noah Friedman" . "friedman@prep.ai.mit.edu")) (:maintainer "Noah Friedman" . "friedman@prep.ai.mit.edu") (:keywords "extensions" "games") (:url . "https://github.com/mschuldt/horoscope.el"))]) - (hotfuzz . [(20230824 1457) ((emacs (27 1))) "Fuzzy completion style" tar ((:commit . "3076cb250d0cb7ac6c3ec746dc4ccfea09ccdb25") (:authors ("Axel Forsman" . "axel@axelf.se")) (:maintainers ("Axel Forsman" . "axel@axelf.se")) (:maintainer "Axel Forsman" . "axel@axelf.se") (:keywords "matching") (:url . "https://github.com/axelf4/hotfuzz"))]) + (hotfuzz . [(20240114 1729) ((emacs (27 1))) "Fuzzy completion style" tar ((:commit . "0d89041ca494432d79e85b0454f21a75c6e21925") (:authors ("Axel Forsman" . "axel@axelf.se")) (:maintainers ("Axel Forsman" . "axel@axelf.se")) (:maintainer "Axel Forsman" . "axel@axelf.se") (:keywords "matching") (:url . "https://github.com/axelf4/hotfuzz"))]) (hound . [(20200122 1700) ((request (0 2 0)) (cl-lib (0 5))) "Display hound search results in a compilation window" tar ((:commit . "35e2cdc81fcc904b450a7ef3ec00fd25df6a4431") (:authors ("Ryan Young")) (:maintainers ("Ryan Young")) (:maintainer "Ryan Young"))]) (hover . [(20220129 1935) ((emacs (25 2)) (dash (2 14 1))) "Package to use hover with flutter" tar ((:commit . "2b826735bb8d3bcfced489a1e0fa21b10fbc967e") (:authors ("Eric Dallo")) (:maintainers ("Eric Dallo")) (:maintainer "Eric Dallo") (:keywords "hover" "flutter" "mobile" "tools") (:url . "https://github.com/ericdallo/hover.el"))]) (howdoi . [(20150204 43) nil "Instant coding answers via Emacs." tar ((:commit . "5fbf7069ee160c597a328e5ce5fb32920e1ca88f") (:authors ("Andrey Tykhonov ")) (:maintainer "Andrey Tykhonov" . "atykhonov@gmail.com") (:keywords "howdoi" "convenience") (:url . "https://github.com/atykhonov/emacs-howdoi/"))]) - (howdoyou . [(20230816 1650) ((emacs (25 1)) (promise (1 1)) (request (0 3 3)) (org (9 2))) "A stackoverflow and its sisters' sites reader" tar ((:commit . "5a8d7878689d2c4fedbe040268bd5a43c169d16f") (:authors ("Thanh Vuong" . "thanhvg@gmail.com")) (:maintainers ("Thanh Vuong" . "thanhvg@gmail.com")) (:maintainer "Thanh Vuong" . "thanhvg@gmail.com") (:url . "https://github.com/thanhvg/howdoyou/"))]) - (howm . [(20230730 534) ((cl-lib (0 5))) "Wiki-like note-taking tool" tar ((:commit . "4b68c83cd2398dabec7c10ea73526659e0d27231") (:authors ("HIRAOKA Kazuyuki" . "kakkokakko@gmail.com")) (:maintainers ("HIRAOKA Kazuyuki" . "kakkokakko@gmail.com")) (:maintainer "HIRAOKA Kazuyuki" . "kakkokakko@gmail.com") (:url . "https://kaorahi.github.io/howm/"))]) + (howdoyou . [(20230928 549) ((emacs (25 1)) (promise (1 1)) (request (0 3 3)) (org (9 2))) "A stackoverflow and its sisters' sites reader" tar ((:commit . "10f31a10803c3fd4c304f3a4495d57a0b9cf9ab5") (:authors ("Thanh Vuong" . "thanhvg@gmail.com")) (:maintainers ("Thanh Vuong" . "thanhvg@gmail.com")) (:maintainer "Thanh Vuong" . "thanhvg@gmail.com") (:url . "https://github.com/thanhvg/howdoyou/"))]) + (howm . [(20240229 1231) ((cl-lib (0 5))) "Wiki-like note-taking tool" tar ((:commit . "11d05032af3ffb895c7b1a1845fea7ffe3be4fbf") (:authors ("HIRAOKA Kazuyuki" . "kakkokakko@gmail.com")) (:maintainers ("HIRAOKA Kazuyuki" . "kakkokakko@gmail.com")) (:maintainer "HIRAOKA Kazuyuki" . "kakkokakko@gmail.com") (:url . "https://kaorahi.github.io/howm/"))]) (hsluv . [(20181127 1206) ((seq (2 20))) "hsluv color space conversions" tar ((:commit . "bc6e27d25b62f5a2f79836a32e8de6125f4d1564") (:authors ("Geert Vermeiren")) (:maintainers ("Geert Vermeiren")) (:maintainer "Geert Vermeiren") (:keywords "color" "hsluv") (:url . "https://github.com/hsluv/hsluv-emacs"))]) (ht . [(20230703 558) ((dash (2 12 0))) "The missing hash table library for Emacs" tar ((:commit . "1c49aad1c820c86f7ee35bf9fff8429502f60fef") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:keywords "hash table" "hash map" "hash"))]) (html-check-frag . [(20201106 1748) ((emacs (24 3))) "Check html-fragments" tar ((:commit . "b9d1f2003a126c2e8b6d469964ec2278ad55c9df") (:authors ("Tobias.Zawada" . "i@tn-home.de")) (:maintainers ("Tobias.Zawada" . "i@tn-home.de")) (:maintainer "Tobias.Zawada" . "i@tn-home.de") (:keywords "html"))]) @@ -2477,8 +2539,8 @@ (html-to-hiccup . [(20230727 1013) ((emacs (25 1)) (s (1 10 0))) "Convert HTML to Hiccup syntax" tar ((:commit . "6879354b8f33ca0c35cf0929581d419cd0ec9ea1") (:authors ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainers ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainer "Arne Brasseur" . "arne@arnebrasseur.net") (:keywords "html" "hiccup" "clojure" "convenience" "tools") (:url . "https://github.com/plexus/html-to-hiccup"))]) (html-to-markdown . [(20151105 840) ((cl-lib (0 5))) "HTML to Markdown converter written in Emacs-lisp." tar ((:commit . "60c5498c801be186478cf7c05be05b4430c4a144") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainers ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com") (:keywords "tools" "wp" "languages") (:url . "http://github.com/Bruce-Connor/html-to-markdown"))]) (html2org . [(20170418 501) ((emacs (24 4))) "Convert html to org format text" tar ((:commit . "6904aed40259ad8afccff079ebd8a07bff319ebc") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "convenience" "html" "org") (:url . "http://github.com/lujun9972/html2org.el"))]) - (htmlize . [(20210825 2150) nil "Convert buffer text and decorations to HTML." tar ((:commit . "dd27bc3f26efd728f2b1f01f9e4ac4f61f2ffbf9") (:authors ("Hrvoje Niksic" . "hniksic@gmail.com")) (:maintainers ("Hrvoje Niksic" . "hniksic@gmail.com")) (:maintainer "Hrvoje Niksic" . "hniksic@gmail.com") (:keywords "hypermedia" "extensions") (:url . "https://github.com/hniksic/emacs-htmlize"))]) - (htmltagwrap . [(20220704 652) ((emacs (24 4))) "Wraps a chunk of HTML code in tags" tar ((:commit . "477d44d1ee38dd2033883bfe9e03f6f9acdfa49d") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/htmltagwrap"))]) + (htmlize . [(20240212 1001) ((emacs (25 1))) "Convert buffer text and decorations to HTML." tar ((:commit . "09d43dfa44899f194095bb3500a45ec5b34d59c6") (:authors ("Hrvoje Niksic" . "hniksic@gmail.com")) (:maintainers ("Hrvoje Niksic" . "hniksic@gmail.com")) (:maintainer "Hrvoje Niksic" . "hniksic@gmail.com") (:keywords "hypermedia" "extensions") (:url . "https://github.com/hniksic/emacs-htmlize"))]) + (htmltagwrap . [(20240120 1010) ((emacs (24 4))) "Wraps a chunk of HTML code in tags" tar ((:commit . "96f89ec74e39903d8ed1f87f261032778c19694a") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/emacs-vs/htmltagwrap"))]) (http . [(20201010 920) ((emacs (24 4)) (request (0 2 0)) (edit-indirect (0 1 4))) "Yet another HTTP client" tar ((:commit . "5fdceed1fbf36e274e578e349a53ce922c574774") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainers ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:keywords "convenience") (:url . "https://github.com/emacs-pe/http.el"))]) (http-post-simple . [(20170715 940) nil "HTTP POST requests using the url library" tar ((:commit . "f53697fca278c741051aeb668b00466b5e0fd3fe") (:authors ("Tom Schutzer-Weissmann")) (:maintainers ("Tom Schutzer-Weissmann")) (:maintainer "Tom Schutzer-Weissmann") (:keywords "comm" "data" "processes" "hypermedia"))]) (http-twiddle . [(20221203 1351) nil "send & twiddle & resend HTTP requests" tar ((:commit . "c07e8620183ec710623db35e26dd839b84c56007") (:authors ("Luke Gorrie" . "luke@synap.se")) (:maintainers ("Hasan Veldstra" . "h@vidiowiki.com")) (:maintainer "Hasan Veldstra" . "h@vidiowiki.com") (:keywords "http" "rest" "soap") (:url . "https://github.com/hassy/http-twiddle/blob/master/http-twiddle.el"))]) @@ -2486,16 +2548,17 @@ (httprepl . [(20141101 1734) ((s (1 9 0)) (dash (2 5 0)) (emacs (24))) "An HTTP REPL" tar ((:commit . "cfa3693267a8ed1c96a86a126823f37dbfe077d8") (:authors ("Greg Sexton" . "gregsexton@gmail.com")) (:maintainers ("Greg Sexton" . "gregsexton@gmail.com")) (:maintainer "Greg Sexton" . "gregsexton@gmail.com") (:keywords "http" "repl") (:url . "https://github.com/gregsexton/httprepl.el"))]) (huecycle . [(20210830 340) ((emacs (27 1))) "Idle color animation" tar ((:commit . "a05e32351dcff3e61b5f15800556adfe1939c112") (:authors ("Phillip O'Reggio ")) (:maintainers ("Phillip O'Reggio")) (:maintainer "Phillip O'Reggio") (:keywords "faces") (:url . "https://github.com/pnor/huecycle"))]) (hugsql-ghosts . [(20211124 1646) ((s (1 9 0)) (dash (2 10 0)) (cider (0 14 0))) "Display hugsql defqueries in clojure code as an overlay" tar ((:commit . "f9ab314b6a10140041233e65a23e924dcab9a7a3") (:authors ("Roland Kaercher" . "roland.kaercher@gmail.com")) (:maintainers ("Roland Kaercher" . "roland.kaercher@gmail.com")) (:maintainer "Roland Kaercher" . "roland.kaercher@gmail.com") (:url . "https://github.com/rkaercher/hugsql-ghosts"))]) - (humanoid-themes . [(20230308 2129) ((emacs (24 3))) "Color themes with a dark and light variant" tar ((:commit . "d6d41b365501650c18939c3394762bc163c87e40") (:authors ("Thomas Friese")) (:maintainers ("Thomas Friese")) (:maintainer "Thomas Friese") (:keywords "faces" "color" "theme") (:url . "https://github.com/humanoid-colors/emacs-humanoid-themes"))]) + (humanoid-themes . [(20231222 1052) ((emacs (27 1))) "Color themes with a dark and light variant" tar ((:commit . "7dd4fe1211e0af187ae9ad4db6d5bea9e3e944f9") (:authors ("Thomas Friese")) (:maintainers ("Thomas Friese")) (:maintainer "Thomas Friese") (:keywords "faces" "color" "theme") (:url . "https://github.com/humanoid-colors/emacs-humanoid-themes"))]) (hungarian-holidays . [(20161020 1138) nil "Adds a list of Hungarian public holidays to Emacs calendar" tar ((:commit . "653108769279499d84a79267c90e640d98823872") (:authors ("Gergely Polonkai" . "gergely@polonkai.eu")) (:maintainers ("Gergely Polonkai" . "gergely@polonkai.eu")) (:maintainer "Gergely Polonkai" . "gergely@polonkai.eu") (:keywords "calendar"))]) (hungry-delete . [(20210409 1643) nil "hungry delete minor mode" tar ((:commit . "d919e555e5c13a2edf4570f3ceec84f0ade71657") (:authors ("Nathaniel Flath" . "flat0103@gmail.com")) (:maintainers ("Nathaniel Flath" . "flat0103@gmail.com")) (:maintainer "Nathaniel Flath" . "flat0103@gmail.com") (:url . "http://github.com/nflath/hungry-delete"))]) + (hush . [(20231008 2125) ((emacs (27 1))) "Pluggable secret manager (auth-source alternative)" tar ((:commit . "51c7960820de0576bbf0c3c286cb1264854d20aa") (:authors ("Theodor-Alexandru Irimia")) (:maintainers ("Theodor-Alexandru Irimia")) (:maintainer "Theodor-Alexandru Irimia") (:keywords "extensions" "lisp" "local" "tools") (:url . "https://github.com/tirimia/hush"))]) (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" tar ((:commit . "e9a7e945fed12d8e664e898cf8b434b0376d5d80") (:authors ("Iku Iwasa" . "iku.iwasa@gmail.com")) (:maintainers ("Iku Iwasa" . "iku.iwasa@gmail.com")) (:maintainer "Iku Iwasa" . "iku.iwasa@gmail.com") (:url . "https://github.com/iquiw/hyai"))]) (hybrid-reverse-theme . [(20220921 1345) ((emacs (24 1))) "Emacs theme with material color scheme" tar ((:commit . "5c60e7428d3c135c5f027d09f4474ed776f80d8d") (:authors ("Riyyi")) (:maintainers ("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" tar ((:commit . "812ffa4bee3163098ef66ee4506feed45018be4e") (:authors ("David Chkhikvadze" . "david@chkhd.net")) (:maintainers ("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")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "bindings") (:url . "https://github.com/abo-abo/hydra"))]) - (hyperdrive . [(20230830 834) ((emacs (27 1)) (map (3 0)) (compat (29 1 4 0)) (plz (0 7)) (persist (0 5))) "P2P filesystem" tar ((:commit . "356783499bc1ce0c88abdd3cd2096b8f85a9268c") (:authors ("Joseph Turner")) (:maintainers ("Joseph Turner" . "joseph@ushin.org")) (:maintainer "Joseph Turner" . "joseph@ushin.org") (:url . "https://git.sr.ht/~ushin/hyperdrive.el"))]) + (hyperdrive . [(20240226 743) ((emacs (28 1)) (map (3 0)) (compat (29 1 4 4)) (plz (0 7 2)) (persist (0 6)) (taxy-magit-section (0 13)) (transient (0 5 3))) "P2P filesystem" tar ((:commit . "9895acdd1bc14e9a63e3b6ef050510a67ae59e7d") (:authors ("Joseph Turner" . "joseph@ushin.org")) (:maintainers ("Joseph Turner" . "~ushin/ushin@lists.sr.ht")) (:maintainer "Joseph Turner" . "~ushin/ushin@lists.sr.ht") (:url . "https://git.sr.ht/~ushin/hyperdrive.el"))]) (hyperkitty . [(20220226 1951) ((request (0 3 2)) (emacs (25 1))) "Emacs interface for Hyperkitty archives" tar ((:commit . "2c1d22ff017d096c359aa151e6a29f7214a58118") (:authors ("Abhilash Raj" . "maxking@asynchronous.in")) (:maintainers ("Abhilash Raj" . "maxking@asynchronous.in")) (:maintainer "Abhilash Raj" . "maxking@asynchronous.in") (:keywords "mail" "hyperkitty" "mailman") (:url . "https://github.com/maxking/hyperkitty.el"))]) (hyperlist-mode . [(20230119 28) ((emacs (24))) "A major-mode for viewing Hyperlists" tar ((:commit . "480dbf33ca72e7b5fade952aaf0d5a5eb43acb1d") (:authors ("Wojciech Siewierski")) (:maintainers ("Wojciech Siewierski")) (:maintainer "Wojciech Siewierski") (:keywords "outlines") (:url . "https://github.com/vifon/hyperlist-mode"))]) (hyperspace . [(20230518 442) ((emacs (25)) (s (1 12 0))) "Get there from here" tar ((:commit . "f574d07fd8715e806ba4f0487b73c699963baed3") (:authors ("Ian Eure" . "ian@retrospec.tv")) (:maintainers ("Ian Eure" . "ian@retrospec.tv")) (:maintainer "Ian Eure" . "ian@retrospec.tv") (:keywords "tools" "convenience") (:url . "https://github.com/ieure/hyperspace-el"))]) @@ -2506,7 +2569,7 @@ (i3wm-config-mode . [(20220913 1121) ((emacs (24 1))) "Better syntax highlighting for i3wm's config file" tar ((:commit . "188e3978807ec39eba3cb69d973c0062af324215") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainers ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:keywords "faces" "languages" "i3wm" "font-lock") (:url . "https://github.com/Alexander-Miller/i3wm-Config-Mode"))]) (ialign . [(20220629 1241) ((emacs (24 4))) "visual align-regexp" tar ((:commit . "bc4d30d79f2f4b413288195ef19894ac0fd258b7") (:authors ("Michał Krzywkowski" . "k.michal@zoho.com")) (:maintainers ("Michał Krzywkowski" . "k.michal@zoho.com")) (:maintainer "Michał Krzywkowski" . "k.michal@zoho.com") (:keywords "tools" "editing" "align" "interactive") (:url . "https://github.com/mkcms/interactive-align"))]) (iasm-mode . [(20171023 1422) nil "interactive assembly major mode." tar ((:commit . "abbec7f308f9ce97beeb57e459fff35f559b4c18") (:authors ("Rémi Attab" . "remi.attab@gmail.com")) (:maintainers ("Rémi Attab" . "remi.attab@gmail.com")) (:maintainer "Rémi Attab" . "remi.attab@gmail.com") (:keywords ":" "tools") (:url . "https://github.com/RAttab/iasm-mode"))]) - (ibrowse . [(20230813 2116) ((emacs (27 1))) "Interact with your browser" tar ((:commit . "0ace95c948b8fae87aaf08cc2b80ceb0b1713835") (:authors ("Nicolas Graves" . "ngraves@ngraves.fr")) (:maintainers ("Nicolas Graves" . "ngraves@ngraves.fr")) (:maintainer "Nicolas Graves" . "ngraves@ngraves.fr") (:keywords "comm" "data" "files" "tools") (:url . "https://git.sr.ht/~ngraves/ibrowse.el"))]) + (ibrowse . [(20230926 2056) ((emacs (27 1))) "Interact with your browser" tar ((:commit . "addfec54f2c33d505d10bb5f17c084876db5baed") (:authors ("Nicolas Graves" . "ngraves@ngraves.fr")) (:maintainers ("Nicolas Graves" . "ngraves@ngraves.fr")) (:maintainer "Nicolas Graves" . "ngraves@ngraves.fr") (:keywords "comm" "data" "files" "tools") (:url . "https://git.sr.ht/~ngraves/ibrowse.el"))]) (ibuffer-git . [(20110508 731) nil "show git status in ibuffer column" tar ((:commit . "d326319c05ddb8280885b31f9094040c1b365876") (:authors ("Jonathan Rockway" . "jon@jrock.us")) (:maintainers ("Jonathan Rockway" . "jon@jrock.us")) (:maintainer "Jonathan Rockway" . "jon@jrock.us") (:keywords "convenience"))]) (ibuffer-project . [(20220321 1312) ((emacs (25 1))) "Group ibuffer's list by project or any function" tar ((:commit . "bfc0ec1f27b02b8ab816dcfd9073e5d78dae1aed") (:authors ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainers ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainer "Andrii Kolomoiets" . "andreyk.mad@gmail.com") (:keywords "tools") (:url . "https://github.com/muffinmad/emacs-ibuffer-project"))]) (ibuffer-projectile . [(20230817 610) ((projectile (0 11 0)) (emacs (25 1)) (seq (2))) "Group ibuffer's list by projectile root" tar ((:commit . "710ecac1578273bf31debe52870f5844472e3428") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "convenience") (:url . "https://github.com/purcell/ibuffer-projectile"))]) @@ -2517,17 +2580,17 @@ (iceberg-theme . [(20220622 1) ((emacs (26 1)) (solarized-theme (1 3))) "Well-designed, eye-friendly, dark blue color scheme" tar ((:commit . "c9fdf9a8f5ff417c206730a84731f64a95483935") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "convenience") (:url . "https://github.com/conao3/iceberg-theme.el"))]) (icl-mode . [(20221003 2316) ((emacs (25 2))) "Support for IEEE 1687 ICL/PDL" tar ((:commit . "1ef19c3c1c7f2667796907391d5337bbc2d73df3") (:authors ("Troy Hinckley" . "troy.hinckley@dabrev.com")) (:maintainers ("Troy Hinckley" . "troy.hinckley@dabrev.com")) (:maintainer "Troy Hinckley" . "troy.hinckley@dabrev.com") (:url . "https://github.com/CeleritasCelery/icl-mode"))]) (icomplete-vertical . [(20220418 2119) ((emacs (26 1))) "Display icomplete candidates vertically" tar ((:commit . "f5775d535630199703c936380d210d38249b342c") (:authors ("Omar Antolín Camarena" . "omar@matem.unam.mx")) (:maintainers ("Omar Antolín Camarena" . "omar@matem.unam.mx")) (:maintainer "Omar Antolín Camarena" . "omar@matem.unam.mx") (:keywords "convenience" "completion") (:url . "https://github.com/oantolin/icomplete-vertical"))]) - (icsql . [(20230626 2045) ((emacs (26)) (choice-program (0 13)) (buffer-manage (0 12))) "Interactive iSQL iteraface to ciSQL" tar ((:commit . "fdf2a280f27def4b633a3a74ebdf3a6c95471e3d") (:authors ("Paul Landes")) (:maintainers ("Paul Landes")) (:maintainer "Paul Landes") (:keywords "isql" "sql" "rdbms" "data") (:url . "https://github.com/plandes/icsql"))]) + (icsql . [(20231021 1949) ((emacs (26)) (choice-program (0 13)) (buffer-manage (0 12))) "Interactive iSQL iteraface to ciSQL" tar ((:commit . "24c013486fd56386946eadc9a2f653e9f0d3f4de") (:authors ("Paul Landes")) (:maintainers ("Paul Landes")) (:maintainer "Paul Landes") (:keywords "isql" "sql" "rdbms" "data") (:url . "https://github.com/plandes/icsql"))]) (id-manager . [(20170320 1246) nil "id-password management" tar ((:commit . "14ebc35db298aac4dedc8aa188bc46bacab81f3b") (:authors ("SAKURAI Masashi ")) (:maintainers ("SAKURAI Masashi ")) (:maintainer "SAKURAI Masashi ") (:keywords "password" "convenience"))]) (idea-darkula-theme . [(20230617 2005) ((emacs (24 1))) "Color theme based on IntelliJ IDEA Darkula color theme" tar ((:commit . "2ba08b6b7c0f75d460d81e1f02114a6449bb1868") (:authors ("Alexey Veretennikov ")) (:maintainers ("Alexey Veretennikov ")) (:maintainer "Alexey Veretennikov ") (:keywords "themes") (:url . "http://github.com/fourier/idea-darkula-theme"))]) (identica-mode . [(20130204 2253) nil "Major mode API client for status.net open microblogging" tar ((:commit . "cf9183ee11ac922e85c7c908f04e2d00b03111b3") (:authors ("Gabriel Saldana" . "gsaldana@gmail.com")) (:maintainers ("Gabriel Saldana" . "gsaldana@gmail.com")) (:maintainer "Gabriel Saldana" . "gsaldana@gmail.com") (:keywords "identica" "web") (:url . "http://blog.gabrielsaldana.org/identica-mode-for-emacs/"))]) - (idle-highlight-in-visible-buffers-mode . [(20181027 1531) nil "highlight the word the point is on" tar ((:commit . "8d8de309d5bd4b035c01bf7f0cfc6e079c79d898") (:authors ("Ignacy Moryc")) (:maintainers ("Ignacy Moryc")) (:maintainer "Ignacy Moryc") (:keywords "convenience") (:url . "https://github.com/ignacy/idle-highlight-in-visible-buffers"))]) - (idle-highlight-mode . [(20230319 810) ((emacs (27 1))) "Highlight the word the point is on" tar ((:commit . "f9091c907d41e7b12d99d108a194229b8dbfc5ae") (:authors ("Phil Hagelberg, Cornelius Mika, Campbell Barton")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:keywords "convenience") (:url . "https://codeberg.org/ideasman42/emacs-idle-highlight-mode"))]) + (idle-highlight-in-visible-buffers-mode . [(20240107 1344) nil "highlight the word the point is on" tar ((:commit . "f1f7ed3148439398adc6c0fe8ecf100d976886e6") (:authors ("Ignacy Moryc")) (:maintainers ("Ignacy Moryc")) (:maintainer "Ignacy Moryc") (:keywords "convenience") (:url . "https://github.com/ignacy/idle-highlight-in-visible-buffers"))]) + (idle-highlight-mode . [(20240222 2257) ((emacs (27 1))) "Highlight the word the point is on" tar ((:commit . "cfb4efba3bbe1f697f6545bee98c479c3f1081b0") (:authors ("Phil Hagelberg, Cornelius Mika, Campbell Barton")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:keywords "convenience") (:url . "https://codeberg.org/ideasman42/emacs-idle-highlight-mode"))]) (idle-org-agenda . [(20190106 1844) nil "Shows your agenda when editor is idle." tar ((:commit . "bfdf1b4f4096acdd081b3549d6b838f4ca4f7d0d") (:authors ("John Wiegley" . "jwiegley@gmail.com")) (:maintainers ("Enis Özgen" . "mail@enisozgen.com")) (:maintainer "Enis Özgen" . "mail@enisozgen.com") (:keywords "org" "org-mode" "org-agenda" "calendar") (:url . "https://github.com/enisozgen/idle-org-agenda"))]) (idle-require . [(20090715 2203) nil "load elisp libraries while Emacs is idle" tar ((:commit . "33592bb098223b4432d7a35a1d65ab83f47c1ec1") (:authors ("Nikolaj Schumacher ")) (:maintainers ("Nikolaj Schumacher ")) (:maintainer "Nikolaj Schumacher ") (:keywords "internal") (:url . "http://nschum.de/src/emacs/idle-require/"))]) (ido-at-point . [(20151113 1508) ((emacs (24))) "ido-style completion-at-point" tar ((:commit . "e5907bbe8a3d148d07698b76bd994dc3076e16ee") (:authors ("katspaugh")) (:maintainers ("katspaugh")) (:maintainer "katspaugh") (:keywords "convenience" "abbrev") (:url . "https://github.com/katspaugh/ido-at-point"))]) (ido-complete-space-or-hyphen . [(20210206 1505) nil "Allow spaces to also match hyphens in ido" tar ((:commit . "d1244243e042b8d5b6b991db752a17a44ea169bc") (:authors ("Ryan C. Thompson" . "rct@thompsonclan.org") ("Ian Yang ")) (:maintainers ("Ryan C. Thompson" . "rct@thompsonclan.org")) (:maintainer "Ryan C. Thompson" . "rct@thompsonclan.org") (:keywords "ido" "completion" "convenience") (:url . "https://github.com/DarwinAwardWinner/ido-complete-space-or-hyphen"))]) - (ido-completing-read+ . [(20210529 1318) ((emacs (24 4)) (seq (0 5)) (memoize (1 1))) "A completing-read-function using ido" tar ((:commit . "00674721e4fce283c918f7316f1158da1d469910") (:authors ("Ryan C. Thompson" . "rct@thompsonclan.org")) (:maintainers ("Ryan C. Thompson" . "rct@thompsonclan.org")) (:maintainer "Ryan C. Thompson" . "rct@thompsonclan.org") (:keywords "ido" "completion" "convenience") (:url . "https://github.com/DarwinAwardWinner/ido-completing-read-plus"))]) + (ido-completing-read+ . [(20240130 30) ((emacs (24 4)) (seq (0 5)) (memoize (1 1))) "A completing-read-function using ido" tar ((:commit . "1609049c0a9b3f674ffff3083adc8f5359746fa9") (:authors ("Ryan C. Thompson" . "rct@thompsonclan.org")) (:maintainers ("Ryan C. Thompson" . "rct@thompsonclan.org")) (:maintainer "Ryan C. Thompson" . "rct@thompsonclan.org") (:keywords "ido" "completion" "convenience") (:url . "https://github.com/DarwinAwardWinner/ido-completing-read-plus"))]) (ido-exit-target . [(20170717 1851) ((emacs (24 4))) "Commands and keys for selecting other window and frame targets within ido" tar ((:commit . "e56fc6928649c87ccf39d56d84ab53ebaced1f73") (:authors ("justin talbott" . "justin@waymondo.com")) (:maintainers ("justin talbott" . "justin@waymondo.com")) (:maintainer "justin talbott" . "justin@waymondo.com") (:keywords "convenience" "tools" "extensions") (:url . "https://github.com/waymondo/ido-exit-target"))]) (ido-flex-with-migemo . [(20190408 350) ((flx-ido (0 6 1)) (migemo (1 9 1)) (emacs (24 4))) "use ido with flex and migemo" tar ((:commit . "aa93aa05947eb6c106bb9523ff3163b8574c4eac") (:authors ("ROCKTAKEY " . "rocktakey@gmail.com")) (:maintainers ("ROCKTAKEY " . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY " . "rocktakey@gmail.com") (:keywords "matching") (:url . "https://github.com/ROCKTAKEY/ido-flex-with-migemo"))]) (ido-gnus . [(20140216 1646) ((gnus (5 13))) "Access gnus groups or servers using ido" tar ((:commit . "f5fe3f6aa8086f675ba216abace9e3d5f2e3a089") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainers ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com") (:keywords "comm") (:url . "https://github.com/vapniks/ido-gnus"))]) @@ -2548,45 +2611,45 @@ (iedit . [(20220216 717) nil "Edit multiple regions in the same way simultaneously." tar ((:commit . "dd5d75b38ee0c52ad81245a8e5c932d3f5c4772d") (:authors ("Victor Ren" . "victorhge@gmail.com")) (:maintainers ("Victor Ren" . "victorhge@gmail.com")) (:maintainer "Victor Ren" . "victorhge@gmail.com") (:keywords "occurrence" "region" "simultaneous" "refactoring") (:url . "https://github.com/victorhge/iedit"))]) (ietf-docs . [(20190420 851) nil "Fetch, Cache and Load IETF documents" tar ((:commit . "ae157549eae5ec78dcbf215c2f48cb662b73abd0") (:authors ("Christian E. Hopps" . "chopps@gmail.com")) (:maintainers ("Christian E. Hopps" . "chopps@gmail.com")) (:maintainer "Christian E. Hopps" . "chopps@gmail.com") (:keywords "ietf" "rfc") (:url . "https://github.com/choppsv1/ietf-docs"))]) (iflipb . [(20220612 858) nil "Interactively flip between recently visited buffers" tar ((:commit . "9ec1888335107bd314e8f40b3e113d525fed8083") (:authors ("Joel Rosdahl" . "joel@rosdahl.net")) (:maintainers ("Joel Rosdahl" . "joel@rosdahl.net")) (:maintainer "Joel Rosdahl" . "joel@rosdahl.net") (:url . "https://github.com/jrosdahl/iflipb"))]) - (igist . [(20230827 923) ((emacs (27 1)) (ghub (3 6 0)) (transient (0 4 1))) "List, create, update and delete GitHub gists" tar ((:commit . "565eb8d89f62e9a09ff6c60fa383197e876ceea3") (:authors ("Karim Aziiev" . "karim.aziiev@gmail.com")) (:maintainers ("Karim Aziiev" . "karim.aziiev@gmail.com")) (:maintainer "Karim Aziiev" . "karim.aziiev@gmail.com") (:keywords "tools") (:url . "https://github.com/KarimAziev/igist"))]) + (igist . [(20240312 1202) ((emacs (27 1)) (ghub (3 6 0)) (transient (0 4 1))) "List, create, update and delete GitHub gists" tar ((:commit . "330f42075fe6062893c4a413434d938295b7aa6e") (:authors ("Karim Aziiev" . "karim.aziiev@gmail.com")) (:maintainers ("Karim Aziiev" . "karim.aziiev@gmail.com")) (:maintainer "Karim Aziiev" . "karim.aziiev@gmail.com") (:keywords "tools") (:url . "https://github.com/KarimAziev/igist"))]) (ignoramus . [(20220611 1514) ((emacs (24 3))) "Ignore backups, build files, et al." tar ((:commit . "f5e4a66191be12c2fc3cf42a5e0849fcc8518a3f") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "convenience" "tools") (:url . "http://github.com/rolandwalker/ignoramus"))]) (igv . [(20141210 1227) nil "Control Integrative Genomic Viewer within Emacs" tar ((:commit . "47ac6ceede252f451348a2c696398c0cb5279555") (:authors ("Stefano Barbi" . "stefanobarbi@gmail.com")) (:maintainers ("Stefano Barbi" . "stefanobarbi@gmail.com")) (:maintainer "Stefano Barbi" . "stefanobarbi@gmail.com"))]) (image+ . [(20150707 1616) ((cl-lib (0 3))) "Image manipulate extensions for Emacs" tar ((:commit . "6834d0c09bb4df9ecc0d7a559bd7827fed48fffc") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "multimedia" "extensions") (:url . "https://github.com/mhayashi1120/Emacs-imagex"))]) (image-archive . [(20150621 132) ((emacs (24)) (cl-lib (0 5))) "Image thumbnails in archive file with non-blocking" tar ((:commit . "4cf0edabfd6a4da2ffb920ff1e5009a002fc1e53") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "multimedia") (:url . "https://github.com/mhayashi1120/Emacs-image-archive"))]) (image-dired+ . [(20150430 544) ((cl-lib (0 3))) "Image-dired extensions" tar ((:commit . "b68094625d963056ad64e0e44af0e2266b2eadc7") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "extensions" "multimedia") (:url . "https://github.com/mhayashi1120/Emacs-image-diredx"))]) (imakado . [(20141024 923) nil "imakado's usefull macros and functions" tar ((:commit . "00a1e7eea2cb9e9066343a23927d6c747707902f") (:authors ("imakado ")) (:maintainers ("imakado")) (:maintainer "imakado") (:keywords "convenience") (:url . "https://github.com/imakado/emacs-imakado"))]) - (imake . [(20230511 2108) ((emacs (25 1)) (compat (29 1 4 1))) "Simple, opinionated make target runner" tar ((:commit . "96ac809dbe9cae0e620bb5b1d5d1fb391f3f4741") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience") (:url . "https://github.com/tarsius/imake"))]) + (imake . [(20240101 2217) ((emacs (25 1)) (compat (29 1 4 1))) "Simple, opinionated make target runner" tar ((:commit . "769e13579ed19fba1fcb6de7036f5cc9357eb1a7") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience") (:url . "https://github.com/tarsius/imake"))]) (imapfilter . [(20180318 2222) nil "run the imapfilter executable" tar ((:commit . "79bbbe918319bc1e8f42a0bef53dc7c77fe868ea") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "mail") (:url . "https://github.com/tarsius/imapfilter"))]) - (imbot . [(20210423 731) ((emacs (25 1))) "Automatic system input method switcher" tar ((:commit . "0e772b52f07e2a5a6601aff1ea2b9fe704696a62") (:keywords "convenience") (:url . "https://github.com/QiangF/imbot"))]) + (imbot . [(20240120 1331) ((emacs (25 1))) "Automatic system input method switcher" tar ((:commit . "32be46c7a8bd759945ae34f19c0c6f09935a7e64") (:keywords "convenience") (:url . "https://github.com/QiangF/imbot"))]) (imenu-anywhere . [(20210201 1704) ((cl-lib (0 5)) (emacs (25))) "ido/ivy/helm imenu across same mode/project/etc buffers" tar ((:commit . "06ec33d79e33edf01b9118aead1eabeae8ee08b1") (:authors ("Vitalie Spinu ")) (:maintainers ("Vitalie Spinu ")) (:maintainer "Vitalie Spinu ") (:keywords "ido" "imenu" "tags") (:url . "https://github.com/vitoshka/imenu-anywhere"))]) (imenu-extra . [(20201229 1035) ((emacs (25 1))) "Add extra items into existing imenu items" tar ((:commit . "68b0aaaefc18b267e4e383df36a8dfb7448bc83c") (:authors ("Chen Bin ")) (:maintainers ("Chen Bin ")) (:maintainer "Chen Bin ") (:keywords "convenience") (:url . "https://github.com/redguardtoo/imenu-extra"))]) (imenu-list . [(20210420 1200) ((emacs (24 3))) "Show imenu entries in a separate buffer" tar ((:commit . "76f2335ee6f2f066d87fe4e4729219d70c9bc70d") (:authors ("Bar Magal (2015)")) (:maintainers ("Bar Magal (2015)")) (:maintainer "Bar Magal (2015)") (:url . "https://github.com/bmag/imenu-list"))]) (imenus . [(20200730 855) ((cl-lib (0 5))) "Imenu for multiple buffers and without subgroups" tar ((:commit . "90200f5f22377903b405082eabe185447968f3e2") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainers ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:keywords "tools" "convenience") (:url . "https://github.com/alezost/imenus.el"))]) (imgbb . [(20180609 1649) ((emacs (24)) (request (0 3 0))) "Simple image upload client for imgbb.com" tar ((:commit . "a524a46263835aa474f908827ebab4e8fa586001") (:authors ("Peter" . "craven@gmx.net")) (:maintainers ("Peter" . "craven@gmx.net")) (:maintainer "Peter" . "craven@gmx.net") (:keywords "extensions") (:url . "https://github.com/ecraven/imgbb.el"))]) - (immaterial-theme . [(20230219 1703) ((emacs (25))) "A flexible theme based on material design principles" tar ((:commit . "20417eaf6f349b3707e515d5d7817896243a8ad1") (:authors ("Peter Gardfjäll")) (:maintainers ("Peter Gardfjäll")) (:maintainer "Peter Gardfjäll") (:keywords "themes") (:url . "https://github.com/petergardfjall/emacs-immaterial-theme"))]) - (immersive-translate . [(20230821 145) ((emacs (28 2))) "Translate the current buffer immersively" tar ((:commit . "7fe460980907f75217c0ecd3b6865f72f325ee90") (:authors ("Eli Qian" . "eli.q.qian@gmail.com")) (:maintainers ("Eli Qian" . "eli.q.qian@gmail.com")) (:maintainer "Eli Qian" . "eli.q.qian@gmail.com") (:keywords "convenience" "help" "translate") (:url . "https://github.com/Elilif/emacs-immersive-translate"))]) + (immaterial-theme . [(20240310 931) ((emacs (25))) "A flexible theme based on material design principles" tar ((:commit . "a0a53a1fd9ca8dfd1d56fb45ab548ad900235a7a") (:authors ("Peter Gardfjäll")) (:maintainers ("Peter Gardfjäll")) (:maintainer "Peter Gardfjäll") (:keywords "themes") (:url . "https://github.com/petergardfjall/emacs-immaterial-theme"))]) + (immersive-translate . [(20231001 1557) ((emacs (28 2))) "Translate the current buffer immersively" tar ((:commit . "1d00d558363985fa988fc40cd5093bfc6926d83e") (:authors ("Eli Qian" . "eli.q.qian@gmail.com")) (:maintainers ("Eli Qian" . "eli.q.qian@gmail.com")) (:maintainer "Eli Qian" . "eli.q.qian@gmail.com") (:keywords "convenience" "help" "translate") (:url . "https://github.com/Elilif/emacs-immersive-translate"))]) (immortal-scratch . [(20160517 2118) nil "respawn the scratch buffer when it's killed" tar ((:commit . "faeab0ad6c33c74c0cbd1dfcebffaa0690de40c6") (:authors ("Jonathan Kotta" . "jpkotta@gmail.com")) (:maintainers ("Jonathan Kotta" . "jpkotta@gmail.com")) (:maintainer "Jonathan Kotta" . "jpkotta@gmail.com"))]) (immutant-server . [(20140311 2208) nil "Run your Immutant server in Emacs" tar ((:commit . "2a21e65588acb6a976f2998e30b21fdabdba4dbb") (:authors ("David Leatherman" . "leathekd@gmail.com")) (:maintainers ("David Leatherman" . "leathekd@gmail.com")) (:maintainer "David Leatherman" . "leathekd@gmail.com") (:url . "http://www.github.com/leathekd/immutant-server.el"))]) (impatient-mode . [(20230511 1746) ((emacs (24 3)) (simple-httpd (1 5 0)) (htmlize (1 40))) "Serve buffers live over HTTP" tar ((:commit . "a4e4e12852840996b027cb8e9fb2b809c37a0ee3") (:authors ("Brian Taylor" . "el.wubo@gmail.com")) (:maintainers ("Brian Taylor" . "el.wubo@gmail.com")) (:maintainer "Brian Taylor" . "el.wubo@gmail.com") (:url . "https://github.com/netguy204/imp.el"))]) - (impatient-showdown . [(20220730 1259) ((emacs (24 3)) (impatient-mode (1 1))) "Preview markdown buffer live over HTTP using showdown" tar ((:commit . "42855c318c5b6ff83dc2d748224b12cbfd487e93") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "live" "preview" "markdown" "http" "server" "impatient") (:url . "https://github.com/jcs-elpa/impatient-showdown"))]) + (impatient-showdown . [(20240101 929) ((emacs (24 3)) (impatient-mode (1 1))) "Preview markdown buffer live over HTTP using showdown" tar ((:commit . "f24ebb103cd8cba36943f6a41a0fed303bd7ba5c") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "live" "preview" "markdown" "http" "server" "impatient") (:url . "https://github.com/jcs-elpa/impatient-showdown"))]) (import-js . [(20220215 1948) ((grizzl (0 1 0)) (emacs (24))) "Import Javascript dependencies" tar ((:commit . "d2bbb53f96395415f9f01de4fa88d82c1f59ba63") (:authors ("Kevin Kehl" . "kevin.kehl@gmail.com")) (:maintainers ("Kevin Kehl" . "kevin.kehl@gmail.com")) (:maintainer "Kevin Kehl" . "kevin.kehl@gmail.com") (:keywords "javascript") (:url . "http://github.com/Galooshi/emacs-import-js/"))]) (import-popwin . [(20170218 1407) ((emacs (24 3)) (popwin (0 6))) "popwin buffer near by import statements with popwin" tar ((:commit . "bb05a9e226f8c63fe7b18a3e92010357049ab5ba") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-import-popwin"))]) (importmagic . [(20180520 303) ((f (0 11 0)) (epc (0 1 0)) (emacs (24 3))) "Fix Python imports using importmagic." tar ((:commit . "e32ee9f6a5eef937b76eba82fdae8bae85d18088") (:authors ("Nicolás Salas V." . "nikosalas@gmail.com")) (:maintainers ("Nicolás Salas V." . "nikosalas@gmail.com")) (:maintainer "Nicolás Salas V." . "nikosalas@gmail.com") (:keywords "languages" "convenience") (:url . "https://github.com/anachronic/importmagic.el"))]) (impostman . [(20230111 2012) ((emacs (27 1))) "Import Postman collections" tar ((:commit . "936575500f733c2428ba878f9400f3eef8c9645e") (:authors ("Sébastien Helleu" . "flashcode@flashtux.org")) (:maintainers ("Sébastien Helleu" . "flashcode@flashtux.org")) (:maintainer "Sébastien Helleu" . "flashcode@flashtux.org") (:keywords "tools") (:url . "https://github.com/flashcode/impostman"))]) - (indent-control . [(20230817 2115) ((emacs (26 1))) "Management for indentation level" tar ((:commit . "f8f5511c4bffb1371bcb3b712b32ae6c832c15bb") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "control" "indent" "tab" "generic" "level") (:url . "https://github.com/jcs-elpa/indent-control"))]) + (indent-control . [(20240303 2359) ((emacs (26 1))) "Management for indentation level" tar ((:commit . "4ede831b8680946f8e4a6cafd4f522c464160c00") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "control" "indent" "tab" "generic" "level") (:url . "https://github.com/jcs-elpa/indent-control"))]) (indent-guide . [(20210115 400) nil "show vertical lines to guide indentation" tar ((:commit . "d388c3387781a370ca13233ff445d03f3c5cf12f") (:authors ("zk_phi")) (:maintainers ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))]) (indent-info . [(20210111 745) ((emacs (24 3))) "Show indentation information in status bar" tar ((:commit . "05a787afeb9946714d8b0c724868195a678db49e") (:authors ("Terje Larsen" . "terlar@gmail.com")) (:maintainers ("Terje Larsen" . "terlar@gmail.com")) (:maintainer "Terje Larsen" . "terlar@gmail.com") (:keywords "convenience" "tools") (:url . "https://github.com/terlar/indent-info.el"))]) (indent-lint . [(20230822 46) ((emacs (25 1)) (async-await (1 0)) (async (1 9 4)) (promise (1 1))) "Async indentation checker" tar ((:commit . "aee76faf54a55e0bcb5dc07a667d7f5999299c9b") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "tools") (:url . "https://github.com/conao3/indent-lint.el"))]) (indent-tools . [(20210622 1207) ((s (0)) (hydra (0)) (yafolding (0))) "Indent, navigate (and more) by blocks of indentation: yaml, python etc." tar ((:commit . "c731f05fa3950e2e8580ec61b88abbc705639830") (:authors ("vindarel" . "vindarel@mailz.org")) (:maintainers ("vindarel" . "vindarel@mailz.org")) (:maintainer "vindarel" . "vindarel@mailz.org") (:keywords "indentation" "movements" "navigation" "kill" "fold" "yaml" "python") (:url . "https://gitlab.com/emacs-stuff/indent-tools/"))]) - (indian-ext . [(20190424 1547) ((emacs (24))) "Extension to Indian language utilities" tar ((:commit . "a5450fe467393194bc2458c0d5e0a06c91bf117a") (:authors ("Patrick McAllister" . "pma@rdorte.org")) (:maintainers ("Patrick McAllister" . "pma@rdorte.org")) (:maintainer "Patrick McAllister" . "pma@rdorte.org") (:keywords "i18n" "tools" "wp" "indian" "devanagari" "encoding") (:url . "https://github.com/paddymcall/indian-ext"))]) + (indian-ext . [(20231009 740) ((emacs (24))) "Extension to Indian language utilities" tar ((:commit . "80ea22eea203c8eb4c28f59fceb8d276395ecb0f") (:authors ("Patrick McAllister" . "pma@rdorte.org")) (:maintainers ("Patrick McAllister" . "pma@rdorte.org")) (:maintainer "Patrick McAllister" . "pma@rdorte.org") (:keywords "i18n" "tools" "wp" "indian" "devanagari" "encoding") (:url . "https://github.com/paddymcall/indian-ext"))]) (indicators . [(20161211 1126) ((dash (2 13 0)) (cl-lib (0 5 0))) "Display the buffer relative location of line in the fringe." tar ((:commit . "f62a1201f21453e3aca93f48483e65ae8251432e") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com") (:keywords "fringe" "frames") (:url . "https://github.com/Fuco1/indicators.el"))]) (indium . [(20210309 1210) ((emacs (25)) (seq (2 16)) (js2-mode (20140114)) (js2-refactor (0 9 0)) (company (0 9 0)) (json-process-client (0 2 0))) "JavaScript Awesome Development Environment" tar ((:commit . "8499e156bf7286846c3a2bf8c9e0c4d4f24b224c") (:authors ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainers ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr") (:keywords "tools" "javascript") (:url . "https://github.com/NicolasPetton/indium"))]) (indy . [(20190807 625) nil "A minor mode and EDSL to manage your mode's indentation rules." tar ((:commit . "abc5bee424780ad2de5520f8fefbf8e120c0d9ed") (:authors ("Kevin W. van Rooijen" . "kevin.van.rooijen@attichacker.com")) (:maintainers ("Kevin W. van Rooijen" . "kevin.van.rooijen@attichacker.com")) (:maintainer "Kevin W. van Rooijen" . "kevin.van.rooijen@attichacker.com") (:keywords "convenience" "matching" "tools"))]) - (inf-clojure . [(20230408 952) ((emacs (26 2)) (clojure-mode (5 11))) "Run an external Clojure process in an Emacs buffer" tar ((:commit . "b153e5126419910c38691088aab569b7c281068c") (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev") (:keywords "processes" "comint" "clojure") (:url . "http://github.com/clojure-emacs/inf-clojure"))]) + (inf-clojure . [(20230909 445) ((emacs (26 2)) (clojure-mode (5 11))) "Run an external Clojure process in an Emacs buffer" tar ((:commit . "9aea5012bf9047781a21a3b62cea134b126f7709") (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev") (:keywords "processes" "comint" "clojure") (:url . "http://github.com/clojure-emacs/inf-clojure"))]) (inf-crystal . [(20180119 211) ((emacs (24 3)) (crystal-mode (0 1 0))) "Run a Inferior-Crystal process in a buffer" tar ((:commit . "dd5c85e621976ea09b602182a15396e3b510ec63") (:authors ("Brantou" . "brantou89@gmail.com")) (:maintainers ("Brantou" . "brantou89@gmail.com")) (:maintainer "Brantou" . "brantou89@gmail.com") (:keywords "languages" "crystal") (:url . "https://github.com/brantou/inf-crystal.el"))]) (inf-elixir . [(20230611 1945) ((emacs (25 1))) "Run an interactive Elixir shell" tar ((:commit . "77ac6af83eb4b816c62f58a0298b1bae0c3d69fd") (:authors ("Jonathan Arnett" . "jonathan.arnett@protonmail.com")) (:maintainers ("Jonathan Arnett" . "jonathan.arnett@protonmail.com")) (:maintainer "Jonathan Arnett" . "jonathan.arnett@protonmail.com") (:keywords "languages" "processes" "tools") (:url . "https://github.com/J3RN/inf-elixir"))]) (inf-mongo . [(20180408 1338) nil "Run a MongoDB shell process in a buffer" tar ((:commit . "2e498d1c88bd1904eeec18ed06b1a0cf8bdc2a92") (:authors ("Tobias Svensson")) (:maintainers ("Tobias Svensson")) (:maintainer "Tobias Svensson") (:keywords "databases" "mongodb") (:url . "http://github.com/endofunky/inf-mongo"))]) - (inf-ruby . [(20230822 1406) ((emacs (24 3))) "Run a Ruby process in a buffer" tar ((:commit . "03475ac1cca410ee63a523f5c63f859cfafe1aeb") (:authors ("Yukihiro Matsumoto") ("Nobuyoshi Nakada") ("Cornelius Mika" . "cornelius.mika@gmail.com") ("Dmitry Gutov" . "dgutov@yandex.ru") ("Kyle Hargraves" . "pd@krh.me")) (:maintainers ("Dmitry Gutov" . "dgutov@yandex.ru")) (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru") (:keywords "languages" "ruby") (:url . "http://github.com/nonsequitur/inf-ruby"))]) + (inf-ruby . [(20240310 1803) ((emacs (26 1))) "Run a Ruby process in a buffer" tar ((:commit . "b88ff8bd5fe2e468de611b0211842634beaeb5da") (:authors ("Yukihiro Matsumoto") ("Nobuyoshi Nakada") ("Cornelius Mika" . "cornelius.mika@gmail.com") ("Dmitry Gutov" . "dgutov@yandex.ru") ("Kyle Hargraves" . "pd@krh.me")) (:maintainers ("Dmitry Gutov" . "dmitry@gutov.dev")) (:maintainer "Dmitry Gutov" . "dmitry@gutov.dev") (:keywords "languages" "ruby") (:url . "http://github.com/nonsequitur/inf-ruby"))]) (inferior-islisp . [(20220924 1040) ((emacs (26 3)) (islisp-mode (0 2))) "Run inferior ISLisp processes" tar ((:commit . "423b84fe4cc6944e36971225b3e19c888e7e4690") (:authors ("Fermin Munoz")) (:maintainers ("Fermin Munoz" . "fmfs@posteo.net")) (:maintainer "Fermin Munoz" . "fmfs@posteo.net") (:keywords "islisp" "lisp" "programming") (:url . "https://gitlab.com/sasanidas/islisp-mode"))]) (inflections . [(20210110 2237) ((cl-lib (0 5)) (emacs (24))) "convert english words between singular and plural" tar ((:commit . "55caa66a7cc6e0b1a76143fd40eff38416928941") (:authors ("Dmitry Galinsky, Howard Yeh")) (:maintainers ("Dmitry Galinsky, Howard Yeh")) (:maintainer "Dmitry Galinsky, Howard Yeh") (:keywords "languages" "tools" "wp") (:url . "https://github.com/eschulte/jump.el"))]) (info-beamer . [(20210427 1033) ((emacs (24 4))) "Utilities for working with info-beamer" tar ((:commit . "6b4cc29f1aec72d8e23b2c25a99cdd84e6cdc92b") (:authors ("Daniel Kraus" . "daniel@kraus.my")) (:maintainers ("Daniel Kraus" . "daniel@kraus.my")) (:maintainer "Daniel Kraus" . "daniel@kraus.my") (:keywords "tools" "processes" "comm") (:url . "https://github.com/dakra/info-beamer.el"))]) @@ -2599,6 +2662,7 @@ (inheritenv . [(20230804 651) ((emacs (24 4))) "Make temp buffers inherit buffer-local environment variables" tar ((:commit . "00106bb208d06e5f1ec25d0c2f41c000cbb25076") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "unix") (:url . "https://github.com/purcell/inheritenv"))]) (ini . [(20220827 2009) ((emacs (24 4))) "Converting between INI files and association lists" tar ((:commit . "d50fe629497d51c6390a56bbded1ad77ce12e5af") (:url . "https://github.com/EsaLaine/ini.el"))]) (ini-mode . [(20230211 1512) ((emacs (24 1))) "Major mode for Windows-style ini files." tar ((:commit . "5472abc94e564edc6b469c48d2324519a044a77c") (:authors ("Anders Lindgren")) (:maintainers ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "languages" "faces") (:url . "https://github.com/Lindydancer/ini-mode"))]) + (init-dir . [(20240216 1758) ((emacs (27 1)) (benchmark-init (1 1))) "Init directory instead of just a single file" tar ((:commit . "3b2320a62e0b2c39ae001381ef3e9ee0d538f146") (:authors ("Jared Finder" . "jared@finder.org")) (:maintainers ("Jared Finder" . "jared@finder.org")) (:maintainer "Jared Finder" . "jared@finder.org") (:keywords "extensions" "internal") (:url . "http://github.com/chaosemer/init-dir"))]) (init-loader . [(20210703 902) ((cl-lib (0 5))) "Loader for configuration files" tar ((:commit . "ecab5a66b40227c4173992adfa5cfeae09f1657e") (:authors ("IMAKADO" . "ken.imakado@gmail.com")) (:maintainers ("IMAKADO" . "ken.imakado@gmail.com")) (:maintainer "IMAKADO" . "ken.imakado@gmail.com") (:url . "https://github.com/emacs-jp/init-loader/"))]) (init-open-recentf . [(20220220 2004) ((emacs (24 4))) "Invoke a command immediately after startup" tar ((:commit . "51463effe54ca9390ec339b9678968f35a40dbfd") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "files" "recentf" "after-init-hook") (:url . "https://github.com/zonuexe/init-open-recentf.el"))]) (initsplit . [(20160919 1818) nil "code to split customizations into different files" tar ((:commit . "c941d436eb2b10b01c76a582c5a2b23fb30751aa") (:authors ("John Wiegley , Dave Abrahams" . "dave@boostpro.com")) (:maintainers ("John Wiegley , Dave Abrahams" . "dave@boostpro.com")) (:maintainer "John Wiegley , Dave Abrahams" . "dave@boostpro.com") (:keywords "lisp") (:url . "http://www.gci-net.com/users/j/johnw/emacs.html"))]) @@ -2607,6 +2671,7 @@ (inline-crypt . [(20170824 900) nil "Simple inline encryption via openssl" tar ((:commit . "af4981c613bfd355d5ef34da1995a8384f167fd9") (:authors ("Daniel Ralston" . "Wubbulous@gmail.com")) (:maintainer "Daniel Ralston" . "Wubbulous@gmail.com") (:keywords "crypt") (:url . "https://github.com/Sodel-the-Vociferous/inline-crypt-el"))]) (inline-docs . [(20230708 222) ((emacs (24 3))) "Show inline contextual docs." tar ((:commit . "08eb99f65406993425ccf9937aad013436a7c6ef") (:authors ("stardiviner" . "numbchild@gmail.com")) (:maintainers ("stardiviner" . "numbchild@gmail.com")) (:maintainer "stardiviner" . "numbchild@gmail.com") (:keywords "inline" "docs" "overlay") (:url . "https://repo.or.cz/inline-docs.git"))]) (inlineR . [(20191017 1920) nil "insert Tag for inline image of R graphics" tar ((:commit . "bf6450a3540aa3538546d312324c41befd0a4e54") (:authors ("myuhe ")) (:maintainers ("myuhe")) (:maintainer "myuhe") (:keywords "convenience" "iimage.el" "cacoo.el") (:url . "https://github.com/myuhe/inlineR.el"))]) + (inputrc-mode . [(20231203 2307) ((emacs (27 1))) "Major mode for readline configuration" tar ((:commit . "c1d5984fb30165ec72636123fc2e36389314eb62") (:authors ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainers ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainer "Noah Peart" . "noah.v.peart@gmail.com") (:keywords "languages" "readline" "config") (:url . "https://github.com/nverno/inputrc-mode"))]) (insecure-lock . [(20230426 53) ((emacs (28 1))) "Extensible screen lock framework" tar ((:commit . "33b2cf4ecf80d948cf0942aa8bc1787d44c99941") (:authors ("Qiantan Hong" . "qhong@alum.mit.edu")) (:maintainers ("Qiantan Hong" . "qhong@alum.mit.edu")) (:maintainer "Qiantan Hong" . "qhong@alum.mit.edu") (:keywords "unix" "screensaver" "security") (:url . "https://github.com/BlueFlo0d/insecure-lock"))]) (insert-char-preview . [(20201023 2108) ((emacs (24 1))) "Insert Unicode char" tar ((:commit . "8f13262ebcb3f271f1d188584d04ca6d87214111") (:authors ("Matsievskiy S.V.")) (:maintainers ("Matsievskiy S.V.")) (:maintainer "Matsievskiy S.V.") (:keywords "convenience") (:url . "https://gitlab.com/matsievskiysv/insert-char-preview"))]) (insert-esv . [(20201201 722) ((emacs (24 3)) (request (0 3 2))) "Insert ESV Bible passages" tar ((:commit . "b6b47f1521f221e0c2a215f1f802708e10294422") (:authors ("Sam (sam030820)")) (:maintainers ("Sam (sam030820)")) (:maintainer "Sam (sam030820)") (:keywords "convenience") (:url . "https://github.com/sam030820/insert-esv/"))]) @@ -2625,23 +2690,25 @@ (io-mode . [(20161004 756) nil "Major mode to edit Io language files in Emacs" tar ((:commit . "fd65ae769093defcf554d6d637eba6e6dfc29f56") (:authors ("Sergei Lebedev" . "superbobry@gmail.com")) (:maintainers ("Sergei Lebedev" . "superbobry@gmail.com")) (:maintainer "Sergei Lebedev" . "superbobry@gmail.com") (:keywords "languages" "io") (:url . "https://github.com/superbobry/io-mode"))]) (io-mode-inf . [(20140128 1934) nil "Interaction with an Io interpreter." tar ((:commit . "6dd2bac3fd87484bb7d97e135b06c29d70b444b6") (:keywords "io" "languages") (:url . "https://github.com/slackorama/io-emacs"))]) (iodine-theme . [(20151031 1639) ((emacs (24))) "A light emacs color theme" tar ((:commit . "02fb780e1d8d8a6b9c709bfac399abe1665c6999") (:authors ("Srđan Panić" . "srdja.panic@gmail.com")) (:maintainers ("Srđan Panić" . "srdja.panic@gmail.com")) (:maintainer "Srđan Panić" . "srdja.panic@gmail.com") (:keywords "themes") (:url . "https://github.com/srdja/iodine-theme"))]) + (iota . [(20230918 1028) nil "Replace marker with increasing integers" tar ((:commit . "c065c087567f074bff639eb12fa53018654b8ce2") (:authors ("Thomas Voss" . "mail@thomasvoss.com")) (:maintainers ("Thomas Voss" . "mail@thomasvoss.com")) (:maintainer "Thomas Voss" . "mail@thomasvoss.com") (:keywords "abbrev" "data" "wp") (:url . "https://git.sr.ht/~mango/iota.el"))]) (ipcalc . [(20210903 958) ((cl-lib (0 5))) "IP subnet calculator" tar ((:commit . "05fcb5bb8db3ba0c1f9e5f1bfcf0c183828a2426") (:authors ("\"Aleksandar Simic\"" . "asimic@gmail.com")) (:maintainers ("\"Aleksandar Simic\"" . "asimic@gmail.com")) (:maintainer "\"Aleksandar Simic\"" . "asimic@gmail.com") (:keywords "networking" "tools") (:url . "http://github.com/dotemacs/ipcalc.el"))]) - (iplayer . [(20161120 2120) nil "Browse and download BBC TV/radio shows" tar ((:commit . "b788fffa4b36bbd558047ffa6be51b1f0f462f23") (:authors ("Christophe Rhodes" . "csr21@cantab.net")) (:maintainers ("Christophe Rhodes" . "csr21@cantab.net")) (:maintainer "Christophe Rhodes" . "csr21@cantab.net") (:keywords "multimedia" "bbc") (:url . "https://github.com/csrhodes/iplayer-el"))]) + (iplayer . [(20240305 1633) nil "Browse and download BBC TV/radio shows" tar ((:commit . "62d3ca74e4f4d4f72f17e9075b06d0ba561ae5df") (:authors ("Christophe Rhodes" . "csr21@cantab.net")) (:maintainers ("Christophe Rhodes" . "csr21@cantab.net")) (:maintainer "Christophe Rhodes" . "csr21@cantab.net") (:keywords "multimedia" "bbc") (:url . "https://github.com/csrhodes/iplayer-el"))]) (ipp . [(20230714 1021) ((cl-lib (0 5)) (emacs (24 1))) "Implementation of the Internet Printing Protocol" tar ((:commit . "2b9359ca49acc558fe15622f63e2d31843cdc1f5") (:authors ("Eric Marsden" . "eric.marsden@risk-engineering.org")) (:maintainers ("Eric Marsden" . "eric.marsden@risk-engineering.org")) (:maintainer "Eric Marsden" . "eric.marsden@risk-engineering.org") (:keywords "printing" "hardware") (:url . "https://github.com/emarsden/ipp-el"))]) (ipretty . [(20180606 522) nil "Interactive Emacs Lisp pretty-printing" tar ((:commit . "042f5cc4e6f81d59115e8335c582bb5c571c2585") (:authors ("steckerhalter")) (:maintainers ("steckerhalter")) (:maintainer "steckerhalter") (:keywords "pretty-print" "elisp" "buffer") (:url . "https://framagit.org/steckerhalter/ipretty"))]) (ipython-shell-send . [(20190220 2246) ((emacs (24))) "Send code (including magics) to ipython shell" tar ((:commit . "0faed86faff02a361f23ce5fc923d0e9b09bb2da") (:authors ("Jack Kamm" . "jackkamm@gmail.com")) (:maintainers ("Jack Kamm" . "jackkamm@gmail.com")) (:maintainer "Jack Kamm" . "jackkamm@gmail.com") (:keywords "tools" "processes") (:url . "https://github.com/jackkamm/ipython-shell-send-el"))]) (iqa . [(20200520 1137) ((emacs (24 3))) "Init file(and directory) Quick Access" tar ((:commit . "03f90a2f68b2f05d8a2509bf3612a337d3d5b67f") (:url . "https://github.com/a13/iqa.el"))]) (ir-black-theme . [(20130303 755) nil "Port of ir-black theme" tar ((:commit . "ee6078bc67cbc15184e64e0f1fc8542d4079d55f") (:authors ("Jon-Michael Deldin" . "dev@jmdeldin.com")) (:maintainers ("Jon-Michael Deldin" . "dev@jmdeldin.com")) (:maintainer "Jon-Michael Deldin" . "dev@jmdeldin.com") (:keywords "faces"))]) (iregister . [(20150515 2107) nil "Interactive register commands for Emacs." tar ((:commit . "6a48c66187289de5f300492be11c83e98410c018") (:authors ("Andrey Tykhonov" . "atykhonov@gmail.com")) (:maintainers ("Andrey Tykhonov" . "atykhonov@gmail.com")) (:maintainer "Andrey Tykhonov" . "atykhonov@gmail.com") (:keywords "convenience") (:url . "https://github.com/atykhonov/iregister.el"))]) - (irony . [(20220110 849) ((cl-lib (0 5)) (json (1 2))) "C/C++ minor mode powered by libclang" tar ((:commit . "870d1576fb279bb93f776a71e65f45283c423a9e") (:authors ("Guillaume Papin" . "guillaume.papin@epitech.eu")) (:maintainers ("Guillaume Papin" . "guillaume.papin@epitech.eu")) (:maintainer "Guillaume Papin" . "guillaume.papin@epitech.eu") (:keywords "c" "convenience" "tools") (:url . "https://github.com/Sarcasm/irony-mode"))]) + (irony . [(20231018 1915) ((cl-lib (0 5)) (json (1 2))) "C/C++ minor mode powered by libclang" tar ((:commit . "40e0ce19eb850bdf1f77225f11713cc816250d95") (:authors ("Guillaume Papin" . "guillaume.papin@epitech.eu")) (:maintainers ("Guillaume Papin" . "guillaume.papin@epitech.eu")) (:maintainer "Guillaume Papin" . "guillaume.papin@epitech.eu") (:keywords "c" "convenience" "tools") (:url . "https://github.com/Sarcasm/irony-mode"))]) (irony-eldoc . [(20200622 2214) ((emacs (24)) (cl-lib (0 5)) (irony (0 1))) "irony-mode support for eldoc-mode" tar ((:commit . "73e79a89fad982a2ba072f2fcc1b4e41f0aa2978") (:authors ("Kirill Ignatiev ")) (:maintainers ("Kirill Ignatiev ")) (:maintainer "Kirill Ignatiev ") (:keywords "c" "c++" "objc" "convenience" "tools") (:url . "https://github.com/ikirill/irony-eldoc"))]) (iscroll . [(20220612 310) ((emacs (26 0))) "Smooth scrolling over images" tar ((:commit . "76aa4e7e72f907e95715351819d9efb6336b8238") (:authors ("Yuan Fu" . "casouri@gmail.com")) (:maintainers ("Yuan Fu" . "casouri@gmail.com")) (:maintainer "Yuan Fu" . "casouri@gmail.com") (:keywords "convenience" "image") (:url . "https://github.com/casouri/iscroll"))]) (isearch-dabbrev . [(20141224 622) ((cl-lib (0 5))) "Use dabbrev in isearch" tar ((:commit . "1efe7abba4923015cbc2462395deaec5446a9cc8") (:authors ("Dewdrops" . "v_v_4474@126.com")) (:maintainers ("Dewdrops" . "v_v_4474@126.com")) (:maintainer "Dewdrops" . "v_v_4474@126.com") (:keywords "dabbrev" "isearch") (:url . "https://github.com/Dewdrops/isearch-dabbrev"))]) - (isearch-project . [(20230517 2157) ((emacs (27 1)) (f (0 20 0))) "Incremental search through the whole project" tar ((:commit . "b341ae06f5895d0666ad361f287036b1dfd7b3b7") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "search") (:url . "https://github.com/jcs-elpa/isearch-project"))]) + (isearch-project . [(20240101 940) ((emacs (27 1)) (f (0 20 0))) "Incremental search through the whole project" tar ((:commit . "07f26dee4636b8e17179dcf57622d40f8d6fee38") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "search") (:url . "https://github.com/jcs-elpa/isearch-project"))]) (isearch-symbol-at-point . [(20130728 2221) nil "Use isearch to search for the symbol at point" tar ((:commit . "51a1029bec1ec414885f9edb7e5947603dffdab2") (:authors ("atom smith")) (:maintainers ("atom smith")) (:maintainer "atom smith") (:keywords "isearch") (:url . "https://github.com/re5et/isearch-symbol-at-point"))]) (isend-mode . [(20210106 1506) nil "Interactively send parts of an Emacs buffer to an interpreter" tar ((:commit . "ea855f63be7febc15bd08aec6229fab9407734fb") (:authors ("François Févotte" . "fevotte@gmail.com")) (:maintainers ("François Févotte" . "fevotte@gmail.com")) (:maintainer "François Févotte" . "fevotte@gmail.com") (:url . "https://github.com/ffevotte/isend-mode.el"))]) (isgd . [(20150414 936) nil "Shorten URLs using the isgd.com shortener service" tar ((:commit . "764306dadd5a9213799081a48aba22f7c75cca9a") (:authors ("Chmouel Boudjnah" . "chmouel@chmouel.com")) (:maintainers ("Chmouel Boudjnah" . "chmouel@chmouel.com")) (:maintainer "Chmouel Boudjnah" . "chmouel@chmouel.com") (:url . "https://github.com/chmouel/isgd.el"))]) (islisp-mode . [(20220924 1043) ((emacs (26 3))) "Major mode for ISLisp programming" tar ((:commit . "bbf45d02495f9455e91beed01676178dfa5d3561") (:authors ("Fermin Munoz")) (:maintainers ("Fermin Munoz" . "fmfs@posteo.net")) (:maintainer "Fermin Munoz" . "fmfs@posteo.net") (:keywords "islisp" "lisp" "programming") (:url . "https://gitlab.com/sasanidas/islisp-mode"))]) + (iso-639 . [(20240218 1008) ((emacs (25 1)) (levenshtein (20090830 1040))) "ISO 639" tar ((:commit . "c217a36102a566bbaf6f0aec81511fc5a9cfc247") (:authors ("Wamm K. D." . "jaft.r@outlook.com")) (:maintainers ("Wamm K. D." . "jaft.r@outlook.com")) (:maintainer "Wamm K. D." . "jaft.r@outlook.com") (:keywords "tools" "multilingual" "language" "iso-639") (:url . "https://codeberg.org/WammKD/emacs-iso-639"))]) (isortify . [(20230821 1632) ((emacs (25)) (pythonic (0 1 0))) "(automatically) format python buffers using isort" tar ((:commit . "5ee404c5bee2772b4f3ee424df0a5b0aef7e6982") (:authors ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainers ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainer "Artem Malyshev" . "proofit404@gmail.com") (:keywords "convenience" "isort") (:url . "https://github.com/proofit404/isortify"))]) (ispc-mode . [(20201215 852) nil "Syntax coloring for ispc programs" tar ((:commit . "bedfff2528157d4bb0b75927c459631bebe2b1ce") (:authors ("Philip Munksgaard" . "philip@munksgaard.me")) (:maintainers ("Philip Munksgaard" . "philip@munksgaard.me")) (:maintainer "Philip Munksgaard" . "philip@munksgaard.me") (:keywords "c" "ispc") (:url . "https://github.com/Munksgaard/ispc-mode"))]) (iss-mode . [(20141001 1913) nil "Mode for InnoSetup install scripts" tar ((:commit . "3b517aff31529bab33f8d7b562bd17aff0107fd1") (:authors ("Stefan Reichoer," . "stefan@xsteve.at")) (:maintainers ("Stefan Reichoer," . "stefan@xsteve.at")) (:maintainer "Stefan Reichoer," . "stefan@xsteve.at"))]) @@ -2651,32 +2718,33 @@ (iterator . [(20210109 1859) ((emacs (24)) (cl-lib (0 5))) "A library to create and use elisp iterators objects." tar ((:commit . "b514d4d1d0167e5973afbc93a34070d1aa967d82") (:authors ("Thierry Volpiatto ")) (:maintainers ("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 ")) (:maintainers ("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 ")) (:maintainers ("KAWABATA, Taichi ")) (:maintainer "KAWABATA, Taichi ") (:keywords "text") (:url . "http://github.com/kawabata/ivs-edit"))]) - (ivy . [(20230714 751) ((emacs (24 5))) "Incremental Vertical completYon" tar ((:commit . "9d630d800e856a2c984c5a62a6f0ad313a9d2228") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "matching") (:url . "https://github.com/abo-abo/swiper"))]) - (ivy-avy . [(20230410 1815) ((emacs (24 5)) (ivy (0 14 0)) (avy (0 5 0))) "Avy integration for Ivy" tar ((:commit . "d28225e86f8dfb3825809ad287f759f95ee9e479") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "convenience") (:url . "https://github.com/abo-abo/swiper"))]) + (ivy . [(20240214 2118) ((emacs (24 5))) "Incremental Vertical completYon" tar ((:commit . "749ac1235a7948011cb0caddd4c31037e3314614") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Basil L. Contovounesios" . "basil@contovou.net")) (:maintainer "Basil L. Contovounesios" . "basil@contovou.net") (:keywords "matching") (:url . "https://github.com/abo-abo/swiper"))]) + (ivy-avy . [(20240214 2118) ((emacs (24 5)) (ivy (0 14 2)) (avy (0 5 0))) "Avy integration for Ivy" tar ((:commit . "749ac1235a7948011cb0caddd4c31037e3314614") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Basil L. Contovounesios" . "basil@contovou.net")) (:maintainer "Basil L. Contovounesios" . "basil@contovou.net") (: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" tar ((:commit . "bb47f355b0da8518aa3fb516019120c14c8747c9") (:authors ("Justin Burkett" . "justin@burkett.cc")) (:maintainers ("Titus von der Malsburg" . "malsburg@posteo.de")) (: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" tar ((:commit . "7c200cd4732821187084fad23547ee3f58365062") (:authors ("William Carroll" . "wpcarro@gmail.com")) (:maintainers ("William Carroll" . "wpcarro@gmail.com")) (:maintainer "William Carroll" . "wpcarro@gmail.com") (:url . "https://github.com/wpcarro/ivy-clipmenu.el"))]) (ivy-clojuredocs . [(20201129 2355) ((edn (1 1 2)) (ivy (0 12 0)) (emacs (24 4))) "Search for help in clojuredocs.org" tar ((:commit . "8b6de19b3578c72d2b88f898e2290d94c04350f9") (:authors ("Wanderson Ferreira" . "iagwanderson@gmail.com")) (:maintainers ("Wanderson Ferreira" . "iagwanderson@gmail.com")) (:maintainer "Wanderson Ferreira" . "iagwanderson@gmail.com") (:keywords "matching") (:url . "https://github.com/wandersoncferreira/ivy-clojuredocs"))]) (ivy-dired-history . [(20210715 48) ((ivy (0 9 0)) (counsel (0 9 0)) (cl-lib (0 5))) "use ivy to open recent directories" tar ((:commit . "dba848929cb063a5536cb442c70be1099e2f5baa") (:authors ("纪秀峰" . "jixiuf@gmail.com")) (:maintainers ("纪秀峰" . "jixiuf@gmail.com")) (:maintainer "纪秀峰" . "jixiuf@gmail.com") (:url . "https://github.com/jixiuf/ivy-dired-history"))]) - (ivy-emms . [(20210817 1300) ((ivy (0 13 0)) (emms (0 0)) (emacs (24 4))) "Ivy interface to emms tracks" tar ((:commit . "dfde98c3bdad8136709eac8382ba048fafdcc6ac") (:authors ("Fran Burstall" . "fran.burstall@gmail.com")) (:maintainers ("Fran Burstall" . "fran.burstall@gmail.com")) (:maintainer "Fran Burstall" . "fran.burstall@gmail.com") (:keywords "multimedia") (:url . "https://github.com/franburstall/ivy-emms"))]) + (ivy-emms . [(20231112 1621) ((ivy (0 13 0)) (emms (0 0)) (emacs (24 4))) "Ivy interface to emms tracks" tar ((:commit . "3b1bda7be64ba5555672b6375c205e0f7d831bc0") (:authors ("Fran Burstall" . "fran.burstall@gmail.com")) (:maintainers ("Fran Burstall" . "fran.burstall@gmail.com")) (:maintainer "Fran Burstall" . "fran.burstall@gmail.com") (:keywords "multimedia") (:url . "https://github.com/franburstall/ivy-emms"))]) (ivy-emoji . [(20200316 2351) ((emacs (26 1)) (ivy (0 13 0))) "Insert emojis with ivy" tar ((:commit . "45894a1f8f8c67b142e1dd1113f47d703dea0b59") (:authors ("Gabriele Bozzola" . "sbozzolator@gmail.com")) (:maintainers ("Gabriele Bozzola" . "sbozzolator@gmail.com")) (:maintainer "Gabriele Bozzola" . "sbozzolator@gmail.com") (:keywords "emoji" "ivy" "convenience") (:url . "https://github.com/sbozzolo/ivy-emoji.git"))]) (ivy-erlang-complete . [(20211019 447) ((async (1 9)) (counsel (0 13 4)) (ivy (0 13 4)) (erlang (19 2)) (emacs (25 1))) "Erlang context sensitive completion at point using ivy. It also support xref and eldoc." tar ((:commit . "6913f6ef7c942a5a2c42bc17635d09c91353e7ca") (:authors ("Sergey Kostyaev" . "feo.me@ya.ru")) (:maintainer "Sergey Kostyaev" . "feo.me@ya.ru") (:keywords "languages" "tools"))]) (ivy-explorer . [(20190909 1921) ((emacs (25)) (ivy (0 10 0))) "Dynamic file browsing grid using ivy" tar ((:commit . "a413966cfbcecacc082d99297fa1abde0c10d3f3") (:authors ("Clemens Radermacher" . "clemera@posteo.net")) (:maintainers ("Clemens Radermacher" . "clemera@posteo.net")) (:maintainer "Clemens Radermacher" . "clemera@posteo.net") (:keywords "convenience" "files" "matching") (:url . "https://github.com/clemera/ivy-explorer"))]) - (ivy-file-preview . [(20220704 653) ((emacs (25 1)) (ivy (0 8 0)) (s (1 12 0)) (f (0 20 0))) "Preview the current ivy file selection" tar ((:commit . "716415a12db2c0166c6fb229e41623587b212719") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "file" "ivy" "swiper" "preview" "select" "selection") (:url . "https://github.com/jcs-elpa/ivy-file-preview"))]) + (ivy-file-preview . [(20240101 1004) ((emacs (25 1)) (ivy (0 8 0)) (s (1 12 0)) (f (0 20 0))) "Preview the current ivy file selection" tar ((:commit . "c1ea280cffa52710fffb14b2285a9a9474d18fa5") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "file" "ivy" "swiper" "preview" "select" "selection") (:url . "https://github.com/jcs-elpa/ivy-file-preview"))]) (ivy-fuz . [(20191222 946) ((emacs (25 1)) (fuz (1 3 0)) (ivy (0 13 0))) "Integration between fuz and ivy." tar ((:commit . "f171ac73422a4bae1503d63d804e691482ed35b2") (:authors ("Zhu Zihao" . "all_but_last@163.com")) (:maintainers ("Philippe Vaucher" . "philippe.vaucher@gmail.com")) (:maintainer "Philippe Vaucher" . "philippe.vaucher@gmail.com") (:keywords "convenience") (:url . "https://github.com/Silex/ivy-fuz.el"))]) (ivy-gitlab . [(20181228 826) ((s (1 9 0)) (dash (2 9 0)) (ivy (0 8 0)) (gitlab (0 8))) "Ivy interface to Gitlab" tar ((:commit . "8c2324c02119500f094c2f92dfaba4c9977ce1ba") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainers ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "gitlab" "ivy") (:url . "https://github.com/nlamirault/emacs-gitlab"))]) (ivy-historian . [(20210714 56) ((emacs (24 4)) (historian (20170111)) (ivy (0 8 0)) (flx (0 6 1))) "Persistently store selected minibuffer candidates" tar ((:commit . "852cb4e72c0f78c8dbb2c972bdcb4e7b0108ff4c") (:authors ("PythonNut" . "pythonnut@pythonnut.com")) (:maintainers ("PythonNut" . "pythonnut@pythonnut.com")) (:maintainer "PythonNut" . "pythonnut@pythonnut.com") (:keywords "convenience" "ivy") (:url . "https://github.com/PythonNut/historian.el"))]) - (ivy-hydra . [(20230410 1815) ((emacs (24 5)) (ivy (0 14 0)) (hydra (0 14 0))) "Additional key bindings for Ivy" tar ((:commit . "d28225e86f8dfb3825809ad287f759f95ee9e479") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "convenience") (:url . "https://github.com/abo-abo/swiper"))]) + (ivy-hoogle . [(20240102 908) ((emacs (28 1)) (async (1 9)) (ivy (0 13 2))) "Search Hoogle using ivy" tar ((:commit . "4b080018175b5770fd3571265bc846a4a845cdca") (:authors ("Aliaksei Artamonau" . "aliaksiej.artamonau@gmail.com")) (:maintainers ("Aliaksei Artamonau" . "aliaksiej.artamonau@gmail.com")) (:maintainer "Aliaksei Artamonau" . "aliaksiej.artamonau@gmail.com") (:keywords "matching" "haskell" "hoogle") (:url . "https://github.com/aartamonau/ivy-hoogle"))]) + (ivy-hydra . [(20240214 2118) ((emacs (24 5)) (ivy (0 14 2)) (hydra (0 14 0))) "Additional key bindings for Ivy" tar ((:commit . "749ac1235a7948011cb0caddd4c31037e3314614") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Basil L. Contovounesios" . "basil@contovou.net")) (:maintainer "Basil L. Contovounesios" . "basil@contovou.net") (:keywords "convenience") (:url . "https://github.com/abo-abo/swiper"))]) (ivy-lobsters . [(20200818 1406) ((ivy (0 8 0)) (cl-lib (0 5))) "Browse lobste.rs stories with ivy." tar ((:commit . "3f7f90751d15ebcf91253ef3cda18c0aa7d856ff") (:authors ("Julien Blanchard ")) (:maintainers ("Julien Blanchard ")) (:maintainer "Julien Blanchard ") (:url . "https://github.com/julienXX/ivy-lobsters"))]) (ivy-migemo . [(20230121 1934) ((emacs (24 3)) (ivy (0 13 0)) (migemo (1 9 2)) (nadvice (0 3))) "Use migemo on ivy" tar ((:commit . "6022b24e72f073a7b5599f2dea611da3a1282378") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainers ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com") (:keywords "matching") (:url . "https://github.com/ROCKTAKEY/ivy-migemo"))]) (ivy-mpdel . [(20190428 920) ((emacs (25 1)) (ivy (0 10 0)) (libmpdel (1 0 0)) (mpdel (1 0 0))) "Ivy interface to navigate MPD" tar ((:commit . "a42dcc943914c71975c115195d38c739f25e475c") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:keywords "multimedia") (:url . "https://gitlab.petton.fr/mpdel/ivy-mpdel"))]) (ivy-omni-org . [(20200810 1050) ((emacs (25 1)) (ivy (0 13)) (dash (2 12))) "Browse anything in Org mode" tar ((:commit . "b6a27379bc40fd6530a84afc50b3f41cd488e0c9") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainers ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:keywords "outlines") (:url . "https://github.com/akirak/ivy-omni-org"))]) (ivy-pass . [(20170812 1955) ((emacs (24)) (ivy (0 8 0)) (password-store (1 6 5))) "ivy interface for pass" tar ((:commit . "5b523de1151f2109fdd6a8114d0af12eef83d3c5") (:authors ("ecraven")) (:maintainers ("ecraven")) (:maintainer "ecraven") (:keywords "pass" "password" "convenience" "data") (:url . "https://github.com/ecraven/ivy-pass/"))]) (ivy-posframe . [(20211217 234) ((emacs (26 0)) (posframe (1 0 0)) (ivy (0 13 0))) "Using posframe to show Ivy" tar ((:commit . "533a8e368fcabfd534761a5c685ce713376fa594") (:authors ("Feng Shu" . "tumashu@163.com") ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:keywords "abbrev" "convenience" "matching" "ivy") (:url . "https://github.com/tumashu/ivy-posframe"))]) - (ivy-prescient . [(20221216 112) ((emacs (25 1)) (prescient (6 1 0)) (ivy (0 11 0))) "prescient.el + Ivy" tar ((:commit . "72b023f5fc1ae2bbf2f51f1786cc012d40671bf4") (:authors ("Radian LLC" . "contact+prescient@radian.codes")) (:maintainers ("Radian LLC" . "contact+prescient@radian.codes")) (:maintainer "Radian LLC" . "contact+prescient@radian.codes") (:keywords "extensions") (:url . "https://github.com/raxod502/prescient.el"))]) + (ivy-prescient . [(20240226 204) ((emacs (25 1)) (prescient (6 1 0)) (ivy (0 11 0))) "prescient.el + Ivy" tar ((:commit . "c39bf07c56b427bf41aafd7d20eaef5cf3c312b5") (:authors ("Radian LLC" . "contact+prescient@radian.codes")) (:maintainers ("Radian LLC" . "contact+prescient@radian.codes")) (:maintainer "Radian LLC" . "contact+prescient@radian.codes") (:keywords "extensions") (:url . "https://github.com/raxod502/prescient.el"))]) (ivy-purpose . [(20160724 1003) ((emacs (24)) (ivy (0 8)) (window-purpose (1 5))) "Ivy Interface for Purpose" tar ((:commit . "0495f2f3aed64d7e0028125e76a9a68f8fc4107e") (:authors ("Bar Magal (2016)")) (:maintainers ("Bar Magal (2016)")) (:maintainer "Bar Magal (2016)") (:url . "https://github.com/bmag/ivy-purpose"))]) (ivy-rich . [(20230425 1422) ((emacs (25 1)) (ivy (0 13 0))) "More friendly display transformer for ivy" tar ((:commit . "aff9b6bd53e0fdcf350ab83c90e64e651b47dba4") (:authors ("Yevgnen Koh" . "wherejoystarts@gmail.com")) (:maintainers ("Yevgnen Koh" . "wherejoystarts@gmail.com")) (:maintainer "Yevgnen Koh" . "wherejoystarts@gmail.com") (:keywords "convenience" "ivy") (:url . "https://github.com/Yevgnen/ivy-rich"))]) (ivy-rtags . [(20191222 920) ((ivy (0 7 0)) (rtags (2 10))) "RTags completion back-end for ivy" tar ((:commit . "595055b5316a7c92ba1d638f324f98842a0f41a5") (:authors ("Jan Erik Hanssen" . "jhanssen@gmail.com") ("Anders Bakken" . "agbakken@gmail.com")) (:maintainers ("Jan Erik Hanssen" . "jhanssen@gmail.com")) (:maintainer "Jan Erik Hanssen" . "jhanssen@gmail.com") (:url . "https://github.com/Andersbakken/rtags"))]) - (ivy-searcher . [(20220704 653) ((emacs (25 1)) (ivy (0 8 0)) (searcher (0 1 8)) (s (1 12 0)) (f (0 20 0))) "Ivy interface to use searcher" tar ((:commit . "5ed00a1e273cdb33ce356f373427b65fb131021a") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "ivy" "interface" "searcher" "search" "replace" "grep" "ag" "rg") (:url . "https://github.com/jcs-elpa/ivy-searcher"))]) + (ivy-searcher . [(20240101 1004) ((emacs (25 1)) (ivy (0 8 0)) (searcher (0 1 8)) (s (1 12 0)) (f (0 20 0))) "Ivy interface to use searcher" tar ((:commit . "1b6f6aed1b371c45b5d8be8aaf6d6e89eba5e0f1") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "ivy" "interface" "searcher" "search" "replace" "grep" "ag" "rg") (:url . "https://github.com/jcs-elpa/ivy-searcher"))]) (ivy-spotify . [(20210329 312) ((emacs (26 1)) (espotify (0 1)) (ivy (0 13 1))) "Search spotify with ivy" tar ((:commit . "eefcb49d740570f6c874302d87be33e5b0ec54ff") (:authors ("Jose A Ortega Ruiz" . "jao@gnu.org")) (:maintainers ("Jose A Ortega Ruiz")) (:maintainer "Jose A Ortega Ruiz") (:keywords "multimedia") (:url . "https://codeberg.org/jao/espotify"))]) (ivy-todo . [(20200323 2005) ((ivy (0 8 0)) (emacs (25))) "Manage org-mode TODOs with ivy" tar ((:commit . "d74501cd334b7d709659946c5e02b21cfd5507de") (:authors ("Erik Sjöstrand" . "sjostrand.erik@gmail.com")) (:maintainers ("Erik Sjöstrand" . "sjostrand.erik@gmail.com")) (:maintainer "Erik Sjöstrand" . "sjostrand.erik@gmail.com") (:keywords "convenience") (:url . "https://github.com/Kungsgeten/ivy-todo"))]) (ivy-xcdoc . [(20160917 1055) ((ivy (0 8 0)) (emacs (24 4))) "Search Xcode documents with ivy interface." tar ((:commit . "fbf264b0746182567b17fd7409fff8eed3658c71") (:authors ("C.T.Chen" . "chenct@7adybird.com")) (:maintainers ("C.T.Chen" . "chenct@7adybird.com")) (:maintainer "C.T.Chen" . "chenct@7adybird.com") (:keywords "ivy" "xcode" "xcdoc") (:url . "https://github.com/hex2010/emacs-ivy-xcdoc"))]) @@ -2686,11 +2754,12 @@ (ivy-youtube . [(20230503 1509) ((request (0 2 0)) (ivy (0 8 0)) (cl-lib (0 5))) "Query YouTube and play videos in your browser" tar ((:commit . "e7a7cc860e967500857e5fd85d8e397c6d752ee1") (:authors ("Brunno dos Santos")) (:maintainers ("Brunno dos Santos")) (:maintainer "Brunno dos Santos") (:keywords "youtube" "multimedia" "mpv" "vlc") (:url . "https://github.com/squiter/ivy-youtube"))]) (ix . [(20131027 1657) ((grapnel (0 5 3))) "Emacs client for http://ix.io pastebin" tar ((:commit . "498dac674f4f1910d39087b1457c5da5465a0614") (:authors ("Abhishek L" . "abhishekl.2006@gmail.com")) (:maintainers ("Abhishek L" . "abhishekl.2006@gmail.com")) (:maintainer "Abhishek L" . "abhishekl.2006@gmail.com") (:url . "http://www.github.com/theanalyst/ix.el"))]) (j-mode . [(20171224 1856) nil "Major mode for editing J programs" tar ((:commit . "e8725ac8af95498faabb2ca3ab3bd809a8f148e6") (:keywords "j" "languages") (:url . "http://github.com/zellio/j-mode"))]) - (jabber . [(20230715 456) ((fsm (0 2)) (srv (0 2))) "A Jabber client for Emacs." tar ((:commit . "c52d60d0a1fd209301c8434634259946c61a5f53") (:authors ("Magnus Henoch" . "mange@freemail.hu")) (:maintainer "wgreenhouse" . "wgreenhouse@tilde.club") (:keywords "comm") (:url . "https://codeberg.org/emacs-jabber/emacs-jabber"))]) + (jabber . [(20240306 524) ((emacs (27 1)) (fsm (0 2)) (srv (0 2))) "A Jabber client for Emacs." tar ((:commit . "633cb73633143ec093c291af94b008f456037e8b") (:authors ("Magnus Henoch" . "mange@freemail.hu")) (:maintainer "wgreenhouse" . "wgreenhouse@tilde.club") (:keywords "comm") (:url . "https://codeberg.org/emacs-jabber/emacs-jabber"))]) (jack . [(20221122 632) ((emacs (28 1))) "HTML generator library" tar ((:commit . "3b4ea97fcc107d0ffd201ea695129af52f390113") (:authors ("Tony Aldon" . "tony.aldon.adm@gmail.com")) (:maintainers ("Tony Aldon" . "tony.aldon.adm@gmail.com")) (:maintainer "Tony Aldon" . "tony.aldon.adm@gmail.com") (:keywords "lisp" "html") (:url . "https://github.com/tonyaldon/jack"))]) (jack-connect . [(20220201 1417) nil "Manage jack connections within Emacs" tar ((:commit . "1acaebfe8f37f0194e95c3e812c9515a6f688eee") (:authors ("Stefano Barbi" . "stefanobarbi@gmail.com")) (:maintainers ("Stefano Barbi" . "stefanobarbi@gmail.com")) (:maintainer "Stefano Barbi" . "stefanobarbi@gmail.com"))]) + (jack-ts-mode . [(20231110 1615) ((emacs (29 1))) "Major mode for jack buffers using tree-sitter" tar ((:commit . "f57f211d96608a90142619a925caeb8808e7c632") (:authors ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainers ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainer "Noah Peart" . "noah.v.peart@gmail.com") (:keywords "tree-sitter" "languages" "jack" "nand2tetris") (:url . "https://github.com/nverno/jack-ts-mode"))]) (jade-mode . [(20210908 2121) nil "Major mode for editing .jade files" tar ((:commit . "111460b056838854e470a6383041a99f843b93ee") (:authors ("Brian M. Carlson and other contributors")) (:maintainers ("Brian M. Carlson and other contributors")) (:maintainer "Brian M. Carlson and other contributors") (:keywords "languages") (:url . "https://github.com/brianc/jade-mode"))]) - (jami-bot . [(20230416 2005) ((emacs (27 1))) "An extendable chat bot for the private messenger GNU Jami" tar ((:commit . "21673c5844f9a1ea9ba49f1a68c72b1fe7cb9f91") (:authors ("Hanno Perrey ")) (:maintainers ("Hanno Perrey" . "hanno@hoowl.se")) (:maintainer "Hanno Perrey" . "hanno@hoowl.se") (:keywords "comm" "jami" "messenger" "chat bot" "dbus") (:url . "https://gitlab.com/hperrey/jami-bot"))]) + (jami-bot . [(20240203 1017) ((emacs (27 1))) "An extendable chat bot for the private messenger GNU Jami" tar ((:commit . "c2ad37e2ada14b5551a83211cc4692b39be4e5fb") (:authors ("Hanno Perrey" . "hanno@hoowl.se")) (:maintainers ("Hanno Perrey" . "hanno@hoowl.se")) (:maintainer "Hanno Perrey" . "hanno@hoowl.se") (:keywords "comm" "jami" "messenger" "chat bot" "dbus") (:url . "https://gitlab.com/hperrey/jami-bot"))]) (jammer . [(20210508 1633) ((emacs (24 1))) "Punish yourself for using Emacs inefficiently" tar ((:commit . "a780e4c2adb2e85a4daadcefd1a2b189d761872f") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainers ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de") (:keywords "games") (:url . "https://depp.brause.cc/jammer"))]) (janet-mode . [(20210924 44) ((emacs (24 3))) "Defines a major mode for Janet" tar ((:commit . "9e3254a0249d720d5fa5603f1f8c3ed0612695af") (:authors ("Adam Schwalm" . "adamschwalm@gmail.com")) (:maintainers ("Adam Schwalm" . "adamschwalm@gmail.com")) (:maintainer "Adam Schwalm" . "adamschwalm@gmail.com") (:url . "https://github.com/ALSchwalm/janet-mode"))]) (japanese-holidays . [(20201229 755) ((emacs (24 1)) (cl-lib (0 3))) "Calendar functions for the Japanese calendar" tar ((:commit . "324b6bf2f55ec050bef49e001caedaabaf4fa35d") (:authors ("Takashi Hattori" . "hattori@sfc.keio.ac.jp") ("Hiroya Murata" . "lapis-lazuli@pop06.odn.ne.jp")) (:maintainers ("Takashi Hattori" . "hattori@sfc.keio.ac.jp")) (:maintainer "Takashi Hattori" . "hattori@sfc.keio.ac.jp") (:keywords "calendar") (:url . "https://github.com/emacs-jp/japanese-holidays"))]) @@ -2706,7 +2775,7 @@ (jazz-theme . [(20230814 1916) nil "A warm color theme for Emacs 24+." tar ((:commit . "b936b392e3ea3b6968530e3d5e5fccb9c454b5f8") (:authors ("Roman Parykin" . "donderom@ymail.com")) (:maintainers ("Roman Parykin" . "donderom@ymail.com")) (:maintainer "Roman Parykin" . "donderom@ymail.com") (:url . "https://github.com/donderom/jazz-theme"))]) (jbeans-theme . [(20200924 1946) ((emacs (24))) "Jbeans theme for GNU Emacs 24 (deftheme)" tar ((:commit . "a63916a928324c42bfbe3016972c2ecff598b1ae") (:authors ("Adam Olsen" . "arolsen@gmail.com")) (:maintainers ("Adam Olsen" . "arolsen@gmail.com")) (:maintainer "Adam Olsen" . "arolsen@gmail.com") (:url . "https://github.com/synic/jbeans-emacs"))]) (jdecomp . [(20170224 2200) ((emacs (24 5))) "Interface to Java decompilers" tar ((:commit . "692866abc83deedce62be8d6040cf24dda7fb7a8") (:authors ("Tianxiang Xiong" . "tianxiang.xiong@gmail.com")) (:maintainers ("Tianxiang Xiong" . "tianxiang.xiong@gmail.com")) (:maintainer "Tianxiang Xiong" . "tianxiang.xiong@gmail.com") (:keywords "decompile" "java" "languages" "tools") (:url . "https://github.com/xiongtx/jdecomp"))]) - (jdee . [(20191102 1426) ((emacs (24 3)) (flycheck (30)) (memoize (1 0 1)) (dash (2 13 0)) (s (1 12 0))) "Java Development Environment for Emacs" tar ((:commit . "8cfe5788348c1f370058ccc0ec01b45300a36c98") (:authors ("Paul Kinnucan" . "pkinnucan@attbi.com")) (:maintainers ("Paul Landes")) (:maintainer "Paul Landes") (:keywords "java" "tools") (:url . "http://github.com/jdee-emacs/jdee"))]) + (jdee . [(20191102 1426) ((emacs (24 3)) (flycheck (30)) (memoize (1 0 1)) (dash (2 13 0)) (s (1 12 0))) "Java Development Environment for Emacs" tar ((:commit . "b510a29f1fc1bea218a6230fb219922775687c78") (:authors ("Paul Kinnucan" . "pkinnucan@attbi.com")) (:maintainers ("Paul Landes")) (:maintainer "Paul Landes") (:keywords "java" "tools") (:url . "http://github.com/jdee-emacs/jdee"))]) (jedi . [(20191011 1750) ((emacs (24)) (jedi-core (0 2 2)) (auto-complete (1 4))) "a Python auto-completion for Emacs" tar ((:commit . "9d5f29116c4d42cae561a9d69e6fba2b61e2cf43") (:authors ("Takafumi Arakaki ")) (:maintainers ("Takafumi Arakaki ")) (:maintainer "Takafumi Arakaki "))]) (jedi-core . [(20210503 1315) ((emacs (24)) (epc (0 1 0)) (python-environment (0 0 2)) (cl-lib (0 5))) "Common code of jedi.el and company-jedi.el" tar ((:commit . "ecb53487c6131d39931ab2927e4b77e9cbfb7204") (:authors ("Takafumi Arakaki ")) (:maintainers ("Takafumi Arakaki ")) (:maintainer "Takafumi Arakaki "))]) (jedi-direx . [(20140310 936) ((jedi (0 1 2)) (direx (0 1 -3))) "Tree style source code viewer for Python buffer" tar ((:commit . "7a2e677400717ed12b959cb5988e7b3fb1c12117") (:authors ("Takafumi Arakaki ")) (:maintainers ("Takafumi Arakaki ")) (:maintainer "Takafumi Arakaki "))]) @@ -2717,63 +2786,66 @@ (jenkins-watch . [(20121004 2326) nil "Watch continuous integration build status" tar ((:commit . "37b84dfbd98240a57ff798e1ff8bc7dba2913577") (:authors ("Andrew Taylor" . "ataylor@redtoad.ca")) (:maintainers ("Andrew Taylor" . "ataylor@redtoad.ca")) (:maintainer "Andrew Taylor" . "ataylor@redtoad.ca") (:url . "https://github.com/ataylor284/jenkins-watch"))]) (jenkinsfile-mode . [(20230525 2006) ((emacs (24)) (groovy-mode (2 0))) "Major mode for editing Jenkins declarative pipeline syntax" tar ((:commit . "568865ee419e0592de0dd0717d6769a66d9df111") (:url . "https://github.com/john2x/jenkinsfile-mode"))]) (jest . [(20220807 2243) ((emacs (24 4)) (dash (2 18 0)) (magit-popup (2 12 0)) (projectile (0 14 0)) (s (1 12 0)) (js2-mode (20180301)) (cl-lib (0 6 1))) "helpers to run jest" tar ((:commit . "c8145635c54bd7df9711000e889753d267afcdc4") (:authors ("Edmund Miller" . "edmund.a.miller@gmail.com")) (:maintainers ("Edmund Miller" . "edmund.a.miller@gmail.com")) (:maintainer "Edmund Miller" . "edmund.a.miller@gmail.com") (:keywords "jest" "javascript" "testing") (:url . "https://github.com/emiller88/emacs-jest/"))]) - (jest-test-mode . [(20220722 1947) ((emacs (25 1))) "Minor mode for running Node.js tests using jest" tar ((:commit . "3126c5c5c5632da639ea34867a7342d4410d78aa") (:authors ("Raymond Huang" . "rymndhng@gmail.com")) (:maintainers ("Raymond Huang" . "rymndhng@gmail.com")) (:maintainer "Raymond Huang" . "rymndhng@gmail.com") (:url . "https://github.com/rymndhng/jest-test-mode.el"))]) + (jest-test-mode . [(20231209 1754) ((emacs (25 1))) "Minor mode for running Node.js tests using jest" tar ((:commit . "a397507d8bb41e4aa6b97994f1d7512e78d3dee3") (:authors ("Raymond Huang" . "rymndhng@gmail.com")) (:maintainers ("Raymond Huang" . "rymndhng@gmail.com")) (:maintainer "Raymond Huang" . "rymndhng@gmail.com") (:url . "https://github.com/rymndhng/jest-test-mode.el"))]) (jet . [(20230525 1334) ((emacs (27 1)) (transient (0 3 7))) "Emacs integration for jet Clojure tool" tar ((:commit . "7a3821c2f351a3770ae23e143f286e6c3a868d38") (:authors ("Eric Dallo" . "ercdll1337@gmail.com")) (:maintainers ("Eric Dallo" . "ercdll1337@gmail.com")) (:maintainer "Eric Dallo" . "ercdll1337@gmail.com") (:keywords "tools") (:url . "https://github.com/ericdallo/jet.el"))]) (jetbrains . [(20180301 502) ((emacs (24 3)) (cl-lib (0 5)) (f (0 17))) "JetBrains IDE bridge" tar ((:commit . "56f71a17d455581c10d48f6dbb31d9e2126227bf") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "tools" "php") (:url . "https://github.com/emacs-php/jetbrains.el"))]) (jetbrains-darcula-theme . [(20230223 1901) nil "A complete port of the default JetBrains Darcula theme" tar ((:commit . "46f153385e50998826ca13e18056c6a972768cfd") (:authors ("Ian Y.E. Pan")) (:maintainers ("Ian Y.E. Pan")) (:maintainer "Ian Y.E. Pan") (:url . "https://github.com/ianpan870102/jetbrains-darcula-emacs-theme"))]) (jg-quicknav . [(20170809 130) ((s (1 9 0)) (cl-lib (0 5))) "Quickly navigate the file system to find a file." tar ((:commit . "c8d53e774d63e68a944092c08a026b57da741038") (:authors ("Jeff Gran" . "jeff@jeffgran.com")) (:maintainers ("Jeff Gran" . "jeff@jeffgran.com")) (:maintainer "Jeff Gran" . "jeff@jeffgran.com") (:keywords "navigation") (:url . "https://github.com/jeffgran/jg-quicknav"))]) (jinja2-mode . [(20220117 807) nil "A major mode for jinja2" tar ((:commit . "03e5430a7efe1d163a16beaf3c82c5fd2c2caee1") (:authors ("Florian Mounier aka paradoxxxzero")) (:maintainers ("Florian Mounier aka paradoxxxzero")) (:maintainer "Florian Mounier aka paradoxxxzero"))]) - (jinx . [(20230816 2045) ((emacs (27 1)) (compat (29 1 4 0))) "Enchanted Spell Checker" tar ((:commit . "417d95002fbf6737d6463e56d2633badff25522c") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainers ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:keywords "convenience" "wp") (:url . "https://github.com/minad/jinx"))]) + (jinx . [(20240311 821) ((emacs (27 1)) (compat (29 1 4 4))) "Enchanted Spell Checker" tar ((:commit . "b09efcb85b1a8db8054a3d5a298e8d9516836f16") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainers ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:keywords "convenience" "text") (:url . "https://github.com/minad/jinx"))]) (jira-markup-mode . [(20150601 2109) nil "Emacs Major mode for JIRA-markup-formatted text files" tar ((:commit . "53bf083fdbece483f1351f32085b424b38c4c1f2") (:authors ("Matthias Nuessler" . "m.nuessler@web.de>")) (:maintainers ("Matthias Nuessler" . "m.nuessler@web.de>")) (:maintainer "Matthias Nuessler" . "m.nuessler@web.de>") (:keywords "jira" "markup") (:url . "https://github.com/mnuessler/jira-markup-mode"))]) (jiralib2 . [(20200520 2031) ((emacs (25)) (request (0 3)) (dash (2 14 1))) "JIRA REST API bindings to Elisp" tar ((:commit . "c21c4e759eff549dbda11099f2f680b78d7f5a01") (:authors ("Henrik Nyman" . "h@nyymanni.com")) (:maintainers ("Henrik Nyman" . "h@nyymanni.com")) (:maintainer "Henrik Nyman" . "h@nyymanni.com") (:keywords "comm" "jira" "rest" "api") (:url . "https://github.com/nyyManni/jiralib2"))]) + (jirascope . [(20240122 2130) ((emacs (25 1))) "A Jira client" tar ((:commit . "61acd8d6adbd6b25ebcc5436b4dce6d5c6d2981c") (:authors ("Stanisław Zagórowski" . "duckonaut@gmail.com")) (:maintainers ("Stanisław Zagórowski" . "duckonaut@gmail.com")) (:maintainer "Stanisław Zagórowski" . "duckonaut@gmail.com") (:keywords "tools") (:url . "https://github.com/Duckonaut/jirascope"))]) (jist . [(20161229 1721) ((emacs (24 4)) (dash (2 12 0)) (seq (1 11)) (let-alist (1 0 4)) (magit (2 1 0)) (request (0 2 0))) "Gist integration" tar ((:commit . "ec4b27eb4051f0084cb3b1e4f19fab9e2db77665") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainers ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:keywords "convenience") (:url . "https://github.com/emacs-pe/jist.el"))]) (jit-lock-stealth-progress . [(20230808 1342) ((emacs (28 1))) "JIT lock stealth mode-line progress" tar ((:commit . "46d7a8a02a01c81125e35c81fdec5295bb4cbcd2") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.org/ideasman42/emacs-jit-lock-stealth-progress"))]) (jknav . [(20121006 2025) nil "Automatically enable j/k keys for line-based navigation" tar ((:commit . "861245715c728503dad6573278fdd75c271dbf8b") (:authors ("Aaron Culich" . "aculich@gmail.com")) (:maintainers ("Aaron Culich" . "aculich@gmail.com")) (:maintainer "Aaron Culich" . "aculich@gmail.com") (:keywords "keyboard" "navigation"))]) - (jmt-mode . [(20230519 1523) ((emacs (27 1))) "Java Mode Tamed" tar ((:commit . "b5b969f23d4cda1f70107db79a112e802951ce30") (:authors ("Michael Allan" . "mike@reluk.ca")) (:maintainers ("Michael Allan" . "mike@reluk.ca")) (:maintainer "Michael Allan" . "mike@reluk.ca") (:keywords "languages" "c") (:url . "http://reluk.ca/project/Java/Emacs/"))]) + (jmespath . [(20240115 1310) ((emacs (24 3))) "Query JSON using jmespath" tar ((:commit . "d3a4a4abdd6804d3aef5e0d0c538abd27667b4c3") (:authors ("Shubham Kumar" . "unresolved.shubham@gmail.com")) (:maintainers ("Shubham Kumar" . "unresolved.shubham@gmail.com")) (:maintainer "Shubham Kumar" . "unresolved.shubham@gmail.com") (:keywords "json" "data" "languages" "tools") (:url . "https://github.com/unresolvedcold/jmespath"))]) + (jmt-mode . [(20240213 1405) ((emacs (27 1))) "Java Mode Tamed" tar ((:commit . "a307c5c1ddc2f32199b52f8183b72a0648d4a4e1") (:authors ("Michael Allan" . "mike@reluk.ca")) (:maintainers ("Michael Allan" . "mike@reluk.ca")) (:maintainer "Michael Allan" . "mike@reluk.ca") (:keywords "languages" "c") (:url . "http://reluk.ca/project/Java/Emacs/"))]) (jonprl-mode . [(20160819 59) ((emacs (24 3)) (cl-lib (0 5)) (yasnippet (0 8 0))) "A major mode for editing JonPRL files" tar ((:commit . "6059bb64891fae45827174e044d6a87ac07172d8") (:authors ("David Raymond Christiansen" . "david@davidchristiansen.dk")) (:maintainers ("David Raymond Christiansen" . "david@davidchristiansen.dk")) (:maintainer "David Raymond Christiansen" . "david@davidchristiansen.dk") (:keywords "languages"))]) - (journalctl-mode . [(20221119 1653) ((emacs (24 1))) "Sample major mode for viewing output journalctl" tar ((:commit . "baaffdfd22a19afb1997ec3715d063186b80d3f5") (:authors ("Sebastian Meisel" . "sebastian.meisel@gmail.com")) (:maintainers ("Sebastian Meisel" . "sebastian.meisel@gmail.com")) (:maintainer "Sebastian Meisel" . "sebastian.meisel@gmail.com") (:keywords "unix") (:url . "https://github.com/SebastianMeisel/journalctl-mode"))]) + (journalctl-mode . [(20240219 2115) ((emacs (27 1))) "Sample major mode for viewing output journalctl" tar ((:commit . "631d10a5c8f466c94c38c3cd7410a27026f5f822") (:authors ("Sebastian Meisel" . "sebastian.meisel@gmail.com")) (:maintainers ("Sebastian Meisel" . "sebastian.meisel@gmail.com")) (:maintainer "Sebastian Meisel" . "sebastian.meisel@gmail.com") (:keywords "unix") (:url . "https://github.com/SebastianMeisel/journalctl-mode"))]) (jpop . [(20170410 1250) ((emacs (24)) (dash (2 11 0)) (cl-lib (0 5))) "Lightweight project caching and navigation framework" tar ((:commit . "7628b03260be96576b34459d45959ee77d8b2110") (:authors ("Dom Charlesworth" . "dgc336@gmail.com")) (:maintainers ("Dom Charlesworth" . "dgc336@gmail.com")) (:maintainer "Dom Charlesworth" . "dgc336@gmail.com") (:keywords "project" "convenience") (:url . "https://github.com/domtronn/jpop.el"))]) (jq-format . [(20190428 1434) ((emacs (24)) (reformatter (0 3))) "Reformat JSON and JSONLines using jq" tar ((:commit . "47e1c5adb89b37b4d53fe01302d8c675913c20e7") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainers ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee") (:keywords "languages") (:url . "https://github.com/wbolster/emacs-jq-format"))]) - (jq-mode . [(20230823 1003) ((emacs (25 1))) "Edit jq scripts." tar ((:commit . "4d9e98e21642007bc32ba75a5c259760f1fcf451") (:authors ("Bjarte Johansen ")) (:maintainers ("Bjarte Johansen ")) (:maintainer "Bjarte Johansen ") (:url . "https://github.com/ljos/jq-mode"))]) - (jq-ts-mode . [(20230826 1925) ((emacs (29 1))) "Tree-sitter support for jq buffers" tar ((:commit . "a495509f6920756dcf5cbf87ef1907b5abda2e5c") (:authors ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainers ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainer "Noah Peart" . "noah.v.peart@gmail.com") (:keywords "jq" "languages" "tree-sitter") (:url . "https://github.com/nverno/jq-ts-mode"))]) + (jq-mode . [(20240304 911) ((emacs (25 1))) "Edit jq scripts." tar ((:commit . "d533567a680bc87060c56a50f83d80e58646d2f2") (:authors ("Bjarte Johansen ")) (:maintainers ("Bjarte Johansen ")) (:maintainer "Bjarte Johansen ") (:url . "https://github.com/ljos/jq-mode"))]) + (jq-ts-mode . [(20240305 1511) ((emacs (29 1))) "Tree-sitter support for jq buffers" tar ((:commit . "9e6a2aab79a973e1200b8e4b5e6f1762b29b0dec") (:authors ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainers ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainer "Noah Peart" . "noah.v.peart@gmail.com") (:keywords "jq" "languages" "tree-sitter") (:url . "https://github.com/nverno/jq-ts-mode"))]) (jquery-doc . [(20150812 758) nil "jQuery api documentation interface for emacs" tar ((:commit . "24032284919b942ec27707d929bdd8bf48420062") (:authors ("Anantha kumaran" . "ananthakumaran@gmail.com")) (:maintainers ("Anantha kumaran" . "ananthakumaran@gmail.com")) (:maintainer "Anantha kumaran" . "ananthakumaran@gmail.com") (:keywords "docs" "jquery"))]) (js-auto-beautify . [(20161031 509) ((web-beautify (0 3 1)) (web-mode (14 0 27))) "auto format you js/jsx file" tar ((:commit . "6bc9fef474197ca1722cb1e9051b270f80cdd7cc") (:authors (nil . "quanwei9958@126.com")) (:maintainers (nil . "quanwei9958@126.com")) (:maintainer nil . "quanwei9958@126.com"))]) (js-auto-format-mode . [(20180807 1352) ((emacs (24))) "Minor mode for auto-formatting JavaScript code" tar ((:commit . "29d245b4d126a5fc5153a4d8f17396be4165b4a6") (:authors ("Masafumi Koba" . "ybiquitous@gmail.com")) (:maintainers ("Masafumi Koba" . "ybiquitous@gmail.com")) (:maintainer "Masafumi Koba" . "ybiquitous@gmail.com") (:keywords "languages") (:url . "https://github.com/ybiquitous/js-auto-format-mode"))]) (js-codemod . [(20190921 941) ((emacs (24 4))) "Run js-codemod on current sentence or selected region" tar ((:commit . "056bdf3e5e0c807b8cf17edb5834179a90fb722b") (:authors (nil . "Torgeir Thoresen <@torgeir>")) (:maintainers (nil . "Torgeir Thoresen <@torgeir>")) (:maintainer nil . "Torgeir Thoresen <@torgeir>") (:keywords "js" "codemod" "region"))]) - (js-comint . [(20230311 230) ((emacs (24 3))) "JavaScript interpreter in window." tar ((:commit . "b788bf5d57ad6b902c4096b666c6d78ceff7c116") (:authors ("Paul Huff" . "paul.huff@gmail.com")) (:maintainers ("Chen Bin ")) (:maintainer "Chen Bin ") (:keywords "javascript" "node" "inferior-mode" "convenience") (:url . "https://github.com/redguardtoo/js-comint"))]) + (js-comint . [(20231126 230) ((emacs (24 3))) "JavaScript interpreter in window." tar ((:commit . "ef2ccccad5740f3d8b5295f52a35df4f62471480") (:authors ("Paul Huff" . "paul.huff@gmail.com")) (:maintainers ("Chen Bin ")) (:maintainer "Chen Bin ") (:keywords "javascript" "node" "inferior-mode" "convenience") (:url . "https://github.com/redguardtoo/js-comint"))]) (js-doc . [(20160715 434) nil "Insert JsDoc style comment easily" tar ((:commit . "f0606e89d5aa89146f96edb38cf69af0068a9d1e") (:authors ("mooz" . "stillpedant@gmail.com")) (:maintainers ("mooz" . "stillpedant@gmail.com")) (:maintainer "mooz" . "stillpedant@gmail.com") (:keywords "document" "comment") (:url . "https://github.com/mooz/js-doc"))]) (js-format . [(20170119 102) ((emacs (24 1)) (js2-mode (20101228))) "Format or transform code style using NodeJS server with different javascript formatter" tar ((:commit . "544bda9be72b74ec2d442543ba60cff727d96669") (:authors ("James Yang" . "jamesyang999@gmail.com")) (:maintainers ("James Yang" . "jamesyang999@gmail.com")) (:maintainer "James Yang" . "jamesyang999@gmail.com") (:keywords "js" "javascript" "format" "standard" "jsbeautify" "esformatter" "airbnb") (:url . "http://github.com/futurist/js-format.el"))]) (js-import . [(20230131 1900) ((emacs (24 4)) (f (0 19 0)) (projectile (0 14 0)) (dash (2 13 0))) "Import Javascript files from your current project or dependencies" tar ((:commit . "9f8b6bc4f080c7146ce7ee5dd5a6572aeb6f1cc7") (:authors ("Jakob Lind" . "karl.jakob.lind@gmail.com")) (:maintainers ("Jakob Lind" . "karl.jakob.lind@gmail.com")) (:maintainer "Jakob Lind" . "karl.jakob.lind@gmail.com") (:keywords "tools") (:url . "https://github.com/jakoblind/js-import"))]) (js-react-redux-yasnippets . [(20200316 1144) ((emacs (24 3)) (yasnippet (0 8 0))) "JavaScript,React,Redux yasnippets" tar ((:commit . "9f509043f01fa59bff4daf31b2e95d63f8deab4a") (:authors ("sooqua")) (:maintainers ("sooqua")) (:maintainer "sooqua") (:keywords "convenience" "snippets") (:url . "https://github.com/sooqua/js-react-redux-yasnippets"))]) (js2-closure . [(20170816 1918) ((js2-mode (20150909))) "Google Closure dependency manager" tar ((:commit . "74a75f001a8bc2b9c02b9e8b4557f7ee3c5f84fb") (:authors ("Justine Tunney" . "jart@google.com")) (:maintainers ("Justine Tunney" . "jart@google.com")) (:maintainer "Justine Tunney" . "jart@google.com") (:keywords "javascript" "closure") (:url . "http://github.com/jart/js2-closure"))]) (js2-highlight-vars . [(20170418 1829) ((emacs (24 4)) (js2-mode (20150908))) "highlight occurrences of the variable under cursor" tar ((:commit . "e3bb177e50f76b272e8073a94d4f46be6512a163") (:authors ("Mihai Bazon" . "mihai.bazon@gmail.com")) (:maintainers ("Mihai Bazon" . "mihai.bazon@gmail.com")) (:maintainer "Mihai Bazon" . "mihai.bazon@gmail.com") (:url . "http://mihai.bazon.net/projects/editing-javascript-with-emacs-js2-mode/js2-highlight-vars-mode"))]) - (js2-mode . [(20230628 238) ((emacs (24 1)) (cl-lib (0 5))) "Improved JavaScript editing mode" tar ((:commit . "79bc78d77db0d2e8e43dc0f9e0504ad90bcbc26d") (:authors ("Steve Yegge" . "steve.yegge@gmail.com") ("mooz" . "stillpedant@gmail.com") ("Dmitry Gutov" . "dgutov@yandex.ru")) (:maintainers ("Steve Yegge" . "steve.yegge@gmail.com")) (:maintainer "Steve Yegge" . "steve.yegge@gmail.com") (:keywords "languages" "javascript") (:url . "https://github.com/mooz/js2-mode/"))]) + (js2-mode . [(20240310 1755) ((emacs (24 1)) (cl-lib (0 5))) "Improved JavaScript editing mode" tar ((:commit . "e92829da3d6387252a0a5737c0c5344cb3de1578") (:authors ("Steve Yegge" . "steve.yegge@gmail.com") ("mooz" . "stillpedant@gmail.com") ("Dmitry Gutov" . "dmitry@gutov.dev")) (:maintainers ("Steve Yegge" . "steve.yegge@gmail.com")) (:maintainer "Steve Yegge" . "steve.yegge@gmail.com") (:keywords "languages" "javascript") (:url . "https://github.com/mooz/js2-mode/"))]) (js2-refactor . [(20210306 2003) ((js2-mode (20101228)) (s (1 9 0)) (multiple-cursors (1 0 0)) (dash (1 0 0)) (s (1 0 0)) (yasnippet (0 9 0 1))) "A JavaScript refactoring library for emacs." tar ((:commit . "1372f8449c620d6209173ac12bcb7ac4ce6a3651") (:authors ("Magnar Sveen" . "magnars@gmail.com") ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:keywords "conveniences"))]) (js2hl . [(20201119 816) ((emacs (25 1)) (js2-mode (20190219))) "Highlight/rename things using js2-mode parser" tar ((:commit . "8a9a53a861d20ce51a382d6caef48ccd978d8212") (:authors ("Chen Bin ")) (:maintainers ("Chen Bin ")) (:maintainer "Chen Bin ") (:keywords "convenience") (:url . "https://github.com/redguardtoo/js2hl"))]) (js3-mode . [(20160515 1550) nil "An improved JavaScript editing mode" tar ((:commit . "7fceb21ec56aac7af4b189bb0c0d0cf620327f5a") (:authors ("Thom Blake" . "webmaster@thomblake.com")) (:maintainers ("Thom Blake" . "webmaster@thomblake.com")) (:maintainer "Thom Blake" . "webmaster@thomblake.com") (:keywords "javascript" "languages"))]) (jscs . [(20151015 1749) ((emacs (24 1)) (cl-lib (0 5))) "Consistent JavaScript editing using JSCS" tar ((:commit . "9d39d0f2355e69a020bf76242504f3a33e013ccf") (:authors ("papaeye" . "papaeye@gmail.com")) (:maintainers ("papaeye" . "papaeye@gmail.com")) (:maintainer "papaeye" . "papaeye@gmail.com") (:keywords "languages" "convenience") (:url . "https://github.com/papaeye/emacs-jscs"))]) - (jsdoc . [(20230808 2224) ((emacs (29 1)) (dash (2 11 0)) (s (1 12 0))) "Insert JSDoc comments" tar ((:commit . "98129da2d6f4b938f9833be3f760d30ebd2986aa") (:authors ("Isa Mert Gurbuz" . "isamertgurbuz@gmail.com")) (:maintainers ("Isa Mert Gurbuz" . "isamertgurbuz@gmail.com")) (:maintainer "Isa Mert Gurbuz" . "isamertgurbuz@gmail.com") (:url . "https://github.com/isamert/jsdoc.el"))]) + (jsdoc . [(20230831 2205) ((emacs (29 1)) (dash (2 11 0)) (s (1 12 0))) "Insert JSDoc comments" tar ((:commit . "4efdae3b94b1bedc167625d5705daed74fcbc967") (:authors ("Isa Mert Gurbuz" . "isamertgurbuz@gmail.com")) (:maintainers ("Isa Mert Gurbuz" . "isamertgurbuz@gmail.com")) (:maintainer "Isa Mert Gurbuz" . "isamertgurbuz@gmail.com") (:url . "https://github.com/isamert/jsdoc.el"))]) (jsfmt . [(20180920 1008) nil "Interface to jsfmt command for javascript files" tar ((:commit . "ca141a135c7700eaedef92561d334e1fb7dc28a1") (:authors ("Brett Langdon" . "brett@blangdon.com")) (:maintainers ("Brett Langdon" . "brett@blangdon.com")) (:maintainer "Brett Langdon" . "brett@blangdon.com") (:url . "https://github.com/brettlangdon/jsfmt.el"))]) - (json-mode . [(20230805 507) ((json-snatcher (1 0 0)) (emacs (24 4))) "Major mode for editing JSON files" tar ((:commit . "481d5d9f4003fc14d116bf31d1bf71d14960d7d9") (:authors ("Josh Johnston")) (:maintainers ("Josh Johnston")) (:maintainer "Josh Johnston") (:url . "https://github.com/joshwnj/json-mode"))]) - (json-navigator . [(20191213 755) ((emacs (25 1)) (hierarchy (0 6 0))) "View and navigate JSON structures" tar ((:commit . "afd902e0b5cde37fad4786515a695d17f1625286") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:url . "https://github.com/DamienCassou/json-navigator"))]) - (json-par . [(20230819 339) ((emacs (24 4)) (json-mode (1 7 0))) "Minor mode for structural editing of JSON" tar ((:commit . "9fff40e04a1956af6fcf48b5206e81143aec23f3") (:authors ("taku0" . "mxxouy6x3m_github@tatapa.org")) (:maintainers ("taku0" . "mxxouy6x3m_github@tatapa.org")) (:maintainer "taku0" . "mxxouy6x3m_github@tatapa.org") (:keywords "abbrev" "convenience" "files") (:url . "https://github.com/taku0/json-par"))]) - (json-process-client . [(20210525 733) ((emacs (25 1))) "Interact with a TCP process using JSON" tar ((:commit . "373b2cc7e3d26dc00594e0b2c1bb66815aad2826") (:authors ("Nicolas Petton" . "nicolas@petton.fr") ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr") (:url . "https://gitlab.petton.fr/nico/json-process-client"))]) + (json-mode . [(20240228 1443) ((json-snatcher (1 0 0)) (emacs (24 4))) "Major mode for editing JSON files" tar ((:commit . "72f340d3fb4b796589e75cb5985797a7f177f34a") (:authors ("Josh Johnston") ("taku0")) (:maintainers ("Josh Johnston")) (:maintainer "Josh Johnston") (:url . "https://github.com/joshwnj/json-mode"))]) + (json-navigator . [(20230904 1757) ((emacs (25 1)) (hierarchy (0 6 0))) "View and navigate JSON structures" tar ((:commit . "f3489153e8509f88296786cb00e31f59597a43f2") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:url . "https://github.com/DamienCassou/json-navigator"))]) + (json-par . [(20240217 550) ((emacs (24 4)) (json-mode (1 7 0))) "Minor mode for structural editing of JSON" tar ((:commit . "52f69108d4eca328f7eb74c2dfb841db2f0ffa8a") (:authors ("taku0" . "mxxouy6x3m_github@tatapa.org")) (:maintainers ("taku0" . "mxxouy6x3m_github@tatapa.org")) (:maintainer "taku0" . "mxxouy6x3m_github@tatapa.org") (:keywords "abbrev" "convenience" "files") (:url . "https://github.com/taku0/json-par"))]) + (json-process-client . [(20230903 1305) ((emacs (27 1))) "Interact with a TCP process using JSON" tar ((:commit . "c4385859ada9b7803698a1f0199fea7fc8880214") (:authors ("Nicolas Petton" . "nicolas@petton.fr") ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr") (:url . "https://gitlab.petton.fr/nico/json-process-client"))]) (json-reformat . [(20220905 2342) ((emacs (24 3))) "Reformatting tool for JSON" tar ((:commit . "e9999b1f1fc933c02ff44f4136602b6a45ed59c6") (:authors ("Wataru MIYAGUNI" . "gonngo@gmail.com")) (:maintainers ("Wataru MIYAGUNI" . "gonngo@gmail.com")) (:maintainer "Wataru MIYAGUNI" . "gonngo@gmail.com") (:keywords "json") (:url . "https://github.com/gongo/json-reformat"))]) (json-rpc . [(20200417 1629) ((emacs (24 1)) (cl-lib (0 5))) "JSON-RPC library" tar ((:commit . "81a5a520072e20d18aeab2aac4d66c046b031e56") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainers ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/elisp-json-rpc"))]) (json-rpc-server . [(20220205 1504) ((emacs (26))) "Server-side JSON-RPC library." tar ((:commit . "349e1f4722474bf1f75dbc8eb9d9c59d790b8083") (:authors ("GitHub user \"Jcaw\"")) (:maintainers ("GitHub user \"Jcaw\"")) (:maintainer "GitHub user \"Jcaw\"") (:keywords "tools" "comm" "json" "rpc") (:url . "https://github.com/jcaw/json-rpc-server.el"))]) (json-snatcher . [(20200916 1717) ((emacs (24))) "Grabs the path to JSON values in a JSON file" tar ((:commit . "b28d1c0670636da6db508d03872d96ffddbc10f2") (:authors ("Sterling Graham" . "sterlingrgraham@gmail.com")) (:maintainers ("Sterling Graham" . "sterlingrgraham@gmail.com")) (:maintainer "Sterling Graham" . "sterlingrgraham@gmail.com") (:url . "http://github.com/sterlingg/json-snatcher"))]) - (jsonian . [(20230826 259) ((emacs (27 1))) "A major mode for editing JSON files" tar ((:commit . "75ecae8a3f449b324706700e4e336abe46b8de04") (:authors ("Ian Wahbe")) (:maintainers ("Ian Wahbe")) (:maintainer "Ian Wahbe") (:url . "https://github.com/iwahbe/jsonian"))]) + (jsonian . [(20231229 1444) ((emacs (27 1))) "A major mode for editing JSON files" tar ((:commit . "f200035b847d6dd10bd7987f4540cff9edd3b881") (:authors ("Ian Wahbe")) (:maintainers ("Ian Wahbe")) (:maintainer "Ian Wahbe") (:url . "https://github.com/iwahbe/jsonian"))]) (jsonl . [(20190623 509) ((emacs (25))) "Utility functions for working with line-delimited JSON" tar ((:commit . "3dd0b7bb2b4bce9f9de7367941f0cc78f82049c9") (:authors ("Erik Anderson" . "erik@ebpa.link")) (:maintainers ("Erik Anderson" . "erik@ebpa.link")) (:maintainer "Erik Anderson" . "erik@ebpa.link") (:keywords "tools") (:url . "https://github.com/ebpa/jsonl.el"))]) (jsonnet-mode . [(20220121 2109) ((emacs (24)) (dash (2 17 0))) "Major mode for editing jsonnet files" tar ((:commit . "cef3d352408599a63655002af655d11757579253") (:authors ("Nick Lanham")) (:maintainers ("Nick Lanham")) (:maintainer "Nick Lanham") (:keywords "languages") (:url . "https://github.com/mgyucht/jsonnet-mode"))]) (jss . [(20130508 1423) ((emacs (24 1)) (websocket (0)) (js2-mode (0))) "An emacs interface to webkit and mozilla debuggers" tar ((:commit . "41749257aecf13c7bd6ed489b5ab3304d06e40bc") (:authors ("Marco Baringer" . "mb@bese.it")) (:maintainers ("Marco Baringer" . "mb@bese.it")) (:maintainer "Marco Baringer" . "mb@bese.it") (:keywords "languages"))]) (jst . [(20150604 1138) ((s (1 9)) (f (0 17)) (dash (2 10)) (pcache (0 3)) (emacs (24 4))) "JS test mode" tar ((:commit . "865ff97449a4cbbcb40d38b4908cf4d7b22a5108") (:authors ("Cheung Hoi Yu" . "yeannylam@gmail.com")) (:maintainers ("Cheung Hoi Yu" . "yeannylam@gmail.com")) (:maintainer "Cheung Hoi Yu" . "yeannylam@gmail.com") (:keywords "js" "javascript" "jasmine" "coffee" "coffeescript") (:url . "https://github.com/cheunghy/jst-mode"))]) (jtags . [(20160211 2029) nil "enhanced tags functionality for Java development" tar ((:commit . "f7d29e1635ef7ee4ee2cdb8f1f6ab83e1015c84a") (:authors ("Alexander Baltatzis" . "alexander@baltatzis.com") ("Johan Dykstrom" . "jody4711-sf@yahoo.se")) (:maintainers ("Johan Dykstrom" . "jody4711-sf@yahoo.se")) (:maintainer "Johan Dykstrom" . "jody4711-sf@yahoo.se") (:keywords "languages" "tools") (:url . "http://jtags.sourceforge.net"))]) - (julia-formatter . [(20230525 1742) ((emacs (27 1)) (session-async (0 0 4))) "Use JuliaFormatter.jl for julia code" tar ((:commit . "783df6cf8ef0db7adb4e81b86aa1e17992642493") (:authors ("Felipe Lema" . "felipe.lema@mortemale.org")) (:maintainers ("Felipe Lema" . "felipe.lema@mortemale.org")) (:maintainer "Felipe Lema" . "felipe.lema@mortemale.org") (:keywords "convenience" "tools") (:url . "https://codeberg.org/FelipeLema/julia-formatter.el"))]) - (julia-mode . [(20230712 1524) ((emacs (26 1))) "Major mode for editing Julia source code" tar ((:commit . "7a8c868e0d3e51ba4a2c621ee22ca9599e0e4bbb") (:keywords "languages") (:url . "https://github.com/JuliaEditorSupport/julia-emacs"))]) - (julia-repl . [(20230529 943) ((emacs (25 1)) (s (1 12))) "A minor mode for a Julia REPL" tar ((:commit . "9503ef7110732e444e686e815c5b2ae8228d274d") (:authors ("Tamas Papp" . "tkpapp@gmail.com")) (:maintainers ("Tamas Papp" . "tkpapp@gmail.com")) (:maintainer "Tamas Papp" . "tkpapp@gmail.com") (:keywords "languages") (:url . "https://github.com/tpapp/julia-repl"))]) + (jtsx . [(20240315 1515) ((emacs (29 1))) "Extends JSX/TSX built-in support" tar ((:commit . "e2fb775b30c2eadd33413d6b1dbdc41ba155c1fe") (:authors ("Loïc Lemaître" . "loic.lemaitre@gmail.com")) (:maintainers ("Loïc Lemaître" . "loic.lemaitre@gmail.com")) (:maintainer "Loïc Lemaître" . "loic.lemaitre@gmail.com") (:keywords "languages") (:url . "https://github.com/llemaitre19/jtsx"))]) + (julia-formatter . [(20231130 1512) ((emacs (27 1)) (session-async (0 0 5))) "Use JuliaFormatter.jl for julia code" tar ((:commit . "4b40481cc9c0dcb3c9704436e00d613067d44bf5") (:authors ("Felipe Lema" . "felipe.lema@mortemale.org")) (:maintainers ("Felipe Lema" . "felipe.lema@mortemale.org")) (:maintainer "Felipe Lema" . "felipe.lema@mortemale.org") (:keywords "convenience" "tools") (:url . "https://codeberg.org/FelipeLema/julia-formatter.el"))]) + (julia-mode . [(20240315 1726) ((emacs (26 1))) "Major mode for editing Julia source code" tar ((:commit . "2dfc869ff6b3878407fe7226669dfaae8d38d541") (:keywords "languages") (:url . "https://github.com/JuliaEditorSupport/julia-emacs"))]) + (julia-repl . [(20231026 1005) ((emacs (25 1)) (s (1 12))) "A minor mode for a Julia REPL" tar ((:commit . "4947319bc948b3f80d61b0d65a719737275949b8") (:authors ("Tamas Papp" . "tkpapp@gmail.com")) (:maintainers ("Tamas Papp" . "tkpapp@gmail.com")) (:maintainer "Tamas Papp" . "tkpapp@gmail.com") (:keywords "languages") (:url . "https://github.com/tpapp/julia-repl"))]) (julia-shell . [(20161125 1910) ((julia-mode (0 3))) "Major mode for an inferior Julia shell" tar ((:commit . "583a0b2ca20461ab4356929fd0f2212c22341b69") (:authors ("Dennis Ogbe" . "dogbe@purdue.edu")) (:maintainers ("Dennis Ogbe" . "dogbe@purdue.edu")) (:maintainer "Dennis Ogbe" . "dogbe@purdue.edu"))]) - (julia-snail . [(20230829 546) ((emacs (26 2)) (dash (2 16 0)) (julia-mode (0 3)) (s (1 12 0)) (spinner (1 7 3)) (popup (0 5 9))) "Julia Snail" tar ((:commit . "49c13ad005b66724bde385e45ef8aa448e40f233") (:url . "https://github.com/gcv/julia-snail"))]) - (julia-ts-mode . [(20230711 2009) ((emacs (29)) (julia-mode (0 4))) "Major mode for Julia source code using tree-sitter" tar ((:commit . "1c5b01753bee57de2d480a80c2b267009ac93e9a") (:authors ("Ronan Arraes Jardim Chagas")) (:maintainers ("Ronan Arraes Jardim Chagas")) (:maintainer "Ronan Arraes Jardim Chagas") (:keywords "julia" "languages" "tree-sitter") (:url . "https://github.com/ronisbr/julia-ts-mode"))]) + (julia-snail . [(20240310 1510) ((emacs (26 2)) (dash (2 16 0)) (julia-mode (0 3)) (s (1 12 0)) (spinner (1 7 3)) (popup (0 5 9))) "Julia Snail" tar ((:commit . "a25ce847480a0c2bed24fad3f1ee62904c9c93a5") (:url . "https://github.com/gcv/julia-snail"))]) + (julia-ts-mode . [(20230921 1433) ((emacs (29 1)) (julia-mode (0 4))) "Major mode for Julia source code using tree-sitter" tar ((:commit . "44260b265359c7ed4052398e099ad019ce899109") (:authors ("Ronan Arraes Jardim Chagas")) (:maintainers ("Ronan Arraes Jardim Chagas")) (:maintainer "Ronan Arraes Jardim Chagas") (:keywords "julia" "languages" "tree-sitter") (:url . "https://github.com/ronisbr/julia-ts-mode"))]) (julia-vterm . [(20230815 2318) ((emacs (25 1)) (vterm (0 0 1))) "A mode for Julia REPL using vterm" tar ((:commit . "6d67b618a6f2714d283095b088b12859fb663df9") (:authors ("Shigeaki Nishina")) (:maintainers ("Shigeaki Nishina")) (:maintainer "Shigeaki Nishina") (:keywords "languages" "julia") (:url . "https://github.com/shg/julia-vterm.el"))]) (jumblr . [(20170727 2043) ((s (1 8 0)) (dash (2 2 0))) "an anagram game for emacs" tar ((:commit . "34533dfb9db8538c005f4eaffafeff7ed193729f") (:keywords "anagram" "word game" "games") (:url . "https://github.com/mkmcc/jumblr"))]) (jump . [(20210110 2237) ((findr (0 7)) (inflections (2 4)) (cl-lib (0 5))) "build functions which contextually jump between files" tar ((:commit . "55caa66a7cc6e0b1a76143fd40eff38416928941") (:authors ("Eric Schulte")) (:maintainers ("Eric Schulte")) (:maintainer "Eric Schulte") (:keywords "project" "convenience" "navigation") (:url . "http://github.com/eschulte/jump.el"))]) @@ -2781,58 +2853,60 @@ (jump-to-line . [(20130122 1653) nil "Jump to line number at point." tar ((:commit . "01ef8c3529d85e6c59cc20840acbc4a8e8325bc8") (:authors ("ongaeshi")) (:maintainers ("ongaeshi")) (:maintainer "ongaeshi") (:keywords "jump" "line" "back" "file" "ruby" "csharp" "python" "perl"))]) (jump-tree . [(20171014 1551) nil "Treat position history as a tree" tar ((:commit . "282267dc6305889e31d46b405b7ad4dfe5923b66") (:authors ("Wen Yang" . "yangwen0228@foxmail.com")) (:maintainers ("Wen Yang" . "yangwen0228@foxmail.com")) (:maintainer "Wen Yang" . "yangwen0228@foxmail.com") (:keywords "convenience" "position" "jump" "tree") (:url . "https://github.com/yangwen0228/jump-tree"))]) (jumplist . [(20151120 345) ((cl-lib (0 5))) "Jump like vim jumplist or ex jumplist" tar ((:commit . "c482d137d95bc5e1bcd790cdbde25b7f729b2502") (:authors ("ganmacs ")) (:maintainers ("ganmacs ")) (:maintainer "ganmacs ") (:keywords "jumplist" "vim") (:url . "https://github.com/ganmacs/jumplist"))]) - (jupyter . [(20230706 139) ((emacs (26)) (cl-lib (0 5)) (org (9 1 6)) (zmq (0 10 10)) (simple-httpd (1 5 0)) (websocket (1 9))) "Jupyter" tar ((:commit . "1baabc8f2d0631f8f4308400f9a53f1aadd58d14") (:authors ("Nathaniel Nicandro" . "nathanielnicandro@gmail.com")) (:maintainers ("Nathaniel Nicandro" . "nathanielnicandro@gmail.com")) (:maintainer "Nathaniel Nicandro" . "nathanielnicandro@gmail.com") (:url . "https://github.com/nnicandro/emacs-jupyter"))]) - (just-mode . [(20230303 2255) ((emacs (26 1))) "Justfile editing mode" tar ((:commit . "d7f52eab8fa3828106f80acb1e2176e5877b7191") (:authors ("Leon Barrett" . "leon@barrettnexus.com")) (:maintainers ("Leon Barrett" . "leon@barrettnexus.com")) (:maintainer "Leon Barrett" . "leon@barrettnexus.com") (:keywords "files" "languages" "tools") (:url . "https://github.com/leon-barrett/just-mode.el"))]) - (justl . [(20230821 318) ((transient (0 1 0)) (emacs (27 1)) (s (1 2 0)) (f (0 20 0)) (inheritenv (0 2))) "Major mode for driving just files" tar ((:commit . "30350ded297b74980e0cafb75030001a21531acf") (:authors ("Sibi Prabakaran")) (:maintainers ("Sibi Prabakaran")) (:maintainer "Sibi Prabakaran") (:keywords "just" "justfile" "tools" "processes") (:url . "https://github.com/psibi/justl.el"))]) + (jupyter . [(20231204 529) ((emacs (26)) (cl-lib (0 5)) (org (9 1 6)) (zmq (0 10 10)) (simple-httpd (1 5 0)) (websocket (1 9))) "Jupyter" tar ((:commit . "da306a6dbda6f1e285281765a311938a1d9db022") (:authors ("Nathaniel Nicandro" . "nathanielnicandro@gmail.com")) (:maintainers ("Nathaniel Nicandro" . "nathanielnicandro@gmail.com")) (:maintainer "Nathaniel Nicandro" . "nathanielnicandro@gmail.com") (:url . "https://github.com/emacs-jupyter/jupyter"))]) + (just-mode . [(20240312 1626) ((emacs (26 1))) "Justfile editing mode" tar ((:commit . "57d854c26033c2f629b63fa4be90236fd3015278") (:authors ("Leon Barrett" . "leon@barrettnexus.com")) (:maintainers ("Leon Barrett" . "leon@barrettnexus.com")) (:maintainer "Leon Barrett" . "leon@barrettnexus.com") (:keywords "files" "languages" "tools") (:url . "https://github.com/leon-barrett/just-mode.el"))]) + (justl . [(20240224 428) ((transient (0 1 0)) (emacs (27 1)) (s (1 2 0)) (f (0 20 0)) (inheritenv (0 2))) "Major mode for driving just files" tar ((:commit . "1b16ca44b227dc761a2c8631690140f62e024f98") (:authors ("Sibi Prabakaran")) (:maintainers ("Sibi Prabakaran")) (:maintainer "Sibi Prabakaran") (:keywords "just" "justfile" "tools" "processes") (:url . "https://github.com/psibi/justl.el"))]) (jvm-mode . [(20150422 708) ((dash (2 6 0)) (emacs (24))) "Monitor and manage your JVMs" tar ((:commit . "3355dbaf5b0185aadfbad24160399abb32c5bea0") (:authors ("Martin Trojer" . "martin.trojer@gmail.com")) (:maintainers ("Martin Trojer" . "martin.trojer@gmail.com")) (:maintainer "Martin Trojer" . "martin.trojer@gmail.com") (:keywords "convenience") (:url . "https://github.com/martintrojer/jvm-mode.el"))]) (k8s-mode . [(20230305 1039) ((emacs (24 3)) (yaml-mode (0 0 10))) "Major mode for Kubernetes configuration file" tar ((:commit . "83266cecd6a39cdf57d124270646047860bfb7ab") (:authors ("Giap Tran" . "txgvnn@gmail.com")) (:maintainers ("Giap Tran" . "txgvnn@gmail.com")) (:maintainer "Giap Tran" . "txgvnn@gmail.com") (:url . "https://github.com/TxGVNN/emacs-k8s-mode"))]) (kaesar . [(20230626 2314) ((emacs (24 3)) (kaesar-pbkdf2 (0 9 0))) "AES algorithm encrypt/decrypt" tar ((:commit . "740eaea4d2510b78d30cceabf4be2c3daca66cf7") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "data") (:url . "https://github.com/mhayashi1120/Emacs-kaesar"))]) (kaesar-file . [(20230614 332) ((emacs (24 3)) (kaesar (0 1 1))) "AES encrypt/decrypt file" tar ((:commit . "be615884cbbb9838c5e6655abf7f112a8df03a06") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "data" "files") (:url . "https://github.com/mhayashi1120/Emacs-kaesar"))]) (kaesar-mode . [(20230626 401) ((emacs (24 3)) (kaesar (0 1 4))) "AES encrypt/decrypt buffer" tar ((:commit . "fd833c69ad3ced4a890eb162f4399d79a8ec199c") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "data" "convenience") (:url . "https://github.com/mhayashi1120/Emacs-kaesar"))]) (kaesar-pbkdf2 . [(20230626 2314) ((emacs (25 1))) "PBKDF2 extension for kaesar.el" tar ((:commit . "740eaea4d2510b78d30cceabf4be2c3daca66cf7") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "data") (:url . "https://github.com/mhayashi1120/Emacs-kaesar"))]) + (kagi . [(20240319 2042) ((emacs (29 1)) (shell-maker (0 46 1))) "Kagi API integration" tar ((:commit . "658662bfd41c16ae53177f359b5fdf34475e49a9") (:authors ("Bram Schoenmakers" . "me@bramschoenmakers.nl")) (:maintainers ("Bram Schoenmakers" . "me@bramschoenmakers.nl")) (:maintainer "Bram Schoenmakers" . "me@bramschoenmakers.nl") (:keywords "terminals" "wp") (:url . "https://codeberg.org/bram85/kagi.el"))]) (kakapo-mode . [(20171004 451) ((cl-lib (0 5))) "TABS (hard or soft) for indentation (leading whitespace), and SPACES for alignment." tar ((:commit . "67d516138172fd60782df94454b3d0bd247e84f3") (:keywords "indentation") (:url . "https://github.com/listx/kakapo-mode"))]) (kakoune . [(20230206 2037) ((ryo-modal (0 45)) (multiple-cursors (1 4)) (expand-region (0 11 0)) (emacs (25 1))) "A simulation, but not emulation, of kakoune" tar ((:commit . "b39c5605e896c55ea246f755c46171bd6d0768a8") (:authors ("Joseph Morag" . "jm4157@columbia.edu")) (:maintainers ("Joseph Morag" . "jm4157@columbia.edu")) (:maintainer "Joseph Morag" . "jm4157@columbia.edu") (:url . "https://github.com/jmorag/kakoune.el"))]) (kaleidoscope . [(20170808 817) ((s (1 11 0))) "Controlling Kaleidoscope-powered devices." tar ((:commit . "b89a243f6024099192f1bc38d8a54e3e7a654090") (:authors ("Gergely Nagy")) (:maintainers ("Gergely Nagy")) (:maintainer "Gergely Nagy") (:url . "https://github.com/algernon/kaleidoscope.el"))]) (kaleidoscope-evil-state-flash . [(20170728 1020) ((evil (1 2 12)) (kaleidoscope (0 1 0)) (s (1 11 0))) "Flash keyboard LEDs when changing Evil state" tar ((:commit . "5b88327350c3d6375ef1d43fb31342eaabd88fdc") (:authors ("Gergely Nagy")) (:maintainers ("Gergely Nagy")) (:maintainer "Gergely Nagy") (:url . "https://github.com/algernon/kaleidoscope.el"))]) (kana . [(20210531 1427) ((emacs (24 4)) (dash (2 17 0))) "Learn Japanese hiragana and katakana" tar ((:commit . "d3d550aad67ef8625b3860598bf3622f5b2a7d32") (:authors ("Damon Chan" . "elecming@gmail.com")) (:maintainers ("Damon Chan" . "elecming@gmail.com")) (:maintainer "Damon Chan" . "elecming@gmail.com") (:keywords "tools") (:url . "https://github.com/chenyanming/kana"))]) + (kanagawa-theme . [(20240319 1209) ((emacs (24 3))) "An elegant theme inspired by The Great Wave off Kanagawa by Katsushika Hokusa" tar ((:commit . "4c5441d6fbb883ac5d98ab654c4c1ec7c321acfb") (:authors ("Meritamen" . "meritamen@sdf.org")) (:maintainers ("Meritamen" . "meritamen@sdf.org")) (:maintainer "Meritamen" . "meritamen@sdf.org") (:keywords "themes" "faces") (:url . "https://github.com/meritamen/emacs-kanagawa-theme"))]) (kanban . [(20230210 1505) nil "Parse org-todo headlines to use org-tables as Kanban tables" tar ((:commit . "d70fa7acab2bfcbb7d3da43c1343073f7eff4998") (:authors ("Arne Babenhauserheide" . "arne_bab@web.de")) (:maintainers ("Arne Babenhauserheide" . "arne_bab@web.de")) (:maintainer "Arne Babenhauserheide" . "arne_bab@web.de") (:keywords "outlines" "convenience"))]) - (kanji-mode . [(20160826 1139) nil "View stroke order for kanji characters at cursor" tar ((:commit . "5e9d5b72468ece11cfb81b729be6babf63ede425") (:authors ("Wojciech Gac" . "wojciech.s.gac@gmail.com")) (:maintainers ("Wojciech Gac" . "wojciech.s.gac@gmail.com")) (:maintainer "Wojciech Gac" . "wojciech.s.gac@gmail.com") (:url . "http://github.com/wsgac/kanji-mode "))]) + (kanji-mode . [(20230928 1113) nil "View stroke order for kanji characters at cursor" tar ((:commit . "731b3a5447bcb899ba1d86b645a344e0915d04f3") (:authors ("Wojciech Gac" . "wojciech.s.gac@gmail.com")) (:maintainers ("Wojciech Gac" . "wojciech.s.gac@gmail.com")) (:maintainer "Wojciech Gac" . "wojciech.s.gac@gmail.com") (:url . "http://github.com/wsgac/kanji-mode "))]) (kaocha-runner . [(20230511 934) ((emacs (26)) (s (1 4 0)) (cider (0 21 0)) (parseedn (0 1 0))) "A package for running Kaocha tests via CIDER." tar ((:commit . "9ba7b47d3a3834964f7fcad389081b3b282f692c") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainers ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:url . "https://github.com/magnars/kaocha-runner.el"))]) - (kaolin-themes . [(20230402 1851) ((emacs (25 1)) (autothemer (0 2 2)) (cl-lib (0 6))) "A set of eye pleasing themes" tar ((:commit . "facb2a08d3179103d4c3a9905b37c87831fe1665") (:authors ("Ogden Webb" . "ogdenwebb@gmail.com")) (:maintainers ("Ogden Webb" . "ogdenwebb@gmail.com")) (:maintainer "Ogden Webb" . "ogdenwebb@gmail.com") (:keywords "dark" "light" "teal" "blue" "violet" "purple" "brown" "theme" "faces") (:url . "https://github.com/ogdenwebb/emacs-kaolin-themes"))]) + (kaolin-themes . [(20240217 2054) ((emacs (25 1)) (autothemer (0 2 2)) (cl-lib (0 6))) "A set of eye pleasing themes" tar ((:commit . "b03749c914b1319caccce4cf96630e3fba5335f5") (:authors ("Ogden Webb" . "ogdenwebb@gmail.com")) (:maintainers ("Ogden Webb" . "ogdenwebb@gmail.com")) (:maintainer "Ogden Webb" . "ogdenwebb@gmail.com") (:keywords "dark" "light" "teal" "blue" "violet" "purple" "brown" "theme" "faces") (:url . "https://github.com/ogdenwebb/emacs-kaolin-themes"))]) (kaomoji . [(20220721 441) ((emacs (24 3)) (helm-core (3 6 0))) "Input kaomoji superb easily" tar ((:commit . "fba0018a13eba70c2bffc6153dcfee99937fa3d6") (:authors ("Ono Hiroko" . "azazabc123@gmail.com")) (:maintainers ("Ono Hiroko" . "azazabc123@gmail.com")) (:maintainer "Ono Hiroko" . "azazabc123@gmail.com") (:keywords "tools" "fun") (:url . "https://github.com/kuanyui/kaomoji.el"))]) (kapacitor . [(20190414 1908) ((emacs (25 1)) (magit (2 13 0)) (magit-popup (2 12 4))) "Main file for kapacitor-mode" tar ((:commit . "e3300d8b4017a2f66b0d929cb85bcc7ee2612072") (:authors ("Manoj Kumar Manikchand" . "manojm.321@gmail.com")) (:maintainers ("Manoj Kumar Manikchand" . "manojm.321@gmail.com")) (:maintainer "Manoj Kumar Manikchand" . "manojm.321@gmail.com") (:keywords "kapacitor" "emacs" "magit" "tools") (:url . "http://github.com/Manoj321/kapacitor-el"))]) (karma . [(20160220 1245) ((pkg-info (0 4)) (emacs (24))) "Karma Test Runner Emacs Integration" tar ((:commit . "31d3e7708246183d7ed0686be92bf23140af348c") (:authors ("Samuel Tonini")) (:maintainers ("Samuel Tonini")) (:maintainer "Samuel Tonini") (:keywords "language" "javascript" "js" "karma" "testing") (:url . "http://github.com/tonini/karma.el"))]) (kconfig-mode . [(20220604 1415) ((emacs (24 3))) "Major mode for editing Kconfig files" tar ((:commit . "cd87b71c8c1739d026645ece0bbd20055a7a2d4a") (:authors ("Dela Anthonio" . "dell.anthonio@gmail.com")) (:maintainers ("Dela Anthonio" . "dell.anthonio@gmail.com")) (:maintainer "Dela Anthonio" . "dell.anthonio@gmail.com") (:keywords "kconfig" "languages" "linux" "kernel") (:url . "https://github.com/delaanthonio/kconfig-mode"))]) (kconfig-ref . [(20230814 1052) ((emacs (24 4)) (projectile (2 7 0)) (emacsql (0))) "A simple package for looking up kconfig symbol quickly" tar ((:commit . "a3f602032cd3b9a7167505bd8ad0f156ae34c0b8") (:authors ("Jason Kim" . "sukbeom.kim@gmail.com")) (:maintainers ("Jason Kim" . "sukbeom.kim@gmail.com")) (:maintainer "Jason Kim" . "sukbeom.kim@gmail.com") (:keywords "tools" "kconfig" "linux" "kernel") (:url . "https://github.com/seokbeomkim/kconfig-ref"))]) - (kdeconnect . [(20210519 2016) nil "An interface for KDE Connect" tar ((:commit . "4977af8cb5fdc21da770f3ee43ad7823f2937da3") (:authors ("Carl Lieberman" . "dev@carl.ac")) (:maintainers ("Carl Lieberman" . "dev@carl.ac")) (:maintainer "Carl Lieberman" . "dev@carl.ac") (:keywords "kdeconnect" "android"))]) + (kdeconnect . [(20231029 2250) ((emacs (25 1))) "An interface for KDE Connect" tar ((:commit . "2548bae3b79df23d3fb765391399410e2b935eb9") (:authors ("Carl Lieberman" . "dev@carl.ac")) (:maintainers ("Carl Lieberman" . "dev@carl.ac")) (:maintainer "Carl Lieberman" . "dev@carl.ac") (:keywords "convenience") (:url . "https://github.com/carldotac/kdeconnect.el"))]) (keepass-mode . [(20211030 958) ((emacs (27))) "Mode for KeePass DB." tar ((:commit . "f432bb60f9f3bd027025140d723906dcabeefaef") (:authors ("Ignasi Fosch" . "natx@y10k.ws")) (:maintainer "Ignasi Fosch" . "natx@y10k.ws") (:keywords "data" "files" "tools") (:url . "https://github.com/ifosch/keepass-mode"))]) (keg . [(20230709 1321) ((emacs (24 1))) "Modern Elisp package development system" tar ((:commit . "c0d24fdad4248e0291685b47a02df54e9f980aba") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "convenience") (:url . "https://github.com/conao3/keg.el"))]) (keg-mode . [(20220307 829) ((emacs (24 4))) "Major mode for editing Keg files" tar ((:commit . "d2ef9cfaee1256849291cfade3d730667f55aaf2") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "convenience") (:url . "https://github.com/conao3/keg.el"))]) (kele . [(20230326 33) ((emacs (28 1)) (async (1 9 7)) (dash (2 19 1)) (f (0 20 0)) (ht (2 3)) (plz (0 4)) (s (1 13 0)) (yaml (0 5 1))) "Spritzy Kubernetes cluster management" tar ((:commit . "15e841fb7bbc08545534e466ce831d6e80fd8901") (:authors ("Jonathan Jin" . "me@jonathanj.in")) (:maintainers ("Jonathan Jin" . "me@jonathanj.in")) (:maintainer "Jonathan Jin" . "me@jonathanj.in") (:keywords "kubernetes" "tools") (:url . "https://github.com/jinnovation/kele.el"))]) (kerl . [(20150424 2005) nil "Emacs integration for kerl" tar ((:commit . "1732ee26213f021bf040919c45ad276aafcaae14") (:authors ("Correl Roush" . "correl@gmail.com")) (:maintainers ("Correl Roush" . "correl@gmail.com")) (:maintainer "Correl Roush" . "correl@gmail.com") (:keywords "tools") (:url . "http://github.com/correl/kerl.el/"))]) - (key-assist . [(20230122 718) ((emacs (24 3))) "Minibuffer keybinding cheatsheet and launcher" tar ((:commit . "41a958ca6b038586bfdcf01045bb8b9d379248fe") (:authors ("Boruch Baum" . "boruch_baum@gmx.com")) (:maintainers ("Boruch Baum" . "boruch_baum@gmx.com")) (:maintainer "Boruch Baum" . "boruch_baum@gmx.com") (:keywords "abbrev" "convenience" "docs" "help") (:url . "https://github.com/Boruch-Baum/emacs-key-assist"))]) - (key-chord . [(20230522 223) ((emacs (24))) "map pairs of simultaneously pressed keys to commands" tar ((:commit . "e724def60fdf6473858f2962ae276cf4413473eb") (:authors ("David Andersson ")) (:maintainers ("David Andersson ")) (:maintainer "David Andersson ") (:keywords "keyboard" "chord" "input"))]) + (key-assist . [(20231208 446) ((emacs (24 3))) "Minibuffer keybinding cheatsheet and launcher" tar ((:commit . "87d2378db3d997b6b5a7b2c04281c18378e70bbb") (:authors ("Boruch Baum" . "boruch_baum@gmx.com")) (:maintainers ("Boruch Baum" . "boruch_baum@gmx.com")) (:maintainer "Boruch Baum" . "boruch_baum@gmx.com") (:keywords "abbrev" "convenience" "docs" "help") (:url . "https://github.com/Boruch-Baum/emacs-key-assist"))]) + (key-chord . [(20240109 1430) ((emacs (24))) "map pairs of simultaneously pressed keys to commands" tar ((:commit . "dbf91fefdad58b1c2f07c92e658ce81490837c60") (:authors ("David Andersson ")) (:maintainers ("David Andersson ")) (:maintainer "David Andersson ") (:keywords "keyboard" "chord" "input"))]) (key-combo . [(20230323 829) nil "map key sequence to commands" tar ((:commit . "16fb73522d53547ef38f3710aff7c0b01005d576") (:authors ("Yuuki Arisawa" . "yuuki.ari@gmail.com")) (:maintainers ("Vitalie Spinu" . "spinuvit@gmail.com")) (:maintainer "Vitalie Spinu" . "spinuvit@gmail.com") (:keywords "keyboard" "input") (:url . "https://github.com/uk-ar/key-combo"))]) (key-intercept . [(20140211 749) nil "Intercept prefix keys" tar ((:commit . "d9a60edb4ce893f2d3d94f242164fdcc62d43cf2") (:authors ("INA Lintaro ")) (:maintainers ("INA Lintaro ")) (:maintainer "INA Lintaro ") (:keywords "keyboard") (:url . "http://github.com/tarao/key-intercept-el"))]) (key-leap . [(20160831 1447) ((emacs (24 3))) "Leap between lines by typing keywords" tar ((:commit . "b3f6ef15c8a13870475d5af159fa24b30f97dea0") (:authors ("Martin Rykfors" . "martinrykfors@gmail.com")) (:maintainers ("Martin Rykfors" . "martinrykfors@gmail.com")) (:maintainer "Martin Rykfors" . "martinrykfors@gmail.com") (:keywords "point" "convenience") (:url . "https://github.com/MartinRykfors/key-leap"))]) (key-quiz . [(20200226 2129) ((emacs (26))) "Emacs Keys Quiz" tar ((:commit . "1ee67f3f8977d95785e021f7896685de1979137e") (:authors ("Federico Tedin" . "federicotedin@gmail.com")) (:maintainers ("Federico Tedin" . "federicotedin@gmail.com")) (:maintainer "Federico Tedin" . "federicotedin@gmail.com") (:keywords "games") (:url . "https://github.com/federicotdn/key-quiz"))]) (key-seq . [(20150907 756) ((key-chord (0 6))) "map pairs of sequentially pressed keys to commands" tar ((:commit . "e29b083a6427d061638749194fc249ef69ad2cc0") (:authors ("Vyacheslav Levit" . "dev@vlevit.org")) (:maintainers ("Vyacheslav Levit" . "dev@vlevit.org")) (:maintainer "Vyacheslav Levit" . "dev@vlevit.org") (:keywords "convenience" "keyboard" "keybindings") (:url . "http://github.com/vlevit/key-seq.el"))]) - (keycast . [(20230617 1128) ((emacs (25 3)) (compat (29 1 4 1))) "Show current command and its binding" tar ((:commit . "0b16d6aa3ae965bcd6b4d1fd0173cfde9dc8e275") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "multimedia") (:url . "https://github.com/tarsius/keycast"))]) + (keycast . [(20240304 1916) ((emacs (25 3)) (compat (29 1 4 1))) "Show current command and its binding" tar ((:commit . "ec90b16baa0e9e7eb43d8c38e6cf6dccf75a95de") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "multimedia") (:url . "https://github.com/tarsius/keycast"))]) (keychain-environment . [(20180318 2223) nil "load keychain environment variables" tar ((:commit . "d3643196de6dc79ea77f9f4805028350fd76100b") (:authors ("Paul Tipper ")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "gnupg" "pgp" "ssh") (:url . "https://github.com/tarsius/keychain-environment"))]) (keydef . [(20090428 1931) nil "a simpler way to define keys, with kbd syntax" tar ((:commit . "dff2be9f58d12d8c6a490ad0c1b2b10b55528dc0") (:authors ("Michael John Downes" . "mjd@ams.org")) (:maintainers ("Michael John Downes" . "mjd@ams.org")) (:maintainer "Michael John Downes" . "mjd@ams.org") (:keywords "convenience" "lisp" "customization" "keyboard" "keys"))]) - (keyfreq . [(20220607 1613) ((cl-lib (0 5))) "track command frequencies" tar ((:commit . "dd88193cd7a91a92113121191573758ea2a3ceb1") (:authors ("Ryan Yeske, Michal Nazarewicz (mina86/AT/mina86.com)")) (:maintainers ("David Capello, Xah lee")) (:maintainer "David Capello, Xah lee"))]) - (keymap-utils . [(20230213 1152) ((emacs (25 1)) (compat (29 1 3 4))) "Keymap utilities" tar ((:commit . "1806ff73b0a68e84234d65c7d08a18cf3f0d29e5") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience" "extensions") (:url . "https://github.com/tarsius/keymap-utils"))]) + (keyfreq . [(20231107 106) ((cl-lib (0 5))) "track command frequencies" tar ((:commit . "c6955162307f37c2ac631d9daf118781009f8dda") (:authors ("Ryan Yeske, Michal Nazarewicz (mina86/AT/mina86.com)")) (:maintainers ("David Capello, Xah lee")) (:maintainer "David Capello, Xah lee"))]) + (keymap-utils . [(20240101 2218) ((emacs (25 1)) (compat (29 1 3 4))) "Keymap utilities" tar ((:commit . "868c2b37abebc78c7dff72e1cb2ca85b93d07537") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience" "extensions") (:url . "https://github.com/tarsius/keymap-utils"))]) (keypress-multi-event . [(20190109 530) ((emacs (24 3))) "Perform different actions for the same keypress." tar ((:commit . "9de65a27e10d8ae47aa6d28c02c3eb82ee8c0b2e") (:authors ("Boruch Baum" . "boruch_baum@gmx.com")) (:maintainers ("Boruch Baum" . "boruch_baum@gmx.com")) (:maintainer "Boruch Baum" . "boruch_baum@gmx.com") (:keywords "abbrev" "convenience" "wp" "keyboard") (:url . "https://www.github.com/Boruch_Baum/emacs-keypress-multi-event"))]) - (keypression . [(20200819 534) ((emacs (26 3))) "Keystroke visualizer" tar ((:commit . "9427241f3fa539e4b5ad7581a05eb7e49f2cf518") (:authors ("chuntaro" . "chuntaro@sakura-games.jp")) (:maintainers ("chuntaro" . "chuntaro@sakura-games.jp")) (:maintainer "chuntaro" . "chuntaro@sakura-games.jp") (:keywords "key" "screencast" "tools") (:url . "https://github.com/chuntaro/emacs-keypression"))]) + (keypression . [(20240111 440) ((emacs (26 3))) "Keystroke visualizer" tar ((:commit . "e85e3fd9ce216a370be221cf9de1503777ef0088") (:authors ("chuntaro" . "chuntaro@sakura-games.jp")) (:maintainers ("chuntaro" . "chuntaro@sakura-games.jp")) (:maintainer "chuntaro" . "chuntaro@sakura-games.jp") (:keywords "key" "screencast" "tools") (:url . "https://github.com/chuntaro/emacs-keypression"))]) (keyset . [(20150220 530) ((dash (2 8 0)) (cl-lib (0 5))) "A small library for structuring key bindings." tar ((:commit . "c6b375fbe8035fde593d1d96895eb6e3f111d379") (:authors ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainers ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainer "Hiroki YAMAKAWA" . "s06139@gmail.com") (:url . "https://github.com/HKey/keyset"))]) (keystore-mode . [(20190409 1946) ((emacs (24 3)) (origami (1 0)) (s (1 12 0)) (seq (2 20))) "A major mode for viewing and managing (java) keystores" tar ((:commit . "43bd5926348298d077c7221f37902c990df3f951") (:authors ("Peterpaul Taekele Klein Haneveld" . "pp.kleinhaneveld@gmail.com")) (:maintainers ("Peterpaul Taekele Klein Haneveld" . "pp.kleinhaneveld@gmail.com")) (:maintainer "Peterpaul Taekele Klein Haneveld" . "pp.kleinhaneveld@gmail.com") (:keywords "tools") (:url . "https://github.com/peterpaul/keystore-mode"))]) (keyswap . [(20160813 957) ((emacs (24 3))) "swap bindings between key pairs" tar ((:commit . "cd682a7c4a8d64d6bae6a005db5045232e5e7b95") (:authors ("Matthew Malcomson" . "hardenedapple@gmail.com")) (:maintainers ("Matthew Malcomson" . "hardenedapple@gmail.com")) (:maintainer "Matthew Malcomson" . "hardenedapple@gmail.com") (:keywords "convenience") (:url . "http://github.com/hardenedapple/keyswap.el"))]) - (keytar . [(20221231 1655) ((emacs (24 4))) "Emacs Lisp interface for node-keytar" tar ((:commit . "51c8f2f1f207cc67af4e67731ee056860e107811") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "keytar" "password" "credential" "secret" "security") (:url . "https://github.com/emacs-grammarly/keytar"))]) + (keytar . [(20240101 846) ((emacs (24 4))) "Emacs Lisp interface for node-keytar" tar ((:commit . "b4fdde53ec884c931db8465b334af6057b30daa1") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "keytar" "password" "credential" "secret" "security") (:url . "https://github.com/emacs-grammarly/keytar"))]) (keyword-search . [(20180424 1102) nil "browser keyword search from Emacs" tar ((:commit . "f8475ecaddb8804a9be6bee47678207c86ac8dee") (:maintainers ("Jens Petersen")) (:maintainer "Jens Petersen") (:keywords "web" "search" "keyword") (:url . "https://github.com/juhp/keyword-search"))]) (kfg . [(20140909 538) ((f (0 17 1))) "an emacs configuration system" tar ((:commit . "ffc35b77f227d4c64a1271ec30d31333ffeb0013") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainers ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:url . "https://github.com/abingham/kfg"))]) (khalel . [(20230606 1909) ((emacs (27 1))) "Import, edit and create calendar events through khal" tar ((:commit . "85df973fe2785caee08d4ef5b23bdaae424a8d98") (:authors ("Hanno Perrey ")) (:maintainers ("Hanno Perrey" . "hanno@hoowl.se")) (:maintainer "Hanno Perrey" . "hanno@hoowl.se") (:keywords "event" "calendar" "ics" "khal") (:url . "https://gitlab.com/hperrey/khalel"))]) - (khardel . [(20220223 934) ((emacs (27 1)) (yaml-mode (0 0 13))) "Integrate with khard" tar ((:commit . "1436ec5ef1b5b26104a4735ee64c0afe148700de") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:url . "https://github.com/DamienCassou/khardel"))]) - (khoj . [(20230829 1844) ((emacs (27 1)) (transient (0 3 0)) (dash (2 19 1))) "AI personal assistant for your digital brain" tar ((:commit . "74409c2c64da3bff37a027537b3521849d395cc6") (:authors ("Debanjum Singh Solanky" . "debanjum@gmail.com")) (:maintainers ("Debanjum Singh Solanky" . "debanjum@gmail.com")) (:maintainer "Debanjum Singh Solanky" . "debanjum@gmail.com") (:keywords "search" "chat" "org-mode" "outlines" "markdown" "pdf" "image") (:url . "https://github.com/khoj-ai/khoj/tree/master/src/interface/emacs"))]) + (khardel . [(20231126 1502) ((emacs (27 1)) (yaml-mode (0 0 13))) "Integrate with khard" tar ((:commit . "205e374b36252183a146a7a8f857bcf95a77edc3") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:url . "https://github.com/DamienCassou/khardel"))]) + (khoj . [(20240314 1838) ((emacs (27 1)) (transient (0 3 0)) (dash (2 19 1))) "AI copilot for your Second Brain" tar ((:commit . "fba0338787b3197e22d6b4ea7dc94be153be7396") (:authors ("Debanjum Singh Solanky" . "debanjum@khoj.dev") ("Saba Imran" . "saba@khoj.dev")) (:maintainers ("Debanjum Singh Solanky" . "debanjum@khoj.dev")) (:maintainer "Debanjum Singh Solanky" . "debanjum@khoj.dev") (:keywords "search" "chat" "org-mode" "outlines" "markdown" "pdf" "image") (:url . "https://github.com/khoj-ai/khoj/tree/master/src/interface/emacs"))]) (kibit-helper . [(20150508 1533) ((s (0 8)) (emacs (24))) "Conveniently use the Kibit Leiningen plugin from Emacs" tar ((:commit . "ec5f154db3bb0c838e86f527353f08644cede926") (:authors ("Jonas Enlund") ("James Elliott" . "james@brunchboy.com")) (:maintainers ("Jonas Enlund")) (:maintainer "Jonas Enlund") (:keywords "languages" "clojure" "kibit") (:url . "http://www.github.com/brunchboy/kibit-helper"))]) (kill-file-path . [(20230306 1041) ((emacs (26))) "Copy file name into kill ring" tar ((:commit . "5dcbce69cbae17665216a32dd20f27de54c62972") (:authors ("Adam Chyła" . "adam@chyla.org")) (:maintainers ("Adam Chyła" . "adam@chyla.org")) (:maintainer "Adam Chyła" . "adam@chyla.org") (:keywords "files") (:url . "https://github.com/chyla/kill-file-path/kill-file-path.el"))]) (kill-or-bury-alive . [(20230606 1503) ((emacs (24 4))) "Precise control over buffer killing" tar ((:commit . "16c393db6ad0c7e184af0a24d26b637e23543b1f") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainers ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:keywords "convenience") (:url . "https://github.com/mrkkrp/kill-or-bury-alive"))]) @@ -2840,44 +2914,45 @@ (killer . [(20190128 10) nil "kill and delete text" tar ((:commit . "ace0547944933440384ceeb5876b1f68c082d540") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience") (:url . "http://github.com/tarsius/killer"))]) (kite . [(20130201 1938) ((json (1 2)) (websocket (0 93 1))) "WebKit inspector front-end" tar ((:commit . "7ed74d1147a6ddd152d3da65dc30df3517d53144") (:authors ("Julian Scheid" . "julians37@gmail.com")) (:maintainers ("Julian Scheid" . "julians37@gmail.com")) (:maintainer "Julian Scheid" . "julians37@gmail.com") (:keywords "tools"))]) (kite-mini . [(20160508 1106) ((dash (2 11 0)) (websocket (1 5))) "Remotely evaluate JavaScript in the WebKit debugger" tar ((:commit . "48734092e735033ad7664a9933acd4556e095f79") (:authors ("Tung Dao" . "me@tungdao.com")) (:maintainers ("Tung Dao" . "me@tungdao.com")) (:maintainer "Tung Dao" . "me@tungdao.com") (:keywords "webkit") (:url . "https://github.com/tungd/kite-mini.el"))]) - (kivy-mode . [(20210318 2106) nil "Emacs major mode for editing Kivy files" tar ((:commit . "db86b06b9b72e514c122e3f54a0bce74adad44c5") (:authors ("Dean Serenevy" . "dean@serenevy.net")) (:maintainers ("Dean Serenevy" . "dean@serenevy.net")) (:maintainer "Dean Serenevy" . "dean@serenevy.net"))]) + (kivy-mode . [(20240105 940) nil "Emacs major mode for editing Kivy files" tar ((:commit . "9ef218027178115a66b417ae34b21f488bdd3617") (:authors ("Dean Serenevy" . "dean@serenevy.net")) (:maintainers ("Dean Serenevy" . "dean@serenevy.net")) (:maintainer "Dean Serenevy" . "dean@serenevy.net"))]) (kiwix . [(20220316 847) ((emacs (25 1)) (request (0 3 0))) "Searching offline Wikipedia through Kiwix." tar ((:commit . "444f686a7f75db788d54f544b923a3532732eb8b") (:authors ("stardiviner" . "numbchild@gmail.com")) (:maintainers ("stardiviner" . "numbchild@gmail.com")) (:maintainer "stardiviner" . "numbchild@gmail.com") (:keywords "kiwix" "wikipedia") (:url . "https://repo.or.cz/kiwix.el.git"))]) (kixtart-mode . [(20150611 1604) ((emacs (24))) "major mode for Kixtart scripting files" tar ((:commit . "1c2356797e7b766bbaaa2b341176a8b10499cd79") (:authors ("Ryrun ")) (:maintainers ("Ryrun ")) (:maintainer "Ryrun ") (:keywords "languages") (:url . "https://github.com/ryrun/kixtart-mode"))]) - (kkp . [(20230801 1603) ((emacs (27 1)) (compat (29 1 3 4))) "Enable support for the Kitty Keyboard Protocol" tar ((:commit . "18e3b1b73fddd234176a7e6633da67c30d13d107") (:authors ("Benjamin Orthen" . "contact@orthen.net")) (:maintainers ("Benjamin Orthen" . "contact@orthen.net")) (:maintainer "Benjamin Orthen" . "contact@orthen.net") (:keywords "terminals") (:url . "https://github.com/benjaminor/kkp"))]) - (klere-theme . [(20230822 144) ((emacs (24))) "A dark theme with lambent color highlights and incremental grays" tar ((:commit . "fa83ea76c92705bc3c1b881b615a666ae3acae28") (:authors ("Wamm K. D." . "jaft.r@outlook.com")) (:maintainers ("Wamm K. D." . "jaft.r@outlook.com")) (:maintainer "Wamm K. D." . "jaft.r@outlook.com") (:url . "https://codeberg.org/WammKD/emacs-klere-theme"))]) - (klondike . [(20230606 704) ((emacs (28 1))) "Klondike" tar ((:commit . "244278348e913433450329c6c863da06167a3f20") (:authors ("Wamm K. D." . "jaft.r@outlook.com")) (:maintainers ("Wamm K. D." . "jaft.r@outlook.com")) (:maintainer "Wamm K. D." . "jaft.r@outlook.com") (:keywords "games" "cards" "solitaire" "klondike") (:url . "https://codeberg.org/WammKD/Emacs-Klondike"))]) + (kkp . [(20240227 1145) ((emacs (27 1)) (compat (29 1 3 4))) "Enable support for the Kitty Keyboard Protocol" tar ((:commit . "ed9214329f11b095fc7bad06feb329b9f232258d") (:authors ("Benjamin Orthen" . "contact@orthen.net")) (:maintainers ("Benjamin Orthen" . "contact@orthen.net")) (:maintainer "Benjamin Orthen" . "contact@orthen.net") (:keywords "terminals") (:url . "https://github.com/benjaminor/kkp"))]) + (klere-theme . [(20240123 124) ((emacs (24))) "A dark theme with lambent color highlights and incremental grays" tar ((:commit . "e73a01e69bf80f753a1603337fdc4b89e685219a") (:authors ("Wamm K. D." . "jaft.r@outlook.com")) (:maintainers ("Wamm K. D." . "jaft.r@outlook.com")) (:maintainer "Wamm K. D." . "jaft.r@outlook.com") (:url . "https://codeberg.org/WammKD/emacs-klere-theme"))]) + (klondike . [(20240131 453) ((emacs (28 1))) "Klondike" tar ((:commit . "1cf14d7b6c14ebde741c36f6aa871dcd41e37cff") (:authors ("Wamm K. D." . "jaft.r@outlook.com")) (:maintainers ("Wamm K. D." . "jaft.r@outlook.com")) (:maintainer "Wamm K. D." . "jaft.r@outlook.com") (:keywords "games" "cards" "solitaire" "klondike") (:url . "https://codeberg.org/WammKD/Emacs-Klondike"))]) (kmacro-x . [(20230502 1253) ((emacs (27 2))) "Keyboard macro helpers and extensions" tar ((:commit . "b5f6b408a9134f3db14c0516c5ba48d68178a175") (:authors ("Wojciech Siewierski")) (:maintainers ("Wojciech Siewierski")) (:maintainer "Wojciech Siewierski") (:keywords "convenience") (:url . "https://github.com/vifon/kmacro-x.el"))]) (know-your-http-well . [(20160208 2305) nil "Look up the meaning of HTTP headers, methods, relations, status codes" tar ((:commit . "c381a9735f3ea86ebc9667e35cdfeab0b67fefb7"))]) (kodi-remote . [(20190622 1325) ((request (0 2 0)) (let-alist (1 0 4)) (json (1 4)) (cl-lib (0 5)) (f (20190109 906))) "Remote Control for Kodi" tar ((:commit . "f5e932036c16e2b61a63020e006fc601e38d181e") (:authors ("Stefan Huchler" . "stefan.huchler@mail.de")) (:maintainers ("Stefan Huchler" . "stefan.huchler@mail.de")) (:maintainer "Stefan Huchler" . "stefan.huchler@mail.de") (:keywords "kodi" "tools" "convinience") (:url . "http://github.com/spiderbit/kodi-remote.el"))]) (kolon-mode . [(20140122 1134) nil "Syntax highlighting for Text::Xslate's Kolon syntax" tar ((:commit . "5af0955e280ae991862189ebecd3937c5fc8fb9f") (:authors ("Sam Tran")) (:maintainers ("Sam Tran")) (:maintainer "Sam Tran") (:keywords "xslate" "perl") (:url . "https://github.com/samvtran/kolon-mode"))]) + (koopa-mode . [(20230905 2243) ((company (0 9 13)) (emacs (27 1))) "A major mode for Microsoft PowerShell" tar ((:commit . "82c81a641e106f270d45427f6d0139aabbd8523c") (:authors ("Tyler Hooks")) (:maintainers ("Tyler Hooks")) (:maintainer "Tyler Hooks") (:keywords "powershell" "convenience") (:url . "https://github.com/sch0lars/koopa-mode"))]) (kooten-theme . [(20161023 905) ((emacs (24 1))) "Dark color theme" tar ((:commit . "d10197b4dd7af02cd14aeab2573c273a294798c3") (:authors ("Pascal van Kooten" . "kootenpv@gmail.com")) (:maintainers ("Pascal van Kooten" . "kootenpv@gmail.com")) (:maintainer "Pascal van Kooten" . "kootenpv@gmail.com") (:keywords "themes") (:url . "http://github.com/kootenpv/emacs-kooten-theme"))]) (korean-holidays . [(20190102 1558) nil "Korean holidays for calendar." tar ((:commit . "3f90ed86f46f8e5533f23baa40e2513ac497ca2b") (:authors ("SeungKi Kim" . "tttuuu888@gmail.com")) (:maintainers ("SeungKi Kim" . "tttuuu888@gmail.com")) (:maintainer "SeungKi Kim" . "tttuuu888@gmail.com") (:keywords "calendar") (:url . "https://github.com/tttuuu888/korean-holidays"))]) (kosmos-theme . [(20170502 1850) ((emacs (24))) "Black and lightgray theme with not so much syntax highlighting." tar ((:commit . "616456d2376a75dc31190ad65137d179fbad4336") (:authors ("Maxim Kim" . "habamax@gmail.com")) (:maintainers ("Maxim Kim" . "habamax@gmail.com")) (:maintainer "Maxim Kim" . "habamax@gmail.com") (:url . "https://github.com/habamax/kosmos-theme"))]) (kotlin-mode . [(20230123 1859) ((emacs (24 3))) "Major mode for kotlin" tar ((:commit . "fddd747e5b4736e8b27a147960f369b86179ddff") (:authors ("Shodai Yokoyama" . "quantumcars@gmail.com")) (:maintainers ("Shodai Yokoyama" . "quantumcars@gmail.com")) (:maintainer "Shodai Yokoyama" . "quantumcars@gmail.com") (:keywords "languages") (:url . "https://github.com/Emacs-Kotlin-Mode-Maintainers/kotlin-mode"))]) - (kotlin-ts-mode . [(20230704 1512) ((emacs (29))) "A mode for editing Kotlin files based on tree-sitter" tar ((:commit . "85d614f9a3952bc744b597dcd55e83e83a413f31") (:authors ("Alex Figl-Brick" . "alex@alexbrick.me")) (:maintainers ("Alex Figl-Brick" . "alex@alexbrick.me")) (:maintainer "Alex Figl-Brick" . "alex@alexbrick.me") (:url . "https://gitlab.com/bricka/emacs-kotlin-ts-mode"))]) + (kotlin-ts-mode . [(20240318 1601) ((emacs (29 1))) "A mode for editing Kotlin files based on tree-sitter" tar ((:commit . "5cf2ab3a50ccae4eb23482f5d0a615fa2d22504b") (:authors ("Alex Figl-Brick" . "alex@alexbrick.me")) (:maintainers ("Alex Figl-Brick" . "alex@alexbrick.me")) (:maintainer "Alex Figl-Brick" . "alex@alexbrick.me") (:url . "https://gitlab.com/bricka/emacs-kotlin-ts-mode"))]) (kpm-list . [(20170924 1352) nil "An emacs buffer list that tries to intelligently group together buffers." tar ((:commit . "e0f5112e5ce8ec1b603f4428fa51681c68bb28f5") (:authors ("Kevin Mahoney")) (:maintainers ("Kevin Mahoney")) (:maintainer "Kevin Mahoney") (:url . "https://github.com/KMahoney/kpm-list/"))]) (kroman . [(20150827 2340) nil "Korean hangul romanization" tar ((:commit . "431144a3cd629a2812a668a29ad85182368dc9b0") (:authors ("Zhang Kai Yu" . "yeannylam@gmail.com")) (:maintainers ("Zhang Kai Yu" . "yeannylam@gmail.com")) (:maintainer "Zhang Kai Yu" . "yeannylam@gmail.com") (:keywords "korean" "roman"))]) (ksp-cfg-mode . [(20190414 2348) ((emacs (24)) (cl-lib (0 5))) "major mode for editing KSP CFG files" tar ((:commit . "faec8bd8456c67276d065eb68c88a30efcef59ef") (:authors ("Emily Backes" . "lucca@accela.net")) (:maintainers ("Emily Backes" . "lucca@accela.net")) (:maintainer "Emily Backes" . "lucca@accela.net") (:keywords "data") (:url . "http://github.com/lashtear/ksp-cfg-mode"))]) (ksp-mode . [(20221220 1136) ((emacs (27 1))) "Major mode for editing ksp files" tar ((:commit . "89b91b8ed6753867e30aa494e5d80325dfe25569") (:maintainers ("YoungJoo Lee" . "youngker@gmail.com")) (:maintainer "YoungJoo Lee" . "youngker@gmail.com") (:keywords "ksp" "languages") (:url . "https://github.com/youngker/ksp-mode.el"))]) - (kubectx-mode . [(20200116 1918) ((emacs (24))) "Change kubectl context/namespace and show in mode line" tar ((:commit . "f08687ae5403eb18bbeffc6dafdfde469bdb9a36") (:authors ("Terje Sannum" . "terje@offpiste.org")) (:maintainers ("Terje Sannum" . "terje@offpiste.org")) (:maintainer "Terje Sannum" . "terje@offpiste.org") (:keywords "tools" "kubernetes") (:url . "https://github.com/terjesannum/emacs-kubectx-mode"))]) - (kubedoc . [(20230513 2014) ((emacs (27 1))) "Kubernetes API Documentation" tar ((:commit . "c07e356326b6f373694d43369c7110c2873e24cd") (:authors ("Dean Lindqvist Todevski ")) (:maintainers ("Dean Lindqvist Todevski")) (:maintainer "Dean Lindqvist Todevski") (:keywords "docs" "help" "k8s" "kubernetes" "tools") (:url . "https://github.com/r0bobo/kubedoc.el/"))]) - (kubel . [(20221123 241) ((transient (0 1 0)) (emacs (25 3)) (dash (2 12 0)) (s (1 2 0)) (yaml-mode (0 0 14))) "Control Kubernetes with limited permissions" tar ((:commit . "5962d566db17ddfa25ac3120b4591df1d741e979") (:authors ("Adrien Brochard")) (:maintainers ("Adrien Brochard")) (:maintainer "Adrien Brochard") (:keywords "kubernetes" "k8s" "tools" "processes") (:url . "https://github.com/abrochard/kubel"))]) - (kubel-evil . [(20220909 2028) ((kubel (1 0)) (evil (1 0)) (emacs (25 3))) "extension for kubel to provide evil keybindings" tar ((:commit . "1b405d8756ffc7c8f1e11450d6f07ffde38fe351") (:authors ("Marcel Patzwahl")) (:maintainers ("Marcel Patzwahl")) (:maintainer "Marcel Patzwahl") (:keywords "kubernetes" "k8s" "tools" "processes" "evil" "keybindings") (:url . "https://github.com/abrochard/kubel"))]) + (kubectx-mode . [(20240312 2024) ((emacs (24))) "Change kubectl context/namespace and show in mode line" tar ((:commit . "b177c0fa9f8471d6199df4598afde1e39e83c504") (:authors ("Terje Sannum" . "terje@offpiste.org")) (:maintainers ("Terje Sannum" . "terje@offpiste.org")) (:maintainer "Terje Sannum" . "terje@offpiste.org") (:keywords "tools" "kubernetes") (:url . "https://github.com/terjesannum/emacs-kubectx-mode"))]) + (kubedoc . [(20240108 1404) ((emacs (27 1))) "Kubernetes API Documentation" tar ((:commit . "aac02b096c98b83b4eaf129e6d767cf7150a6d43") (:authors ("Dean Lindqvist Todevski ")) (:maintainers ("Dean Lindqvist Todevski")) (:maintainer "Dean Lindqvist Todevski") (:keywords "docs" "help" "k8s" "kubernetes" "tools") (:url . "https://github.com/r0bobo/kubedoc.el/"))]) + (kubel . [(20240201 2021) ((transient (0 1 0)) (emacs (25 3)) (dash (2 12 0)) (s (1 2 0)) (yaml-mode (0 0 14))) "Control Kubernetes with limited permissions" tar ((:commit . "7affc4269e2a2925f68f073863af0929854002f2") (:authors ("Adrien Brochard")) (:maintainers ("Adrien Brochard")) (:maintainer "Adrien Brochard") (:keywords "kubernetes" "k8s" "tools" "processes") (:url . "https://github.com/abrochard/kubel"))]) + (kubel-evil . [(20231224 1343) ((kubel (1 0)) (evil (1 0)) (emacs (25 3))) "extension for kubel to provide evil keybindings" tar ((:commit . "3d2f86fccdf81ab890f5d46dde93f241b718a436") (:authors ("Marcel Patzwahl")) (:maintainers ("Marcel Patzwahl")) (:maintainer "Marcel Patzwahl") (:keywords "kubernetes" "k8s" "tools" "processes" "evil" "keybindings") (:url . "https://github.com/abrochard/kubel"))]) (kubernetes . [(20221229 1519) ((dash (2 12 0)) (magit-section (3 1 1)) (magit-popup (2 13 0)) (with-editor (3 0 4)) (request (0 3 2)) (s (1 12 0)) (transient (0 3 0))) "Magit-like porcelain for Kubernetes" tar ((:commit . "099004511670c7fd52a619c5758047bb3172ba36") (:authors ("Chris Barrett" . "chris+emacs@walrus.cool")) (:maintainers ("Chris Barrett" . "chris+emacs@walrus.cool")) (:maintainer "Chris Barrett" . "chris+emacs@walrus.cool") (:keywords "kubernetes") (:url . "https://github.com/kubernetes-el/kubernetes-el"))]) (kubernetes-evil . [(20220625 534) ((kubernetes (0 18 0)) (evil (1 2 12))) "Kubernetes keybindings for evil-mode." tar ((:commit . "b155d64aa72bd1175770db3518a67a347caa36dd") (:authors ("Chris Barrett" . "chris+emacs@walrus.cool")) (:maintainers ("Chris Barrett" . "chris+emacs@walrus.cool")) (:maintainer "Chris Barrett" . "chris+emacs@walrus.cool"))]) (kubernetes-helm . [(20230221 1438) ((yaml-mode (0 0 13)) (emacs (25 3))) "extension for helm, the package manager for kubernetes" tar ((:commit . "f70e2efa6ef869143ccb2f158f4ab7df91dcc58f") (:authors ("Adrien Brochard")) (:maintainers ("Adrien Brochard")) (:maintainer "Adrien Brochard") (:keywords "kubernetes" "helm" "k8s" "tools" "processes") (:url . "https://github.com/abrochard/kubernetes-helm"))]) (kubernetes-tramp . [(20181228 922) ((emacs (24)) (cl-lib (0 5))) "TRAMP integration for kubernetes containers" tar ((:commit . "8713571b66940f8f3f496b55baa23cdf1df7a869") (:authors ("Giovanni Ruggiero" . "giovanni.ruggiero+github@gmail.com")) (:maintainers ("Giovanni Ruggiero" . "giovanni.ruggiero+github@gmail.com")) (:maintainer "Giovanni Ruggiero" . "giovanni.ruggiero+github@gmail.com") (:keywords "kubernetes" "convenience") (:url . "https://github.com/gruggiero/kubernetes-tramp"))]) (kurecolor . [(20221213 124) ((emacs (24 4)) (s (1 12))) "color editing goodies" tar ((:commit . "ac67ceba85839ab1ced96fad605bf023b697263f") (:authors ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainers ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com") (:url . "https://github.com/emacsfodder/kurecolor.el"))]) - (kuronami-theme . [(20220602 339) ((emacs (24 1))) "A deep blue theme with cool autumnal colors" tar ((:commit . "a51d5ff3883bd94d0a181bb5d60f747190eda4f6") (:authors ("Eric Chung <>")) (:maintainers ("Eric Chung <>")) (:maintainer "Eric Chung <>") (:url . "https://github.com/inj0h/kuronami"))]) + (kuronami-theme . [(20240104 2022) ((emacs (24 1))) "A deep blue theme with cool autumnal colors" tar ((:commit . "4d0a9e5f789e5768a0c2ea7dec31f98ea95c7372") (:authors ("inj0h <>")) (:maintainers ("inj0h <>")) (:maintainer "inj0h <>") (:url . "https://github.com/inj0h/kuronami"))]) (kv . [(20140108 1534) nil "key/value data structure functions" tar ((:commit . "721148475bce38a70e0b678ba8aa923652e8900e") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainers ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:keywords "lisp"))]) (kwin . [(20220120 2125) nil "communicatewith the KWin window manager" tar ((:commit . "20fac6508e5535a26df783ba05f04d1800b7382c") (:authors ("Simon Hafner")) (:maintainers ("Simon Hafner")) (:maintainer "Simon Hafner") (:url . "http://github.com/reactormonk/kwin-minor-mode"))]) (laas . [(20230331 1806) ((emacs (26 3)) (auctex (11 88)) (aas (1 1))) "A bundle of as-you-type LaTeX snippets" tar ((:commit . "a00f0aba237b85b3e5fd60cf84de5759d1bf5d48") (:maintainers ("Yoav Marco" . "yoavm448@gmail.com")) (:maintainer "Yoav Marco" . "yoavm448@gmail.com") (:keywords "tools" "tex") (:url . "https://github.com/tecosaur/LaTeX-auto-activating-snippets"))]) - (lab . [(20230819 1456) ((emacs (27 1)) (memoize (1 1)) (request (0 3 2)) (s (1 10 0))) "An interface for GitLab" tar ((:commit . "44cc2630adaa02f902bcf28fa05f3a9039dda005") (:authors ("Isa Mert Gurbuz" . "isamertgurbuz@gmail.com")) (:maintainers ("Isa Mert Gurbuz" . "isamertgurbuz@gmail.com")) (:maintainer "Isa Mert Gurbuz" . "isamertgurbuz@gmail.com") (:url . "https://github.com/isamert/lab.el"))]) + (lab . [(20240317 1949) ((emacs (27 1)) (memoize (1 1)) (request (0 3 2)) (s (1 10 0)) (f (0 20 0)) (compat (29 1 4 4)) (promise (1 1)) (async-await (1 1))) "An interface for GitLab" tar ((:commit . "bd88c08c02203a66048412672b894c0d7dab3da3") (:authors ("Isa Mert Gurbuz" . "isamertgurbuz@gmail.com")) (:maintainers ("Isa Mert Gurbuz" . "isamertgurbuz@gmail.com")) (:maintainer "Isa Mert Gurbuz" . "isamertgurbuz@gmail.com") (:url . "https://github.com/isamert/lab.el"))]) (lab-themes . [(20200815 2104) ((emacs (24))) "A custom theme carefully constructed in the LAB space" tar ((:commit . "9d7deb9635959d3a50ccb1082eb1207275f4b3e8") (:authors ("MetroWind" . "chris.corsair@gmail.com")) (:maintainers ("MetroWind" . "chris.corsair@gmail.com")) (:maintainer "MetroWind" . "chris.corsair@gmail.com") (:keywords "lisp") (:url . "https://github.com/MetroWind/lab-theme"))]) (labburn-theme . [(20221208 1611) nil "A lab color space zenburn theme." tar ((:commit . "bd0de2fdcf285d981f32e3e5ebc56fe3c9b589a5") (:authors ("Johannes Goslar")) (:maintainers ("Johannes Goslar")) (:maintainer "Johannes Goslar") (:keywords "theme" "zenburn") (:url . "https://github.com/ksjogo/labburn-theme"))]) (lacquer . [(20230824 725) ((emacs (25 2))) "Switch theme/font by selecting from a cache" tar ((:commit . "c8a0fb81f18001b3d510f545ba253ed4f9a50f5b") (:authors ("zakudriver" . "zy.hua1122@gmail.com")) (:maintainers ("zakudriver" . "zy.hua1122@gmail.com")) (:maintainer "zakudriver" . "zy.hua1122@gmail.com") (:keywords "tools") (:url . "https://github.com/zakudriver/lacquer"))]) (laguna-theme . [(20220804 227) nil "An updated blue-green Laguna Theme." tar ((:commit . "680ab8c936cb1c249b5a6a07976bcc83ef217e25") (:authors ("Henry Newcomer" . "a.cliche.email@gmail.com")) (:maintainers ("Henry Newcomer" . "a.cliche.email@gmail.com")) (:maintainer "Henry Newcomer" . "a.cliche.email@gmail.com") (:url . "https://github.com/HenryNewcomer/laguna-theme"))]) - (lambdapi-mode . [(20230728 1221) ((emacs (26 1)) (eglot (1 5)) (math-symbol-lists (1 2 1)) (highlight (20190710 1527))) "A major mode for editing Lambdapi source code" tar ((:commit . "e16893661355d35db3a48f0821981b72486d4841") (:maintainers ("Deducteam" . "dedukti-dev@inria.fr")) (:maintainer "Deducteam" . "dedukti-dev@inria.fr") (:keywords "languages") (:url . "https://github.com/Deducteam/lambdapi"))]) + (lambdapi-mode . [(20240130 1533) ((emacs (26 1)) (eglot (1 5)) (math-symbol-lists (1 2 1)) (highlight (20190710 1527))) "A major mode for editing Lambdapi source code" tar ((:commit . "bc447c9ab7f9a6ff6b30cabab467f445e30ae86c") (:maintainers ("Deducteam" . "dedukti-dev@inria.fr")) (:maintainer "Deducteam" . "dedukti-dev@inria.fr") (:keywords "languages") (:url . "https://github.com/Deducteam/lambdapi"))]) (lammps-mode . [(20180801 1319) ((emacs (24 4))) "basic syntax highlighting for LAMMPS files" tar ((:commit . "a5b68d7a59975770b56ee8f6e66fa4f703a72ffe") (:authors ("Aidan Thompson ")) (:maintainers ("Rohit Goswami ")) (:maintainer "Rohit Goswami ") (:keywords "languages" "faces") (:url . "https://github.com/lammps/lammps/tree/master/tools/emacs"))]) (lang-refactor-perl . [(20131122 2127) nil "Simple refactorings, primarily for Perl" tar ((:commit . "691bd69639de6b7af357e3b7143563ececd9c497") (:authors (nil . "Johan Lindstrom ")) (:maintainers (nil . "Johan Lindstrom ")) (:maintainer nil . "Johan Lindstrom ") (:keywords "languages" "refactoring" "perl") (:url . "https://github.com/jplindstrom/emacs-lang-refactor-perl"))]) (langdoc . [(20150218 645) ((cl-lib (0 2))) "Help to define help document mode for various languages" tar ((:commit . "2c7223bacb116992d700ecb19a60df5c09c63424") (:authors ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainers ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainer "Tomoya Tanjo" . "ttanjo@gmail.com") (:keywords "convenience" "eldoc") (:url . "https://github.com/tom-tan/langdoc/"))]) @@ -2885,18 +2960,19 @@ (langtool-ignore-fonts . [(20210526 2340) ((emacs (25 1)) (langtool (2 2 1))) "Force langtool to ignore certain fonts" tar ((:commit . "a5d04c3840c293f1b11db3c28e7210d0d20f53af") (:authors ("Christopher Lloyd" . "cjl8zf@virginia.edu")) (:maintainers ("Christopher Lloyd" . "cjl8zf@virginia.edu")) (:maintainer "Christopher Lloyd" . "cjl8zf@virginia.edu") (:url . "https://github.com/cjl8zf/langtool-ignore-fonts"))]) (langtool-popup . [(20230222 401) ((emacs (25 1)) (popup (0 5 9))) "Popup message extension for langtool.el" tar ((:commit . "d86101eafe9a994eb0425e08e7c1795e9cb0cd42") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "docs") (:url . "https://github.com/mhayashi1120/Emacs-langtool"))]) (language-detection . [(20161123 1813) ((emacs (24)) (cl-lib (0 5))) "Automatic language detection from code snippets" tar ((:commit . "38f5d294870678efc6ccf94ce6e8175a58f93025") (:authors ("Andreas Jansson" . "andreas@jansson.me.uk")) (:maintainers ("Andreas Jansson" . "andreas@jansson.me.uk")) (:maintainer "Andreas Jansson" . "andreas@jansson.me.uk") (:url . "https://github.com/andreasjansson/language-detection.el"))]) - (language-id . [(20230722 1141) ((emacs (24 3))) "Library to work with programming language identifiers" tar ((:commit . "ff09e3ef89a90d0707a77d6b7f4d2d7d67f4c03a") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "languages" "util") (:url . "https://github.com/lassik/emacs-language-id"))]) + (language-id . [(20240205 2150) ((emacs (24 3))) "Library to work with programming language identifiers" tar ((:commit . "1ad782d7e448c1e8d8652861f01f4a58315826c3") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "languages" "util") (:url . "https://github.com/lassik/emacs-language-id"))]) (languagetool . [(20230325 507) ((emacs (27 1))) "LanguageTool integration for grammar and spell check" tar ((:commit . "b136d531129eb488dc4134784e34c4afedcb0c2f") (:authors ("Joar Buitrago" . "jebuitragoc@unal.edu.co")) (:maintainers ("Joar Buitrago" . "jebuitragoc@unal.edu.co")) (:maintainer "Joar Buitrago" . "jebuitragoc@unal.edu.co") (:keywords "grammar" "text" "docs" "tools" "convenience" "checker") (:url . "https://github.com/PillFall/Emacs-LanguageTool.el"))]) - (lark-mode . [(20230327 1003) ((emacs (24 3))) "Major mode for editing Lark parser code" tar ((:commit . "9e19b40df29d273cf3aec9ddd0e739d3b3d9b3a8") (:authors ("Ta Quang Trung")) (:maintainers ("Ta Quang Trung")) (:maintainer "Ta Quang Trung") (:keywords "languages") (:url . "https://github.com/taquangtrung/lark-mode"))]) + (lark-mode . [(20231221 340) ((emacs (24 3))) "Major mode for editing Lark parser code" tar ((:commit . "0a0724b0f64d433d81f90ba8f86e618f8c33522a") (:authors ("Ta Quang Trung")) (:maintainers ("Ta Quang Trung")) (:maintainer "Ta Quang Trung") (:keywords "languages") (:url . "https://github.com/taquangtrung/lark-mode"))]) (lastfm . [(20211018 838) ((emacs (26 1)) (request (0 3 0)) (anaphora (1 0 4)) (memoize (1 1)) (elquery (0 1 0)) (s (1 12 0))) "Last.fm API for Emacs Lisp" tar ((:commit . "b4b19f0aadc5087febeeb3f59944a89c4cdcf325") (:authors ("Mihai Olteanu" . "mihai_olteanu@fastmail.fm")) (:maintainers ("Mihai Olteanu" . "mihai_olteanu@fastmail.fm")) (:maintainer "Mihai Olteanu" . "mihai_olteanu@fastmail.fm") (:keywords "multimedia" "api") (:url . "https://github.com/mihaiolteanu/lastfm.el/"))]) (lastpass . [(20201229 2109) ((emacs (24 4)) (seq (1 9)) (cl-lib (0 5))) "LastPass command wrapper" tar ((:commit . "2366de7824b6c5f8e9ec6811d219dc06794e8630") (:authors ("Petter Storvik")) (:maintainers ("Petter Storvik")) (:maintainer "Petter Storvik") (:keywords "extensions" "processes" "lpass" "lastpass") (:url . "https://github.com/storvik/emacs-lastpass"))]) - (latex-change-env . [(20230810 542) ((emacs (27 1)) (auctex (13 1))) "Change in and out of LaTeX environments" tar ((:commit . "968f38f0699c72ed5e8be2d0531424d16280f0f4") (:authors ("Tony Zorman" . "soliditsallgood@mailbox.org")) (:maintainers ("Tony Zorman" . "soliditsallgood@mailbox.org")) (:maintainer "Tony Zorman" . "soliditsallgood@mailbox.org") (:keywords "convenience" "tex") (:url . "https://gitlab.com/slotThe/change-env"))]) + (latex-change-env . [(20240318 855) ((emacs (27 1)) (auctex (13 1))) "Change in and out of LaTeX environments" tar ((:commit . "8b6bcd562c8ba5753551f7a6837b01b562b6439a") (:authors ("Tony Zorman" . "soliditsallgood@mailbox.org")) (:maintainers ("Tony Zorman" . "soliditsallgood@mailbox.org")) (:maintainer "Tony Zorman" . "soliditsallgood@mailbox.org") (:keywords "convenience" "tex") (:url . "https://github.com/slotThe/change-env"))]) (latex-extra . [(20220817 5) ((auctex (11 86 1)) (cl-lib (0 5))) "Adds several useful functionalities to LaTeX-mode." tar ((:commit . "a81e7588448f85c5fcc3f3fc71cf957d0928a656") (:authors ("Artur Malabarba" . "artur@endlessparentheses.com")) (:maintainers ("Artur Malabarba" . "artur@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "artur@endlessparentheses.com") (:keywords "tex") (:url . "http://github.com/Malabarba/latex-extra"))]) + (latex-labeler . [(20231231 1909) ((emacs (28 1))) "Simplify equation labeling in LaTeX" tar ((:commit . "c2df4c9d0a41a36de893925a91445ea65d504222") (:authors ("X9hRRDys")) (:maintainers ("X9hRRDys")) (:maintainer "X9hRRDys") (:keywords "tools") (:url . "https://github.com/X9hRRDys/latex-labeler"))]) (latex-math-preview . [(20211228 641) nil "preview LaTeX mathematical expressions." tar ((:commit . "1c082179493eed3ce8bc255f87791eb4acb1fbdb") (:authors ("Takayuki YAMAGUCHI" . "d@ytak.info")) (:maintainers ("Takayuki YAMAGUCHI" . "d@ytak.info")) (:maintainer "Takayuki YAMAGUCHI" . "d@ytak.info") (:keywords "latex" "tex") (:url . "https://gitlab.com/latex-math-preview/latex-math-preview"))]) (latex-pretty-symbols . [(20151112 1044) nil "Display many latex symbols as their unicode counterparts" tar ((:commit . "83d5888147bb734a94dfd4847a11e975a7d86ba8") (:authors ("Erik Parmann" . "eparmann@gmail.com") ("Pål Drange")) (:maintainers ("Erik Parmann" . "eparmann@gmail.com")) (:maintainer "Erik Parmann" . "eparmann@gmail.com") (:keywords "convenience" "display") (:url . "https://bitbucket.org/mortiferus/latex-pretty-symbols.el"))]) (latex-preview-pane . [(20181008 1822) nil "Makes LaTeX editing less painful by providing a updatable preview pane" tar ((:commit . "5297668a89996b50b2b62f99cba01cc544dbed2e") (:authors ("John L. Singleton" . "jsinglet@gmail.com")) (:maintainer "John L. Singleton" . "jsinglet@gmail.com") (:keywords "latex" "preview") (:url . "http://www.emacswiki.org/emacs/LaTeXPreviewPane"))]) - (latex-table-wizard . [(20230821 1507) ((emacs (27 1)) (auctex (12 1)) (transient (0 3 7))) "Magic editing of LaTeX tables" tar ((:commit . "9dcc3d62ce2be04946b67cc023f8655c0a14aa7a") (:authors ("Enrico Flor" . "enrico@eflor.net")) (:maintainers ("Enrico Flor" . "enrico@eflor.net")) (:maintainer "Enrico Flor" . "enrico@eflor.net") (:keywords "convenience") (:url . "https://github.com/enricoflor/latex-table-wizard"))]) - (latex-unicode-math-mode . [(20170123 1816) nil "Input method for Unicode math symbols" tar ((:commit . "e8931e68214ca94e6a04080ebc629693d5881884") (:authors ("Christoph Dittmann" . "github@christoph-d.de")) (:maintainers ("Christoph Dittmann" . "github@christoph-d.de")) (:maintainer "Christoph Dittmann" . "github@christoph-d.de") (:url . "https://github.com/Christoph-D/latex-unicode-math-mode"))]) + (latex-table-wizard . [(20230903 2104) ((emacs (27 1)) (auctex (12 1)) (transient (0 3 7))) "Magic editing of LaTeX tables" tar ((:commit . "b55d215dbef321194dbf10553d4c0d3b244a50f0") (:authors ("Enrico Flor" . "enrico@eflor.net")) (:maintainers ("Enrico Flor" . "enrico@eflor.net")) (:maintainer "Enrico Flor" . "enrico@eflor.net") (:keywords "convenience") (:url . "https://github.com/enricoflor/latex-table-wizard"))]) + (latex-unicode-math-mode . [(20231210 2234) nil "Input method for Unicode math symbols" tar ((:commit . "af6a28c3c7e8652f1e9c124beeccaa81133b1d88") (:authors ("Christoph Dittmann" . "github@christoph-d.de")) (:maintainers ("Christoph Dittmann" . "github@christoph-d.de")) (:maintainer "Christoph Dittmann" . "github@christoph-d.de") (:url . "https://github.com/Christoph-D/latex-unicode-math-mode"))]) (latexdiff . [(20190827 1651) ((emacs (24 4))) "Latexdiff integration in Emacs" tar ((:commit . "56d0b240867527d1b43d3ddec14059361929b971") (:authors ("Launay Gaby" . "gaby.launay@tutanota.com")) (:maintainers ("Launay Gaby" . "gaby.launay@tutanota.com")) (:maintainer "Launay Gaby" . "gaby.launay@tutanota.com") (:keywords "tex" "vc" "tools" "git" "helm") (:url . "http://github.com/galaunay/latexdiff.el"))]) (latvian-holidays . [(20230326 2030) nil "Latvian holidays for the calendar" tar ((:commit . "6b82f3bd9682c97f19a65b7d359ce7a02ec9cfec") (:authors ("Alexander Shumilov" . "alexander.shumilov@me.com")) (:maintainers ("Alexander Shumilov" . "alexander.shumilov@me.com")) (:maintainer "Alexander Shumilov" . "alexander.shumilov@me.com") (:keywords "calendar") (:url . "https://github.com/ashumilov/latvian-holidays"))]) (launch . [(20130619 2204) nil "launch files with OS-standard associated applications." tar ((:commit . "e7c3b573fc05fe4d3d322389079909311542e799") (:authors ("Simon Law" . "sfllaw@sfllaw.ca")) (:maintainers ("Simon Law" . "sfllaw@sfllaw.ca")) (:maintainer "Simon Law" . "sfllaw@sfllaw.ca") (:keywords "convenience" "processes") (:url . "https://github.com/sfllaw/emacs-launch"))]) @@ -2907,6 +2983,7 @@ (lcb-mode . [(20160816 630) ((emacs (24))) "LiveCode Builder major mode" tar ((:commit . "be0768e9aa6f9b8e76f2230f4f7f4d152a766b9a") (:authors ("Peter TB Brett" . "peter@peter-b.co.uk")) (:maintainers ("Peter TB Brett" . "peter@peter-b.co.uk")) (:maintainer "Peter TB Brett" . "peter@peter-b.co.uk") (:keywords "languages") (:url . "https://github.com/peter-b/lcb-mode"))]) (lcr . [(20221012 742) ((dash (2 12 0)) (emacs (25 1))) "lightweight coroutines" tar ((:commit . "6c345112ffb59f3e7babca6c83942f686b5f554b") (:authors ("Jean-Philippe Bernardy" . "jeanphilippe.bernardy@gmail.com")) (:maintainers ("Jean-Philippe Bernardy" . "jeanphilippe.bernardy@gmail.com")) (:maintainer "Jean-Philippe Bernardy" . "jeanphilippe.bernardy@gmail.com") (:keywords "tools") (:url . "https://github.com/jyp/lcr"))]) (le-thesaurus . [(20230112 1604) ((request (0 3 2)) (emacs (24 4))) "Query thesaurus.com for synonyms of a given word" tar ((:commit . "83e8df8957a3b8167cc2bf97849a1eca555ce9a6") (:url . "https://github.com/AnselmC/le-thesaurus.el"))]) + (leader-key . [(20231001 2236) ((emacs (25 1))) "Leader key configuration (e.g. for god-mode)" tar ((:commit . "64d2a29e2f667399869f2b0334855a647211e50e") (:authors ("Lukasz Pawelczyk" . "havner@gmail.com")) (:maintainers ("Lukasz Pawelczyk" . "havner@gmail.com")) (:maintainer "Lukasz Pawelczyk" . "havner@gmail.com") (:keywords "convenience" "keys" "keybinding" "config" "leader" "god" "god-mode") (:url . "https://github.com/havner/leader-key"))]) (leaf . [(20230803 729) ((emacs (24 1))) "Simplify your init.el configuration, extended use-package" tar ((:commit . "fce3378f987bf118a0a5f1a24c4408ac920f858d") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "lisp" "settings") (:url . "https://github.com/conao3/leaf.el"))]) (leaf-convert . [(20210816 1103) ((emacs (26 1)) (leaf (3 6 0)) (leaf-keywords (1 1 0)) (ppp (2 1))) "Convert many format to leaf format" tar ((:commit . "da86654f1021445cc42c1a5a9195f15097352209") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "tools") (:url . "https://github.com/conao3/leaf-convert.el"))]) (leaf-defaults . [(20210301 118) ((emacs (26 1)) (leaf (4 1)) (leaf-keywords (1 1))) "Awesome leaf config collections" tar ((:commit . "96ce39d4f16736f1e654e24eac16a2603976c724") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "convenience") (:url . "https://github.com/conao3/leaf-defaults.el"))]) @@ -2916,54 +2993,54 @@ (lean-mode . [(20230611 728) ((emacs (24 3)) (dash (2 18 0)) (s (1 10 0)) (f (0 19 0)) (flycheck (30))) "A major mode for the Lean 3 language" tar ((:commit . "99d6a34dc5b12f6e996e9217fa9f6fe4a6af037a") (:authors ("Leonardo de Moura" . "leonardo@microsoft.com") ("Soonho Kong " . "soonhok@cs.cmu.edu") ("Gabriel Ebner " . "gebner@gebner.org") ("Sebastian Ullrich" . "sebasti@nullri.ch")) (:maintainers ("Sebastian Ullrich" . "sebasti@nullri.ch")) (:maintainer "Sebastian Ullrich" . "sebasti@nullri.ch") (:keywords "languages") (:url . "https://github.com/leanprover/lean-mode"))]) (leanote . [(20161223 139) ((emacs (24 4)) (cl-lib (0 5)) (request (0 2)) (let-alist (1 0 3)) (pcache (0 4 0)) (s (1 10 0)) (async (1 9))) "A minor mode writing markdown leanote" tar ((:commit . "d499e7b59bb1f1a2fabc0e4c26fb101ed62ebc7b") (:authors ("Aborn Jiang" . "aborn.jiang@gmail.com")) (:maintainers ("Aborn Jiang" . "aborn.jiang@gmail.com")) (:maintainer "Aborn Jiang" . "aborn.jiang@gmail.com") (:keywords "leanote" "note" "markdown") (:url . "https://github.com/aborn/leanote-emacs"))]) (learn-ocaml . [(20211003 1412) ((emacs (25 1))) "Emacs frontend for learn-ocaml" tar ((:commit . "abdc263537a6a534152a4eaaa17b2c3e4e10418b") (:url . "https://github.com/pfitaxel/learn-ocaml.el"))]) - (ledger-import . [(20210419 818) ((emacs (25 1)) (ledger-mode (3 1 1))) "Fetch OFX files from bank and push them to Ledger" tar ((:commit . "f77adf79ce67524c3e08546448ac88ea1a665b64") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:url . "https://gitlab.petton.fr/mpdel/libmpdel"))]) - (ledger-mode . [(20230810 1707) ((emacs (25 1))) "Helper code for use with the \"ledger\" command-line tool" tar ((:commit . "6ca9e1b487ba642dbc28a2d81e0dbbb1a5a617ba"))]) + (ledger-import . [(20230904 1837) ((emacs (25 1))) "Fetch OFX files from bank and push them to Ledger" tar ((:commit . "e47e8508794462986b982d6ce3d05bcd17c19242") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:url . "https://gitlab.petton.fr/mpdel/libmpdel"))]) + (ledger-mode . [(20240320 359) ((emacs (25 1))) "Helper code for use with the \"ledger\" command-line tool" tar ((:commit . "44ec610ca522fa35ecf241cc2c9c1adb56c139ed"))]) (leerzeichen . [(20220626 835) nil "Minor mode to display whitespace characters." tar ((:commit . "9d4126d5f6563569080845a69b0867119a9fd6ea") (:authors ("Felix Geller" . "fgeller@gmail.com")) (:maintainers ("Felix Geller" . "fgeller@gmail.com")) (:maintainer "Felix Geller" . "fgeller@gmail.com") (:keywords "whitespace" "characters") (:url . "http://github.com/fgeller/leerzeichen.el"))]) (leetcode . [(20230524 1851) ((emacs (26 1)) (dash (2 16 0)) (graphql (0 1 1)) (spinner (1 7 3)) (aio (1 0)) (log4e (0 3 3))) "An leetcode client" tar ((:commit . "e5701191a98d043acdc7112f28d67e3d5c848228") (:authors ("Wang Kai" . "kaiwkx@gmail.com")) (:maintainers ("Wang Kai" . "kaiwkx@gmail.com")) (:maintainer "Wang Kai" . "kaiwkx@gmail.com") (:keywords "extensions" "tools") (:url . "https://github.com/kaiwk/leetcode.el"))]) (legalese . [(20200119 2248) nil "Add legalese to your program files" tar ((:commit . "e465471d2d5a62d35073d93e0f8d40387a82e302") (:authors ("Jorgen Schaefer" . "forcer@forcix.cx")) (:maintainers ("Jorgen Schaefer" . "forcer@forcix.cx")) (:maintainer "Jorgen Schaefer" . "forcer@forcix.cx") (:keywords "convenience") (:url . "https://github.com/jorgenschaefer/legalese"))]) + (lem . [(20240313 1154) ((emacs (29 1)) (fedi (0 2)) (markdown-mode (2 5))) "A lemmy client" tar ((:commit . "48caf7b856efc0c98f5d735dc605fbe0db793ec5") (:authors ("martian hiatus ")) (:maintainers ("martian hiatus ")) (:maintainer "martian hiatus ") (:keywords "multimedia" "comm" "web" "fediverse") (:url . "https://codeberg.org/martianh/lem.el"))]) (lemon-mode . [(20130216 1304) nil "A major mode for editing lemon grammar files" tar ((:commit . "155bfced6c9afc8072a0133d3d1baa54c6d67430") (:authors ("mooz" . "stillpedant@gmail.com")) (:maintainers ("mooz" . "stillpedant@gmail.com")) (:maintainer "mooz" . "stillpedant@gmail.com") (:keywords "lemon"))]) - (lentic . [(20221201 47) ((emacs (25)) (m-buffer (0 13)) (dash (2 5 0))) "One buffer as a view of another" tar ((:commit . "6af878392e127e75409ae0f4bc08837a8f591d88") (:authors ("Phillip Lord" . "phillip.lord@russet.org.uk")) (:maintainers ("Phillip Lord" . "phillip.lord@russet.org.uk")) (:maintainer "Phillip Lord" . "phillip.lord@russet.org.uk"))]) - (lentic-server . [(20160717 2052) ((lentic (0 8)) (web-server (0 1 1))) "Web Server for Emacs Literate Source" tar ((:commit . "8e809fafbb27a98f815b544d9d9ee15843eb6a36") (:authors ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) (:maintainers ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) (:maintainer "Phillip Lord" . "phillip.lord@newcastle.ac.uk"))]) + (lentic . [(20240303 1456) ((emacs (25)) (m-buffer (0 13)) (dash (2 5 0))) "One buffer as a view of another" tar ((:commit . "180c1082c016de790f9e6596b63329657c83ce20") (:authors ("Phillip Lord" . "phillip.lord@russet.org.uk")) (:maintainers ("Phillip Lord" . "phillip.lord@russet.org.uk")) (:maintainer "Phillip Lord" . "phillip.lord@russet.org.uk"))]) + (lentic-server . [(20240315 144) ((lentic (0 8)) (web-server (0 1 1))) "Web Server for Emacs Literate Source" tar ((:commit . "732b88e7a183707ba65c38e8b3517cac42572644") (:authors ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) (:maintainers ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) (:maintainer "Phillip Lord" . "phillip.lord@newcastle.ac.uk"))]) (leo . [(20220111 1045) ((emacs (27 1))) "Interface for dict.leo.org" tar ((:commit . "9f6aeb9670241255c373432af7785c7b87cee290") (:authors ("M.T. Enders ") ("Marty Hiatt ")) (:maintainers ("M.T. Enders ")) (:maintainer "M.T. Enders ") (:keywords "convenience" "translate") (:url . "https://github.com/mtenders/emacs-leo"))]) (lesim-mode . [(20230627 1350) ((emacs (28 1))) "Major mode for Learning Simulator scripts" tar ((:commit . "74bffc63058f64b3399e685cf0fe0a8f18cc491e") (:authors ("Stefano Ghirlanda" . "drghirlanda@gmail.com")) (:maintainers ("Stefano Ghirlanda" . "drghirlanda@gmail.com")) (:maintainer "Stefano Ghirlanda" . "drghirlanda@gmail.com") (:keywords "languages" "faces") (:url . "https://github.com/drghirlanda/lesim-mode"))]) (less-css-mode . [(20161001 453) nil "Major mode for editing LESS CSS files (lesscss.org)" tar ((:commit . "59bf174c4e9f053ec2a7ef8c8a8198490390f6fb") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "less" "css" "mode") (:url . "https://github.com/purcell/less-css-mode"))]) (letcheck . [(20160202 1948) nil "Check the erroneous assignments in let forms" tar ((:commit . "edf188ca2f85349e971b83f164c6484264e79426") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com") (:keywords "convenience") (:url . "https://github.com/Fuco1/letcheck"))]) (letterbox-mode . [(20170702 125) ((emacs (24 3))) "hide sensitive text on a buffer" tar ((:commit . "88c67a51d67216d569a28e8423200883fde096dd") (:authors ("Fernando Leboran" . "f.leboran@gmail.com")) (:maintainers ("Fernando Leboran" . "f.leboran@gmail.com")) (:maintainer "Fernando Leboran" . "f.leboran@gmail.com") (:keywords "password" "convenience") (:url . "http://github.com/pacha64/letterbox-mode"))]) - (leuven-theme . [(20230812 1827) nil "Elegant Emacs color theme for a white background" tar ((:commit . "b73a51a71ab8424bc2da8891f28e5239eac1236c") (:authors ("Fabrice Niessen <(concat \"fniessen\" at-sign \"pirilampo.org\")>")) (:maintainers ("Fabrice Niessen <(concat \"fniessen\" at-sign \"pirilampo.org\")>")) (:maintainer "Fabrice Niessen <(concat \"fniessen\" at-sign \"pirilampo.org\")>") (:keywords "color" "theme") (:url . "https://github.com/fniessen/emacs-leuven-theme"))]) + (leuven-theme . [(20240304 1034) nil "Elegant Emacs color theme for a white background" tar ((:commit . "04ac63e73f060edcb1bf5fadad3466c3ab557d47") (:authors ("Fabrice Niessen <(concat \"fniessen\" at-sign \"pirilampo.org\")>")) (:maintainers ("Fabrice Niessen <(concat \"fniessen\" at-sign \"pirilampo.org\")>")) (:maintainer "Fabrice Niessen <(concat \"fniessen\" at-sign \"pirilampo.org\")>") (:keywords "color" "theme") (:url . "https://github.com/fniessen/emacs-leuven-theme"))]) (levenshtein . [(20090830 1040) nil "Edit distance between two strings." tar ((:commit . "070925197ebf6b704e6e00c4f2d2ec783f3df38c") (:authors ("Aaron S. Hawley ,") ("Art Taylor")) (:maintainers ("Aaron S. Hawley ,")) (:maintainer "Aaron S. Hawley ,") (:keywords "lisp"))]) (lexbind-mode . [(20141027 1429) nil "Puts the value of lexical-binding in the mode line" tar ((:commit . "fa0a6848c1cfd3fbf45db43dc2deef16377d887d") (:authors ("Andrew Kirkpatrick" . "ubermonk@gmail.com")) (:maintainers ("Andrew Kirkpatrick" . "ubermonk@gmail.com")) (:maintainer "Andrew Kirkpatrick" . "ubermonk@gmail.com") (:keywords "convenience" "lisp") (:url . "https://github.com/spacebat/lexbind-mode"))]) (lexic . [(20220501 1432) ((emacs (26 3))) "A major mode to find out more about words" tar ((:commit . "f9b3de4d9c2dd1ce5022383e1a504b87bf7d1b09") (:authors ("pluskid" . "pluskid@gmail.com") ("gucong" . "gucong43216@gmail.com") ("TEC" . "tec@tecosaur.com")) (:maintainers ("TEC" . "tec@tecosaur.com")) (:maintainer "TEC" . "tec@tecosaur.com") (:url . "https://github.com/tecosaur/lexic"))]) (lf . [(20210808 1921) ((s (1 12 0)) (dash (2 16 0)) (emacs (27 1))) "A Language Features library for Emacs Lisp" tar ((:commit . "35db92ca765a0544721fdeea036d77b7d192d083") (:authors ("Musa Al-hassy" . "alhassy@gmail.com")) (:maintainers ("Musa Al-hassy" . "alhassy@gmail.com")) (:maintainer "Musa Al-hassy" . "alhassy@gmail.com") (:keywords "convenience" "programming") (:url . "https://alhassy.github.io/lf.el/"))]) - (lfe-mode . [(20220822 911) nil "Lisp Flavoured Erlang mode" tar ((:commit . "42fc3dc57d4229800f44a0d6907185ebdf7175e2"))]) + (lfe-mode . [(20230102 1428) nil "Lisp Flavoured Erlang mode" tar ((:commit . "68c9c7ec8ef441eb79e68772ec4956fd2671b2e7"))]) (lgr . [(20230407 1317) ((emacs (26 1))) "A fully featured logging framework" tar ((:commit . "4ab6c22bcbc533acace3c854876f40fa9d2f7819") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "tools") (:url . "https://github.com/Fuco1/emacs-lgr"))]) (libbcel . [(20230826 1233) ((emacs (26 1)) (request (0 3 1))) "Library to connect to basecamp 3 API" tar ((:commit . "35679c86b6d73817fef17df4119a7a45dfc9f33d") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:url . "https://gitlab.petton.fr/bcel/libbcel"))]) - (libelcouch . [(20230129 1000) ((emacs (26 1)) (request (0 3 0))) "Communication with CouchDB" tar ((:commit . "595697f4199519dd018fe489e885f237c54b0675") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:keywords "tools") (:url . "https://gitlab.petton.fr/elcouch/libelcouch/"))]) + (libelcouch . [(20230903 800) ((emacs (26 1)) (request (0 3 0))) "Communication with CouchDB" tar ((:commit . "5202084caee9fd236a18afc6f83293f05168a4c3") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:keywords "tools") (:url . "https://github.com/DamienCassou/libelcouch/"))]) (liberime . [(20230113 556) ((emacs (25 1))) "Rime elisp binding" tar ((:commit . "cc9eb9812fd6f68e78ed6a0c0a85da7a18765753") (:authors ("A.I.")) (:maintainers ("A.I.")) (:maintainer "A.I.") (:keywords "convenience" "chinese" "input-method" "rime") (:url . "https://github.com/merrickluo/liberime"))]) (liblouis . [(20220426 657) ((emacs (26 1))) "Mode for editing liblouis braille translation tables" tar ((:commit . "a341a0c434cdbe7f46956c8db13203c3fc941a34") (:authors ("Christian Egli" . "christian.egli@sbs.ch")) (:maintainers ("Christian Egli" . "christian.egli@sbs.ch")) (:maintainer "Christian Egli" . "christian.egli@sbs.ch") (:keywords "languages") (:url . "https://github.com/liblouis/liblouis-mode"))]) (libmpdee . [(20220825 957) nil "Client end library for mpd, a music playing daemon" tar ((:commit . "9a84e074385cd085622f94e720a968a0e05ceae5") (:authors ("Ramkumar R. Aiyengar" . "andyetitmoves@gmail.com")) (:maintainers ("Ramkumar R. Aiyengar" . "andyetitmoves@gmail.com")) (:maintainer "Ramkumar R. Aiyengar" . "andyetitmoves@gmail.com") (:keywords "music" "mpd"))]) (libmpdel . [(20230816 839) ((emacs (25 1))) "Communication with an MPD server" tar ((:commit . "ca5397f1d66462e11c9ff4a49d308d92aef31b29") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:keywords "multimedia") (:url . "https://github.com/mpdel/libmpdel"))]) - (librera-sync . [(20230306 17) ((emacs (26 1)) (f (0 17)) (dash (2 12 0))) "Sync document's position with Librera Reader for Android" tar ((:commit . "29e158fc478d5817dffc4045b067feed4c3d0dbe") (:authors ("Dmitriy Pshonko" . "jumper047@gmail.com")) (:maintainers ("Dmitriy Pshonko" . "jumper047@gmail.com")) (:maintainer "Dmitriy Pshonko" . "jumper047@gmail.com") (:keywords "multimedia" "sync") (:url . "https://github.com/jumper047/librera-sync"))]) + (librera-sync . [(20230902 1006) ((emacs (26 1)) (f (0 17)) (dash (2 12 0))) "Sync document's position with Librera Reader for Android" tar ((:commit . "19cf9496d71daac67ce4b0ebcdf7f6ac2c3e689a") (:authors ("Dmitriy Pshonko" . "jumper047@gmail.com")) (:maintainers ("Dmitriy Pshonko" . "jumper047@gmail.com")) (:maintainer "Dmitriy Pshonko" . "jumper047@gmail.com") (:keywords "multimedia" "sync") (:url . "https://github.com/jumper047/librera-sync"))]) (lice . [(20220312 2215) nil "License And Header Template" tar ((:commit . "0b69ba54057146f1473e85c0760029e584e3eb13") (:authors ("Taiki Sugawara" . "buzz.taiki@gmail.com")) (:maintainers ("Taiki Sugawara" . "buzz.taiki@gmail.com")) (:maintainer "Taiki Sugawara" . "buzz.taiki@gmail.com") (:keywords "template" "license" "tools") (:url . "https://github.com/buzztaiki/lice-el"))]) (license-snippets . [(20201117 1619) ((emacs (26)) (yasnippet (0 8 0))) "LICENSE templates for yasnippet" tar ((:commit . "a89988b81604fd23c43746912215770a4b861989") (:authors ("Seong Yong-ju" . "sei40kr@gmail.com")) (:maintainers ("Seong Yong-ju" . "sei40kr@gmail.com")) (:maintainer "Seong Yong-ju" . "sei40kr@gmail.com") (:keywords "tools") (:url . "https://github.com/sei40kr/license-snippets"))]) - (license-templates . [(20230311 11) ((emacs (24 3)) (request (0 3 0))) "Create LICENSE using GitHub API" tar ((:commit . "09f1b017c93067c2970a0a63b69026bfc172d2b7") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "license" "api" "template") (:url . "https://github.com/jcs-elpa/license-templates"))]) + (license-templates . [(20240101 932) ((emacs (24 3)) (request (0 3 0))) "Create LICENSE using GitHub API" tar ((:commit . "62adc47eb36a6f2eabe63c3e9dc8ce7f94007f19") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "license" "api" "template") (:url . "https://github.com/jcs-elpa/license-templates"))]) (ligature . [(20220808 1225) ((emacs (28))) "Display typographical ligatures in major modes" tar ((:commit . "89cbd67a815f61e5001f19d64d6ec1771e867742") (:authors ("Mickey Petersen" . "mickey@masteringemacs.org")) (:maintainers ("Mickey Petersen" . "mickey@masteringemacs.org")) (:maintainer "Mickey Petersen" . "mickey@masteringemacs.org") (:keywords "tools" "faces") (:url . "https://www.github.com/mickeynp/ligature.el"))]) (ligature-pragmatapro . [(20221127 2252) ((emacs (28)) (ligature (1 0))) "PragmataPro support for ligature.el" tar ((:commit . "85f7b15a5cf5f2ee843bc0469e03602a0251c275") (:authors ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainers ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainer "Yuri D'Elia" . "wavexx@thregr.org") (:keywords "faces" "fonts" "ligatures" "programming-ligatures") (:url . "https://gitlab.com/wavexx/ligature-pragmatapro.el"))]) (light-soap-theme . [(20150607 1445) ((emacs (24))) "Emacs 24 theme with a light background." tar ((:commit . "76a787bd40c6b567ae68ced7f5d9f9f10725e00d"))]) - (ligo-mode . [(20230815 1212) ((emacs (27 1))) "A major mode for editing LIGO source code" tar ((:commit . "d59593717f7600faba4d20d4a2a2fe851df96317") (:authors ("LigoLang SASU")) (:maintainers ("LigoLang SASU")) (:maintainer "LigoLang SASU") (:keywords "languages") (:url . "https://gitlab.com/ligolang/ligo/-/tree/dev/tools/emacs"))]) - (line-reminder . [(20230420 142) ((emacs (25 1)) (indicators (0 0 4)) (fringe-helper (1 0 1)) (ov (1 0 6)) (ht (2 0))) "Line annotation for changed and saved lines" tar ((:commit . "583bff387b361e1fe442f57e9ad1f6f8e87dedf4") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "annotation") (:url . "https://github.com/emacs-vs/line-reminder"))]) + (line-reminder . [(20240101 857) ((emacs (25 1)) (fringe-helper (1 0 1)) (ov (1 0 6)) (ht (2 0))) "Line annotation for changed and saved lines" tar ((:commit . "91d8f57f11f5ddbb5e94cb23877c67a8f59d4d8c") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "annotation") (:url . "https://github.com/emacs-vs/line-reminder"))]) (line-up-words . [(20180219 1024) nil "Align words in an intelligent way" tar ((:commit . "2c236f5772e18d0e50d7ca2eee7eebbe356d9b60") (:url . "https://github.com/janestreet/line-up-words"))]) (lines-at-once . [(20180422 247) ((emacs (25))) "Insert and edit multiple lines at once" tar ((:commit . "a018ba90549384d52ec58c2685fd14a0f65252be") (:authors ("Jiahao Li" . "jiahaowork@gmail.com")) (:maintainers ("Jiahao Li" . "jiahaowork@gmail.com")) (:maintainer "Jiahao Li" . "jiahaowork@gmail.com") (:keywords "abbrev" "tools") (:url . "https://github.com/jiahaowork/lines-at-once.el"))]) (lingr . [(20100807 1731) nil "Lingr Client for GNU Emacs" tar ((:commit . "4215a8704492d3c860097cbe2649936c22c196df") (:authors ("lugecy" . "lugecy@gmail.com")) (:maintainers ("lugecy" . "lugecy@gmail.com")) (:maintainer "lugecy" . "lugecy@gmail.com") (:keywords "chat" "client" "internet") (:url . "http://github.com/lugecy/lingr-el"))]) (linguistic . [(20181129 2116) nil "A package for basic linguistic analysis." tar ((:commit . "23e47e98cdb09ee61883669b6d8a11bf6449862c") (:authors ("Andrew Favia ")) (:maintainers ("Andrew Favia ")) (:maintainer "Andrew Favia ") (:keywords "linguistics" "text analysis" "matching") (:url . "https://github.com/andcarnivorous/linguistic"))]) (lingva . [(20220910 1435) ((emacs (25 1))) "Access Google Translate without tracking via lingva.ml" tar ((:commit . "6c33594068fa33de622172503deeec6778d9c744") (:authors ("marty hiatt ")) (:maintainers ("marty hiatt ")) (:maintainer "marty hiatt ") (:keywords "convenience" "translation" "wp" "text") (:url . "https://codeberg.org/martianh/lingva.el"))]) (link . [(20191111 446) nil "Hypertext links in text buffers" tar ((:commit . "c9cad101100975e88873636bfd426b7a19304ebd") (:authors ("Torsten Hilbrich" . "torsten.hilbrich@gmx.net")) (:maintainers ("Torsten Hilbrich" . "torsten.hilbrich@gmx.net")) (:maintainer "Torsten Hilbrich" . "torsten.hilbrich@gmx.net") (:keywords "interface" "hypermedia"))]) - (link-hint . [(20230405 1801) ((avy (0 4 0)) (emacs (24 4))) "Use avy to open, copy, etc. visible links" tar ((:commit . "36ce929331f2838213bcaa1145ece4b73ce84afe") (:authors ("Fox Kiester" . "noct@posteo.net")) (:maintainers ("Fox Kiester" . "noct@posteo.net")) (:maintainer "Fox Kiester" . "noct@posteo.net") (:keywords "convenience" "url" "avy" "link" "links" "hyperlink") (:url . "https://github.com/noctuid/link-hint.el"))]) + (link-hint . [(20231225 1354) ((avy (0 4 0)) (emacs (24 4))) "Use avy to open, copy, etc. visible links" tar ((:commit . "9153eafc776549376bb85d9ff555fef83aca8285") (:authors ("Fox Kiester" . "noct@posteo.net")) (:maintainers ("Fox Kiester" . "noct@posteo.net")) (:maintainer "Fox Kiester" . "noct@posteo.net") (:keywords "convenience" "url" "avy" "link" "links" "hyperlink") (:url . "https://github.com/noctuid/link-hint.el"))]) (linkode . [(20200607 2152) nil "Generate a linkode snippet with region/buffer content" tar ((:commit . "e31bdae11ff38b736b1869fbe94920e862f29794") (:authors ("Erick Navarro" . "erick@navarro.io")) (:maintainers ("Erick Navarro" . "erick@navarro.io")) (:maintainer "Erick Navarro" . "erick@navarro.io") (:url . "https://github.com/erickgnavar/linkode.el"))]) (linphone . [(20130524 1109) nil "Emacs interface to Linphone" tar ((:commit . "99af3db941b7f4e5272bb48bff96c1ce4ceac302") (:authors ("Yoni Rabkin" . "yonirabkin@member.fsf.org")) (:maintainers ("Yoni Rabkin" . "yonirabkin@member.fsf.org")) (:maintainer "Yoni Rabkin" . "yonirabkin@member.fsf.org") (:keywords "comm") (:url . "https://github.com/zabbal/emacs-linphone"))]) (linum-off . [(20160217 2137) nil "Provides an interface for turning line-numbering off" tar ((:commit . "3e37baaad27d27e405f8dfe01d4ab9cd5b591353") (:authors ("Matthew L. Fidler, Florian Adamsky (see wiki)")) (:maintainers ("Matthew L. Fidler")) (:maintainer "Matthew L. Fidler") (:keywords "line" "numbering") (:url . "http://www.emacswiki.org/emacs/auto-indent-mode.el "))]) (linum-relative . [(20221025 517) nil "display relative line number in emacs." tar ((:commit . "8fbe89ad897921849665a3e8da18cee7d0721441") (:authors ("coldnew" . "coldnew.tw@gmail.com")) (:maintainers ("coldnew" . "coldnew.tw@gmail.com")) (:maintainer "coldnew" . "coldnew.tw@gmail.com") (:keywords "converience") (:url . "http://github.com/coldnew/linum-relative"))]) (liquid-types . [(20151202 735) ((flycheck (0 13)) (dash (1 2)) (emacs (24 1)) (popup (0 5 2)) (pos-tip (0 5 0)) (flycheck-liquidhs (0 0 1)) (button-lock (1 0 2))) "show inferred liquid-types" tar ((:commit . "cc4bacbbf204ef9cf0756f78dfebee2c6ae14d7b") (:authors ("Ranjit Jhala" . "jhala@cs.ucsd.edu")) (:maintainers ("Ranjit Jhala" . "jhala@cs.ucsd.edu")) (:maintainer "Ranjit Jhala" . "jhala@cs.ucsd.edu"))]) - (liquidmetal . [(20220704 654) ((emacs (24 4))) "A mimetic poly-alloy of the Quicksilver scoring algorithm" tar ((:commit . "323c38edd4572d7d58cdec729dcaac7a615d000d") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "matching" "fuzzy") (:url . "https://github.com/jcs-elpa/liquidmetal"))]) + (liquidmetal . [(20240101 1004) ((emacs (24 4))) "A mimetic poly-alloy of the Quicksilver scoring algorithm" tar ((:commit . "5d100f4371e0d10656a2bd23c0461781c3c1884b") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "matching" "fuzzy") (:url . "https://github.com/jcs-elpa/liquidmetal"))]) (liso-theme . [(20160410 2029) nil "Eclectic Dark Theme for GNU Emacs" tar ((:commit . "844688245eb860d23043455e165ee24503454c81") (:authors ("Vlad Piersec" . "vlad.piersec@gmail.com")) (:maintainers ("Vlad Piersec" . "vlad.piersec@gmail.com")) (:maintainer "Vlad Piersec" . "vlad.piersec@gmail.com") (:keywords "theme" "themes") (:url . "https://github.com/caisah/liso-theme"))]) (lisp-butt-mode . [(20210215 2206) ((emacs (25))) "Slim Lisp Butts" tar ((:commit . "2b719baf0ccba79e28fcb3c2633c4849d976ac23") (:authors ("Marco Wahl" . "marcowahlsoft@gmail.com")) (:maintainers ("Marco Wahl" . "marcowahlsoft@gmail.com")) (:maintainer "Marco Wahl" . "marcowahlsoft@gmail.com") (:keywords "lisp") (:url . "https://gitlab.com/marcowahl/lisp-butt-mode"))]) (lisp-extra-font-lock . [(20181008 1921) nil "Highlight bound variables and quoted exprs." tar ((:commit . "4605eccbe1a7fcbd3cacf5b71249435413b4db4f") (:authors ("Anders Lindgren")) (:maintainers ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "languages" "faces") (:url . "https://github.com/Lindydancer/lisp-extra-font-lock"))]) @@ -2976,27 +3053,29 @@ (list-unicode-display . [(20230216 958) ((emacs (24 3))) "Search for and list unicode characters by name" tar ((:commit . "57b4384ebe0c5d10890ee0dfcf66d0b16e5f5060") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "convenience"))]) (list-utils . [(20230422 1740) nil "List-manipulation utility functions" tar ((:commit . "f02dcef36330871855346f9eab97eef58d323d9a") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "extensions") (:url . "http://github.com/rolandwalker/list-utils"))]) (listenbrainz . [(20230530 741) ((emacs (27 1)) (request (0 3))) "ListenBrainz API interface" tar ((:commit . "2386189ec8a19a74d7b8a46e08a9fa6d974a6305") (:authors ("nik gaffney" . "nik@fo.am")) (:maintainers ("nik gaffney" . "nik@fo.am")) (:maintainer "nik gaffney" . "nik@fo.am") (:keywords "music" "scrobbling" "multimedia") (:url . "https://github.com/zzkt/listenbrainz"))]) - (lister . [(20230204 1357) ((emacs (26 1))) "Yet another list printer" tar ((:commit . "b256c254f670ebaf50134655fbe430025fff41ab") (:authors (nil . "")) (:maintainers (nil . "")) (:maintainer nil . "") (:keywords "lisp") (:url . "https://github.com/publicimageltd/lister"))]) + (lister . [(20240102 1500) ((emacs (26 1))) "Yet another list printer" tar ((:commit . "84fbba7450ac02cbb844727a28b6f245f553df7b") (:authors (nil . "")) (:maintainers (nil . "")) (:maintainer nil . "") (:keywords "lisp") (:url . "https://github.com/publicimageltd/lister"))]) (lit-mode . [(20141205 441) nil "Major mode for lit" tar ((:commit . "c61c403afc8333a5649c5421ab1a6341dc1c7d92") (:authors ("Hector A Escobedo" . "ninjahector.escobedo@gmail.com")) (:maintainers ("Hector A Escobedo" . "ninjahector.escobedo@gmail.com")) (:maintainer "Hector A Escobedo" . "ninjahector.escobedo@gmail.com") (:keywords "languages" "tools"))]) (litable . [(20221028 1640) ((dash (2 6 0))) "dynamic evaluation replacement with emacs" tar ((:commit . "0a75befedbf826c9779f83500792b044658f2374") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com") (:keywords "lisp"))]) (litanize . [(20230419 917) ((emacs (24 1)) (enlive (0 0 1)) (s (1 12 0))) "Generate \"Latour Litanies\"" tar ((:commit . "a45902fa29c16ef9606229cb01a5441ea754f11b") (:authors ("nik gaffney" . "nik@fo.am")) (:maintainers ("nik gaffney" . "nik@fo.am")) (:maintainer "nik gaffney" . "nik@fo.am") (:keywords "tools" "latour litany" "alien phenomenology" "ontography" "metaphorism" "carpentry") (:url . "https://github.com/zzkt/litanizer"))]) (litecoin-ticker . [(20160612 11) ((json (1 2))) "litecoin price in modeline" tar ((:commit . "3d8047c736e4ee0b8638953f8cc63eaefad34106") (:authors ("Zhe Lei")) (:maintainers ("Zhe Lei")) (:maintainer "Zhe Lei"))]) (literal-string . [(20191023 733) ((emacs (25)) (edit-indirect (0 1 5))) "edit string literals in a dedicated buffer" tar ((:commit . "afffa86e626798ee9f9188ea3be2d5ee6ad17c39") (:authors ("Joost Diepenmaat" . "joost@zeekat.nl")) (:maintainers ("Joost Diepenmaat" . "joost@zeekat.nl")) (:maintainer "Joost Diepenmaat" . "joost@zeekat.nl") (:keywords "lisp" "tools" "docs") (:url . "https://github.com/joodie/literal-string-mode/"))]) - (literate-calc-mode . [(20230805 436) ((emacs (25 1)) (dash (2 19 1)) (s (1 12 0))) "Inline results from calc" tar ((:commit . "b3db1b5249e6e6fbcde2dcc0e9ac5b2d2bbe77c2") (:authors ("Robin Schroer")) (:maintainers ("Robin Schroer")) (:maintainer "Robin Schroer") (:keywords "calc" "languages" "tools") (:url . "https://github.com/sulami/literate-calc-mode.el"))]) + (literate-calc-mode . [(20231125 29) ((emacs (27)) (dash (2 19 1)) (s (1 12 0))) "Inline results from calc" tar ((:commit . "a1a78f26dea70aac1c4df7f5767c8f5c1643d7d1") (:authors ("Robin Schroer")) (:maintainers ("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" tar ((:commit . "ef34c3a5b813ef078d44c29887761950ab6821c7") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("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" tar ((:commit . "bbc4befbf13f63b92cb1d780501482ae5bd8285b") (:authors ("Jingtao Xu" . "jingtaozf@gmail.com")) (:maintainers ("Jingtao Xu" . "jingtaozf@gmail.com")) (:maintainer "Jingtao Xu" . "jingtaozf@gmail.com") (:keywords "lisp" "docs" "extensions" "tools") (:url . "https://github.com/jingtaozf/literate-elisp"))]) (litex-mode . [(20221107 147) ((emacs (24 4)) (units-mode (0 1 1))) "Minor mode for converting lisp to LaTeX" tar ((:commit . "45004b3a865771799b739d17ebb7849190fffa63") (:authors ("Gaurav Atreya" . "allmanpride@gmail.com")) (:maintainers ("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" tar ((:commit . "97f16a9ee4e6ff3e0f9291eaead772c66e3e12ae") (:authors ("David Raymond Christiansen" . "david@davidchristiansen.dk")) (:maintainers ("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" tar ((:commit . "603a4a1759fbec92e7a1cabc249517c78e59ce7e") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "languages" "util") (:url . "https://github.com/lassik/emacs-live-preview"))]) - (live-py-mode . [(20230430 1540) ((emacs (24 3))) "Live Coding in Python" tar ((:commit . "c927feefa62f4ce9b3b5029063f9654a317267ef") (:authors ("Don Kirkby http://donkirkby.github.io")) (:maintainers ("Don Kirkby http://donkirkby.github.io")) (:maintainer "Don Kirkby http://donkirkby.github.io") (:keywords "live" "coding") (:url . "http://donkirkby.github.io/live-py-plugin/"))]) + (live-preview . [(20231215 1612) ((emacs (24 4))) "Live preview by any shell command while editing" tar ((:commit . "135f2b9a8ecf81d00cf92175d144a33561e36f4c") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "languages" "util") (:url . "https://github.com/lassik/emacs-live-preview"))]) + (live-py-mode . [(20240304 1642) ((emacs (24 3))) "Live Coding in Python" tar ((:commit . "eafd9848fe6eeea14373c6969c3bd9e5e0838fe2") (:authors ("Don Kirkby http://donkirkby.github.io")) (:maintainers ("Don Kirkby http://donkirkby.github.io")) (:maintainer "Don Kirkby http://donkirkby.github.io") (:keywords "live" "coding") (:url . "http://donkirkby.github.io/live-py-plugin/"))]) (lively . [(20171005 754) nil "interactively updating text" tar ((:commit . "348675828c6a81bfa1ac311ca465aad813542c1b") (:authors ("Luke Gorrie" . "luke@bup.co.nz")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) (livereload . [(20170629 650) ((emacs (25)) (websocket (1 8))) "Livereload server" tar ((:commit . "1e501d7e46dbd476c2c7cc9d20b5ac9d41fb1955") (:authors ("João Távora" . "joaotavora@gmail.com")) (:maintainers ("João Távora" . "joaotavora@gmail.com")) (:maintainer "João Távora" . "joaotavora@gmail.com") (:keywords "convenience"))]) (livescript-mode . [(20221015 1316) ((emacs (24 3))) "Major mode for editing LiveScript files" tar ((:commit . "e71a82a400e9d451c966c397bb8fa7887d35637b") (:authors ("Hisamatsu Yasuyuki" . "yas@null.net")) (:maintainers ("Hisamatsu Yasuyuki" . "yas@null.net")) (:maintainer "Hisamatsu Yasuyuki" . "yas@null.net") (:keywords "languages" "livescript") (:url . "https://github.com/yhisamatsu/livescript-mode"))]) (livid-mode . [(20131116 1344) ((skewer-mode (1 5 3)) (s (1 8 0))) "Live browser eval of JavaScript every time a buffer changes" tar ((:commit . "dfe5212fa64738bc4138bfebf349fbc8bc237c26") (:authors ("Murphy McMahon")) (:maintainers ("Murphy McMahon")) (:maintainer "Murphy McMahon") (:url . "https://github.com/pandeiro/livid-mode"))]) (ll-debug . [(20211002 1031) ((emacs (24 3))) "Low level debug tools" tar ((:commit . "a2cfeab46e5100c348b35987fae34f9ea76d7c0b") (:authors ("Claus Brunzema" . "mail@cbrunzema.de")) (:maintainers ("Claus Brunzema" . "mail@cbrunzema.de")) (:maintainer "Claus Brunzema" . "mail@cbrunzema.de") (:keywords "abbrev" "convenience" "tools" "c" "lisp") (:url . "https://github.com/replrep/ll-debug"))]) - (llama . [(20230714 39) ((seq (2 23))) "Compact syntax for short lambda" tar ((:commit . "5c454f1a83c698668942603e595cec36a5211768") (:keywords "extensions") (:url . "https://git.sr.ht/~tarsius/llama"))]) + (llama . [(20240312 1636) nil "Compact syntax for short lambda" tar ((:commit . "e73736d3bd3a8284a2d48266a0cfdb0c9b9217e4") (:keywords "extensions") (:url . "https://git.sr.ht/~tarsius/llama"))]) + (llama-cpp . [(20231228 2043) ((emacs (27 1)) (dash (2 19 1))) "A client for llama-cpp server" tar ((:commit . "e876c05eca8ffadc39d3c5013c2581f1e9f8f94f") (:authors ("Evgeny Kurnevsky" . "kurnevsky@gmail.com")) (:maintainers ("Evgeny Kurnevsky" . "kurnevsky@gmail.com")) (:maintainer "Evgeny Kurnevsky" . "kurnevsky@gmail.com") (:keywords "tools") (:url . "https://github.com/kurnevsky/llama.el"))]) + (llvm-ts-mode . [(20231120 1251) ((emacs (29 1))) "LLVM major mode using tree-sitter" tar ((:commit . "9974601dcddbeffc4ad47598d63d3c1a83bb6fb9") (:authors ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainers ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainer "Noah Peart" . "noah.v.peart@gmail.com") (:keywords "languages" "tree-sitter" "llvm") (:url . "https://github.com/nverno/llvm-ts-mode"))]) (lms . [(20210820 2200) ((emacs (25 1))) "Squeezebox / Logitech Media Server frontend" tar ((:commit . "29593b4c18a570dfb2e60b196f24d407a1277daa") (:authors ("Iñigo Serna" . "inigoserna@gmx.com")) (:maintainers ("Iñigo Serna" . "inigoserna@gmx.com")) (:maintainer "Iñigo Serna" . "inigoserna@gmx.com") (:keywords "multimedia") (:url . "https://hg.serna.eu/emacs/lms"))]) - (load-bash-alias . [(20230310 1657) ((emacs (24 1)) (seq (2 16))) "Convert bash aliases into eshell ones" tar ((:commit . "5daab364e65bdd7abe531b8557d88342b446f0c0") (:authors ("Davide Restivo" . "davide.restivo@yahoo.it")) (:maintainers ("Davide Restivo" . "davide.restivo@yahoo.it")) (:maintainer "Davide Restivo" . "davide.restivo@yahoo.it") (:keywords "emacs" "bash" "eshell" "alias") (:url . "https://github.com/daviderestivo/load-bash-alias"))]) + (load-bash-alias . [(20240103 916) ((emacs (24 1)) (seq (2 16))) "Convert bash aliases into eshell ones" tar ((:commit . "7e7b6773f99e6aafe819596388a3a7fd09dd91a9") (:authors ("Davide Restivo" . "davide.restivo@yahoo.it")) (:maintainers ("Davide Restivo" . "davide.restivo@yahoo.it")) (:maintainer "Davide Restivo" . "davide.restivo@yahoo.it") (:keywords "emacs" "bash" "eshell" "alias") (:url . "https://github.com/daviderestivo/load-bash-alias"))]) (load-env-vars . [(20180511 2210) ((emacs (24))) "Load environment variables from files" tar ((:commit . "5da97fabb4d36a00a29c40375fce9c16d8005ab3") (:authors ("Jorge Dias" . "jorge@mrdias.com")) (:maintainers ("Jorge Dias" . "jorge@mrdias.com")) (:maintainer "Jorge Dias" . "jorge@mrdias.com") (:keywords "lisp") (:url . "https://github.com/diasjorge/emacs-load-env-vars"))]) (load-relative . [(20230214 1032) nil "Relative file load (within a multi-file Emacs package)" tar ((:commit . "b7987c265a64435299d6b02f960ed2c894c4a145") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainers ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org") (:keywords "internal") (:url . "https://github.com/rocky/emacs-load-relative"))]) (load-theme-buffer-local . [(20120702 2036) nil "Install emacs24 color themes by buffer." tar ((:commit . "bc221a88aefec5bdc137b5d5e449e1f1e55ce901") (:authors ("Victor Borja" . "vic.borja@gmail.com")) (:maintainers ("Victor Borja" . "vic.borja@gmail.com")) (:maintainer "Victor Borja" . "vic.borja@gmail.com") (:keywords "faces") (:url . "http://github.com/vic/color-theme-buffer-local"))]) @@ -3004,15 +3083,15 @@ (loccur . [(20210224 2041) ((emacs (25 1))) "Perform an occur-like folding in current buffer" tar ((:commit . "01b7afa62589432a98171074abb8c5a1e089034a") (:authors ("Alexey Veretennikov" . "alexey.veretennikov@gmail.com")) (:maintainers ("Alexey Veretennikov" . "alexey.veretennikov@gmail.com")) (:maintainer "Alexey Veretennikov" . "alexey.veretennikov@gmail.com") (:keywords "matching") (:url . "https://github.com/fourier/loccur"))]) (lockfile-mode . [(20170625 507) nil "Major mode for .lock files" tar ((:commit . "496b6035716df0582f879f9488f296947cabead2") (:authors ("Preetpal S. Sohal")) (:maintainers ("Preetpal S. Sohal")) (:maintainer "Preetpal S. Sohal") (:url . "https://github.com/preetpalS/emacs-lockfile-mode"))]) (lodgeit . [(20190802 1308) nil "Paste to a lodgeit powered pastebin" tar ((:commit . "442637194d48a7105b7747b8d98772f5899f9e21") (:authors ("Eric Larson" . "eric@ionrock.org")) (:maintainers ("Eric Larson" . "eric@ionrock.org")) (:maintainer "Eric Larson" . "eric@ionrock.org") (:keywords "pastebin" "lodgeit") (:url . "https://github.com/ionrock/lodgeit-el"))]) - (log4e . [(20211019 948) nil "provide logging framework for elisp" tar ((:commit . "737d275eac28dbdfb0b26d28e99da148bfce9d16") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "log") (:url . "https://github.com/aki2o/log4e"))]) + (log4e . [(20240123 1313) nil "provide logging framework for elisp" tar ((:commit . "6d71462df9bf595d3861bfb328377346aceed422") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "log") (:url . "https://github.com/aki2o/log4e"))]) (log4j-mode . [(20230826 1331) ((emacs (25 1))) "Major mode for viewing log files" tar ((:commit . "45d5e3ee918f502a160c3a131ce75fd3c38e5c6e") (:authors ("Johan Dykstrom")) (:maintainers ("Johan Dykstrom")) (:maintainer "Johan Dykstrom") (:keywords "tools") (:url . "https://github.com/dykstrom/log4j-mode"))]) (logalimacs . [(20131021 1829) ((popwin (0 6 2)) (popup (0 5 0)) (stem (20130120))) "Front-end to logaling-command for Ruby gems" tar ((:commit . "8286e39502250fc6c3c6656a7f46a8eee8e9a713") (:authors ("Yuta Yamada ")) (:maintainers ("Yuta Yamada ")) (:maintainer "Yuta Yamada ") (:keywords "translation" "logaling-command") (:url . "https://github.com/logaling/logalimacs"))]) (logito . [(20201226 534) ((emacs (25 1))) "logging library for Emacs" tar ((:commit . "d5934ce10ba3a70d3fcfb94d742ce3b9136ce124") (:authors ("Yann Hodique" . "yann.hodique@gmail.com")) (:maintainers ("Yann Hodique" . "yann.hodique@gmail.com")) (:maintainer "Yann Hodique" . "yann.hodique@gmail.com") (:keywords "lisp" "extensions"))]) - (logms . [(20220704 654) ((emacs (27 1)) (f (0 20 0)) (s (1 9 0)) (ht (2 3))) "Log message with clickable links to context" tar ((:commit . "186478e47265b7d40b87d4b4277275a0031f09f7") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "maint" "debug" "log") (:url . "https://github.com/jcs-elpa/logms"))]) - (lognav-mode . [(20220410 1344) ((emacs (24 3))) "Navigate Log Error Messages" tar ((:commit . "100541ec31468b771073a7d2ad4512c1dcb1eb07") (:authors ("Shawn Ellis" . "shawn.ellis17@gmail.com")) (:maintainers ("Shawn Ellis" . "shawn.ellis17@gmail.com")) (:maintainer "Shawn Ellis" . "shawn.ellis17@gmail.com") (:keywords "log" "error" "lognav-mode" "convenience") (:url . "https://hg.osdn.net/view/lognav-mode/lognav-mode"))]) + (logms . [(20240101 942) ((emacs (27 1)) (f (0 20 0)) (s (1 9 0)) (ht (2 3))) "Log message with clickable links to context" tar ((:commit . "ef571d7ab8b2809363197e6867bfc1fbff5d14b7") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "maint" "debug" "log") (:url . "https://github.com/jcs-elpa/logms"))]) + (lognav-mode . [(20240115 1637) ((emacs (24 3))) "Navigate Log Error Messages" tar ((:commit . "139da9eb356b4432f416d1db49fdbfa46fb1bf8d") (:authors ("Shawn Ellis" . "shawn.ellis17@gmail.com")) (:maintainers ("Shawn Ellis" . "shawn.ellis17@gmail.com")) (:maintainer "Shawn Ellis" . "shawn.ellis17@gmail.com") (:keywords "log" "error" "lognav-mode" "convenience") (:url . "https://github.com/ellisvelo/lognav-mode.git"))]) (logpad . [(20201113 917) nil "Simulate Windows Notepad for logging." tar ((:commit . "2955c6e3de40bd1e84acb4c16c7690b210f82bec") (:authors ("Sven Knurr" . "git@tuxproject.de")) (:maintainers ("Sven Knurr" . "git@tuxproject.de")) (:maintainer "Sven Knurr" . "git@tuxproject.de") (:keywords "files" "outlines" "notepad") (:url . "https://github.com/dertuxmalwieder/logpad.el"))]) (logstash-conf . [(20210123 1949) nil "basic mode for editing logstash configuration" tar ((:commit . "ec9b527191cd47d3b5947cb0ec3d6a8a57b121ea") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))]) - (logview . [(20230818 1411) ((emacs (25 1)) (datetime (0 8)) (extmap (1 0))) "Major mode for viewing log files" tar ((:commit . "cabaf93f1df86c92aa022dde4a92d92371d72572") (:authors ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainers ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainer "Paul Pogonyshev" . "pogonyshev@gmail.com") (:keywords "files" "tools") (:url . "https://github.com/doublep/logview"))]) + (logview . [(20231014 1840) ((emacs (25 1)) (datetime (0 8)) (extmap (1 0))) "Major mode for viewing log files" tar ((:commit . "9140067afdc2f0d1eb493dc4dfdb53645289dd2b") (:authors ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainers ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainer "Paul Pogonyshev" . "pogonyshev@gmail.com") (:keywords "files" "tools") (:url . "https://github.com/doublep/logview"))]) (lol-data-dragon . [(20200705 1822) ((emacs (25 1))) "Browse Champions of League of Legends on Data Dragon" tar ((:commit . "0deec9867bd7ba96220ee2968a9b2a94fd474431") (:authors ("Xu Chunyang")) (:maintainers ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:keywords "games" "hypermedia") (:url . "https://github.com/xuchunyang/lol-data-dragon.el"))]) (lolcat . [(20190527 1145) ((emacs (24 3))) "Rainbows and unicorns!" tar ((:commit . "4855e587a3b9681c077dac4b9f166dd860f439a4") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainers ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:url . "https://github.com/xuchunyang/lolcat.el"))]) (lolcode-mode . [(20111002 847) nil "Major mode for editing LOLCODE" tar ((:commit . "280a47e0bf02ee3abc7c5b6b14345056f41981f9") (:authors ("Bodil Stokke" . "lolcode@bodil.tv")) (:maintainers ("Bodil Stokke" . "lolcode@bodil.tv")) (:maintainer "Bodil Stokke" . "lolcode@bodil.tv") (:keywords "lolcode" "major" "mode") (:url . "http://github.com/bodil/lolcode-mode"))]) @@ -3020,42 +3099,43 @@ (look-mode . [(20220626 641) nil "quick file viewer for image and text file browsing" tar ((:commit . "726c5b9098926278603a83e978b488371c0e9143") (:authors ("Peter H. Mao " . "petermao@jpl.nasa.gov")) (:maintainers ("Peter H. Mao " . "petermao@jpl.nasa.gov")) (:maintainer "Peter H. Mao " . "petermao@jpl.nasa.gov"))]) (loop . [(20160813 1407) nil "friendly imperative loop structures" tar ((:commit . "0ce77271d56b0fcdba4b3b38fed526081cd1f674") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:keywords "loop" "while" "for each" "break" "continue"))]) (loophole . [(20221126 1556) ((emacs (27 1))) "Manage temporary key bindings" tar ((:commit . "dadc3fadc68b13501c4dbe89109f30deb0d3441a") (:authors ("0x60DF" . "0x60df@gmail.com")) (:maintainers ("0x60DF" . "0x60df@gmail.com")) (:maintainer "0x60DF" . "0x60df@gmail.com") (:keywords "convenience") (:url . "https://github.com/0x60df/loophole"))]) - (loopy . [(20230827 1900) ((emacs (27 1)) (map (3 0)) (seq (2 22)) (compat (29 1 3))) "A looping macro" tar ((:commit . "420ed83c77e350461c3e7d8aab722b59956a9b23") (:authors ("Earl Hyatt")) (:maintainer "Earl Hyatt") (:keywords "extensions") (:url . "https://github.com/okamsn/loopy"))]) - (loopy-dash . [(20230501 225) ((emacs (25 1)) (loopy (0 11 2)) (dash (2 19))) "Dash destructuring for `loopy'" tar ((:commit . "d04f4b8a6918ffaf745b8ccdba5ff9fee66ea8bf") (:authors ("Earl Hyatt")) (:maintainers ("Earl Hyatt")) (:maintainer "Earl Hyatt") (:keywords "extensions") (:url . "https://github.com/okamsn/loopy"))]) + (loopy . [(20240310 50) ((emacs (27 1)) (map (3 3 1)) (seq (2 22)) (compat (29 1 3))) "A looping macro" tar ((:commit . "de9a2933f4794d13236236db6165403d722e5105") (:authors ("Earl Hyatt")) (:maintainer "Earl Hyatt") (:keywords "extensions") (:url . "https://github.com/okamsn/loopy"))]) + (loopy-dash . [(20240225 1740) ((emacs (25 1)) (loopy (0 12 3)) (dash (2 19))) "Dash destructuring for `loopy'" tar ((:commit . "eeebd2713d636b3cf08c6af22f46d23b9aa06592") (:authors ("Earl Hyatt")) (:maintainers ("Earl Hyatt")) (:maintainer "Earl Hyatt") (:keywords "extensions") (:url . "https://github.com/okamsn/loopy"))]) (lorem-ipsum . [(20221214 1857) nil "Insert dummy pseudo Latin text" tar ((:commit . "4e87a899868e908a7a9e1812831d76c8d072f885") (:authors ("Jean-Philippe Theberge" . "jphil21@sourceforge.net")) (:maintainers ("Joe Schafer" . "joe@jschaf.com")) (:maintainer "Joe Schafer" . "joe@jschaf.com") (:keywords "tools" "language" "convenience") (:url . "https://github.com/jschaf/emacs-lorem-ipsum"))]) (lox-mode . [(20200619 1700) ((emacs (24 3))) "Major mode for the Lox programming language" tar ((:commit . "083a2299e188a516d1e46ef2dd1cbb89db1aec49") (:authors ("Timmy Jose" . "zoltan.jose@gmail.com")) (:maintainers ("Timmy Jose" . "zoltan.jose@gmail.com")) (:maintainer "Timmy Jose" . "zoltan.jose@gmail.com") (:keywords "languages" "lox") (:url . "https://github.com/timmyjose-projects/lox-mode"))]) - (lpy . [(20221106 1310) ((emacs (25 1)) (lispy (0 27 0))) "A lispy interface to Python" tar ((:commit . "fa95b11e1023704510cc7dd2897bf8bcc3027cbb") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "python" "lisp") (:url . "https://github.com/abo-abo/lpy"))]) - (lsp-cfn . [(20230701 1533) ((emacs (27 0)) (lsp-mode (8 0 0)) (yaml-mode (0 0 15))) "LSP integration for cfn-lsp-extra" tar ((:commit . "afef283ae27dc7dfbec997982ba5dc0e062f0a03") (:authors ("Laurence Warne")) (:maintainers ("Laurence Warne")) (:maintainer "Laurence Warne") (:url . "https://github.com/LaurenceWarne/lsp-cfn.el"))]) - (lsp-dart . [(20230516 52) ((emacs (26 3)) (lsp-treemacs (0 3)) (lsp-mode (7 0 1)) (dap-mode (0 6)) (f (0 20 0)) (dash (2 14 1)) (dart-mode (1 0 5)) (jsonrpc (1 0 15)) (ht (2 2))) "Dart support lsp-mode" tar ((:commit . "5356af174813ccad4f59006acd918d7303b3af0a") (:keywords "languages" "extensions") (:url . "https://emacs-lsp.github.io/lsp-dart"))]) - (lsp-docker . [(20230824 947) ((emacs (27 1)) (dash (2 14 1)) (lsp-mode (6 2 1)) (f (0 20 0)) (s (1 13 0)) (yaml (0 2 0)) (ht (2 0))) "LSP Docker integration" tar ((:commit . "6b7701917417e4e74961185051c147e1bf003750") (:authors ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainers ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainer "Ivan Yonchovski" . "yyoncho@gmail.com") (:keywords "languages" "langserver") (:url . "https://github.com/emacs-lsp/lsp-docker"))]) + (lpy . [(20231026 1525) ((emacs (25 1)) (lispy (0 27 0))) "A lispy interface to Python" tar ((:commit . "2c086ec162d4456b99a6095c3c335382a8304734") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "python" "lisp") (:url . "https://github.com/abo-abo/lpy"))]) + (lsp-cfn . [(20240112 921) ((emacs (27 0)) (lsp-mode (8 0 0)) (yaml-mode (0 0 15))) "LSP integration for cfn-lsp-extra" tar ((:commit . "2297533003118ebd9db0116b4d3486a987e98ca9") (:authors ("Laurence Warne")) (:maintainers ("Laurence Warne")) (:maintainer "Laurence Warne") (:url . "https://github.com/LaurenceWarne/lsp-cfn.el"))]) + (lsp-dart . [(20240215 14) ((emacs (26 3)) (lsp-treemacs (0 3)) (lsp-mode (7 0 1)) (dap-mode (0 6)) (f (0 20 0)) (dash (2 14 1)) (dart-mode (1 0 5)) (jsonrpc (1 0 15)) (ht (2 2))) "Dart support lsp-mode" tar ((:commit . "f51c80f5458d8ba4db9dd3781d190c6c32213250") (:keywords "languages" "extensions") (:url . "https://emacs-lsp.github.io/lsp-dart"))]) + (lsp-docker . [(20240318 2039) ((emacs (27 1)) (dash (2 14 1)) (lsp-mode (6 2 1)) (f (0 20 0)) (s (1 13 0)) (yaml (0 2 0)) (ht (2 0))) "LSP Docker integration" tar ((:commit . "5554349883af05fd25d6bbd56d7116d7f965d493") (:authors ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainers ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainer "Ivan Yonchovski" . "yyoncho@gmail.com") (:keywords "languages" "langserver") (:url . "https://github.com/emacs-lsp/lsp-docker"))]) (lsp-focus . [(20200906 1917) ((emacs (26 1)) (focus (0 1 1)) (lsp-mode (6 1))) "focus.el support for lsp-mode" tar ((:commit . "d01f0af156e4e78dcb9fa8e080a652cf8f221d30") (:authors ("Vibhav Pant")) (:maintainers ("Vibhav Pant")) (:maintainer "Vibhav Pant") (:keywords "languages" "lsp-mode") (:url . "https://github.com/emacs-lsp/lsp-focus"))]) - (lsp-grammarly . [(20230814 1827) ((emacs (27 1)) (lsp-mode (6 1)) (grammarly (0 3 0)) (request (0 3 0)) (s (1 12 0)) (ht (2 3))) "LSP Clients for Grammarly" tar ((:commit . "ac651a717af5e1effcd853846957fa0e85d82061") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "lsp" "grammarly" "checker") (:url . "https://github.com/emacs-grammarly/lsp-grammarly"))]) - (lsp-haskell . [(20230824 850) ((emacs (27 1)) (lsp-mode (3 0)) (haskell-mode (16 1))) "Haskell support for lsp-mode" tar ((:commit . "c443f1536404c252dbd16cf44eb47cabdcd6c45f") (:keywords "haskell") (:url . "https://github.com/emacs-lsp/lsp-haskell"))]) + (lsp-grammarly . [(20240229 115) ((emacs (27 1)) (lsp-mode (6 1)) (grammarly (0 3 0)) (request (0 3 0)) (s (1 12 0)) (ht (2 3))) "LSP Clients for Grammarly" tar ((:commit . "39deb23b282785eaffc6ae17838c92c613a49315") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "lsp" "grammarly" "checker") (:url . "https://github.com/emacs-grammarly/lsp-grammarly"))]) + (lsp-haskell . [(20231011 1723) ((emacs (27 1)) (lsp-mode (3 0)) (haskell-mode (16 1))) "Haskell support for lsp-mode" tar ((:commit . "89d16370434e9a247e95b8b701f524f5abfc884b") (:keywords "haskell") (:url . "https://github.com/emacs-lsp/lsp-haskell"))]) (lsp-intellij . [(20180831 2051) ((emacs (25 1)) (lsp-mode (4 1))) "intellij lsp client" tar ((:commit . "cf30f0ac63bd0140e758840b8ab070e8313697b2") (:authors ("Ruin0x11" . "ipickering2@gmail.com")) (:maintainers ("Ruin0x11" . "ipickering2@gmail.com")) (:maintainer "Ruin0x11" . "ipickering2@gmail.com") (:keywords "languages" "processes" "tools") (:url . "https://github.com/Ruin0x11/lsp-intellij"))]) (lsp-ivy . [(20220831 1823) ((emacs (25 1)) (dash (2 14 1)) (lsp-mode (6 2 1)) (ivy (0 13 0))) "LSP ivy integration" tar ((:commit . "9ecf4dd9b1207109802bd1882aa621eb1c385106") (:keywords "languages" "debug") (:url . "https://github.com/emacs-lsp/lsp-ivy"))]) - (lsp-java . [(20230827 428) ((emacs (27 1)) (lsp-mode (6 0)) (markdown-mode (2 3)) (dash (2 18 0)) (f (0 20 0)) (ht (2 0)) (request (0 3 0)) (treemacs (2 5)) (dap-mode (0 5))) "Java support for lsp-mode" tar ((:commit . "bc89297c72136f7250df6b745ae2364b5a4f10a2") (:keywords "languague" "tools") (:url . "https://github.com/emacs-lsp/lsp-java"))]) + (lsp-java . [(20230922 1154) ((emacs (27 1)) (lsp-mode (6 0)) (markdown-mode (2 3)) (dash (2 18 0)) (f (0 20 0)) (ht (2 0)) (request (0 3 0)) (treemacs (2 5)) (dap-mode (0 5))) "Java support for lsp-mode" tar ((:commit . "449673da7221a30f1b1756cedcc48b9a2b52a51e") (:keywords "languague" "tools") (:url . "https://github.com/emacs-lsp/lsp-java"))]) (lsp-javacomp . [(20190124 1755) ((emacs (25 1)) (lsp-mode (3 0)) (s (1 2 0))) "Provide Java IDE features powered by JavaComp." tar ((:commit . "82aa4ad6ca03a74565c35e855b318b1887bcd89b") (:keywords "java" "tools" "lsp") (:url . "https://github.com/tigersoldier/lsp-javacomp"))]) (lsp-jedi . [(20230824 1908) ((emacs (25 1)) (lsp-mode (6 0))) "Lsp client plugin for Python Jedi Language Server" tar ((:commit . "3c828df8dd422dbb94856cc99db6f9acb52b871d") (:authors ("Fred Campos" . "fred.tecnologia@gmail.com")) (:maintainers ("Fred Campos")) (:maintainer "Fred Campos") (:keywords "language-server" "tools" "python" "jedi" "ide") (:url . "http://github.com/fredcamps/lsp-jedi"))]) - (lsp-julia . [(20230414 2107) ((emacs (25 1)) (lsp-mode (6 3)) (julia-mode (0 3))) "Julia support for lsp-mode" tar ((:commit . "c584f79c7fee6176bbb6120f4cb0f1001bcf8113") (:authors ("Martin Wolke" . "vibhavp@gmail.com") ("Adam Beckmeyer" . "adam_git@thebeckmeyers.xyz") ("Guido Kraemer" . "gdkrmr@users.noreply.github.com")) (:maintainers ("Guido Kraemer" . "gdkrmr@users.noreply.github.com")) (:maintainer "Guido Kraemer" . "gdkrmr@users.noreply.github.com") (:keywords "languages" "tools") (:url . "https://github.com/gdkrmr/lsp-julia"))]) - (lsp-latex . [(20230717 1707) ((emacs (27 1)) (lsp-mode (6 0)) (consult (0 35))) "LSP-mode client for LaTeX, on texlab" tar ((:commit . "7d70e07a02f7b808ba97f1ed7d63491ab8f55900") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainers ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com") (:keywords "languages" "tex") (:url . "https://github.com/ROCKTAKEY/lsp-latex"))]) - (lsp-ltex . [(20230416 1826) ((emacs (27 1)) (lsp-mode (6 1))) "LSP Clients for LTEX" tar ((:commit . "c2faddc1197a360548aee7927b6512365e8c0d3a") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("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 . [(20230817 827) ((emacs (27 1)) (scala-mode (1 1)) (lsp-mode (7 0)) (lsp-treemacs (0 2)) (dap-mode (0 3)) (dash (2 18 0)) (f (0 20 0)) (ht (2 0)) (treemacs (2 5)) (posframe (1 4 1))) "Scala Client settings" tar ((:commit . "811f02e4416d208102350ea48404e0310ffea647") (:authors ("Ross A. Baker" . "ross@rossabaker.com") ("Evgeny Kurnevsky" . "kurnevsky@gmail.com")) (:maintainers ("Ross A. Baker" . "ross@rossabaker.com")) (:maintainer "Ross A. Baker" . "ross@rossabaker.com") (:keywords "languages" "extensions") (:url . "https://github.com/emacs-lsp/lsp-metals"))]) - (lsp-mode . [(20230823 446) ((emacs (27 1)) (dash (2 18 0)) (f (0 20 0)) (ht (2 3)) (spinner (1 7 3)) (markdown-mode (2 3)) (lv (0)) (eldoc (1 11))) "LSP mode" tar ((:commit . "f8ed844b6e23c7717fb69d6c645aa41f0772c557") (:authors ("Vibhav Pant, Fangrui Song, Ivan Yonchovski")) (:maintainers ("Vibhav Pant, Fangrui Song, Ivan Yonchovski")) (:maintainer "Vibhav Pant, Fangrui Song, Ivan Yonchovski") (:keywords "languages") (:url . "https://github.com/emacs-lsp/lsp-mode"))]) + (lsp-julia . [(20230915 654) ((emacs (25 1)) (lsp-mode (6 3)) (julia-mode (0 3))) "Julia support for lsp-mode" tar ((:commit . "c869b2f6c05a97e5495ed3cc6710a33b4faf41a2") (:authors ("Martin Wolke" . "vibhavp@gmail.com") ("Adam Beckmeyer" . "adam_git@thebeckmeyers.xyz") ("Guido Kraemer" . "gdkrmr@users.noreply.github.com")) (:maintainers ("Guido Kraemer" . "gdkrmr@users.noreply.github.com")) (:maintainer "Guido Kraemer" . "gdkrmr@users.noreply.github.com") (:keywords "languages" "tools") (:url . "https://github.com/gdkrmr/lsp-julia"))]) + (lsp-latex . [(20240316 1745) ((emacs (27 1)) (lsp-mode (6 0)) (consult (0 35))) "LSP-mode client for LaTeX, on texlab" tar ((:commit . "a00c68234efefa48f40b64819ed8e770b107bff7") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainers ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com") (:keywords "languages" "tex") (:url . "https://github.com/ROCKTAKEY/lsp-latex"))]) + (lsp-ltex . [(20240318 224) ((emacs (27 1)) (lsp-mode (6 1))) "LSP Clients for LTEX" tar ((:commit . "c4bc1515be815b58d76bed2dbc5e7c400c37d6be") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("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 . [(20231017 911) ((emacs (27 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 (3 1)) (posframe (1 4 1))) "Scala Client settings" tar ((:commit . "da7e54ed65f4e153c94b9c54689908dce142ef37") (:authors ("Ross A. Baker" . "ross@rossabaker.com") ("Evgeny Kurnevsky" . "kurnevsky@gmail.com")) (:maintainers ("Ross A. Baker" . "ross@rossabaker.com")) (:maintainer "Ross A. Baker" . "ross@rossabaker.com") (:keywords "languages" "extensions") (:url . "https://github.com/emacs-lsp/lsp-metals"))]) + (lsp-mode . [(20240319 1043) ((emacs (27 1)) (dash (2 18 0)) (f (0 20 0)) (ht (2 3)) (spinner (1 7 3)) (markdown-mode (2 3)) (lv (0)) (eldoc (1 11))) "LSP mode" tar ((:commit . "8903da305bccaabe6e8fb2665b0d1c6f8861e024") (:authors ("Vibhav Pant, Fangrui Song, Ivan Yonchovski")) (:maintainers ("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 . [(20230510 1124) ((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 . "a0dba8f86a2ace7e800a9dc8f814767625a509af") (:authors ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainers ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainer "Ivan Yonchovski" . "yyoncho@gmail.com") (:keywords "data" "languages") (:url . "https://github.com/emacs-lsp/lsp-mssql"))]) (lsp-origami . [(20230815 704) ((emacs (27 1)) (origami (1 0)) (lsp-mode (6 1))) "origami.el support for lsp-mode" tar ((:commit . "86aa06517910141c3d5054eea5f7723461fce6a6") (:authors ("Vibhav Pant")) (:maintainers ("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")) (:maintainers ("Dmitri Makarov")) (:maintainer "Dmitri Makarov") (:keywords "lsp" "p4") (:url . "https://github.com/dmakarov/p4ls"))]) (lsp-pascal . [(20200422 1610) ((emacs (24 4)) (lsp-mode (6 3))) "LSP client for Pascal" tar ((:commit . "9b65bf9e923b1459d1feb1d7528e5855e7bd4ef2") (:authors ("Arjan Adriaanse" . "arjan@adriaan.se")) (:maintainers ("Arjan Adriaanse" . "arjan@adriaan.se")) (:maintainer "Arjan Adriaanse" . "arjan@adriaan.se") (:keywords "languages" "tools") (:url . "https://github.com/arjanadriaanse/lsp-pascal"))]) (lsp-pyre . [(20190406 335) ((lsp-mode (6 0))) "lsp-mode client for python using pyre" tar ((:commit . "e177b8f5efd1a955b5753aeb5d1894e6d21be35a") (:authors ("John Allen" . "oss@porcnick.com")) (:maintainers ("John Allen" . "oss@porcnick.com")) (:maintainer "John Allen" . "oss@porcnick.com") (:url . "https://github.com/jra3/lsp-pyre"))]) - (lsp-pyright . [(20230225 1118) ((emacs (26 1)) (lsp-mode (7 0)) (dash (2 18 0)) (ht (2 0))) "Python LSP client using Pyright" tar ((:commit . "54a2acddfdd7c3d31cb804a042305a3c6e60cf81") (:authors ("Arif Rezai, Vincent Zhang, Andrew Christianson")) (:maintainers ("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-pyright . [(20231006 1212) ((emacs (26 1)) (lsp-mode (7 0)) (dash (2 18 0)) (ht (2 0))) "Python LSP client using Pyright" tar ((:commit . "2f2631ae242d5770dbe6cb924e44c1ee5671789d") (:authors ("Arif Rezai, Vincent Zhang, Andrew Christianson")) (:maintainers ("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 . [(20230731 1458) ((emacs (25 1)) (lsp-mode (6 1))) "The lsp-mode client for Microsoft python-language-server" tar ((:commit . "7bda327bec7b219d140c34dab4b1e1fbd41bc516") (:authors ("Charl Botha")) (:maintainers ("Andrew Christianson, Vincent Zhang")) (: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" tar ((:commit . "7baf9adf10234cf964feefae99050268e9bc5681") (:authors ("John Lee")) (:maintainers ("John Lee")) (:maintainer "John Lee") (:keywords "languages") (:url . "https://github.com/jjlee/lsp-rescript"))]) (lsp-scheme . [(20230606 1722) ((emacs (26 1)) (f (0 20 0)) (lsp-mode (8 0 0))) "Scheme support for lsp-mode" tar ((:commit . "99251252005650d6f39cead8b2b9698c83251f01") (:authors ("Ricardo G. Herdt" . "r.herdt@posteo.de")) (:maintainers ("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-shader . [(20240229 111) ((emacs (27 1)) (lsp-mode (6 1))) "LSP Clients for ShaderLab" tar ((:commit . "02fdc6d74e931db52ba1aa8dcce17d0a26049242") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "shader") (:url . "https://github.com/shader-ls/lsp-shader"))]) (lsp-sonarlint . [(20230814 1954) ((emacs (27 1)) (dash (2 12 0)) (lsp-mode (6 3)) (ht (2 3))) "Emacs SonarLint lsp client" tar ((:commit . "d131779950d5d45c3129eb088cef5fd11099f47c") (:authors ("Fermin MF" . "fmfs@posteo.net")) (:maintainers ("Fermin MF" . "fmfs@posteo.net")) (:maintainer "Fermin MF" . "fmfs@posteo.net") (:keywords "languages" "tools" "php" "javascript" "typescript" "go" "xml" "html" "java" "python") (:url . "https://github.com/emacs-lsp/lsp-sonarlint"))]) (lsp-sourcekit . [(20230815 717) ((emacs (27 1)) (lsp-mode (5))) "sourcekit-lsp client for lsp-mode" tar ((:commit . "1cd5e7d2699598a97bdbcd289d9a88b249db474c") (:authors ("Daniel Martín")) (:maintainers ("Daniel Martín")) (:maintainer "Daniel Martín") (:keywords "languages" "lsp" "swift" "objective-c" "c++") (:url . "https://github.com/emacs-lsp/lsp-sourcekit"))]) (lsp-tailwindcss . [(20230407 951) ((lsp-mode (7 1)) (f (0 20 0)) (emacs (26 1))) "A lsp-mode client for tailwindcss" tar ((:commit . "6ade9cacd1db89da0e9c0941a86408a42091d479") (:authors ("A.I." . "merrick@luois.me")) (:maintainers ("A.I." . "merrick@luois.me")) (:maintainer "A.I." . "merrick@luois.me") (:keywords "language" "tools") (:url . "https://github.com/merrickluo/lsp-tailwindcss"))]) (lsp-treemacs . [(20230811 611) ((emacs (27 1)) (dash (2 18 0)) (f (0 20 0)) (ht (2 0)) (treemacs (2 5)) (lsp-mode (6 0))) "LSP treemacs" tar ((:commit . "e66ae2196503d4e84334519e56b4388feffa5060") (:authors ("Ivan Yonchovski")) (:maintainers ("Ivan Yonchovski")) (:maintainer "Ivan Yonchovski") (:keywords "languages") (:url . "https://github.com/emacs-lsp/lsp-treemacs"))]) (lsp-ui . [(20230811 552) ((emacs (27 1)) (dash (2 18 0)) (lsp-mode (6 0)) (markdown-mode (2 3))) "UI modules for lsp-mode" tar ((:commit . "0dd39900c8ed8145d207985cb2f65cedd1ffb410") (:authors ("Sebastien Chapuis , Fangrui Song" . "i@maskray.me")) (:maintainers ("Sebastien Chapuis , Fangrui Song" . "i@maskray.me")) (:maintainer "Sebastien Chapuis , Fangrui Song" . "i@maskray.me") (:keywords "languages" "tools") (:url . "https://github.com/emacs-lsp/lsp-ui"))]) - (lua-mode . [(20230810 931) ((emacs (24 3))) "a major-mode for editing Lua scripts" tar ((:commit . "7eb8eaa420c25477c830623b830fd18dc350cdfb") (:authors ("2011-2013 immerrr" . "immerrr+lua@gmail.com") ("2010-2011 Reuben Thomas" . "rrt@sc3d.org") ("2006 Juergen Hoetzel" . "juergen@hoetzel.info") ("2004 various (support for Lua 5 and byte compilation)") ("2001 Christian Vogler" . "cvogler@gradient.cis.upenn.edu") ("1997 Bret Mogilefsky" . "mogul-lua@gelatinous.com") ("tcl-mode by Gregor Schmid" . "schmid@fb3-s7.math.tu-berlin.de") ("with tons of assistance from") ("Paul Du Bois" . "pld-lua@gelatinous.com") ("Aaron Smith" . "aaron-lua@gelatinous.com")) (:maintainers ("2011-2013 immerrr" . "immerrr+lua@gmail.com")) (:maintainer "2011-2013 immerrr" . "immerrr+lua@gmail.com") (:keywords "languages" "processes" "tools") (:url . "https://immerrr.github.io/lua-mode"))]) + (lua-mode . [(20231023 947) ((emacs (24 3))) "a major-mode for editing Lua scripts" tar ((:commit . "d074e4134b1beae9ed4c9b512af741ca0d852ba3") (:authors ("2011-2013 immerrr" . "immerrr+lua@gmail.com") ("2010-2011 Reuben Thomas" . "rrt@sc3d.org") ("2006 Juergen Hoetzel" . "juergen@hoetzel.info") ("2004 various (support for Lua 5 and byte compilation)") ("2001 Christian Vogler" . "cvogler@gradient.cis.upenn.edu") ("1997 Bret Mogilefsky" . "mogul-lua@gelatinous.com") ("tcl-mode by Gregor Schmid" . "schmid@fb3-s7.math.tu-berlin.de") ("with tons of assistance from") ("Paul Du Bois" . "pld-lua@gelatinous.com") ("Aaron Smith" . "aaron-lua@gelatinous.com")) (:maintainers ("2011-2013 immerrr" . "immerrr+lua@gmail.com")) (:maintainer "2011-2013 immerrr" . "immerrr+lua@gmail.com") (:keywords "languages" "processes" "tools") (:url . "https://immerrr.github.io/lua-mode"))]) (luarocks . [(20170430 2305) ((emacs (24)) (cl-lib (0 5))) "luarocks tools" tar ((:commit . "cee27ba0716edf338077387969883226dd2b7484") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainers ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:keywords "convenience") (:url . "https://github.com/emacs-pe/luarocks.el"))]) (lurk-mode . [(20230120 2226) ((emacs (25 1))) "A major mode for editing lurk files" tar ((:commit . "59a3f956944a5ddd43cfd57deeff6b647fc46554") (:maintainers ("Jeff Weiss" . "jweiss@protocol.ai")) (:maintainer "Jeff Weiss" . "jweiss@protocol.ai") (:keywords "languages" "lurk" "lisp") (:url . "http://github.com/lurk-lang/lurk-emacs"))]) (lush-theme . [(20180816 2200) ((emacs (24))) "A dark theme with lush colors" tar ((:commit . "7cfc993709d712f75c51b505078608c9e1c11466") (:authors ("Andre Richter" . "andre.o.richter@gmail.com")) (:maintainers ("Andre Richter" . "andre.o.richter@gmail.com")) (:maintainer "Andre Richter" . "andre.o.richter@gmail.com") (:keywords "theme" "dark" "strong colors") (:url . "https://github.com/andre-richter/emacs-lush-theme"))]) @@ -3066,29 +3146,30 @@ (lxc-tramp . [(20230119 1251) ((emacs (24)) (cl-lib (0 6))) "TRAMP integration for LXC containers" tar ((:commit . "57559701334bb5635b82a252bd00298d06d794fe") (:authors ("montag451")) (:maintainers ("montag451")) (:maintainer "montag451") (:keywords "lxc" "convenience") (:url . "https://github.com/montag451/lxc-tramp"))]) (lxd-tramp . [(20181023 7) ((emacs (24 4)) (cl-lib (0 6))) "TRAMP integration for LXD containers" tar ((:commit . "f335c76245f62b02cf67a9376eca6f3863c8a75a") (:authors ("Yc.S" . "onixie@gmail.com")) (:maintainers ("Yc.S" . "onixie@gmail.com")) (:maintainer "Yc.S" . "onixie@gmail.com") (:keywords "lxd" "lxc" "convenience") (:url . "https://github.com/onixie/lxd-tramp.git"))]) (lyrics . [(20220206 116) ((emacs (25 1)) (seq (2 15))) "Show lyrics" tar ((:commit . "c3d42f1e039941f32f49252e1b1610de337b4470") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainers ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:keywords "convenience") (:url . "https://github.com/emacs-pe/lyrics.el"))]) - (lyrics-fetcher . [(20220717 1716) ((emacs (27)) (emms (7 5)) (f (0 20 0)) (request (0 3 2))) "Fetch song lyrics and album covers" tar ((:commit . "a3be34b0153c2c056dc4b55bbc5fbdc2d9f87549") (:authors ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainers ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainer "Korytov Pavel" . "thexcloud@gmail.com") (:url . "https://github.com/SqrtMinusOne/lyrics-fetcher.el"))]) - (m-buffer . [(20220719 1850) ((seq (2 14))) "List-Oriented, Functional Buffer Manipulation" tar ((:commit . "d2e35bf9293367f1a2d19f259f32a35bd9f4788b") (:authors ("Phillip Lord" . "phillip.lord@russet.org.uk")) (:maintainers ("Phillip Lord" . "phillip.lord@russet.rg.uk")) (:maintainer "Phillip Lord" . "phillip.lord@russet.rg.uk"))]) - (mac-pseudo-daemon . [(20200215 513) ((cl-lib (0 1))) "Daemon mode that plays nice with Mac OS." tar ((:commit . "564b006835facc4a8df247d8a47ab1030d7e7beb") (:authors ("Ryan C. Thompson")) (:maintainers ("Ryan C. Thompson")) (:maintainer "Ryan C. Thompson") (:keywords "convenience" "osx" "mac") (:url . "https://github.com/DarwinAwardWinner/osx-pseudo-daemon"))]) + (lyrics-fetcher . [(20231225 2350) ((emacs (27)) (emms (7 5)) (f (0 20 0)) (request (0 3 2))) "Fetch song lyrics and album covers" tar ((:commit . "bcde34a7ae8db84170bfe76260eefed64686ddf0") (:authors ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainers ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainer "Korytov Pavel" . "thexcloud@gmail.com") (:url . "https://github.com/SqrtMinusOne/lyrics-fetcher.el"))]) + (m-buffer . [(20240302 2255) ((seq (2 14))) "List-Oriented, Functional Buffer Manipulation" tar ((:commit . "8a51de3366599e7fa52e37b596c9ce226b6f04c5") (:authors ("Phillip Lord" . "phillip.lord@russet.org.uk")) (:maintainers ("Phillip Lord" . "phillip.lord@russet.rg.uk")) (:maintainer "Phillip Lord" . "phillip.lord@russet.rg.uk"))]) + (mac-pseudo-daemon . [(20211208 138) ((cl-lib (0 1))) "Daemon mode that plays nice with Mac OS." tar ((:commit . "462031a53255185ae25eb10ae1f4272e49ad70f7") (:authors ("Ryan C. Thompson")) (:maintainers ("Ryan C. Thompson")) (:maintainer "Ryan C. Thompson") (:keywords "convenience" "osx" "mac") (:url . "https://github.com/DarwinAwardWinner/mac-pseudo-daemon"))]) (maces-game . [(20170903 1551) ((dash (2 12 0)) (cl-lib (0 5)) (emacs (24))) "another anagram game." tar ((:commit . "6a067422d305ac51612842930ed6686dc615ffec") (:authors ("Pawel Bokota" . "pawelb.lnx@gmail.com")) (:maintainers ("Pawel Bokota" . "pawelb.lnx@gmail.com")) (:maintainer "Pawel Bokota" . "pawelb.lnx@gmail.com") (:keywords "games" "word games" "anagram") (:url . "https://github.com/pawelbx/anagram-game"))]) - (macports . [(20230814 1525) ((emacs (25 1)) (transient (0 1 0))) "A porcelain for MacPorts" tar ((:commit . "0a99de715b1f62a01d8128dfaef263a168ee05e4") (:authors ("Aaron Madlon-Kay")) (:maintainers ("Aaron Madlon-Kay")) (:maintainer "Aaron Madlon-Kay") (:keywords "convenience") (:url . "https://github.com/amake/macports.el"))]) + (macports . [(20240113 1224) ((emacs (26 1)) (transient (0 1 0))) "A porcelain for MacPorts" tar ((:commit . "75604bb57040be06eabf41669e6e2553afa8f7ba") (:authors ("Aaron Madlon-Kay")) (:maintainers ("Aaron Madlon-Kay")) (:maintainer "Aaron Madlon-Kay") (:keywords "convenience") (:url . "https://github.com/amake/macports.el"))]) (macro-math . [(20130328 1604) nil "in-buffer mathematical operations" tar ((:commit . "216e59371e9ee39c34117ba79b9acd78bb415750") (:authors ("Nikolaj Schumacher ")) (:maintainers ("Nikolaj Schumacher ")) (:maintainer "Nikolaj Schumacher ") (:keywords "convenience") (:url . "http://nschum.de/src/emacs/macro-math/"))]) (macrostep . [(20230813 2123) ((cl-lib (0 5))) "Interactive macro expander" tar ((:commit . "0b04a89f698c335c9ea492553470a8d45c113edd") (:authors ("Jon Oddie" . "j.j.oddie@gmail.com")) (:maintainers ("Jon Oddie" . "j.j.oddie@gmail.com")) (:maintainer "Jon Oddie" . "j.j.oddie@gmail.com") (:keywords "lisp" "languages" "macro" "debugging") (:url . "https://github.com/emacsorphanage/macrostep"))]) (macrostep-geiser . [(20210717 801) ((emacs (24 4)) (macrostep (0 9)) (geiser (0 12))) "Macrostep for `geiser'" tar ((:commit . "f6a2d5bb96ade4f23df557649af87ebd0cc45125") (:authors ("Nikita Bloshchanevich")) (:maintainers ("Nikita Bloshchanevich")) (:maintainer "Nikita Bloshchanevich") (:keywords "languages" "scheme") (:url . "https://github.com/nbfalcon/macrostep-geiser"))]) (madhat2r-theme . [(20170203 30) ((emacs (24))) "dark color theme that is easy on the eyes" tar ((:commit . "6b387f09de055cfcc15d74981cd4f32f8f9a7323") (:authors ("Micah Duke")) (:maintainers ("Micah Duke")) (:maintainer "Micah Duke") (:keywords "color" "theme") (:url . "https://github.com/madhat2r/madhat2r-theme"))]) (mag-menu . [(20150505 1850) ((splitter (0 1 0))) "Intuitive keyboard-centric menu system" tar ((:commit . "9b9277021cd09fb1dba64b1d2a00705d20914bd6") (:authors ("Steven Thomas")) (:maintainers ("Steven Thomas")) (:maintainer "Steven Thomas") (:keywords "convenience") (:url . "https://github.com/chumpage/mag-menu"))]) - (magic-filetype . [(20180219 1552) ((emacs (24)) (s (1 9 0))) "Enhance filetype major mode" tar ((:commit . "019494add5ff02dd36cb3f500142fc51125522cc") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "emulations" "vim" "ft" "file" "magic-mode") (:url . "https://github.com/zonuexe/magic-filetype.el"))]) + (magic-filetype . [(20240130 1805) ((emacs (24 3)) (s (1 9 0))) "Enhance filetype major mode" tar ((:commit . "3979ddbd8066d7390e31bde2b35f997c5f5f4516") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "emulations" "vim" "ft" "file" "magic-mode") (:url . "https://github.com/emacs-php/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" tar ((:commit . "903ec91872760e47c0e5715795f8465173615098") (:authors ("zk_phi")) (:maintainers ("zk_phi")) (:maintainer "zk_phi") (:url . "http://zk-phi.github.io/"))]) - (magik-mode . [(20230817 1258) ((emacs (24 4)) (compat (28 1))) "mode for editing Magik + some utils." tar ((:commit . "327be988d4c9938ca5d04b6e37bc922525b6de93") (:keywords "languages") (:url . "http://github.com/roadrunner1776/magik"))]) - (magit . [(20230828 1932) ((emacs (25 1)) (compat (29 1 3 4)) (dash (20221013)) (git-commit (20230101)) (magit-section (20230101)) (seq (2 23)) (transient (20230201)) (with-editor (20230118))) "A Git porcelain inside Emacs." tar ((:commit . "86b8491ce87a67551e1fb4261a41f2160ded590a") (:authors ("Marius Vollmer" . "marius.vollmer@gmail.com") ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "git" "tools" "vc") (:url . "https://github.com/magit/magit"))]) - (magit-annex . [(20230407 1200) ((cl-lib (0 3)) (magit (3 0 0))) "Control git-annex from Magit" tar ((:commit . "255e443e19a32e716ff414e09ad5e00f6f8bc8fb") (:authors ("Kyle Meyer" . "kyle@kyleam.com") ("Rémi Vanicat" . "vanicat@debian.org")) (:maintainers ("Kyle Meyer" . "kyle@kyleam.com")) (:maintainer "Kyle Meyer" . "kyle@kyleam.com") (:keywords "vc" "tools") (:url . "https://github.com/magit/magit-annex"))]) - (magit-commit-mark . [(20230420 304) ((emacs (28 1)) (magit (3 3 0))) "Support marking commits as read" tar ((:commit . "8c0ea6c2e25ae0d47f15ae9067874a0605c00704") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.org/ideasman42/emacs-magit-commit-mark"))]) + (magik-mode . [(20240216 921) ((emacs (24 4)) (compat (28 1))) "Emacs major mode for Smallworld Magik files" tar ((:commit . "6ac83927a6c294619bb99cb1ceb2ecf352498599") (:keywords "languages") (:url . "https://github.com/roadrunner1776/magik"))]) + (magit . [(20240316 1907) ((emacs (25 1)) (compat (29 1 4 4)) (dash (20240103)) (git-commit (20240123)) (magit-section (20240114)) (seq (2 24)) (transient (20240201)) (with-editor (20240101))) "A Git porcelain inside Emacs." tar ((:commit . "0963697f24cfbe80f92312044bd9ab28b914b053") (: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 . [(20231210 2140) ((cl-lib (0 3)) (magit (3 0 0))) "Control git-annex from Magit" tar ((:commit . "056f0d4462cdccbd7bb7589994da7fef9de766da") (:authors ("Kyle Meyer" . "kyle@kyleam.com") ("Rémi Vanicat" . "vanicat@debian.org")) (:maintainers ("Kyle Meyer" . "kyle@kyleam.com")) (:maintainer "Kyle Meyer" . "kyle@kyleam.com") (:keywords "vc" "tools") (:url . "https://github.com/magit/magit-annex"))]) + (magit-commit-mark . [(20240220 2101) ((emacs (28 1)) (magit (3 3 0))) "Support marking commits as read" tar ((:commit . "e5aa6a69af963fd25779f5211a7c3d91a65c6b0f") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.org/ideasman42/emacs-magit-commit-mark"))]) (magit-delta . [(20220125 50) ((emacs (25 1)) (magit (20200426)) (xterm-color (2 0))) "Use Delta when displaying diffs in Magit" tar ((:commit . "5fc7dbddcfacfe46d3fd876172ad02a9ab6ac616") (:authors ("Dan Davison" . "dandavison7@gmail.com")) (:maintainers ("Dan Davison" . "dandavison7@gmail.com")) (:maintainer "Dan Davison" . "dandavison7@gmail.com") (:url . "https://github.com/dandavison/magit-delta"))]) (magit-diff-flycheck . [(20190524 551) ((magit (2)) (flycheck (31)) (seq (2)) (emacs (25 1))) "Report errors in diffs" tar ((:commit . "ad58efa312d708f25661dfcc2a7f83a833cca328") (:authors ("Alex Ragone" . "ragonedk@gmail.com")) (:maintainers ("Alex Ragone" . "ragonedk@gmail.com")) (:maintainer "Alex Ragone" . "ragonedk@gmail.com") (:keywords "convenience" "matching") (:url . "https://github.com/ragone/magit-diff-flycheck"))]) (magit-filenotify . [(20151116 2340) ((magit (1 3 0)) (emacs (24 4))) "Refresh status buffer when git tree changes" tar ((:commit . "c0865b3c41af20b6cd89de23d3b0beb54c8401a4") (:authors ("Rüdiger Sonderfeld" . "ruediger@c-plusplus.de")) (:maintainers ("Rüdiger Sonderfeld" . "ruediger@c-plusplus.de")) (:maintainer "Rüdiger Sonderfeld" . "ruediger@c-plusplus.de") (:keywords "tools"))]) (magit-find-file . [(20150702 830) ((magit (2 1 0)) (dash (2 8 0))) "completing-read over all files in Git" tar ((:commit . "035da838b1a19e7a5ee135b4ca8475f4e235b61e") (:authors ("Bradley Wright" . "brad@intranation.com")) (:maintainers ("Bradley Wright" . "brad@intranation.com")) (:maintainer "Bradley Wright" . "brad@intranation.com") (:keywords "git") (:url . "https://github.com/bradleywright/magit-find-file.el"))]) - (magit-gerrit . [(20230309 2251) ((emacs (25 1)) (magit (2 90 1)) (transient (0 3 0))) "Magit plugin for Gerrit Code Review" tar ((:commit . "a97521574c5b7d4b7ab89e25c358c87fd5b1887f") (:authors ("Brian Fransioli" . "assem@terranpro.org")) (:maintainers ("Brian Fransioli" . "assem@terranpro.org")) (:maintainer "Brian Fransioli" . "assem@terranpro.org") (:url . "https://github.com/emacsorphanage/magit-gerrit"))]) + (magit-gerrit . [(20231002 1538) ((emacs (25 1)) (magit (2 90 1)) (transient (0 3 0))) "Magit plugin for Gerrit Code Review" tar ((:commit . "9b6c476a4a5e715d68081dda45312f7e2bedd484") (:authors ("Brian Fransioli" . "assem@terranpro.org")) (:maintainers ("Brian Fransioli" . "assem@terranpro.org")) (:maintainer "Brian Fransioli" . "assem@terranpro.org") (:url . "https://github.com/emacsorphanage/magit-gerrit"))]) (magit-gh-pulls . [(20191230 1944) ((emacs (24 4)) (gh (0 9 1)) (magit (2 12 0)) (pcache (0 2 3)) (s (1 6 1))) "GitHub pull requests extension for Magit" tar ((:commit . "57f3a5158bbc7bfd169ee136fde351cce999e0ca") (:authors ("Yann Hodique" . "yann.hodique@gmail.com")) (:maintainers ("Yann Hodique" . "yann.hodique@gmail.com")) (:maintainer "Yann Hodique" . "yann.hodique@gmail.com") (:keywords "git" "tools") (:url . "https://github.com/sigma/magit-gh-pulls"))]) (magit-gitflow . [(20170929 824) ((magit (2 1 0)) (magit-popup (2 2 0))) "gitflow extension for magit" tar ((:commit . "cc41b561ec6eea947fe9a176349fb4f771ed865b") (:authors ("Jan Tatarik" . "Jan.Tatarik@gmail.com")) (:maintainers ("Jan Tatarik" . "Jan.Tatarik@gmail.com")) (:maintainer "Jan Tatarik" . "Jan.Tatarik@gmail.com") (:keywords "vc" "tools") (:url . "https://github.com/jtatarik/magit-gitflow"))]) + (magit-gptcommit . [(20240303 1649) ((emacs (29 1)) (dash (2 13 0)) (magit (2 90 1)) (gptel (0 6 0))) "Git commit with help of gpt" tar ((:commit . "28485542a14966141208daf6baedb3833ad2357d") (:authors ("Tiou Lims" . "dourokinga@gmail.com")) (:maintainers ("Tiou Lims" . "dourokinga@gmail.com")) (:maintainer "Tiou Lims" . "dourokinga@gmail.com") (:url . "https://github.com/douo/magit-gptcommit"))]) (magit-imerge . [(20230522 1054) ((emacs (25 1)) (magit (3 0 0))) "Magit extension for git-imerge" tar ((:commit . "b7cfe49a197c2cf5948109921e053711b156389d") (:authors ("Kyle Meyer" . "kyle@kyleam.com")) (:maintainers ("Kyle Meyer" . "kyle@kyleam.com")) (:maintainer "Kyle Meyer" . "kyle@kyleam.com") (:keywords "vc" "tools") (:url . "https://github.com/magit/magit-imerge"))]) (magit-lfs . [(20221031 1447) ((emacs (24 4)) (magit (2 10 3)) (dash (2 13 0))) "Magit plugin for Git LFS" tar ((:commit . "cd9f46e1840270be27e2c2d9dcf036ff0781f66d") (:authors ("Junyoung/Clare Jang" . "jjc9310@gmail.com")) (:maintainers ("Junyoung/Clare Jang" . "jjc9310@gmail.com")) (:maintainer "Junyoung/Clare Jang" . "jjc9310@gmail.com") (:keywords "magit" "git" "lfs" "tools" "vc") (:url . "https://github.com/ailrun/magit-lfs"))]) (magit-org-todos . [(20180709 1950) ((magit (2 0 0)) (emacs (24))) "Add local todo items to the magit status buffer" tar ((:commit . "9ffa3efb098434d837cab4bacd1601fdfc6fe999") (:authors ("Daniel Ma")) (:maintainers ("Daniel Ma")) (:maintainer "Daniel Ma") (:keywords "org-mode" "magit" "tools") (:url . "http://github.com/danielma/magit-org-todos"))]) @@ -3097,12 +3178,12 @@ (magit-popup . [(20200719 1015) ((emacs (24 4)) (dash (2 13 0))) "Define prefix-infix-suffix command combos" tar ((:commit . "d8585fa39f88956963d877b921322530257ba9f5") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "bindings") (:url . "https://github.com/magit/magit-popup"))]) (magit-rbr . [(20181009 2016) ((magit (2 13 0)) (emacs (24 3))) "Support for git rbr in Magit" tar ((:commit . "029203b3e48537205052a058e964f058cd802c3c") (:authors ("Anatoly Fayngelerin" . "fanatoly+magitrbr@gmail.com")) (:maintainers ("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" tar ((:commit . "aceedff88921f1dfef8a6b2fb18fe316fb7223a8") (:authors ("Jules Tamagnan" . "jtamagnan@gmail.com")) (:maintainers ("Jules Tamagnan" . "jtamagnan@gmail.com")) (:maintainer "Jules Tamagnan" . "jtamagnan@gmail.com") (:keywords "magit" "vc") (:url . "http://github.com/jtamagnan/magit-reviewboard"))]) - (magit-section . [(20230805 1908) ((emacs (25 1)) (compat (29 1 3 4)) (dash (20221013))) "Sections for read-only buffers." tar ((:commit . "d73a3b11db7c25175cf710b1b135ff7e07125115") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "tools") (:url . "https://github.com/magit/magit"))]) + (magit-section . [(20240311 1407) ((emacs (25 1)) (compat (29 1 4 4)) (dash (20221013))) "Sections for read-only buffers." tar ((:commit . "8a3c1ccdda8185255ce76adc2ba41b9a43f18b8c") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "tools") (:url . "https://github.com/magit/magit"))]) (magit-stats . [(20230223 1819) ((emacs (25 1))) "Generates GIT Repo Statistics Report" tar ((:commit . "41b18e5fc664dba93981a7931f476632c5b54a7d") (:authors ("Rahul M. Juliato")) (:maintainers ("Rahul M. Juliato")) (:maintainer "Rahul M. Juliato") (:keywords "vc" "convenience") (:url . "https://github.com/LionyxML/magit-stats"))]) - (magit-stgit . [(20220914 1349) ((emacs (24 4)) (magit (2 12 0)) (magit-popup (2 12 0))) "StGit extension for Magit" tar ((:commit . "bf96fa0f40c087329ad7e6a3b1946de7df03559c") (:authors ("Lluís Vilanova" . "vilanova@ac.upc.edu")) (:maintainers ("UNMAINTAINED")) (:maintainer "UNMAINTAINED") (:keywords "vc" "tools"))]) + (magit-stgit . [(20231226 1514) ((emacs (24 4)) (magit (2 12 0)) (magit-popup (2 12 0))) "StGit extension for Magit" tar ((:commit . "59d1eb355caf4adbbdf1e351f5861de61b0b5efa") (:authors ("Lluís Vilanova" . "vilanova@ac.upc.edu")) (:maintainers ("Peter Grayson" . "pete@jpgrayson.net")) (:maintainer "Peter Grayson" . "pete@jpgrayson.net") (:keywords "git" "tools" "vc") (:url . "https://github.com/stacked-git/magit-stgit"))]) (magit-svn . [(20220314 1451) ((emacs (25 1)) (magit (2 90 1)) (transient (0 3 2))) "Git-Svn extension for Magit" tar ((:commit . "b8277081db90977247ae3900ea6afeb0ca644d36") (:authors ("Phil Jackson" . "phil@shellarchive.co.uk")) (:maintainers ("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" tar ((:commit . "55e6443710def357f3f78eea27d5bbe023d868f5") (:authors ("Kyle Meyer" . "kyle@kyleam.com")) (:maintainers ("Kyle Meyer" . "kyle@kyleam.com")) (:maintainer "Kyle Meyer" . "kyle@kyleam.com") (:keywords "vc" "tools") (:url . "https://github.com/magit/magit-tbdiff"))]) - (magit-todos . [(20230826 1832) ((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" tar ((:commit . "d85518d45d329cc0b465cc3b84910b7c66b3fc42") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "magit" "vc") (:url . "http://github.com/alphapapa/magit-todos"))]) + (magit-todos . [(20240213 1759) ((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" tar ((:commit . "1e9acc0ba63fbc297001bf334d63cb4326be80df") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "magit" "vc") (:url . "http://github.com/alphapapa/magit-todos"))]) (magit-topgit . [(20161105 1623) ((emacs (24 4)) (magit (2 1 0))) "TopGit extension for Magit" tar ((:commit . "11489ea798bc88d0ea5244bbf725285eedfefbef") (:authors ("Yann Hodique" . "yann.hodique@gmail.com")) (:maintainers ("Robin Green" . "greenrd@greenrd.org")) (:maintainer "Robin Green" . "greenrd@greenrd.org") (:keywords "vc" "tools"))]) (magit-vcsh . [(20230402 1219) ((magit (2 90 1)) (vcsh (0 4)) (emacs (24 4))) "Magit vcsh integration" tar ((:commit . "fd6c86c066b14bbf78644d38eca9711d6d9544a1") (:authors ("Štěpán Němec" . "stepnem@smrk.net")) (:maintainers ("Štěpán Němec" . "stepnem@smrk.net")) (:maintainer "Štěpán Němec" . "stepnem@smrk.net") (:keywords "vc" "files" "magit") (:url . "http://git.smrk.net/magit-vcsh.el"))]) (magithub . [(20220315 117) ((emacs (25)) (magit (2 12)) (s (1 12 0)) (ghub+ (0 3)) (git-commit (2 12)) (markdown-mode (2 3))) "Magit interfaces for GitHub" tar ((:commit . "dd62c7057155c0a334e6d9087779a2923d2300b8") (:authors ("Sean Allred" . "code@seanallred.com")) (:maintainers ("Sean Allred" . "code@seanallred.com")) (:maintainer "Sean Allred" . "code@seanallred.com") (:keywords "git" "tools" "vc") (:url . "https://github.com/vermiculus/magithub"))]) @@ -3110,7 +3191,7 @@ (magnatune . [(20151030 1935) ((dash (2 9 0)) (s (1 9 0))) "browse magnatune's music catalog" tar ((:commit . "605b01505ba30589c77ebb4c96834b5072ccbdd4"))]) (magrant . [(20210706 1438) ((emacs (25 1)) (dash (2 17 0)) (s (1 12 0)) (tablist (0 70)) (transient (0 2 0)) (friendly-shell-command (0 2 3))) "Transient Interface to Vagrant" tar ((:commit . "6309c001355126e3ade79493479b517925943d17") (:keywords "processes" "terminals") (:url . "https://github.com/p3r7/magrant"))]) (majapahit-themes . [(20221207 121) nil "Color theme with a dark and light versions" tar ((:commit . "7200f16f0fd4cc18e8c7d82b62cc351b610609af") (:authors ("Alexander F. Adhyatma")) (:maintainer "Alexander F. Adhyatma") (:url . "http:/gitlab.com/franksn/majapahit-theme/"))]) - (major-mode-hydra . [(20210221 834) ((dash (2 18 0)) (pretty-hydra (0 2 2)) (emacs (25))) "Major mode keybindings managed by Hydra" tar ((:commit . "84c1929a5153be169ca5c36737439d51dffde505") (:authors ("Jerry Peng" . "pr2jerry@gmail.com")) (:maintainers ("Jerry Peng" . "pr2jerry@gmail.com")) (:maintainer "Jerry Peng" . "pr2jerry@gmail.com") (:url . "https://github.com/jerrypnz/major-mode-hydra.el"))]) + (major-mode-hydra . [(20231003 2050) ((dash (2 18 0)) (pretty-hydra (0 2 2)) (emacs (25))) "Major mode keybindings managed by Hydra" tar ((:commit . "d0a5dadee97c3752fcdef113cf2ba1923972a480") (:authors ("Jerry Peng" . "pr2jerry@gmail.com")) (:maintainers ("Jerry Peng" . "pr2jerry@gmail.com")) (:maintainer "Jerry Peng" . "pr2jerry@gmail.com") (:url . "https://github.com/jerrypnz/major-mode-hydra.el"))]) (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" tar ((:commit . "a1b34e95ccd3ebee4fba1489ab613d0b3078026d") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainers ("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")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "make" "dired") (:url . "https://github.com/abo-abo/make-it-so"))]) @@ -3120,36 +3201,37 @@ (mallard-mode . [(20131204 425) nil "Major mode for editing Mallard files" tar ((:commit . "0a4cfede57bc31134495804ce513cc106de8de3c") (:authors ("Jaromir Hradilek" . "jhradilek@gmail.com")) (:maintainers ("Jaromir Hradilek" . "jhradilek@gmail.com")) (:maintainer "Jaromir Hradilek" . "jhradilek@gmail.com") (:keywords "xml" "mallard") (:url . "https://github.com/jhradilek/emacs-mallard-mode"))]) (mallard-snippets . [(20131023 1851) ((yasnippet (0 8 0)) (mallard-mode (0 1 1))) "Yasnippets for Mallard" tar ((:commit . "35b7d0558da14fcffd51863f623806216a0093ce") (:authors ("Jaromir Hradilek" . "jhradilek@gmail.com")) (:maintainers ("Jaromir Hradilek" . "jhradilek@gmail.com")) (:maintainer "Jaromir Hradilek" . "jhradilek@gmail.com") (:keywords "snippets" "mallard") (:url . "https://github.com/jhradilek/emacs-mallard-snippets"))]) (malyon . [(20161208 2125) ((cl-lib (0 5))) "mode to execute Z-code files version 3, 5, 8" tar ((:commit . "0d9882650720b4a791556f5e2d917388965d6fc0") (:authors ("Peter Ilberg , Christopher Madsen , Erik Selberg" . "erik@selberg.org")) (:maintainers ("Christopher Madsen , Erik Selberg" . "erik@selberg.org")) (:maintainer "Christopher Madsen , Erik Selberg" . "erik@selberg.org") (:keywords "games" "emulations") (:url . "https://github.com/speedenator/malyon"))]) - (mame . [(20230804 1538) ((emacs (27 1))) "A MAME front-end" tar ((:commit . "2793335a9901bba6071abb94f5124d94c04343a5") (:authors ("Yong" . "luo.yong.name@gmail.com")) (:maintainers ("Yong" . "luo.yong.name@gmail.com")) (:maintainer "Yong" . "luo.yong.name@gmail.com") (:url . "https://github.com/Iacob/elmame"))]) + (mame . [(20231021 1522) ((emacs (27 1))) "A MAME front-end" tar ((:commit . "04322e0b036198112417cf688ddf6b711010561e") (:authors ("Yong" . "luo.yong.name@gmail.com")) (:maintainers ("Yong" . "luo.yong.name@gmail.com")) (:maintainer "Yong" . "luo.yong.name@gmail.com") (:url . "https://github.com/Iacob/elmame"))]) (man-commands . [(20151221 2221) ((cl-lib (0 5))) "Add interactive commands for every manpages installed in your computer." tar ((:commit . "f4ba0c3790855d7544dff92d470d212f24de1d9d") (:authors ("Nathaniel Flath" . "nflath@gmail.com")) (:maintainers ("Nathaniel Flath" . "nflath@gmail.com")) (:maintainer "Nathaniel Flath" . "nflath@gmail.com") (:url . "http://github.com/nflath/man-commands"))]) (manage-minor-mode . [(20210108 1832) ((emacs (24 3))) "Manage your minor-modes easily" tar ((:commit . "f4b37fffec7b6608a597e6a3f6900634802807b4") (:authors ("Shingo Fukuyama - http://fukuyama.co")) (:maintainers ("Jen-Chieh Shen" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh Shen" . "jcs090218@gmail.com") (:keywords "tools" "minor-mode" "manage" "emacs") (:url . "https://github.com/ShingoFukuyama/manage-minor-mode"))]) - (manage-minor-mode-table . [(20220616 1932) ((emacs (25 1)) (manage-minor-mode (1 1))) "Manage minor-modes in table" tar ((:commit . "e47d0e1856f0a9eb9935abdaf6e14e67ef2ab4cc") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "tools" "minor-mode" "manage") (:url . "https://github.com/jcs-elpa/manage-minor-mode-table"))]) - (mandm-theme . [(20230805 739) nil "An M&M color theme." tar ((:commit . "8f3d6497aca7b0e6a8dc759b307d20fcb68920d9") (:authors ("Christian Hopps" . "chopps@gmail.com")) (:maintainers ("Christian Hopps" . "chopps@gmail.com")) (:maintainer "Christian Hopps" . "chopps@gmail.com") (:url . "https://github.com/choppsv1/emacs-mandm-theme.git"))]) + (manage-minor-mode-table . [(20240101 931) ((emacs (25 1)) (manage-minor-mode (1 1))) "Manage minor-modes in table" tar ((:commit . "ed492f13f71f7897b50da9acd49a7540b0f81a3f") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "tools" "minor-mode" "manage") (:url . "https://github.com/jcs-elpa/manage-minor-mode-table"))]) + (mandm-theme . [(20231203 334) nil "An M&M color theme." tar ((:commit . "a410c2b66f514bdeb546b7fe8e2d9fee675096ac") (:authors ("Christian Hopps" . "chopps@gmail.com")) (:maintainers ("Christian Hopps" . "chopps@gmail.com")) (:maintainer "Christian Hopps" . "chopps@gmail.com") (:url . "https://github.com/choppsv1/emacs-mandm-theme.git"))]) (mandoku . [(20180403 1106) ((org (8)) (github-clone (20150705 1705))) "A tool to access repositories of premodern Chinese texts" tar ((:commit . "e3b7678762e9824861b1ce775a94b05b096164f5") (:authors ("Christian Wittern" . "cwittern@gmail.com")) (:maintainers ("Christian Wittern" . "cwittern@gmail.com")) (:maintainer "Christian Wittern" . "cwittern@gmail.com") (:keywords "convenience") (:url . "http://www.mandoku.org"))]) (mandoku-tls . [(20171118 240) ((emacs (24 4)) (mandoku (20170301)) (github-clone (0 2)) (hydra (0 13 6)) (helm (1 7 0)) (org (9 0)) (helm-charinfo (20170601))) "A tool to access the TLS database" tar ((:commit . "ffeebf5bd451ac1806ddfe1744fbbd036a56f902") (:authors ("Christian Wittern" . "cwittern@gmail.com")) (:maintainers ("Christian Wittern" . "cwittern@gmail.com")) (:maintainer "Christian Wittern" . "cwittern@gmail.com") (:keywords "convenience") (:url . "https://github.com/mandoku/mandoku-tls"))]) (map-progress . [(20190128 16) ((cl-lib (0 6 1))) "mapping macros that report progress" tar ((:commit . "1fb916159cd054c233ce3c80d9d01adfae640297") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("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" tar ((:commit . "ae2d1c22f786ad987aef3e319925e80160a887a0") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("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")) (:maintainers ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "docker") (:url . "https://github.com/nlamirault/marcopolo"))]) - (marginalia . [(20230805 915) ((emacs (27 1)) (compat (29 1 4 0))) "Enrich existing commands with completion annotations" tar ((:commit . "17fffc685731a1459fb5faa9e376b75ebe225d5c") (:authors ("Omar Antolín Camarena , Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainers ("Omar Antolín Camarena , Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Omar Antolín Camarena , Daniel Mendler" . "mail@daniel-mendler.de") (:keywords "docs" "help" "matching" "completion") (:url . "https://github.com/minad/marginalia"))]) + (marginalia . [(20240316 1257) ((emacs (27 1)) (compat (29 1 4 4))) "Enrich existing commands with completion annotations" tar ((:commit . "f6fe86b989a177355ab3ff7e97a384e10a7b0bb1") (:authors ("Omar Antolín Camarena , Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainers ("Omar Antolín Camarena , Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Omar Antolín Camarena , Daniel Mendler" . "mail@daniel-mendler.de") (:keywords "docs" "help" "matching" "completion") (: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 . [(20230805 1701) ((emacs (26)) (choice-program (0 14))) "Mark a pattern at the current point" tar ((:commit . "22ce137450890421c8dce79943c96dec79a65d77") (:authors ("Paul Landes")) (:maintainers ("Paul Landes")) (:maintainer "Paul Landes") (:keywords "mark" "point" "lisp") (:url . "https://github.com/plandes/mark-thing-at"))]) + (mark-thing-at . [(20231019 1111) ((emacs (26)) (choice-program (0 14))) "Mark a pattern at the current point" tar ((:commit . "06cc38fb92c0c1badb06f6744f0110742ffdfe6c") (:authors ("Paul Landes")) (:maintainers ("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" tar ((:commit . "a11b61effa90bd0abc876d12573674d36fc17f0c") (:authors ("Alex Bennée" . "alex@bennee.com")) (:maintainers ("Alex Bennée" . "alex@bennee.com")) (:maintainer "Alex Bennée" . "alex@bennee.com") (:url . "https://github.com/stsquad/emacs-mark-tools"))]) + (mark-yank . [(20231105 2027) ((emacs (24 4))) "Set region to the last yank" tar ((:commit . "7207aabe9edd0872ec6d506a58b942b43926c122") (:authors ("Michael Kleehammer" . "michael@kleehammer.com")) (:maintainers ("Michael Kleehammer" . "michael@kleehammer.com")) (:maintainer "Michael Kleehammer" . "michael@kleehammer.com") (:url . "https://github.com/mkleehammer/mark-yank"))]) (markdown-changelog . [(20230805 1720) ((emacs (26)) (dash (2 13 0))) "Maintain changelog entries" tar ((:commit . "403d2cd1cff932ae135692d57062824892e01d13") (:authors ("Paul Landes")) (:maintainers ("Paul Landes")) (:maintainer "Paul Landes") (:keywords "markdown" "changelog" "files") (:url . "https://github.com/plandes/markdown-changelog"))]) - (markdown-mode . [(20230820 2349) ((emacs (27 1))) "Major mode for Markdown-formatted text" tar ((:commit . "c71548a58f9b611a6670ba8e9036d3d8e8435bf8") (:authors ("Jason R. Blevins" . "jblevins@xbeta.org")) (:maintainers ("Jason R. Blevins" . "jblevins@xbeta.org")) (:maintainer "Jason R. Blevins" . "jblevins@xbeta.org") (:keywords "markdown" "github flavored markdown" "itex") (:url . "https://jblevins.org/projects/markdown-mode/"))]) + (markdown-mode . [(20240318 1307) ((emacs (27 1))) "Major mode for Markdown-formatted text" tar ((:commit . "fd6c5508f979ab526e024a591eaec963712cb211") (:authors ("Jason R. Blevins" . "jblevins@xbeta.org")) (:maintainers ("Jason R. Blevins" . "jblevins@xbeta.org")) (:maintainer "Jason R. Blevins" . "jblevins@xbeta.org") (:keywords "markdown" "github flavored markdown" "itex") (:url . "https://jblevins.org/projects/markdown-mode/"))]) (markdown-preview-eww . [(20160111 1502) ((emacs (24 4))) "Realtime preview by eww" tar ((:commit . "5853f836425c877c8a956501f0adda137ef1d3b7") (:authors ("niku" . "niku@niku.name")) (:maintainers ("niku" . "niku@niku.name")) (:maintainer "niku" . "niku@niku.name") (:url . "https://github.com/niku/markdown-preview-eww"))]) (markdown-preview-mode . [(20230707 803) ((emacs (24 4)) (websocket (1 6)) (markdown-mode (2 0)) (cl-lib (0 5)) (web-server (0 1 1))) "markdown realtime preview minor mode." tar ((:commit . "68242b3907dc065aa35412bfd928b43d8052d321") (:authors ("Igor Shymko" . "igor.shimko@gmail.com")) (:maintainers ("Igor Shymko" . "igor.shimko@gmail.com")) (:maintainer "Igor Shymko" . "igor.shimko@gmail.com") (:keywords "markdown" "gfm" "convenience") (:url . "https://github.com/ancane/markdown-preview-mode"))]) - (markdown-soma . [(20230819 340) ((emacs (25)) (s (1 11 0)) (dash (2 19 1)) (f (0 20 0))) "Live preview for Markdown" tar ((:commit . "a80ed319a835efeaf7d71f49df0be143939bcc13") (:authors ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainers ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com") (:keywords "wp" "docs" "text" "markdown") (:url . "https://github.com/jasonm23/markdown-soma"))]) + (markdown-soma . [(20240215 228) ((emacs (25)) (s (1 11 0)) (dash (2 19 1)) (f (0 20 0))) "Live preview for Markdown" tar ((:commit . "ba30e609108d32fe6e1998490548b4631e3e48c3") (:authors ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainers ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com") (:keywords "wp" "docs" "text" "markdown") (:url . "https://github.com/jasonm23/markdown-soma"))]) (markdown-toc . [(20210905 738) ((s (1 9 0)) (dash (2 11 0)) (markdown-mode (2 1))) "A simple TOC generator for markdown file" tar ((:commit . "4e8f97d7d94c53fd706da9e3d5006e1c9dff5ff8") (:authors (nil . "Antoine R. Dumont (@ardumont)")) (:maintainer nil . "Antoine R. Dumont (@ardumont)") (:keywords "markdown" "toc" "tools") (:url . "http://github.com/ardumont/markdown-toc"))]) (markdownfmt . [(20160609 1241) ((emacs (24))) "Format markdown using markdownfmt" tar ((:commit . "af83cd00fafcaa837ffdb50d1fa2b0ac952f16c0") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainers ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "markdown") (:url . "https://github.com/nlamirault/emacs-markdownfmt"))]) - (markless . [(20220702 1811) ((emacs (24 4))) "Major mode for Markless documents" tar ((:commit . "048eec3278ab82c1040d063d4f677f01090d4dab") (:authors ("Nicolas Hafner" . "shinmera@tymoon.eu")) (:maintainers ("Nicolas Hafner" . "shinmera@tymoon.eu")) (:maintainer "Nicolas Hafner" . "shinmera@tymoon.eu") (:keywords "languages" "wp") (:url . "http://github.com/shirakumo/markless.el/"))]) + (markless . [(20240218 1639) ((emacs (24 4))) "Major mode for Markless documents" tar ((:commit . "686dcf2592a042ebb4e01cbf60d4d8840dd74eaa") (:authors ("Nicolas Hafner" . "shinmera@tymoon.eu")) (:maintainers ("Nicolas Hafner" . "shinmera@tymoon.eu")) (:maintainer "Nicolas Hafner" . "shinmera@tymoon.eu") (:keywords "languages" "wp") (:url . "http://github.com/shirakumo/markless.el/"))]) (markup . [(20170420 1129) ((cl-lib (0 5))) "Simple markup generation helpers." tar ((:commit . "876da2d3f23473475bb0fd0a1480ae11d2671291") (:authors ("Arthur Leonard Andersen" . "leoc.git@gmail.com")) (:maintainers ("Arthur Leonard Andersen" . "leoc.git@gmail.com")) (:maintainer "Arthur Leonard Andersen" . "leoc.git@gmail.com") (:keywords "convenience" "markup" "html") (:url . "http://github.com/leoc/markup.el"))]) (markup-faces . [(20141110 817) nil "collection of faces for markup language modes" tar ((:commit . "98a807ed82473eb41c6a201ed7ef816d6bcd67b0") (:authors ("Florian Kaufmann" . "sensorflo@gmail.com")) (:maintainers ("Florian Kaufmann" . "sensorflo@gmail.com")) (:maintainer "Florian Kaufmann" . "sensorflo@gmail.com") (:keywords "wp" "faces") (:url . "https://github.com/sensorflo/markup-faces"))]) (marmalade-client . [(20141231 2007) ((web (0 5 2)) (kv (0 0 19)) (gh (0 8 0))) "client for marmalade API from emacs" tar ((:commit . "f315dea57e4fbebd9ee0668c0bafd4c45c7b754a") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainers ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:keywords "lisp") (:url . "https://github.com/nicferrier/emacs-marmalade-upload"))]) - (marquee-header . [(20221230 1008) ((emacs (26 1))) "Code interface for displaying marquee in header" tar ((:commit . "1fee5bbec486d0755954f5cafda67f342dc7daa1") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "wp" "animation" "marquee") (:url . "https://github.com/jcs-elpa/marquee-header"))]) + (marquee-header . [(20240101 930) ((emacs (26 1))) "Code interface for displaying marquee in header" tar ((:commit . "cb5c17be49fcf96614364eb12079351bf4d749a4") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "wp" "animation" "marquee") (:url . "https://github.com/jcs-elpa/marquee-header"))]) (marshal . [(20201223 1853) ((emacs (25 1)) (ht (2 0))) "eieio extension for automatic (un)marshalling" tar ((:commit . "490496d974d03906f784707ecc2e0ac36ed84b96") (:authors ("Yann Hodique" . "yann.hodique@gmail.com")) (:maintainers ("Yann Hodique" . "yann.hodique@gmail.com")) (:maintainer "Yann Hodique" . "yann.hodique@gmail.com") (:keywords "extensions") (:url . "https://github.com/sigma/marshal.el"))]) (maruo-macro-mode . [(20160616 1349) ((emacs (24 3))) "Major mode for editing Hidemaru/Maruo macro script" tar ((:commit . "8fc9a38ad051eafa8eb94038711acc52c5d1d8d5") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "programming" "editor" "macro"))]) (masm-mode . [(20200308 1450) ((emacs (25 1))) "MASM x86 and x64 assembly major mode" tar ((:commit . "ab63524d195332ec9f703783704231606e69c292") (:authors ("YiGeeker" . "zyfchinese@yeah.net")) (:maintainers ("YiGeeker" . "zyfchinese@yeah.net")) (:maintainer "YiGeeker" . "zyfchinese@yeah.net") (:keywords "languages") (:url . "https://github.com/YiGeeker/masm-mode"))]) - (mastodon . [(20230822 1652) ((emacs (27 1)) (request (0 3 0)) (persist (0 4)) (ts (0 3))) "Client for fediverse services using the Mastodon API" tar ((:commit . "b54fc1b6d405024c2b5c6019e60ee7ed0744b66c") (:authors ("Johnson Denen" . "johnson.denen@gmail.com") ("Marty Hiatt" . "martianhiatus@riseup.net")) (:maintainers ("Marty Hiatt" . "martianhiatus@riseup.net")) (:maintainer "Marty Hiatt" . "martianhiatus@riseup.net") (:url . "https://codeberg.org/martianh/mastodon.el"))]) + (mastodon . [(20240309 1753) ((emacs (27 1)) (request (0 3 0)) (persist (0 4))) "Client for fediverse services using the Mastodon API" tar ((:commit . "90aeac60805ed49da29781b979b6ab3edab671aa") (:authors ("Johnson Denen" . "johnson.denen@gmail.com") ("Marty Hiatt" . "martianhiatus@riseup.net")) (:maintainers ("Marty Hiatt" . "martianhiatus@riseup.net")) (:maintainer "Marty Hiatt" . "martianhiatus@riseup.net") (:url . "https://codeberg.org/martianh/mastodon.el"))]) (material-theme . [(20210904 1226) ((emacs (24 1))) "A Theme based on the colors of the Google Material Design" tar ((:commit . "6823009bc92f82aa3a90e27e1009f7da8e87b648") (:authors ("Christoph Paulik" . "cpaulik@gmail.com")) (:maintainers ("Christoph Paulik" . "cpaulik@gmail.com")) (:maintainer "Christoph Paulik" . "cpaulik@gmail.com") (:keywords "themes") (:url . "http://github.com/cpaulik/emacs-material-theme"))]) (math-preview . [(20230425 1820) ((emacs (26 1)) (json (1 4)) (dash (2 18 0)) (s (1 12 0))) "Preview TeX math equations inline" tar ((:commit . "620de35fc8cf940eba5a567767eac2288708d8cb") (:authors ("Matsievskiy S.V.")) (:maintainers ("Matsievskiy S.V.")) (:maintainer "Matsievskiy S.V.") (:keywords "convenience") (:url . "https://gitlab.com/matsievskiysv/math-preview"))]) (math-symbol-lists . [(20220828 2047) nil "Lists of Unicode math symbols and latex commands" tar ((:commit . "ac3eb053d3b576fcdd192b0ac6ad5090ea3a7079") (:authors ("Vitalie Spinu" . "spinuvit@gmail.com")) (:maintainers ("Vitalie Spinu" . "spinuvit@gmail.com")) (:maintainer "Vitalie Spinu" . "spinuvit@gmail.com") (:keywords "unicode" "symbols" "mathematics") (:url . "https://github.com/vspinu/math-symbol-lists"))]) @@ -3160,12 +3242,12 @@ (maven-test-mode . [(20141220 557) ((s (1 9)) (emacs (24))) "Utilities for navigating test files and running maven test tasks." tar ((:commit . "a19151861df2ad8ae4880a2e7c86ddf848cb569a") (:authors ("Renan Ranelli")) (:maintainers ("Renan Ranelli")) (:maintainer "Renan Ranelli") (:keywords "java" "maven" "test") (:url . "http://github.com/rranelli/maven-test-mode"))]) (maxframe . [(20170120 1705) nil "maximize the emacs frame based on display size" tar ((:commit . "13bda6dd9f1d96aa4b9dd9957a26cefd399a7772") (:authors ("Ryan McGeary")) (:maintainers ("Ryan McGeary")) (:maintainer "Ryan McGeary") (:keywords "display" "frame" "window" "maximize"))]) (maxima . [(20230529 1658) ((emacs (26 1)) (s (1 11 0)) (test-simple (1 3 0))) "Major mode for Maxima" tar ((:commit . "2de798f6644753772553cd0420d3c419ed50dd0b") (:authors ("William F. Schelter") ("Jay Belanger") ("Fermin Munoz")) (:maintainers ("Fermin Munoz" . "fmfs@posteo.net")) (:maintainer "Fermin Munoz" . "fmfs@posteo.net") (:keywords "maxima" "tools" "math") (:url . "https://gitlab.com/sasanidas/maxima"))]) - (mb-url . [(20230811 442) ((emacs (25))) "Multiple Backends for Emacs URL package" tar ((:commit . "a9f1e8ab46858c35a600ce304748a7db65400bef") (:authors ("ZHANG Weiyi" . "dochang@gmail.com")) (:maintainers ("ZHANG Weiyi" . "dochang@gmail.com")) (:maintainer "ZHANG Weiyi" . "dochang@gmail.com") (:keywords "comm" "data" "processes" "hypermedia") (:url . "https://github.com/dochang/mb-url"))]) + (mb-url . [(20240229 730) ((emacs (25))) "Multiple Backends for Emacs URL package" tar ((:commit . "13517d8bee3001d6208ad5255237880f19d4f1e5") (:authors ("ZHANG Weiyi" . "dochang@gmail.com")) (:maintainers ("ZHANG Weiyi" . "dochang@gmail.com")) (:maintainer "ZHANG Weiyi" . "dochang@gmail.com") (:keywords "comm" "data" "processes" "hypermedia") (:url . "https://github.com/dochang/mb-url"))]) (mbe . [(20151126 1134) ((emacs (24)) (cl-lib (0 5))) "Macros by Example" tar ((:commit . "bb10aa8f26bb7e9b1d5746934c94edb00402940c") (:authors ("Ian Price" . "ianprice90@googlemail.com")) (:maintainers ("Ian Price" . "ianprice90@googlemail.com")) (:maintainer "Ian Price" . "ianprice90@googlemail.com") (:keywords "tools" "macros") (:url . "https://github.com/ijp/mbe.el"))]) (mbo70s-theme . [(20170808 1315) ((emacs (24 0))) "70s style palette, with similarities to mbo theme" tar ((:commit . "bed3db8965708ed4e9482b224a9b084765c052f2") (:authors ("Jason Milkins")) (:maintainers ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/tmtheme-to-deftheme"))]) (mbsync . [(20200128 1053) nil "run mbsync to fetch mails" tar ((:commit . "d3c81da81ce5b154c0d048047a47277338721a70") (:authors ("Dimitri Fontaine" . "dim@tapoueh.org")) (:maintainers ("Dimitri Fontaine" . "dim@tapoueh.org")) (:maintainer "Dimitri Fontaine" . "dim@tapoueh.org") (:url . "https://github.com/dimitri/mbsync-el"))]) (mc-calc . [(20200420 1836) ((emacs (24 4)) (multiple-cursors (1 2 1))) "Combine multiple-cursors and calc" tar ((:commit . "74a046a5728919a4d1135ca62738326b0dde278c") (:authors (nil . "Frank Roland hatheroldev@fgmail.com>")) (:maintainers (nil . "Frank Roland hatheroldev@fgmail.com>")) (:maintainer nil . "Frank Roland hatheroldev@fgmail.com>") (:keywords "convenience") (:url . "https://github.com/hatheroldev/mc-calc"))]) - (mc-extras . [(20181109 1735) ((multiple-cursors (1 2 1))) "Extra functions for multiple-cursors mode." tar ((:commit . "053abc52181b8718559d7361a587bbb795faf164") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainers ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:keywords "editing" "cursors") (:url . "https://github.com/knu/mc-extras.el"))]) + (mc-extras . [(20231206 1655) ((multiple-cursors (1 2 1))) "Extra functions for multiple-cursors mode." tar ((:commit . "8718cbdaa7bf3dd5c0f30c66a36a6bfbdf7f07c1") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainers ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:keywords "editing" "cursors") (:url . "https://github.com/knu/mc-extras.el"))]) (md-readme . [(20191112 1943) nil "Markdown-formatted READMEs for your ELisp" tar ((:commit . "ca99f44de11fab18d1f50d4b1722f2ceee3c814d") (:authors ("Thomas Kappler" . "tkappler@gmail.com")) (:maintainers ("Thomas Kappler" . "tkappler@gmail.com")) (:maintainer "Thomas Kappler" . "tkappler@gmail.com") (:keywords "lisp" "help" "readme" "markdown" "header" "documentation" "github") (:url . "http://github.com/thomas11/md-readme/tree/master"))]) (md4rd . [(20230725 2316) ((emacs (25 1)) (request (0 3 0)) (cl-lib (0 6 1)) (dash (2 12 0)) (s (1 12 0)) (tree-mode (1 0 0))) "Mode for reddit (browse it)." tar ((:commit . "2fa198af749e9ddb759e052d911f56a626088903") (:authors ("Matthew Carter" . "m@ahungry.com")) (:maintainers ("Matthew Carter" . "m@ahungry.com")) (:maintainer "Matthew Carter" . "m@ahungry.com") (:keywords "ahungry" "reddit" "browse" "news") (:url . "https://github.com/ahungry/md4rd"))]) (media-progress . [(20230805 2231) ((emacs (28 1))) "Display position where media player stopped" tar ((:commit . "951742e9e741a71bf527a23bf56deeedb12af7bd") (:authors ("Dmitriy Pshonko ")) (:maintainers ("Dmitriy Pshonko ")) (:maintainer "Dmitriy Pshonko ") (:keywords "files" "convenience") (:url . "https://github.com/jumper047/media-progress"))]) @@ -3177,46 +3259,49 @@ (melancholy-theme . [(20230330 835) ((emacs (27 1))) "A dark theme that's pretty sad -*- lexical-binding: t; -" tar ((:commit . "a5c4360f57793401b63b0df382e845b4845c8f97") (:authors ("@baaash" . "bleat@baaa.sh")) (:maintainers ("@baaash" . "bleat@baaa.sh")) (:maintainer "@baaash" . "bleat@baaa.sh") (:keywords "faces" "frames") (:url . "https://gitlab.com/baaash/melancholy-theme"))]) (mellow-theme . [(20170808 1317) ((emacs (24 0))) "an Emacs 24 theme based on Mellow (tmTheme)" tar ((:commit . "2bdf18f05f5212b6f269d9a94afe2cf201766891") (:authors ("Jason Milkins")) (:maintainers ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/tmtheme-to-deftheme"))]) (melpa-upstream-visit . [(20130720 1033) ((s (1 6 0))) "A set of kludges to visit a melpa-hosted package's homepage" tar ((:commit . "7310c74fdead3c0f86ad6eff76cf989e63f70f66") (:authors ("Alessandro Piras" . "laynor@gmail.com")) (:maintainers ("Alessandro Piras" . "laynor@gmail.com")) (:maintainer "Alessandro Piras" . "laynor@gmail.com") (:keywords "convenience"))]) - (memento-mori . [(20190628 2147) ((emacs (24)) (cl-lib (0 5))) "Reminder of mortality" tar ((:commit . "52f95bd4cf6617b60dc204c9bccb8d8fa17d4f9e") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "help") (:url . "https://github.com/lassik/emacs-memento-mori"))]) + (memento-mori . [(20231220 155) ((emacs (24 3))) "Reminder of mortality" tar ((:commit . "880df15f3b8ab49deb77586549a2afdec95778b5") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Ivan Andrus" . "darthandrus@gmail.com")) (:maintainer "Ivan Andrus" . "darthandrus@gmail.com") (:keywords "help") (:url . "https://github.com/lassik/emacs-memento-mori"))]) (memoize . [(20200103 2036) nil "Memoization functions" tar ((:commit . "51b075935ca7070f62fae1d69fe0ff7d8fa56fdd") (:authors ("Christopher Wellons" . "mosquitopsu@gmail.com")) (:maintainers ("Christopher Wellons" . "mosquitopsu@gmail.com")) (:maintainer "Christopher Wellons" . "mosquitopsu@gmail.com") (:url . "https://github.com/skeeto/emacs-memoize"))]) (memolist . [(20150804 1721) ((markdown-mode (22 0)) (ag (0 45))) "memolist.el is Emacs port of memolist.vim." tar ((:commit . "60c296e202a71e9dcf1c3936d47b5c4b95c5839f") (:authors ("mikanfactory ")) (:maintainers ("mikanfactory")) (:maintainer "mikanfactory") (:keywords "markdown" "memo") (:url . "http://github.com/mikanfactory/emacs-memolist"))]) (mentor . [(20230103 1146) ((emacs (25 1)) (xml-rpc (1 6 15)) (seq (1 11)) (async (1 9 3)) (url-scgi (0 8))) "Frontend for the rTorrent bittorrent client" tar ((:commit . "f51dd4f3f87c54b7cc92189924b9d873a53f5a75") (:authors ("Stefan Kangas" . "stefankangas@gmail.com")) (:maintainers ("Stefan Kangas" . "stefankangas@gmail.com")) (:maintainer "Stefan Kangas" . "stefankangas@gmail.com") (:keywords "comm" "processes" "bittorrent") (:url . "https://github.com/skangas/mentor"))]) - (meow . [(20230822 2304) ((emacs (27 1))) "Yet Another modal editing" tar ((:commit . "f553db183a47b23d037b1a7f1cab48b0b4798a37") (:authors ("Shi Tianshu")) (:maintainers ("Shi Tianshu")) (:maintainer "Shi Tianshu") (:keywords "convenience" "modal-editing") (:url . "https://www.github.com/DogLooksGood/meow"))]) - (merlin . [(20230726 900) ((emacs (25 1))) "Mode for Merlin, an assistant for OCaml" tar ((:commit . "fd1bac38fcfe601094ce8e01895333666733e664") (:authors ("Frédéric Bour ")) (:maintainers ("Frédéric Bour ")) (:maintainer "Frédéric Bour ") (:keywords "ocaml" "languages") (:url . "https://github.com/ocaml/merlin"))]) + (meow . [(20240320 517) ((emacs (27 1))) "Yet Another modal editing" tar ((:commit . "c693c48a2fa106790389015673a7b01526862b00") (:authors ("Shi Tianshu")) (:maintainers ("Shi Tianshu")) (:maintainer "Shi Tianshu") (:keywords "convenience" "modal-editing") (:url . "https://www.github.com/DogLooksGood/meow"))]) + (merlin . [(20231201 918) ((emacs (25 1))) "Mode for Merlin, an assistant for OCaml" tar ((:commit . "ad9955c76b1cb031e847e139c5cf7b7cc5cb4696") (:authors ("Frédéric Bour ")) (:maintainers ("Frédéric Bour ")) (:maintainer "Frédéric Bour ") (:keywords "ocaml" "languages") (:url . "https://github.com/ocaml/merlin"))]) (merlin-ac . [(20221123 1408) ((emacs (25 1)) (merlin (3)) (auto-complete (1 5))) "Merlin and auto-complete integration" tar ((:commit . "8bcab034a680f57ddf58092fda6288dc4caddd2a") (:authors ("Simon Castellan ") ("Frédéric Bour ") ("Thomas Refis ")) (:maintainers ("Simon Castellan ")) (:maintainer "Simon Castellan ") (:keywords "ocaml" "languages") (:url . "http://github.com/ocaml/merlin"))]) (merlin-company . [(20221123 1408) ((emacs (25 1)) (merlin (3)) (company (0 9))) "Merlin and company mode integration" tar ((:commit . "8bcab034a680f57ddf58092fda6288dc4caddd2a") (:authors ("Simon Castellan ") ("Frédéric Bour ") ("Thomas Refis ")) (:maintainers ("Simon Castellan ")) (:maintainer "Simon Castellan ") (:keywords "ocaml" "languages") (:url . "http://github.com/ocaml/merlin"))]) (merlin-eldoc . [(20230213 555) ((emacs (24 4)) (merlin (3 0))) "eldoc for OCaml and Reason" tar ((:commit . "bf8edc63d85b35e4def352fa7ce4ea39f43e1fd8") (:authors ("Louis Roché" . "louis@louisroche.net")) (:maintainers ("Louis Roché" . "louis@louisroche.net")) (:maintainer "Louis Roché" . "louis@louisroche.net") (:keywords "merlin" "ocaml" "languages" "eldoc") (:url . "https://github.com/khady/merlin-eldoc"))]) (merlin-iedit . [(20221123 1408) ((emacs (25 1)) (merlin (3)) (iedit (0 9))) "Merlin and iedit integration" tar ((:commit . "8bcab034a680f57ddf58092fda6288dc4caddd2a") (:authors ("Simon Castellan ") ("Frédéric Bour ") ("Thomas Refis ")) (:maintainers ("Simon Castellan ")) (:maintainer "Simon Castellan ") (:keywords "ocaml" "languages") (:url . "http://github.com/ocaml/merlin"))]) - (mermaid-mode . [(20230517 1527) ((emacs (25 3))) "major mode for working with mermaid graphs" tar ((:commit . "105271870a872ae7a91838454b064a1153353b5f") (:authors ("Adrien Brochard")) (:maintainers ("Adrien Brochard")) (:maintainer "Adrien Brochard") (:keywords "mermaid" "graphs" "tools" "processes") (:url . "https://github.com/abrochard/mermaid-mode"))]) - (meson-mode . [(20210820 905) ((emacs (26 1))) "Major mode for the Meson build system files" tar ((:commit . "1a2e2abb098c9288c2cdb3affbad76edd98abf59") (:authors ("Michal Sojka" . "sojkam1@fel.cvut.cz")) (:maintainers ("Michal Sojka" . "sojkam1@fel.cvut.cz")) (:maintainer "Michal Sojka" . "sojkam1@fel.cvut.cz") (:keywords "languages" "tools") (:url . "https://github.com/wentasah/meson-mode"))]) + (mermaid-docker-mode . [(20231126 1943) ((emacs (26 1)) (mermaid-mode (1 0))) "Render mermaid graphs with Docker service" tar ((:commit . "9d3421e02704f50e2e695d8dbe6fbb7eb5f2371f") (:authors ("Peter Badida" . "keyweeusr@gmail.com")) (:maintainers ("Peter Badida" . "keyweeusr@gmail.com")) (:maintainer "Peter Badida" . "keyweeusr@gmail.com") (:keywords "convenience" "docker" "mermaid" "mmd" "graph" "design" "jpg" "image" "api") (:url . "https://github.com/KeyWeeUsr/mermaid-docker-mode"))]) + (mermaid-mode . [(20240123 1729) ((emacs (25 3))) "major mode for working with mermaid graphs" tar ((:commit . "d8bfb8c819cda9ead19c871842f6b0b8d56c56c0") (:authors ("Adrien Brochard")) (:maintainers ("Adrien Brochard")) (:maintainer "Adrien Brochard") (:keywords "mermaid" "graphs" "tools" "processes") (:url . "https://github.com/abrochard/mermaid-mode"))]) + (mermaid-ts-mode . [(20231001 1704) ((emacs (29 1))) "Major mode for Mermaid" tar ((:commit . "3f3a537d249b44e939d6a0d65a6c316761ff8c41") (:authors ("Jonathan Hope" . "jhope@theflatfield.net")) (:maintainers ("Jonathan Hope" . "jhope@theflatfield.net")) (:maintainer "Jonathan Hope" . "jhope@theflatfield.net") (:keywords "mermaid" "languages") (:url . "https://github.com/JonathanHope/mermaid-ts-mode"))]) + (meson-mode . [(20240211 823) ((emacs (26 1))) "Major mode for the Meson build system files" tar ((:commit . "ed7d3071059429d816a878f879cb5cfabfa34485") (:authors ("Michal Sojka" . "sojkam1@fel.cvut.cz")) (:maintainers ("Michal Sojka" . "sojkam1@fel.cvut.cz")) (:maintainer "Michal Sojka" . "sojkam1@fel.cvut.cz") (:keywords "languages" "tools") (:url . "https://github.com/wentasah/meson-mode"))]) (mess . [(20230718 1533) ((emacs (27 1)) (mame (1 0))) "Front-end for MAME MESS" tar ((:commit . "65392b0d0ded45de789d4deab28a4ce88de24567") (:authors ("Yong" . "luo.yong.name@gmail.com")) (:maintainers ("Yong" . "luo.yong.name@gmail.com")) (:maintainer "Yong" . "luo.yong.name@gmail.com") (:url . "https://github.com/Iacob/elmame"))]) (message-attachment-reminder . [(20230124 520) ((emacs (24 1))) "Remind if missing attachment" tar ((:commit . "975381d6e7c6771c462e73abd3398a4ed2a9b86b") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainers ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com") (:url . "https://github.com/alexmurray/message-attachment-reminder"))]) (message-view-patch . [(20210904 2227) ((emacs (24 4)) (magit (3 0 0))) "Colorize patch-like emails in mu4e" tar ((:commit . "50dd3d92a1794f24b7e375b74e5199c63b54a2d8") (:authors ("Sean Farley")) (:maintainers ("Sean Farley")) (:maintainer "Sean Farley") (:keywords "extensions" "mu4e" "gnus") (:url . "https://github.com/seanfarley/message-view-patch"))]) (messages-are-flowing . [(20191029 954) nil "visible indication when composing \"flowed\" emails" tar ((:commit . "d582a564a63b7b90764ffc5c618bc5300225d0ab") (:authors ("Magnus Henoch" . "magnus.henoch@gmail.com")) (:maintainers ("Magnus Henoch" . "magnus.henoch@gmail.com")) (:maintainer "Magnus Henoch" . "magnus.henoch@gmail.com") (:keywords "mail"))]) (meta-presenter . [(20210714 1658) nil "A simple multi-file presentation tool for Emacs" tar ((:commit . "4ab48dacea245b223a0ffd2723ece746bd61c0af") (:authors ("Mohammed Ismail Ansari" . "team.terminal@gmail.com")) (:maintainers ("Mohammed Ismail Ansari" . "team.terminal@gmail.com")) (:maintainer "Mohammed Ismail Ansari" . "team.terminal@gmail.com") (:keywords "productivity" "presentation") (:url . "http://ismail.teamfluxion.com"))]) (metal-archives . [(20210223 1638) ((emacs (26 3)) (alert (1 2)) (ht (2 3)) (request (0 2 2))) "List future releases using Metal-Archives API" tar ((:commit . "a218d63b990365edeef6a2394f72d1f2286aeeae") (:authors ("Sébastien Le Maguer" . "lemagues@tcd.ie")) (:maintainers ("Sébastien Le Maguer" . "lemagues@tcd.ie")) (:maintainer "Sébastien Le Maguer" . "lemagues@tcd.ie") (:keywords "lisp" "calendar") (:url . "https://github.com/seblemaguer/metal-archives.el"))]) - (metal-archives-shopping-list . [(20230509 1130) ((emacs (26 3)) (org-ml (5 8 7)) (alert (1 2)) (ht (2 3)) (metal-archives (0 1))) "Add shopping list generation support to metal-archives" tar ((:commit . "ab8f3fcb5bdf7374c27445c8ae756d67658ccde0") (:authors ("Sébastien Le Maguer" . "lemagues@tcd.ie")) (:maintainers ("Sébastien Le Maguer" . "lemagues@tcd.ie")) (:maintainer "Sébastien Le Maguer" . "lemagues@tcd.ie") (:keywords "org" "calendar") (:url . "https://github.com/seblemaguer/metal-archives.el"))]) + (metal-archives-shopping-list . [(20240217 736) ((emacs (26 3)) (org-ml (5 8 7)) (alert (1 2)) (ht (2 3)) (metal-archives (0 1))) "Add shopping list generation support to metal-archives" tar ((:commit . "9425dc00f2f73089a3eada06fe87eba3802d090b") (:authors ("Sébastien Le Maguer" . "lemagues@tcd.ie")) (:maintainers ("Sébastien Le Maguer" . "lemagues@tcd.ie")) (:maintainer "Sébastien Le Maguer" . "lemagues@tcd.ie") (:keywords "org" "calendar") (:url . "https://github.com/seblemaguer/metal-archives.el"))]) (metalheart-theme . [(20160710 641) ((emacs (24))) "Low-contrast theme with a dark blue-green background." tar ((:commit . "ec98ea2c11dc1213dae8cbe1fe0cee73ca138bb2") (:authors ("Martin Haesler")) (:maintainers ("Martin Haesler")) (:maintainer "Martin Haesler"))]) (metamorph . [(20220328 129) ((emacs (26 1))) "Transform your buffers with lisp" tar ((:commit . "3633e32a9601c491df32d6c2212dbe63dc6484f4") (:authors ("Adam Niederer" . "adam.niederer@gmail.com")) (:maintainers ("Adam Niederer" . "adam.niederer@gmail.com")) (:maintainer "Adam Niederer" . "adam.niederer@gmail.com") (:keywords "metaprogramming" "wp") (:url . "http://github.com/AdamNiederer/metamorph"))]) (metascript-mode . [(20150709 57) ((emacs (24 3))) "Major mode for the Metascript programming language" tar ((:commit . "edb361c7b0e5de231e5334a17b90652fb1df78f9") (:keywords "languages" "metascript" "mjs") (:url . "http://github.com/metascript/metascript-mode"))]) (metaweblog . [(20230501 234) ((emacs (27 1))) "An XML-RPC MetaWeblog and WordPress API client" tar ((:commit . "814f8a7098508286195e3053bf24f6af928c7f0b") (:authors ("Puneeth Chaganti" . "punchagan+org2blog@gmail.com")) (:maintainers ("Grant Rettke" . "grant@wisdomandwonder.com")) (:maintainer "Grant Rettke" . "grant@wisdomandwonder.com") (:keywords "comm") (:url . "https://github.com/org2blog/org2blog"))]) - (metrics-tracker . [(20221030 42) ((emacs (24 4)) (seq (2 3))) "Generate reports of personal metrics from diary entries" tar ((:commit . "ace35dfb6d00749a24993f3fb8f838938826b45e") (:authors ("Ian Martins" . "ianxm@jhu.edu")) (:maintainers ("Ian Martins" . "ianxm@jhu.edu")) (:maintainer "Ian Martins" . "ianxm@jhu.edu") (:keywords "calendar") (:url . "https://github.com/ianxm/emacs-tracker"))]) + (metrics-tracker . [(20231006 1213) ((emacs (24 4)) (seq (2 3))) "Generate reports of personal metrics from diary entries" tar ((:commit . "3f32267635e7b73334cc661a01f3b4d31580eaf5") (:authors ("Ian Martins" . "ianxm@jhu.edu")) (:maintainers ("Ian Martins" . "ianxm@jhu.edu")) (:maintainer "Ian Martins" . "ianxm@jhu.edu") (:keywords "calendar") (:url . "https://github.com/ianxm/emacs-tracker"))]) (metronome . [(20230515 1850) ((emacs (25 1))) "The missing metronome for GNU Emacs" tar ((:commit . "4811b54d800d1bb69fd501ffeab3adf86978362d") (:authors ("Jonathan Gregory ")) (:maintainers ("Jonathan Gregory ")) (:maintainer "Jonathan Gregory ") (:url . "https://git.sr.ht/~jagrg/metronome"))]) - (mew . [(20230415 633) nil "Messaging in the Emacs World" tar ((:commit . "47886a3b6bc64e5822546318e5a3dd0ff5eeb967") (:authors ("Mew developing team")) (:maintainers ("Mew developing team")) (:maintainer "Mew developing team"))]) + (mew . [(20240305 27) nil "Messaging in the Emacs World" tar ((:commit . "d41dc93785d231f1e391ba61893aacd1331d5726") (:authors ("Mew developing team")) (:maintainers ("Mew developing team")) (:maintainer "Mew developing team"))]) (mexican-holidays . [(20210604 1421) nil "Mexico holidays for Emacs calendar." tar ((:commit . "8e28907ea69f2c0ed9aad9f3b99664ca147379d0") (:authors ("Saúl Gutiérrez" . "me@sggc.me")) (:maintainers ("Saúl Gutiérrez" . "me@sggc.me")) (:maintainer "Saúl Gutiérrez" . "me@sggc.me") (:keywords "calendar") (:url . "https://github.com/sggutier/mexican-holidays"))]) - (meyvn . [(20221206 2219) ((emacs (25 1)) (cider (0 23)) (projectile (2 1)) (s (1 12)) (dash (2 17)) (parseedn (1 1 0)) (parseclj (1 1 0)) (geiser (0 12))) "Meyvn client" tar ((:commit . "493e652b8fffcbed226f69a2ea82e6f9fc51ab08") (:authors ("Daniel Szmulewicz" . "daniel.szmulewicz@gmail.com")) (:maintainers ("Daniel Szmulewicz" . "daniel.szmulewicz@gmail.com")) (:maintainer "Daniel Szmulewicz" . "daniel.szmulewicz@gmail.com") (:url . "https://github.com/danielsz/meyvn-el"))]) - (mgmtconfig-mode . [(20230420 2202) ((emacs (24 3))) "mgmt configuration management language" tar ((:commit . "c5efe7a17b5b66a4bf2096b6213998287637c64a") (:authors ("Peter Oliver" . "mgmtconfig@mavit.org.uk")) (:maintainers ("Mgmt contributors ")) (:maintainer "Mgmt contributors ") (:keywords "languages") (:url . "https://github.com/purpleidea/mgmt/misc/emacs"))]) - (mhc . [(20201227 406) ((calfw (20150703))) "Message Harmonized Calendaring system." tar ((:commit . "1cd9cbc7f8cfe40833d1af726644ae45a3d07dc0") (:authors ("Yoshinari Nomura" . "nom@quickhack.net")) (:maintainers ("Yoshinari Nomura" . "nom@quickhack.net")) (:maintainer "Yoshinari Nomura" . "nom@quickhack.net") (:keywords "calendar") (:url . "http://www.quickhack.net/mhc"))]) + (meyvn . [(20231213 230) ((emacs (25 1)) (cider (0 23)) (projectile (2 1)) (s (1 12)) (dash (2 17)) (parseedn (1 1 0)) (parseclj (1 1 0)) (geiser (0 12))) "Meyvn client" tar ((:commit . "3afb0a4283afd4f63ef7fdd48eb5da972421fd7a") (:authors ("Daniel Szmulewicz" . "daniel.szmulewicz@gmail.com")) (:maintainers ("Daniel Szmulewicz" . "daniel.szmulewicz@gmail.com")) (:maintainer "Daniel Szmulewicz" . "daniel.szmulewicz@gmail.com") (:url . "https://github.com/danielsz/meyvn-el"))]) + (mgmtconfig-mode . [(20240305 605) ((emacs (24 3))) "mgmt configuration management language" tar ((:commit . "90f6d4e5630ab69d737fdf7f17c81843a9c6a081") (:authors ("Peter Oliver" . "mgmtconfig@mavit.org.uk")) (:maintainers ("Mgmt contributors ")) (:maintainer "Mgmt contributors ") (:keywords "languages") (:url . "https://github.com/purpleidea/mgmt/misc/emacs"))]) + (mhc . [(20240311 1117) ((calfw (20150703))) "Message Harmonized Calendaring system." tar ((:commit . "79ab5687cd4e979d2613f5515c8016058ca9b3c2") (:authors ("Yoshinari Nomura" . "nom@quickhack.net")) (:maintainers ("Yoshinari Nomura" . "nom@quickhack.net")) (:maintainer "Yoshinari Nomura" . "nom@quickhack.net") (:keywords "calendar") (:url . "http://www.quickhack.net/mhc"))]) (mic . [(20230725 1139) ((emacs (26 1))) "Minimal and combinable configuration manager" tar ((:commit . "95dcc9fa306f579e8de6e417839841efe88ae1fc") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainers ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com") (:keywords "convenience") (:url . "https://github.com/ROCKTAKEY/mic"))]) (mic-paren . [(20170731 1907) nil "advanced highlighting of matching parentheses" tar ((:commit . "d0410c7d805c9aaf51a1bcefaaef092bed5824c4") (:authors ("Mikael Sjödin" . "mic@docs.uu.se") ("Klaus Berndl " . "berndl@sdm.de") ("Jonathan Kotta" . "jpkotta@gmail.com")) (:maintainers ("ttn")) (:maintainer "ttn") (:keywords "languages" "faces" "parenthesis" "matching"))]) (micgoline . [(20160415 326) ((emacs (24 3)) (powerline (2 3))) "powerline mode, color schemes from microsoft and google's logo." tar ((:commit . "e3e2effe4846175a3b52b4092c0c134ced5978d8") (:authors ("yzprofile" . "yzprofiles@gmail.com")) (:maintainers ("yzprofile" . "yzprofiles@gmail.com")) (:maintainer "yzprofile" . "yzprofiles@gmail.com") (:keywords "mode-line" "powerline" "theme") (:url . "https://github.com/yzprofile/micgoline"))]) - (micromamba . [(20230708 926) ((emacs (27 1)) (pythonic (0 1 0))) "A library for working with micromamba environments" tar ((:commit . "ce97237986668c31d9b023348f1ef16199276794") (:authors ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainers ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainer "Korytov Pavel" . "thexcloud@gmail.com") (:url . "https://github.com/SqrtMinusOne/micromamba.el"))]) - (migemo . [(20200913 12) ((cl-lib (0 5))) "Japanese incremental search through dynamic pattern expansion" tar ((:commit . "f756cba3d5268968da361463c2e29b3a659a3de7") (:authors ("Satoru Takabayashi" . "satoru-t@is.aist-nara.ac.jp")) (:maintainers ("Satoru Takabayashi" . "satoru-t@is.aist-nara.ac.jp")) (:maintainer "Satoru Takabayashi" . "satoru-t@is.aist-nara.ac.jp") (:url . "https://github.com/emacs-jp/migemo"))]) + (micromamba . [(20231225 2320) ((emacs (27 1)) (pythonic (0 1 0))) "A library for working with micromamba environments" tar ((:commit . "cd3ce4b7142790f25f20e5cfd6ed5ebbf4498c6c") (:authors ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainers ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainer "Korytov Pavel" . "thexcloud@gmail.com") (:url . "https://github.com/SqrtMinusOne/micromamba.el"))]) + (migemo . [(20231120 842) ((cl-lib (0 5))) "Japanese incremental search through dynamic pattern expansion" tar ((:commit . "7d78901773da3b503e5c0d5fa14a53ad6060c97f") (:authors ("Satoru Takabayashi" . "satoru-t@is.aist-nara.ac.jp")) (:maintainers ("Satoru Takabayashi" . "satoru-t@is.aist-nara.ac.jp")) (:maintainer "Satoru Takabayashi" . "satoru-t@is.aist-nara.ac.jp") (:url . "https://github.com/emacs-jp/migemo"))]) (milkode . [(20140927 529) nil "Command line search and direct jump with Milkode" tar ((:commit . "ba97e2aeefa1d9d0b3835bf08edd0de248b0c513") (:authors ("ongaeshi")) (:maintainers ("ongaeshi")) (:maintainer "ongaeshi") (:keywords "milkode" "search" "grep" "jump" "keyword"))]) (mimetypes . [(20201115 1605) ((emacs (25 1))) "Guess a file's mimetype by extension" tar ((:commit . "1663054ce266ed25e47ec707c19f619d33225903") (:authors ("Craig Niles ")) (:maintainers ("Craig Niles ")) (:maintainer "Craig Niles ") (:url . "https://github.com/cniles/emacs-mimetypes"))]) (mindre-theme . [(20220827 1031) ((emacs (26 1))) "Minimal, light theme" tar ((:commit . "fc9ab1ba03494f2fb8cb8dc4e2ba5120ae35eb31") (:authors ("Erik Bäckman" . "contact@ebackman.net")) (:maintainers ("Erik Bäckman" . "contact@ebackman.net")) (:maintainer "Erik Bäckman" . "contact@ebackman.net") (:keywords "faces") (:url . "https://github.com/erikbackman/mindre-theme"))]) (minesweeper . [(20200416 2342) nil "play minesweeper in Emacs" tar ((:commit . "d4248e3c9b3e9e7277cb9e6d081330611898f334") (:authors ("Zachary Kanfer" . "zkanfer@gmail.com")) (:maintainers ("Zachary Kanfer" . "zkanfer@gmail.com")) (:maintainer "Zachary Kanfer" . "zkanfer@gmail.com") (:keywords "game" "fun" "minesweeper" "inane" "diversion") (:url . "https://hg.sr.ht/~zck/minesweeper"))]) (mingus . [(20230518 1726) ((libmpdee (2 2))) "MPD Interface" tar ((:commit . "3fa9b95552eb062eb245321abb7f442c458618dc") (:authors ("Niels Giesen ")) (:maintainers ("Niels Giesen ")) (:maintainer "Niels Giesen ") (:keywords "multimedia" "elisp" "music" "mpd") (:url . "https://github.com/pft/mingus"))]) + (mini-echo . [(20240311 2001) ((emacs (29 1)) (hide-mode-line (1 0 3))) "Echo buffer status in minibuffer window" tar ((:commit . "9b3fd955e04ec168fa769a79cb9f480e84f90ffd") (:authors ("liuyinz" . "liuyinz95@gmail.com")) (:maintainers ("liuyinz" . "liuyinz95@gmail.com")) (:maintainer "liuyinz" . "liuyinz95@gmail.com") (:keywords "frames") (:url . "https://github.com/liuyinz/mini-echo.el"))]) (mini-frame . [(20220627 2041) ((emacs (26 1))) "Show minibuffer in child frame on read-from-minibuffer" tar ((:commit . "60838f3cab438dcbda8eaa15ab3e5d1af88910e9") (:authors ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainers ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainer "Andrii Kolomoiets" . "andreyk.mad@gmail.com") (:keywords "frames") (:url . "https://github.com/muffinmad/emacs-mini-frame"))]) (mini-header-line . [(20170621 1221) ((emacs (24 4))) "a minimal header-line" tar ((:commit . "73b6724e0a26c4528d93768191c8aa59e6bce2e5") (:authors ("Johannes Goslar")) (:maintainers ("Johannes Goslar")) (:maintainer "Johannes Goslar") (:keywords "header-line" "mode-line") (:url . "https://github.com/ksjogo/mini-header-line"))]) (mini-modeline . [(20230306 1521) ((emacs (25 1)) (dash (2 12 0))) "Display modeline in minibuffer" tar ((:commit . "86e753b6c38a06b0fc80d7560aa6a25245fd4d38") (:authors ("Kien Nguyen" . "kien.n.quang@gmail.com")) (:maintainers ("Kien Nguyen" . "kien.n.quang@gmail.com")) (:maintainer "Kien Nguyen" . "kien.n.quang@gmail.com") (:keywords "convenience" "tools") (:url . "https://github.com/kiennq/emacs-mini-modeline"))]) @@ -3227,20 +3312,21 @@ (miniedit . [(20100419 1745) nil "Enhanced editing for minibuffer fields." tar ((:commit . "e12bf659c3eb92dd8a4cb77642dc0865c54667a3"))]) (minimal-session-saver . [(20140508 2041) nil "Very lean session saver" tar ((:commit . "ac42b6835f777a8a7e04599d8f20ec650997ba96") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "tools" "frames" "project") (:url . "http://github.com/rolandwalker/minimal-session-saver"))]) (minimal-theme . [(20190113 2132) nil "A light/dark minimalistic Emacs 24 theme." tar ((:commit . "063b4d8ca33d55d04c341f0b2b777ec241a3e201") (:authors ("Anler Hp ")) (:maintainers ("Anler Hp ")) (:maintainer "Anler Hp ") (:keywords "color" "theme" "minimal") (:url . "http://github.com/ikame/minimal-theme"))]) - (minions . [(20230514 1805) ((emacs (25 2)) (compat (29 1 4 1))) "A minor-mode menu for the mode line" tar ((:commit . "62948a4a2951dab0716977421bfe0a87ea2583c5") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience") (:url . "https://github.com/tarsius/minions"))]) - (minitest . [(20200506 308) ((dash (1 0 0))) "An Emacs mode for ruby minitest files" tar ((:commit . "ddd152c990a528ad09a696bfad23afa4330ea4d7") (:authors ("Arthur Neves")) (:maintainers ("Arthur Neves")) (:maintainer "Arthur Neves") (:url . "https://github.com/arthurnn/minitest-emacs"))]) + (minions . [(20240101 2220) ((emacs (25 2)) (compat (29 1 4 1))) "A minor-mode menu for the mode line" tar ((:commit . "07caa8c30b12c35f3fe563a036f9823c4a6a5f01") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience") (:url . "https://github.com/tarsius/minions"))]) + (minitest . [(20231222 1521) ((dash (1 0 0))) "An Emacs mode for ruby minitest files" tar ((:commit . "5999c45c047212cee15a2be67e78787776a79c35") (:authors ("Arthur Neves")) (:maintainers ("Arthur Neves")) (:maintainer "Arthur Neves") (:url . "https://github.com/arthurnn/minitest-emacs"))]) (minizinc-mode . [(20180201 1450) ((emacs (24 1))) "Major mode for MiniZinc code" tar ((:commit . "2512521ba7f8e263a06db88df663fc6b3cca7e16") (:keywords "languages" "minizinc") (:url . "http://github.com/m00nlight/minizinc-mode"))]) (minor-mode-hack . [(20170926 34) nil "Change priority of minor-mode keymaps" tar ((:commit . "c3aa957602c924c01fe07d48d191b8616fb3696a") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "lisp") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/minor-mode-hack.el"))]) (minsk-theme . [(20200306 1220) ((emacs (24))) "Minsk, a theme in deep muted greens" tar ((:commit . "c924eb90fc2ef53d4c366b752ea8cb5c5b8f87ea") (:authors ("Jean Lo" . "jlpaca@users.noreply.github.com")) (:maintainers ("Jean Lo" . "jlpaca@users.noreply.github.com")) (:maintainer "Jean Lo" . "jlpaca@users.noreply.github.com") (:keywords "theme" "faces") (:url . "https://github.com/jlpaca/minsk-theme"))]) (mint-mode . [(20221031 411) ((emacs (25 1))) "Major mode for the Mint programming language" tar ((:commit . "7bb0f9946f5833eada199e880fdc4efa6df09e0b") (:authors ("Diwank Tomer" . "singh@diwank.name")) (:maintainers ("jgart" . "jgart@dismail.de")) (:maintainer "jgart" . "jgart@dismail.de") (:keywords "mint" "languages" "processes" "convenience" "tools" "files") (:url . "https://github.com/creatorrr/emacs-mint-mode"))]) (mip-mode . [(20151127 617) nil "virtual projects for emacs." tar ((:commit . "7c88c383b4c7ed0a4c1dc397735f365c1fcb461c") (:authors ("Eeli Reilin" . "gaudecker@fea.st")) (:maintainers ("Eeli Reilin" . "gaudecker@fea.st")) (:maintainer "Eeli Reilin" . "gaudecker@fea.st") (:keywords "workspaces" "workspace" "project" "projects" "mip-mode"))]) (mips-mode . [(20220608 1204) ((emacs (25 1))) "Major-mode for MIPS assembly" tar ((:commit . "98795cdc81979821ac35d9f94ce354cd99780c67") (:authors ("Henrik Lissner ")) (:maintainers ("Henrik Lissner" . "contact@henrik.io")) (:maintainer "Henrik Lissner" . "contact@henrik.io") (:keywords "languages" "mips" "assembly") (:url . "https://github.com/hlissner/emacs-mips-mode"))]) - (mix . [(20210605 1015) ((emacs (25 1))) "Mix Major Mode. Build Elixir using Mix" tar ((:commit . "3d5dbc0ef01c4f6b3732f067e9ebc2d7be74a49e") (:authors ("Ayrat Badykov" . "ayratin555@gmail.com")) (:maintainers ("Ayrat Badykov" . "ayratin555@gmail.com")) (:maintainer "Ayrat Badykov" . "ayratin555@gmail.com") (:keywords "tools") (:url . "https://github.com/ayrat555/mix.el"))]) + (mistty . [(20231122 2029) ((emacs (29 1))) "Shell/Comint alternative based on term.el" tar ((:commit . "d51d6d995db42377d225169ec8ad200cbbfca401") (:authors ("Stephane Zermatten" . "szermatt@gmx.net")) (:maintainers ("Stephane Zermatten" . "szermatt@gmx.net")) (:maintainer "Stephane Zermatten" . "szermatt@gmx.net") (:keywords "convenience" "unix") (:url . "http://github.com/szermatt/mistty"))]) + (mix . [(20240122 720) ((emacs (25 1))) "Mix Major Mode. Build Elixir using Mix" tar ((:commit . "16cc69cbf919769c191b1c49c1cab324fd0682a9") (:authors ("Ayrat Badykov" . "ayratin555@gmail.com")) (:maintainers ("Ayrat Badykov" . "ayratin555@gmail.com")) (:maintainer "Ayrat Badykov" . "ayratin555@gmail.com") (:keywords "tools") (:url . "https://github.com/ayrat555/mix.el"))]) (mixed-pitch . [(20210304 1900) ((emacs (24 3))) "Use a variable pitch, keeping fixed pitch where it's sensible" tar ((:commit . "519e05f74825abf04b7d2e0e38ec040d013a125a") (:authors ("J. Alexander Branham" . "branham@utexas.edu")) (:maintainers ("J. Alexander Branham" . "branham@utexas.edu")) (:maintainer "J. Alexander Branham" . "branham@utexas.edu") (:url . "https://gitlab.com/jabranham/mixed-pitch"))]) (mkdown . [(20140517 1418) ((markdown-mode (2 0))) "Pretty Markdown previews based on mkdown.com" tar ((:commit . "8e23de82719af6c5b53b52b3308a02b3a1fb872e") (:authors ("Andrew Tulloch")) (:maintainers ("Andrew Tulloch")) (:maintainer "Andrew Tulloch") (:keywords "markdown") (:url . "https://github.com/ajtulloch/mkdown.el"))]) - (mlscroll . [(20221204 1608) ((emacs (27 1))) "A scroll bar for the modeline" tar ((:commit . "de9f84531ca4db6e54a2ca7201638decc0ccadd4") (:authors ("J.D. Smith")) (:maintainers ("J.D. Smith")) (:maintainer "J.D. Smith") (:keywords "convenience") (:url . "https://github.com/jdtsmith/mlscroll"))]) + (mlscroll . [(20240119 2149) ((emacs (27 1))) "A scroll bar for the modeline" tar ((:commit . "47182e0afb966994e4ea26842652fb4da9735103") (:authors ("J.D. Smith")) (:maintainers ("J.D. Smith")) (:maintainer "J.D. Smith") (:keywords "convenience") (:url . "https://github.com/jdtsmith/mlscroll"))]) (mmm-jinja2 . [(20170313 1420) ((mmm-mode (0 5 4))) "MMM submode class for Jinja2 Templates" tar ((:commit . "c8cb763174fa2fb61b9a0e5e0ff8cb0210f8492f") (:authors ("Ben Hayden" . "hayden767@gmail.com")) (:maintainers ("Ben Hayden" . "hayden767@gmail.com")) (:maintainer "Ben Hayden" . "hayden767@gmail.com") (:url . "https://github.com/glynnforrest/mmm-jinja2"))]) - (mmm-mode . [(20221228 1931) ((emacs (25 1)) (cl-lib (0 2))) "Allow Multiple Major Modes in a buffer" tar ((:commit . "171bf6395b8a95a2d08d41fa38cc1799025d3916") (:authors ("Michael Abraham Shulman" . "viritrilbia@gmail.com")) (:maintainers ("Dmitry Gutov" . "dgutov@yandex.ru")) (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru") (:keywords "convenience" "faces" "languages" "tools") (:url . "https://github.com/purcell/mmm-mode"))]) + (mmm-mode . [(20240222 428) ((emacs (25 1)) (cl-lib (0 2))) "Allow Multiple Major Modes in a buffer" tar ((:commit . "b1f5c7dbdc405e6e10d9ddd99a43a6b2ad61b176") (:authors ("Michael Abraham Shulman" . "viritrilbia@gmail.com")) (:maintainers ("Dmitry Gutov" . "dmitry@gutov.dev")) (:maintainer "Dmitry Gutov" . "dmitry@gutov.dev") (:keywords "convenience" "faces" "languages" "tools") (:url . "https://github.com/dgutov/mmm-mode"))]) (mmt . [(20230606 1513) ((emacs (24 5))) "Missing macro tools for Emacs Lisp" tar ((:commit . "2a24463eeb72ebef100e89977ebfb88f5f220217") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainers ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:keywords "macro" "lisp" "extensions") (:url . "https://github.com/mrkkrp/mmt"))]) (mo-git-blame . [(20160129 1759) nil "An interactive, iterative 'git blame' mode for Emacs" tar ((:commit . "254a675eb794cdbbdef9fa2b4b7bb510b70089c0") (:authors ("Moritz Bunkus" . "moritz@bunkus.org")) (:maintainers ("Moritz Bunkus" . "moritz@bunkus.org")) (:maintainer "Moritz Bunkus" . "moritz@bunkus.org") (:keywords "tools"))]) (mo-vi-ment-mode . [(20181217 206) nil "Provide vi-like cursor movement that's easy on the fingers" tar ((:commit . "e8b525ffc5faa31d36ecc5496b40f0f5c3603c08") (:authors ("Ajay MT" . "ajay.tatachar@gmail.com")) (:maintainers ("Ajay MT" . "ajay.tatachar@gmail.com")) (:maintainer "Ajay MT" . "ajay.tatachar@gmail.com") (:keywords "convenience"))]) @@ -3248,11 +3334,11 @@ (mocha . [(20200729 1130) ((js2-mode (20150909)) (f (0 18))) "Run Mocha or Jasmine tests" tar ((:commit . "6a72fa20e7be6e55c09b1bc9887ee09c5df28e45") (:authors ("Al Scott")) (:maintainers ("Al Scott")) (:maintainer "Al Scott") (:keywords "javascript" "mocha" "jasmine") (:url . "http://github.com/scottaj/mocha.el"))]) (mocha-snippets . [(20190417 1931) ((yasnippet (0 8 0))) "Yasnippets for the Mocha JS Testing Framework" tar ((:commit . "361a3809f755577406e109b9e44d473dfa7c08e0") (:authors ("Charles Lowell" . "cowboyd@frontside.io")) (:maintainers ("Charles Lowell" . "cowboyd@frontside.io")) (:maintainer "Charles Lowell" . "cowboyd@frontside.io") (:keywords "test" "javascript"))]) (mocker . [(20220727 1452) ((emacs (25 1))) "mocking framework for emacs" tar ((:commit . "4bd8d56eb4c3a1fcbbcdbf616f1b43e076b13eee") (:authors ("Yann Hodique" . "yann.hodique@gmail.com")) (:maintainers ("Yann Hodique" . "yann.hodique@gmail.com")) (:maintainer "Yann Hodique" . "yann.hodique@gmail.com") (:keywords "lisp" "testing"))]) - (modaled . [(20230825 152) ((emacs (25 1))) "Build your own minor modes for modal editing" tar ((:commit . "98f58e6857877bc1b593e86ee0ee61ad64daaf24") (:authors ("DCsunset")) (:maintainers ("DCsunset")) (:maintainer "DCsunset") (:keywords "convenience" "modal-editing") (:url . "https://github.com/DCsunset/modaled"))]) + (modaled . [(20240302 12) ((emacs (25 1))) "Build your own minor modes for modal editing" tar ((:commit . "0d8f8941f3e31a19641db4b21dd7d963c514ec92") (:authors ("DCsunset")) (:maintainers ("DCsunset")) (:maintainer "DCsunset") (:keywords "convenience" "modal-editing") (:url . "https://github.com/DCsunset/modaled"))]) (modalka . [(20230606 1357) ((emacs (24 4))) "Modal editing your way" tar ((:commit . "6deb661e84cb34746a62ce84842f52c22138beda") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainers ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:keywords "convenience") (:url . "https://github.com/mrkkrp/modalka"))]) - (mode-icons . [(20200920 2031) ((emacs (24)) (cl-lib (0 5))) "Show icons for modes" tar ((:commit . "82cfba411c544c862a0854f682494a437642c957") (:authors ("Tom Willemse" . "tom@ryuslash.org")) (:maintainers ("Tom Willemse" . "tom@ryuslash.org")) (:maintainer "Tom Willemse" . "tom@ryuslash.org") (:keywords "multimedia") (:url . "http://ryuslash.org/projects/mode-icons.html"))]) + (mode-icons . [(20230911 20) ((emacs (24)) (cl-lib (0 5))) "Show icons for modes" tar ((:commit . "931250e8f9f1106e7ace6247989867c5e17fc9cc") (:authors ("Tom Willemse" . "tom@ryuslash.org")) (:maintainers ("Tom Willemse" . "tom@ryuslash.org")) (:maintainer "Tom Willemse" . "tom@ryuslash.org") (:keywords "multimedia") (:url . "http://ryuslash.org/projects/mode-icons.html"))]) (mode-line-bell . [(20181029 516) nil "Flash the mode line instead of ringing the bell" tar ((:commit . "4985ba42f5a19f46ddbf9b3622453a9694995ce5") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "convenience"))]) - (mode-line-debug . [(20230511 2106) ((emacs (25 1)) (compat (29 1 4 1))) "Show status of debug-on-error in mode-line" tar ((:commit . "8e58bd51f1a8292c5df92e75a8c4a470e11a03e4") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience" "lisp") (:url . "https://github.com/tarsius/mode-line-debug"))]) + (mode-line-debug . [(20240101 2221) ((emacs (25 1)) (compat (29 1 4 1))) "Show status of debug-on-error in mode-line" tar ((:commit . "b5fbea38d6d92b50be14be99065b44b0ef832983") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience" "lisp") (:url . "https://github.com/tarsius/mode-line-debug"))]) (mode-line-idle . [(20230704 12) ((emacs (28 1))) "Evaluate mode line content when idle" tar ((:commit . "1dc0115bd4864b8b8cc9cbaac75c03d764070873") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.org/ideasman42/emacs-mode-line-idle"))]) (modelica-mode . [(20230508 1020) ((emacs (27 1))) "Major mode for editing Modelica files" tar ((:commit . "7064a4abdae68fc074a85a2e7c159e067c44c0e1") (:keywords "languages" "continuous system modeling") (:url . "https://github.com/modelica-tools/modelica-mode"))]) (modern-cpp-font-lock . [(20210405 1155) nil "Font-locking for \"Modern C++\"" tar ((:commit . "43c6b68ff58fccdf9deef11674a172e4eaa8455c") (:authors ("Ludwig PACIFICI" . "ludwig@lud.cc")) (:maintainers ("Ludwig PACIFICI" . "ludwig@lud.cc")) (:maintainer "Ludwig PACIFICI" . "ludwig@lud.cc") (:keywords "languages" "c++" "cpp" "font-lock") (:url . "https://github.com/ludwigpacifici/modern-cpp-font-lock"))]) @@ -3260,8 +3346,8 @@ (modern-sh . [(20211101 1001) ((emacs (25 1)) (hydra (0 15 0)) (eval-in-repl (0 9 7))) "Minor mode for editing shell script" tar ((:commit . "8ebebe77304aa8170f7af809e7564c79d3bd45da") (:keywords "languages" "programming") (:url . "https://github.com/damon-kwok/modern-sh"))]) (modtime-skip-mode . [(20140128 2201) nil "Minor mode for disabling modtime and supersession checks on files." tar ((:commit . "c0e49523aa26b2263a8693691ac775988015f592") (:authors ("Jordon Biondo" . "biondoj@mail.gvsu.edu")) (:maintainers ("Jordon Biondo" . "biondoj@mail.gvsu.edu")) (:maintainer "Jordon Biondo" . "biondoj@mail.gvsu.edu") (:url . "http://www.github.com/jordonbiondo/modtime-skip-mode"))]) (modular-config . [(20210726 1614) ((emacs (25 1))) "Organize your config into small and loadable modules" tar ((:commit . "043907d96efff70dfaea1e721de90bd35970e8bd") (:authors ("Sidharth Arya" . "sidhartharya10@gmail.com")) (:maintainers ("Sidharth Arya" . "sidhartharya10@gmail.com")) (:maintainer "Sidharth Arya" . "sidhartharya10@gmail.com") (:keywords "startup" "lisp" "tools") (:url . "https://github.com/SidharthArya/modular-config.el"))]) - (modus-themes . [(20230825 337) ((emacs (27 1))) "Elegant, highly legible and customizable themes" tar ((:commit . "b23c84e6b44e13ed12758eda05ab9d5f75928315") (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) (:maintainers ("Modus-Themes Development" . "~protesilaos/modus-themes@lists.sr.ht")) (:maintainer "Modus-Themes Development" . "~protesilaos/modus-themes@lists.sr.ht") (:keywords "faces" "theme" "accessibility") (:url . "https://git.sr.ht/~protesilaos/modus-themes"))]) - (moe-theme . [(20230818 554) nil "A colorful eye-candy theme. Moe, moe, kyun!" tar ((:commit . "51795cd85ea5f01f3b2a82476914419a5bd89a55") (:authors ("kuanyui" . "azazabc123@gmail.com")) (:maintainers ("kuanyui" . "azazabc123@gmail.com")) (:maintainer "kuanyui" . "azazabc123@gmail.com") (:keywords "themes") (:url . "https://github.com/kuanyui/moe-theme.el"))]) + (modus-themes . [(20240317 1619) ((emacs (27 1))) "Elegant, highly legible and customizable themes" tar ((:commit . "a082d7739f627523c6d9098c869cf143fa60b014") (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) (:maintainers ("Protesilaos Stavrou" . "info@protesilaos.com")) (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") (:keywords "faces" "theme" "accessibility") (:url . "https://github.com/protesilaos/modus-themes"))]) + (moe-theme . [(20240308 921) nil "A colorful eye-candy theme. Moe, moe, kyun!" tar ((:commit . "56286c6b869520807596e3e8af1b37c50e5a1349") (:authors ("kuanyui" . "azazabc123@gmail.com")) (:maintainers ("kuanyui" . "azazabc123@gmail.com")) (:maintainer "kuanyui" . "azazabc123@gmail.com") (:keywords "themes") (:url . "https://github.com/kuanyui/moe-theme.el"))]) (molar-mass . [(20220922 1752) ((emacs (24 3))) "Calculates molar mass of a molecule" tar ((:commit . "c3b686c4b621b45fa4b17857b4934eb4487d74f5") (:authors ("Sergi Ruiz Trepat")) (:maintainers ("Sergi Ruiz Trepat")) (:maintainer "Sergi Ruiz Trepat") (:keywords "convenience" "chemistry") (:url . "https://github.com/sergiruiztrepat/molar-mass.el"))]) (molecule . [(20180527 743) ((emacs (25 1))) "Simple wrapper for molecule" tar ((:commit . "2ef72b81d9aa24ea782b71a061a3abdad6cae162") (:authors (": drymer ")) (:maintainers (": drymer ")) (:maintainer ": drymer ") (:keywords ":" "languages" "terminals") (:url . "https://git.daemons.it/drymer/molecule.el"))]) (molokai-theme . [(20220106 1520) nil "molokai theme with Emacs theme engine" tar ((:commit . "cc53e997e7eff93b58ad16a376a292c1dd66044b") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/alloy-d/color-theme-molokai"))]) @@ -3272,73 +3358,73 @@ (mono-complete . [(20230808 1345) ((emacs (28 1))) "Completion suggestions with multiple back-ends" tar ((:commit . "d22df33d3523f1c0adf62bc0546da22792a2852d") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.org/ideasman42/emacs-mono-complete"))]) (monochrome-theme . [(20140326 1050) nil "A dark Emacs 24 theme for your focused hacking sessions" tar ((:commit . "9cf993670c9e8d198f41d840216e13280585b3e1") (:authors ("Xavier Noria" . "fxn@hashref.com")) (:maintainers ("Xavier Noria" . "fxn@hashref.com")) (:maintainer "Xavier Noria" . "fxn@hashref.com"))]) (monokai-alt-theme . [(20170630 2048) ((emacs (24))) "Theme with a dark background. Based on sublime monokai theme." tar ((:commit . "f342b6afc31f929be0626eca2d696ee9fab78011") (:authors ("Dmytro Koval")) (:maintainers ("Dmytro Koval")) (:maintainer "Dmytro Koval") (:url . "https://github.com/dawidof/emacs-monokai-theme"))]) - (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")) (:maintainers ("Kaleb Elwert" . "belak@coded.io")) (:maintainer "Kaleb Elwert" . "belak@coded.io") (:url . "https://github.com/belak/emacs-monokai-pro-theme"))]) + (monokai-pro-theme . [(20231120 1622) nil "A simple theme based on the Monokai Pro Sublime color schemes" tar ((:commit . "d56fa38a9ed3b1d8e4f8401cb4c3f08073f3ba26") (:authors ("Kaleb Elwert" . "belak@coded.io")) (:maintainers ("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." tar ((:commit . "4a09c59f948ba5b602b6f395e667f53224fd75a2") (:authors ("Kelvin Smith" . "oneKelvinSmith@gmail.com")) (:maintainers ("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" tar ((:commit . "f32a04b5bfee9cbcce4b223f17228d1142a28211") (:authors ("caffo")) (:maintainers ("caffo")) (:maintainer "caffo") (:url . "https://github.com/caffo/monotropic-theme"))]) (monroe . [(20220915 1647) nil "Yet another client for nREPL" tar ((:commit . "8f809e4aa0a35ec2d1c880aacf59e6bc317a566f") (:authors ("Sanel Zukan" . "sanelz@gmail.com")) (:maintainers ("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 . [(20230126 917) ((emacs (25 1))) "A minimal mode line inspired by doom-modeline" tar ((:commit . "58e85c815092ac93d02dab584fe537fd1be3828a") (:authors ("Jessie Hildebrandt ")) (:maintainers ("Jessie Hildebrandt ")) (:maintainer "Jessie Hildebrandt ") (:keywords "mode-line" "faces") (:url . "https://gitlab.com/jessieh/mood-line"))]) + (mood-line . [(20231210 1309) ((emacs (26 1))) "A minimal mode line inspired by doom-modeline" tar ((:commit . "d1c024fdf9543fbc0101cd2c6e8b248378f591cd") (:authors ("Jessie Hildebrandt ")) (:maintainers ("Jessie Hildebrandt ")) (:maintainer "Jessie Hildebrandt ") (:keywords "mode-line" "faces") (:url . "https://gitlab.com/jessieh/mood-line"))]) (mood-one-theme . [(20221222 1214) ((emacs (27 1))) "A dark color scheme inspired by the Doom One theme" tar ((:commit . "dfbc81900737d3382a340feeed24d2bcd9bdedb0") (:authors ("Jessie Hildebrandt ")) (:maintainers ("Jessie Hildebrandt ")) (:maintainer "Jessie Hildebrandt ") (:keywords "mode-line" "faces") (:url . "https://gitlab.com/jessieh/mood-one-theme"))]) - (moody . [(20230514 1803) ((emacs (25 3)) (compat (29 1 4 1))) "Tabs and ribbons for the mode line" tar ((:commit . "888e6fb37eb5122803c70ae60d28fc54589e26c0") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "faces") (:url . "https://github.com/tarsius/moody"))]) + (moody . [(20240311 1617) ((emacs (25 3)) (compat (29 1 4 1))) "Tabs and ribbons for the mode line" tar ((:commit . "65116ee9a8d8ca5a9e1e579b5957e0e7673c1dfe") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "faces") (:url . "https://github.com/tarsius/moody"))]) (moom . [(20230722 2037) ((emacs (25 1))) "Commands to control frame position and size" tar ((:commit . "54750aa2e3e9476375a32ef94714e22ece6e4039") (:authors ("Takaaki ISHIKAWA ")) (:maintainers ("Takaaki ISHIKAWA ")) (:maintainer "Takaaki ISHIKAWA ") (:keywords "frames" "faces" "convenience") (:url . "https://github.com/takaxp/Moom"))]) (moonscript . [(20170831 2226) ((cl-lib (0 5)) (emacs (24))) "Major mode for editing MoonScript code" tar ((:commit . "56f90471e2ced2b0a177aed4d8c2f854797e9cc7") (:authors ("@GriffinSchneider, @k2052, @EmacsFodder")) (:maintainers ("@GriffinSchneider, @k2052, @EmacsFodder")) (:maintainer "@GriffinSchneider, @k2052, @EmacsFodder"))]) (moonshot . [(20210627 2244) ((emacs (25 1)) (cl-lib (0 5)) (f (0 18)) (s (1 11 0)) (projectile (2 0 0)) (counsel (0 11 0)) (realgud (1 5 1)) (seq (2 20)) (levenshtein (1 0))) "Run executable file, debug and build commands on project" tar ((:commit . "ec37a12825888047a90d9ee8131aa4bea348edf7") (:authors ("Jong-Hyouk Yun" . "ageldama@gmail.com")) (:maintainers ("Jong-Hyouk Yun" . "ageldama@gmail.com")) (:maintainer "Jong-Hyouk Yun" . "ageldama@gmail.com") (:keywords "convenience" "files" "processes" "tools" "unix") (:url . "https://github.com/ageldama/moonshot"))]) (morganey-mode . [(20170118 934) ((emacs (24 4))) "Major mode for editing Morganey files" tar ((:commit . "7e33f1be486f58dfcf02adcbf82ccac47f69bd9b") (:authors ("Alexey Kutepov" . "reximkut@gmail.com")) (:maintainers ("Alexey Kutepov" . "reximkut@gmail.com")) (:maintainer "Alexey Kutepov" . "reximkut@gmail.com") (:url . "https://github.com/morganey-lang/morganey-mode"))]) (morgentau-theme . [(20220319 1049) ((emacs (24))) "Tango-based custom theme" tar ((:commit . "a8da5640b4a9b72a3136901d0a1a03071d9fcb00") (:authors ("Benjamin Vincent Schulenburg")) (:maintainers ("Benjamin Vincent Schulenburg")) (:maintainer "Benjamin Vincent Schulenburg") (:keywords "theme" "dark" "faces") (:url . "https://github.com/Melchizedek6809/morgentau-theme"))]) - (morlock . [(20230511 2105) ((emacs (25 1)) (compat (29 1 4 1))) "More font-lock keywords for elisp" tar ((:commit . "b7e2066a69c059c5d4c72e829b615a6b15cef4dc") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience") (:url . "https://github.com/tarsius/morlock"))]) - (morrowind-theme . [(20230311 1919) ((emacs (24 1))) "Theme" tar ((:commit . "5253d03e4aba8fe4f9d30c1483c2189616ce8990") (:authors ("Samuel Banya")) (:maintainers ("Samuel Banya")) (:maintainer "Samuel Banya") (:url . "https://github.com/samuelbanya/morrowind-theme"))]) + (morlock . [(20240125 1741) ((emacs (25 1)) (compat (29 1 4 1))) "More font-lock keywords for elisp" tar ((:commit . "2a62e20a7648747e74313ebcf3932fa8a858739b") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience") (:url . "https://github.com/tarsius/morlock"))]) + (morrowind-theme . [(20230912 406) ((emacs (24 1))) "Theme" tar ((:commit . "f197ef02e96fa3b8a38eca25ba750df7b843e564") (:authors ("Samuel Banya")) (:maintainers ("Samuel Banya")) (:maintainer "Samuel Banya") (:url . "https://github.com/samuelbanya/morrowind-theme"))]) (mos-mode . [(20221209 1353) ((emacs (24 4)) (lsp-mode (8 0 0)) (dap-mode (0 7)) (dash (2 19 1)) (ht (2 3))) "MOS toolkit usage" tar ((:commit . "770f49417e8ad7dbf382c8691f6f689d793b9314") (:url . "https://github.com/themkat/mos-mode"))]) (mosey . [(20180614 1649) ((emacs (24 4))) "Mosey around your buffers" tar ((:commit . "2e3ac9d334fa2937ed5267193dfd25d8e1f14dc2") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "convenience") (:url . "http://github.com/alphapapa/mosey.el"))]) (most-used-words . [(20200808 1353) ((emacs (24 3))) "Display most used words in buffer" tar ((:commit . "90c09da92b30c6497e9141f0edfe7842440c4d53") (:authors ("Udyant Wig" . "udyant.wig@gmail.com")) (:maintainers ("Udyant Wig" . "udyant.wig@gmail.com")) (:maintainer "Udyant Wig" . "udyant.wig@gmail.com") (:keywords "convenience" "wp") (:url . "https://github.com/udyantw/most-used-words"))]) (mote-mode . [(20160123 29) ((ruby-mode (1 1))) "Mote minor mode" tar ((:commit . "666c6641addbd3b337a7aa01fd2742ded2f41b83") (:authors ("Leandro López (inkel)" . "inkel.ar@gmail.com")) (:maintainers ("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")) (:maintainers ("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" tar ((:commit . "bf2e578b89d7e7bf0b5500d9afcf49ac6ec2dcd1") (:authors ("Jimmy Yuen Ho Wong" . "wyuenho@gmail.com")) (:maintainers ("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-mode . [(20221205 1433) ((emacs (25 1))) "A major-mode for editing Move language" tar ((:commit . "fa34fbe977d62c8297abc3547b9cfb25802e033c") (:authors ("Ashok Menon")) (:maintainers ("Ashok Menon")) (:maintainer "Ashok Menon") (:keywords "languages") (:url . "https://github.com/amnn/move-mode"))]) - (move-text . [(20221006 1634) nil "Move current line or region with M-up or M-down." tar ((:commit . "b17f0f4cbe9d8a72e6d9765daf2e6cdc12b3f4ba") (:authors ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainers ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com") (:keywords "edit") (:url . "https://github.com/emacsfodder/move-text"))]) + (move-mode . [(20240309 2223) ((emacs (25 1))) "A major-mode for editing Move language" tar ((:commit . "b07983c8df12fa428117cea8e09067ae952871d9") (:authors ("Ashok Menon")) (:maintainers ("Ashok Menon")) (:maintainer "Ashok Menon") (:keywords "languages") (:url . "https://github.com/amnn/move-mode"))]) + (move-text . [(20231204 1514) nil "Move current line or region with M-up or M-down." tar ((:commit . "90ef0b078dbcb2dee47a15b0c6c6f417101e0c43") (:authors ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainers ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com") (:keywords "edit") (:url . "https://github.com/emacsfodder/move-text"))]) (mowedline . [(20171218 237) nil "elisp utilities for using mowedline" tar ((:commit . "c17501b48ded8261d815ab60bf14cddf7040be72") (:authors ("John Foerch" . "jjfoerch@earthlink.net")) (:maintainers ("John Foerch" . "jjfoerch@earthlink.net")) (:maintainer "John Foerch" . "jjfoerch@earthlink.net"))]) - (mozc . [(20230807 1644) ((emacs (24 3))) "minor mode to input Japanese with Mozc" tar ((:commit . "9a925ee918e4b9c0266fb61b5cb2735f21ee6f1a") (:keywords "mule" "multilingual" "input method"))]) + (mozc . [(20240209 1327) ((emacs (24 3))) "minor mode to input Japanese with Mozc" tar ((:commit . "c2fcbf6515c5884437977de46187c16a8cb7bb50") (: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" tar ((:commit . "1d07d5055381008ccbb29b97315d140e09a7ee95") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainers ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:keywords "i18n" "tooltip") (:url . "https://github.com/akirak/mozc-posframe"))]) (mozc-im . [(20160412 22) ((mozc (0))) "Mozc with input-method-function interface." tar ((:commit . "df614a1076c28a11551fb3e822868bae47e855a5") (:authors ("Daisuke Kobayashi" . "d5884jp@gmail.com")) (:maintainers ("Daisuke Kobayashi" . "d5884jp@gmail.com")) (:maintainer "Daisuke Kobayashi" . "d5884jp@gmail.com") (:keywords "i18n" "extentions"))]) (mozc-popup . [(20150224 34) ((popup (0 5 2)) (mozc (0))) "Mozc with popup" tar ((:commit . "f0684b875a7427ec08f8df13939a486e5d5cf420") (:authors ("Daisuke Kobayashi" . "d5884jp@gmail.com")) (:maintainers ("Daisuke Kobayashi" . "d5884jp@gmail.com")) (:maintainer "Daisuke Kobayashi" . "d5884jp@gmail.com") (:keywords "i18n" "extentions"))]) (mozc-temp . [(20160228 840) ((emacs (24)) (dash (2 10 0)) (mozc (0))) "Use mozc temporarily" tar ((:commit . "7f5dd5fc8ceeca9b1822f7e056a4be67e2e74959") (:authors ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainers ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainer "Hiroki YAMAKAWA" . "s06139@gmail.com") (:url . "https://github.com/HKey/mozc-temp"))]) (mpages . [(20150710 1404) nil "An Emacs buffer for quickly writing your Morning Pages" tar ((:commit . "39a72a0931ab1cdbfdf0ab9f412dc12d43a3829f") (:authors ("Sean Levin")) (:maintainers ("Sean Levin")) (:maintainer "Sean Levin") (:url . "https://github.com/slevin/mpages"))]) - (mpdel . [(20230103 1924) ((emacs (25 1)) (libmpdel (1 2 0)) (navigel (0 7 0))) "Play and control your MPD music" tar ((:commit . "365b2661e56165c53eadd28d3e0a5f9d594412c7") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:keywords "multimedia") (:url . "https://github.com/mpdel/mpdel"))]) + (mpdel . [(20230903 915) ((emacs (25 1)) (libmpdel (1 2 0)) (navigel (0 7 0))) "Play and control your MPD music" tar ((:commit . "b7a76a95bde185a3dc2c948c68465b1d532b095b") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:keywords "multimedia") (:url . "https://github.com/mpdel/mpdel"))]) (mpdel-embark . [(20230103 2021) ((emacs (26 1)) (mpdel (2 0 0)) (libmpdel (2 0 0)) (embark (0 19))) "Integrate MPDel with Embark" tar ((:commit . "31d91a62b680fb4472ec34c04ac6af80bb3cf4b8") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:keywords "multimedia") (:url . "https://github.com/mpdel/mpdel-embark"))]) - (mpdmacs . [(20210904 2048) ((emacs (25 1)) (elmpd (0 1))) "A lightweight MPD client" tar ((:commit . "66031a8993a2a704bdfaa9c63ec590dd0c5a2eea") (:authors ("Michael Herstine" . "sp1ff@pobox.com")) (:maintainers ("Michael Herstine" . "sp1ff@pobox.com")) (:maintainer "Michael Herstine" . "sp1ff@pobox.com") (:keywords "comm") (:url . "https://github.com/sp1ff/mpdmacs"))]) + (mpdmacs . [(20240210 1526) ((emacs (29 1)) (elmpd (0 2))) "A lightweight MPD client" tar ((:commit . "a401e2331300f79f9c4edc6fae46982d560c74fb") (:authors ("Michael Herstine" . "sp1ff@pobox.com")) (:maintainers ("Michael Herstine" . "sp1ff@pobox.com")) (:maintainer "Michael Herstine" . "sp1ff@pobox.com") (:keywords "comm") (:url . "https://github.com/sp1ff/mpdmacs"))]) (mpmc-queue . [(20180303 2029) ((emacs (26 0)) (queue (0 2 0))) "a multiple-producer-multiple-consumer queue" tar ((:commit . "df07d6bef7468edb1d73ef73b8331b94d0e5d0ca") (:authors ("Sho Mizoe" . "sho.mizoe@gmail.com")) (:maintainers ("Sho Mizoe" . "sho.mizoe@gmail.com")) (:maintainer "Sho Mizoe" . "sho.mizoe@gmail.com") (:keywords "lisp" "async") (:url . "https://github.com/smizoe/mpmc-queue"))]) (mpv . [(20220801 1917) ((emacs (25 1))) "control mpv for easy note-taking" tar ((:commit . "2e0234bc21a3dcdf12d94d3285475e7f6769d3e8") (:authors ("Johann Klähn" . "johann@jklaehn.de")) (:maintainers ("Johann Klähn" . "johann@jklaehn.de")) (:maintainer "Johann Klähn" . "johann@jklaehn.de") (:keywords "tools" "multimedia") (:url . "https://github.com/kljohann/mpv.el"))]) - (mpvi . [(20230608 154) ((emacs (28 1)) (emms (11))) "Integrated video tool based on EMMS and MPV" tar ((:commit . "f633510686d7b974147592336fa21ce6df80a5da") (:authors ("lorniu" . "lorniu@gmail.com")) (:maintainers ("lorniu" . "lorniu@gmail.com")) (:maintainer "lorniu" . "lorniu@gmail.com") (:keywords "convenience" "docs" "multimedia" "application") (:url . "https://github.com/lorniu/mpvi"))]) + (mpvi . [(20240315 214) ((emacs (28 1)) (emms (11))) "Media tool based on EMMS and MPV" tar ((:commit . "2412e4cd2879e1ebeaf29b92104abc94226b50bc") (:authors ("lorniu" . "lorniu@gmail.com")) (:maintainers ("lorniu" . "lorniu@gmail.com")) (:maintainer "lorniu" . "lorniu@gmail.com") (:keywords "convenience" "docs" "multimedia" "application") (:url . "https://github.com/lorniu/mpvi"))]) (mqr . [(20180527 1204) ((emacs (24 4))) "Multi-dimensional query and replace" tar ((:commit . "4ade19d4620b8b61340290bf63fa56d5e493859f") (:authors ("Tino Calancha" . "tino.calancha@gmail.com")) (:maintainers ("Tino Calancha" . "tino.calancha@gmail.com")) (:maintainer "Tino Calancha" . "tino.calancha@gmail.com") (:keywords "convenience" "extensions" "lisp") (:url . "https://github.com/calancha/multi-replace"))]) (mqtt-mode . [(20180611 1735) ((emacs (25)) (dash (2 12 0))) "client for interaction with MQTT servers" tar ((:commit . "613e70e9b9940e635e779994b5c83f86eb62c8e6") (:authors ("Andreas Müller" . "code@0x7.ch")) (:maintainers ("Andreas Müller" . "code@0x7.ch")) (:maintainer "Andreas Müller" . "code@0x7.ch") (:keywords "tools") (:url . "https://github.com/andrmuel/mqtt-mode"))]) (msgpack . [(20200323 515) ((emacs (25 1))) "Read and write MessagePack object" tar ((:commit . "e2a0d76d1087bc8178c9f27222cb9b93e2e815ec") (:authors ("Xu Chunyang")) (:maintainers ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:keywords "lisp") (:url . "https://github.com/xuchunyang/msgpack.el"))]) (msvc . [(20221015 1610) ((emacs (24)) (cl-lib (0 5)) (cedet (1 0)) (ac-clang (2 0 0))) "Microsoft Visual C/C++ mode" tar ((:commit . "1bf173b5da3fbf2bdb799116e2a1f31916c1e16e") (:authors ("yaruopooner [https://github.com/yaruopooner]")) (:maintainers ("yaruopooner [https://github.com/yaruopooner]")) (:maintainer "yaruopooner [https://github.com/yaruopooner]") (:keywords "languages" "completion" "syntax check" "mode" "intellisense") (:url . "https://github.com/yaruopooner/msvc"))]) - (mtg-deck-mode . [(20180613 2010) ((emacs (25 1))) "Major mode to edit MTG decks" tar ((:commit . "8265b8ed17fcd4406760c19aa6ee9c76068b1ab0") (:authors ("Mattias Bengtsson" . "mattias.jc.bengtsson@gmail.com")) (:maintainers ("Mattias Bengtsson" . "mattias.jc.bengtsson@gmail.com")) (:maintainer "Mattias Bengtsson" . "mattias.jc.bengtsson@gmail.com") (:keywords "data" "mtg" "magic") (:url . "https://github.com/mattiasb/mtg-deck-mode"))]) + (mtg-deck-mode . [(20231202 1546) ((emacs (25 1))) "Major mode to edit MTG decks" tar ((:commit . "3cb3866951feae40531c0a2e4fa72c0f2989c36c") (:keywords "data" "mtg" "magic") (:url . "https://github.com/mattiasb/mtg-deck-mode"))]) (mu-cite . [(20190803 439) ((flim (1 14 9))) "A library to provide MIME features." tar ((:commit . "b2c83bbce4646d100b942f0f0de0877a8d47298c") (:authors ("MORIOKA Tomohiko" . "tomo@m17n.org") ("Shuhei KOBAYASHI" . "shuhei@aqua.ocn.ne.jp")) (:maintainer "Katsumi Yamaoka" . "yamaoka@jpl.org") (:keywords "mail" "news" "citation"))]) (mu2tex . [(20200512 704) nil "Convert plain text molecule names and units to TeX" tar ((:commit . "4b84cdac955cb36a8c44a2be48f3310252e3d3ad") (:authors ("Carsten Dominik" . "carsten.dominik@gmail.com")) (:maintainers ("Carsten Dominik" . "carsten.dominik@gmail.com")) (:maintainer "Carsten Dominik" . "carsten.dominik@gmail.com") (:keywords "tex") (:url . "https://github.com/cdominik/mu2tex"))]) (mu4e-alert . [(20230722 1746) ((alert (1 2)) (s (1 10 0)) (ht (2 0)) (emacs (24 4))) "Desktop notification for mu4e" tar ((:commit . "6beda20fc69771f2778f507c4a9e069dbaf1b628") (:authors ("Iqbal Ansari" . "iqbalansari02@yahoo.com")) (:maintainers ("Mikhail Rudenko" . "mike.rudenko@gmail.com")) (:maintainer "Mikhail Rudenko" . "mike.rudenko@gmail.com") (:keywords "mail" "convenience") (:url . "https://github.com/iqbalansari/mu4e-alert"))]) - (mu4e-column-faces . [(20221213 2206) ((emacs (25 3))) "Faces for individual mu4e columns" tar ((:commit . "1bbb646ea07deb1bd2daa4c6eb36e0f65aac40b0") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainers ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/mu4e-column-faces"))]) + (mu4e-column-faces . [(20240318 2050) ((emacs (25 3))) "Faces for individual mu4e columns" tar ((:commit . "d0387f277c1572160b3e80471252ff0305409988") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainers ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/mu4e-column-faces"))]) (mu4e-conversation . [(20190609 812) ((emacs (25 1))) "Show a complete thread in a single buffer" tar ((:commit . "98110bb9c300fc9866dee8e0023355f9f79c9b96") (:authors ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainers ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") (:keywords "mail" "convenience" "mu4e") (:url . "https://gitlab.com/Ambrevar/mu4e-conversation"))]) + (mu4e-crypto . [(20240120 646) ((emacs (24 3))) "Encrypt and decrypt emails for mu4e with GnuPG" tar ((:commit . "8eb4ce811044aa93f3527adf35984aa502ac0d4b") (:authors ("Meritamen" . "meritamen@sdf.org")) (:maintainers ("Meritamen" . "meritamen@sdf.org")) (:maintainer "Meritamen" . "meritamen@sdf.org") (:keywords "mu4e" "mail" "crypto") (:url . "https://github.com/meritamen/mu4e-crypto"))]) (mu4e-jump-to-list . [(20221202 1023) ((emacs (24 4)) (cl-lib (0 5))) "mu4e jump-to-list extension" tar ((:commit . "cf19684d2333cb0cda7f6b62c7607144baa49310") (:authors ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainers ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainer "Yuri D'Elia" . "wavexx@thregr.org") (:keywords "mu4e" "mail" "convenience") (:url . "https://gitlab.com/wavexx/mu4e-jump-to-list.el"))]) - (mu4e-maildirs-extension . [(20220517 1852) ((dash (0 0 0))) "Show mu4e maildirs summary in mu4e-main-view" tar ((:commit . "cdc2e141d8ecd59508a5cd50d6d02120073bf4f1") (:authors ("Andreu Gil Pàmies" . "agpchil@gmail.com")) (:maintainers ("Andreu Gil Pàmies" . "agpchil@gmail.com")) (:maintainer "Andreu Gil Pàmies" . "agpchil@gmail.com") (:url . "http://github.com/agpchil/mu4e-maildirs-extension"))]) (mu4e-marker-icons . [(20230423 1039) ((emacs (26 1)) (nerd-icons (0 0 1))) "Display icons for mu4e markers" tar ((:commit . "09fe0ca72b5c000d45a875c7cfa58016f740c1ae") (:keywords "mail") (:url . "https://repo.or.cz/mu4e-marker-icons.git"))]) - (mu4e-overview . [(20221107 833) ((emacs (26))) "Show overview of maildir" tar ((:commit . "21d4fbf44f67b786a61072afd20065a56b3952a1") (:authors ("Michał Krzywkowski" . "k.michal@zoho.com")) (:maintainers ("Michał Krzywkowski" . "k.michal@zoho.com")) (:maintainer "Michał Krzywkowski" . "k.michal@zoho.com") (:keywords "mail" "tools") (:url . "https://github.com/mkcms/mu4e-overview"))]) + (mu4e-overview . [(20240219 2302) ((emacs (26))) "Show overview of maildir" tar ((:commit . "7843cb64c861729bfd57ec3e8ad7faf6edb2e543") (:authors ("Michał Krzywkowski" . "k.michal@zoho.com")) (:maintainers ("Michał Krzywkowski" . "k.michal@zoho.com")) (:maintainer "Michał Krzywkowski" . "k.michal@zoho.com") (:keywords "mail" "tools") (:url . "https://github.com/mkcms/mu4e-overview"))]) (mu4e-query-fragments . [(20211030 2307) ((emacs (24 4))) "mu4e query fragments extension" tar ((:commit . "8d93ede3772353e2dbc307de03e06e37ea6a0b6c") (:authors ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainers ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainer "Yuri D'Elia" . "wavexx@thregr.org") (:keywords "mu4e" "mail" "convenience") (:url . "https://gitlab.com/wavexx/mu4e-query-fragments.el"))]) (mu4e-views . [(20230105 1443) ((emacs (26 1)) (xwidgets-reuse (0 2)) (ht (2 2)) (esxml (20210323 1102))) "View emails in mu4e using xwidget-webkit" tar ((:commit . "ba223d69fa9edf7b039bd728f4630c64b08c39ff") (:authors ("Boris Glavic" . "lordpretzel@gmail.com")) (:maintainers ("Boris Glavic" . "lordpretzel@gmail.com")) (:maintainer "Boris Glavic" . "lordpretzel@gmail.com") (:keywords "mail") (:url . "https://github.com/lordpretzel/mu4e-views"))]) (mu4easy . [(20230629 1721) ((emacs (25 1)) (mu4e-column-faces (1 2 1)) (mu4e-alert (1 0)) (helm-mu (1 0 0)) (org-msg (4 0))) "Packages + configs for using mu4e with multiple accounts" tar ((:commit . "bb9f5df374723932c848f8864c86d7b0ceacc82c") (:authors ("Daniel Fleischer" . "danflscr@gmail.com")) (:maintainers ("Daniel Fleischer" . "danflscr@gmail.com")) (:maintainer "Daniel Fleischer" . "danflscr@gmail.com") (:keywords "mail") (:url . "https://github.com/danielfleischer/mu4easy"))]) (muban . [(20180415 1219) ((emacs (25))) "Lightweight template expansion tool" tar ((:commit . "c134c46e60be1fb3e9a08dba3d07346855e0fcc2") (:authors ("Jiahao Li" . "jiahaowork@gmail.com")) (:maintainers ("Jiahao Li" . "jiahaowork@gmail.com")) (:maintainer "Jiahao Li" . "jiahaowork@gmail.com") (:keywords "abbrev" "tools") (:url . "https://github.com/jiahaowork/muban.el"))]) - (mugur . [(20210719 722) ((emacs (26 1)) (s (1 12 0)) (anaphora (1 0 4)) (dash (2 18 1)) (cl-lib (1 0))) "Configurator for QMK compatible keyboards" tar ((:commit . "63a0377ac1ad48171621c9f0c719b62ec9395d35") (:authors ("Mihai Olteanu" . "mihai_olteanu@fastmail.fm")) (:maintainers ("Mihai Olteanu" . "mihai_olteanu@fastmail.fm")) (:maintainer "Mihai Olteanu" . "mihai_olteanu@fastmail.fm") (:keywords "multimedia") (:url . "https://github.com/mihaiolteanu/mugur"))]) + (mugur . [(20231024 755) ((emacs (26 1)) (s (1 12 0)) (anaphora (1 0 4)) (dash (2 18 1)) (cl-lib (1 0))) "Configurator for QMK compatible keyboards" tar ((:commit . "9d55e6eac893abfc0a2622d6ac2a791ce5b23fbb") (:authors ("Mihai Olteanu" . "mihai_olteanu@fastmail.fm")) (:maintainers ("Mihai Olteanu" . "mihai_olteanu@fastmail.fm")) (:maintainer "Mihai Olteanu" . "mihai_olteanu@fastmail.fm") (:keywords "multimedia") (:url . "https://github.com/mihaiolteanu/mugur"))]) (multi . [(20131013 1544) ((emacs (24))) "Clojure-style multi-methods for emacs lisp" tar ((:commit . "884203b11fdac8374ec644cca975469aab263404") (:authors ("Christina Whyte" . "kurisu.whyte@gmail.com")) (:maintainers ("Christina Whyte" . "kurisu.whyte@gmail.com")) (:maintainer "Christina Whyte" . "kurisu.whyte@gmail.com") (:keywords "multimethod" "generic" "predicate" "dispatch") (:url . "http://github.com/kurisuwhyte/emacs-multi"))]) (multi-compile . [(20211113 2119) ((emacs (24 4)) (dash (2 12 1))) "Multi target interface to compile." tar ((:commit . "360e44b200d07da379c906856d37613d0f06a9ae") (:authors ("Kvashnin Vladimir" . "reangd@gmail.com")) (:maintainers ("Kvashnin Vladimir" . "reangd@gmail.com")) (:maintainer "Kvashnin Vladimir" . "reangd@gmail.com") (:keywords "tools" "compile" "build") (:url . "https://github.com/ReanGD/emacs-multi-compile"))]) (multi-line . [(20230721 1814) ((emacs (24 3)) (s (1 9 0)) (cl-lib (0 5)) (dash (2 12 0)) (shut-up (0 3 2))) "multi-line statements" tar ((:commit . "06ea7294c4e4ace0c3253b7952a6d937a169eb55") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainers ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:keywords "multi" "line" "length" "whitespace" "programming" "tools" "convenience" "files") (:url . "https://github.com/IvanMalison/multi-line"))]) - (multi-project . [(20230729 1543) ((emacs (25))) "Find files, compile, and search for multiple projects." tar ((:commit . "0ba7d337d8764b4f83788bc6c1f17080aad2b6c7") (:authors ("Shawn Ellis" . "shawn.ellis17@gmail.com")) (:maintainers ("Shawn Ellis" . "shawn.ellis17@gmail.com")) (:maintainer "Shawn Ellis" . "shawn.ellis17@gmail.com") (:keywords "convenience" "project" "management") (:url . "https://hg.osdn.net/view/multi-project/multi-project"))]) + (multi-project . [(20240115 1635) ((emacs (26 1))) "Find files, compile, and search in multiple projects" tar ((:commit . "3bc67ba8adf10a0844fa2f9cce9d78f130307645") (:authors ("Shawn Ellis" . "shawn.ellis17@gmail.com")) (:maintainers ("Shawn Ellis" . "shawn.ellis17@gmail.com")) (:maintainer "Shawn Ellis" . "shawn.ellis17@gmail.com") (:keywords "convenience" "project" "management") (:url . "https://github.com/ellisvelo/multi-project.git"))]) (multi-run . [(20210108 336) ((emacs (24)) (window-layout (1 4))) "Efficiently manage multiple remote nodes" tar ((:commit . "13d4d923535b5e8482b13ff76185203075fb26a3") (:authors ("Sagar Jha")) (:maintainers ("Sagar Jha")) (:maintainer "Sagar Jha") (:keywords "multiple shells" "multi-run" "remote nodes") (:url . "https://www.github.com/sagarjha/multi-run"))]) (multi-term . [(20200514 428) nil "Managing multiple terminal buffers in Emacs." tar ((:commit . "017c77c550115936860e2ea71b88e585371475d5") (:authors ("Andy Stewart" . "lazycat.manatee@gmail.com")) (:maintainers ("Andy Stewart" . "lazycat.manatee@gmail.com")) (:maintainer "Andy Stewart" . "lazycat.manatee@gmail.com") (:keywords "term" "terminal" "multiple buffer") (:url . "http://www.emacswiki.org/emacs/download/multi-term.el"))]) (multi-vterm . [(20221031 610) ((emacs (26 3)) (vterm (0 0)) (project (0 3 0))) "Like multi-term.el but for vterm" tar ((:commit . "36746d85870dac5aaee6b9af4aa1c3c0ef21a905") (:keywords "terminals" "processes") (:url . "https://github.com/suonlight/multi-libvterm"))]) (multi-web-mode . [(20130824 354) nil "multiple major mode support for web editing" tar ((:commit . "ad1c8d1c870334052d244c7ae3636cb7b9357b7c") (:authors ("Fabián E. Gallina" . "fabian@anue.biz")) (:maintainers ("Fabián E. Gallina" . "fabian@anue.biz")) (:maintainer "Fabián E. Gallina" . "fabian@anue.biz") (:keywords "convenience" "languages" "wp") (:url . "https://github.com/fgallina/multi-web-mode"))]) (multicolumn . [(20150202 2251) nil "Creating and managing multiple side-by-side windows." tar ((:commit . "c7a3afecd470859b2e60aa7c554d6e4d436df7fa") (:authors ("Anders Lindgren")) (:maintainers ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:url . "https://github.com/Lindydancer/multicolumn"))]) (multifiles . [(20130615 2133) nil "View and edit parts of multiple files in one buffer" tar ((:commit . "dddfe64b8e1c1cd1f9ccc1f03405477fc0d53897") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainers ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:keywords "multiple" "files"))]) - (multiple-cursors . [(20230728 518) ((cl-lib (0 5))) "Multiple cursors for Emacs." tar ((:commit . "234806c832994cadedb42596fe235e91bbd59e8c") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:keywords "editing" "cursors") (:url . "https://github.com/magnars/multiple-cursors.el"))]) + (multiple-cursors . [(20240223 1134) ((cl-lib (0 5))) "Multiple cursors for Emacs." tar ((:commit . "c870c18462461df19382ecd2f9374c8b902cd804") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:keywords "editing" "cursors") (:url . "https://github.com/magnars/multiple-cursors.el"))]) (multistate . [(20210124 2014) ((emacs (25 1)) (ht (2 3))) "Multistate mode" tar ((:commit . "a7ab9dc7aac0b6d6d2f872de4e0d1b8550834a9b") (:authors ("Matsievskiy S.V.")) (:maintainers ("Matsievskiy S.V.")) (:maintainer "Matsievskiy S.V.") (:keywords "convenience") (:url . "https://gitlab.com/matsievskiysv/multistate"))]) - (multitran . [(20220903 510) ((emacs (24)) (cl-lib (0 5))) "Interface to multitran" tar ((:commit . "6244e227bcf57eed391eecb34bae445f9c17e809") (:authors ("Zajcev Evgeny" . "zevlg@yandex.ru")) (:maintainers ("Zajcev Evgeny" . "zevlg@yandex.ru")) (:maintainer "Zajcev Evgeny" . "zevlg@yandex.ru") (:keywords "dictionary" "hypermedia"))]) + (multitran . [(20240206 1617) ((emacs (24)) (cl-lib (0 5))) "Interface to multitran" tar ((:commit . "680f31d15b78876daf484bd926e5c172ab061595") (:authors ("Zajcev Evgeny" . "zevlg@yandex.ru")) (:maintainers ("Zajcev Evgeny" . "zevlg@yandex.ru")) (:maintainer "Zajcev Evgeny" . "zevlg@yandex.ru") (:keywords "dictionary" "hypermedia"))]) (musicbrainz . [(20230530 749) ((emacs (28 1)) (request (0 3))) "MusicBrainz API interface" tar ((:commit . "986690a515e67526598eaa4200bd383f03a007bd") (:authors ("nik gaffney" . "nik@fo.am")) (:maintainers ("nik gaffney" . "nik@fo.am")) (:maintainer "nik gaffney" . "nik@fo.am") (:keywords "music" "scrobbling" "multimedia") (:url . "https://github.com/zzkt/metabrainz"))]) (mustache . [(20230713 514) ((emacs (26)) (s (1 3 0)) (dash (1 2 0))) "Mustache templating library in emacs lisp" tar ((:commit . "229e01f0f0a5684499bcc6a11a5bf8dbe14fd4e8") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:keywords "convenience" "mustache" "template") (:url . "https://github.com/Wilfred/mustache.el"))]) (mustache-mode . [(20141024 1432) nil "A major mode for editing Mustache files." tar ((:commit . "bf9897eb287ca47ced65d7d4e07ea61ea0aec39f") (:authors ("Tony Gentilcore") ("Chris Wanstrath") ("Daniel Hackney")) (:maintainers ("Tony Gentilcore")) (:maintainer "Tony Gentilcore"))]) @@ -3360,7 +3446,7 @@ (mysql-to-org . [(20210622 447) ((emacs (24 3)) (s (1 11 0))) "Minor mode to output the results of mysql queries to org tables" tar ((:commit . "c5eefc71200f2e1d0d67a13ed897b3cdfa835117") (:authors ("Tijs Mallaerts" . "tijs.mallaerts@gmail.com")) (:maintainers ("Tijs Mallaerts" . "tijs.mallaerts@gmail.com")) (:maintainer "Tijs Mallaerts" . "tijs.mallaerts@gmail.com"))]) (myterminal-controls . [(20210904 516) ((emacs (24)) (cl-lib (0 5))) "Quick toggle controls at a key-stroke" tar ((:commit . "c635868e13ee898ec77925d98b36421640e22aa4") (:authors ("Mohammed Ismail Ansari" . "team.terminal@gmail.com")) (:maintainers ("Mohammed Ismail Ansari" . "team.terminal@gmail.com")) (:maintainer "Mohammed Ismail Ansari" . "team.terminal@gmail.com") (:keywords "convenience" "shortcuts") (:url . "http://ismail.teamfluxion.com"))]) (n4js . [(20150714 231) ((emacs (24)) (cypher-mode (0))) "Neo4j Shell" tar ((:commit . "3991ed8975151d5e8d568e952362df810f7ffab7") (:authors ("TruongTx" . "me@truongtx.me")) (:maintainers ("TruongTx" . "me@truongtx.me")) (:maintainer "TruongTx" . "me@truongtx.me") (:keywords "neo4j" "shell" "comint") (:url . "https://github.com/tmtxt/n4js.el"))]) - (naga-theme . [(20230824 1740) ((emacs (24 1))) "Dark color theme with green foreground color" tar ((:commit . "00f3bac7bc11fde37fa60e66442e8c13a6159a81") (:authors ("Johannes Maier" . "johannes.maier@mailbox.org")) (:maintainers ("Johannes Maier" . "johannes.maier@mailbox.org")) (:maintainer "Johannes Maier" . "johannes.maier@mailbox.org") (:keywords "faces" "themes") (:url . "https://github.com/kenranunderscore/emacs-naga-theme"))]) + (naga-theme . [(20240311 1929) nil "Dark color theme with green foreground color" tar ((:commit . "084e2a7d52f31d2ff80ba86b0fdeba5a3baebafe") (:authors ("Johannes Maier" . "johannes.maier@mailbox.org")) (:maintainers ("Johannes Maier" . "johannes.maier@mailbox.org")) (:maintainer "Johannes Maier" . "johannes.maier@mailbox.org"))]) (name-this-color . [(20151014 2030) ((emacs (24)) (cl-lib (0 5)) (dash (2 11 0))) "Match RGB codes to names easily and precisely" tar ((:commit . "e37cd1291d5d68d4c8d6386eab9cb9d94fd3bcfa") (:keywords "lisp" "color" "hex" "rgb" "shade" "name") (:url . "https://github.com/knl/name-this-color.el"))]) (named-timer . [(20181120 2224) ((emacs (24 4))) "Simplified timer management for Emacs Lisp" tar ((:commit . "670b81e3eddef2e7353a4eedc9553a85306445db") (:authors ("Ryan C. Thompson")) (:maintainers ("Ryan C. Thompson")) (:maintainer "Ryan C. Thompson") (:keywords "tools") (:url . "https://github.com/DarwinAwardWinner/emacs-named-timer"))]) (nameframe . [(20221023 957) nil "Manage frames by name." tar ((:commit . "06d3400750c6b33ae215b9ac2922ee4dafd6b506") (:authors ("John Del Rosario" . "john2x@gmail.com")) (:maintainers ("John Del Rosario" . "john2x@gmail.com")) (:maintainer "John Del Rosario" . "john2x@gmail.com") (:url . "https://github.com/john2x/nameframe"))]) @@ -3379,28 +3465,29 @@ (narumi . [(20220228 243) ((emacs (26 1))) "A dashboard that displays a ramdom sampled image" tar ((:commit . "2f23f03a7b94766799f26605e167b259a4a90903") (:url . "https://github.com/nryotaro/narumi"))]) (nash-mode . [(20160830 1212) nil "Nash major mode" tar ((:commit . "bb7ae728a16812a0ef506483b877f6221c92ca9c") (:authors ("Tiago Natel de Moura")) (:maintainers ("Tiago Natel de Moura")) (:maintainer "Tiago Natel de Moura") (:keywords "nash" "languages") (:url . "https://github.com/tiago4orion/nash-mode.el"))]) (nasm-mode . [(20190410 342) ((emacs (24 3))) "NASM x86 assembly major mode" tar ((:commit . "65ca6546fc395711fac5b3b4299e76c2303d43a8") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainers ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/nasm-mode"))]) - (native-complete . [(20230505 1803) ((emacs (26 1))) "Shell completion using native complete mechanisms" tar ((:commit . "7b5e7d86c39ce9833118db278034789a6c0ecfd6") (:authors ("Troy Hinckley" . "troy.hinckley@gmail.com")) (:maintainers ("Troy Hinckley" . "troy.hinckley@gmail.com")) (:maintainer "Troy Hinckley" . "troy.hinckley@gmail.com") (:url . "https://github.com/CeleritasCelery/emacs-native-shell-complete"))]) + (native-complete . [(20231218 316) ((emacs (26 1))) "Shell completion using native complete mechanisms" tar ((:commit . "56b20b414a9298f45b0923edf633c7153b97892b") (:authors ("Troy Hinckley" . "troy.hinckley@gmail.com")) (:maintainers ("Troy Hinckley" . "troy.hinckley@gmail.com")) (:maintainer "Troy Hinckley" . "troy.hinckley@gmail.com") (:url . "https://github.com/CeleritasCelery/emacs-native-shell-complete"))]) (nav . [(20120507 707) nil "Emacs mode for filesystem navigation" tar ((:commit . "c5eb234c063f435dbdcd1f8bdc46cfc68c973ebe") (:authors ("Issac Trotts" . "issactrotts@google.com")) (:maintainers ("Issac Trotts" . "issactrotts@google.com")) (:maintainer "Issac Trotts" . "issactrotts@google.com"))]) (nav-flash . [(20220726 1117) ((emacs (25 1))) "Briefly highlight the current line" tar ((:commit . "5d4b48567862f6be0ca973d6b1dca90e4815cb9b") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "extensions" "navigation" "interface") (:url . "http://github.com/rolandwalker/nav-flash"))]) (navi-mode . [(20201220 1727) ((outshine (2 0)) (outorg (2 0))) "major-mode for easy buffer-navigation" tar ((:commit . "cf97e1e338815ad3a4d0bbbf4ff6dd1a4e322ca8") (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:url . "https://github.com/alphapapa/navi"))]) (navi2ch . [(20200130 36) nil "Navigator for 2ch for Emacsen" tar ((:commit . "7811dba052f679bd920a1f648d621a6fecace10f") (:authors ("Taiki SUGAWARA" . "taiki@users.sourceforge.net")) (:maintainers ("Taiki SUGAWARA" . "taiki@users.sourceforge.net")) (:maintainer "Taiki SUGAWARA" . "taiki@users.sourceforge.net") (:keywords "network" "2ch"))]) - (navigel . [(20230527 1620) ((emacs (25 1)) (tablist (1 0))) "Facilitate the creation of tabulated-list based UIs" tar ((:commit . "680b71f0f2017f9417504639d5c47366b102c2b7") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:url . "https://gitlab.petton.fr/DamienCassou/navigel"))]) + (navigel . [(20230903 835) ((emacs (25 1)) (tablist (1 0))) "Facilitate the creation of tabulated-list based UIs" tar ((:commit . "31320a6433093ca860508beee9f0e29a794c51ca") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:url . "https://github.com/DamienCassou/navigel"))]) (navorski . [(20141203 1824) ((s (1 9 0)) (dash (1 5 0)) (multi-term (0 8 14))) "Helping you live in the terminal, like Viktor did." tar ((:commit . "698c1c62da70164aebe9a7a5d034778fbc30ea5b") (:authors ("Roman Gonzalez , Tavis Rudd" . "tavis@birdseye-sw.com")) (:maintainers ("Roman Gonzalez" . "romanandreg@gmail.com")) (:maintainer "Roman Gonzalez" . "romanandreg@gmail.com") (:keywords "terminal"))]) - (naysayer-theme . [(20230720 2056) ((emacs (24))) "The naysayer color theme" tar ((:commit . "eafbc760e32728d2fe2b347621da222537372500") (:authors ("Nick Aversano" . "nickav@users.noreply.github.com")) (:maintainers ("Nick Aversano" . "nickav@users.noreply.github.com")) (:maintainer "Nick Aversano" . "nickav@users.noreply.github.com") (:url . "https://github.com/nickav/naysayer-theme.el"))]) + (naysayer-theme . [(20240220 2159) ((emacs (24))) "The naysayer color theme" tar ((:commit . "5e0bfaffb5162f3f35690ef3397a5ab63006042f") (:authors ("Nick Aversano" . "nickav@users.noreply.github.com")) (:maintainers ("Nick Aversano" . "nickav@users.noreply.github.com")) (:maintainer "Nick Aversano" . "nickav@users.noreply.github.com") (:url . "https://github.com/nickav/naysayer-theme.el"))]) (ncl-mode . [(20180129 703) ((emacs (24))) "Major Mode for editing NCL scripts and other goodies" tar ((:commit . "602292712a9e6b7e7c25155978999e77d06b7338") (:authors ("Yagnesh Raghava Yakkala" . "hi@yagnesh.org")) (:maintainer "Yagnesh Raghava Yakkala" . "hi@yagnesh.org") (:keywords "ncl" "major mode" "ncl-mode" "atmospheric science.") (:url . "https://github.com/yyr/ncl-mode"))]) (nclip . [(20130617 2015) nil "Network (HTTP) Clipboard" tar ((:commit . "af88e38b1f04be02bf2e57affc662dbd0f828e67") (:authors ("Marian Schubert" . "marian.schubert@gmail.com")) (:maintainers ("Marian Schubert" . "marian.schubert@gmail.com")) (:maintainer "Marian Schubert" . "marian.schubert@gmail.com") (:keywords "nclip" "clipboard" "network") (:url . "http://www.github.com/maio/nclip.el"))]) (neato-graph-bar . [(20181130 1649) ((emacs (24 3))) "Neat-o graph bars CPU/memory etc." tar ((:commit . "a7ae35afd67911e8924f36e646bce0d3e3c1bbe6") (:authors ("Robert Cochran" . "robert-git@cochranmail.com")) (:maintainers ("Robert Cochran" . "robert-git@cochranmail.com")) (:maintainer "Robert Cochran" . "robert-git@cochranmail.com") (:url . "https://gitlab.com/RobertCochran/neato-graph-bar"))]) - (neil . [(20230322 2035) ((emacs (27 1))) "companion for Babashka Neil" tar ((:commit . "19bc12d1c868eb5c1f200963c240a2a107982556") (:authors ("Ag Ibragimov" . "agzam.ibragimov@gmail.com")) (:maintainers ("Ag Ibragimov" . "agzam.ibragimov@gmail.com")) (:maintainer "Ag Ibragimov" . "agzam.ibragimov@gmail.com") (:keywords "convenience" "tools") (:url . "https://github.com/babashka/neil"))]) + (neil . [(20231214 736) ((emacs (27 1))) "companion for Babashka Neil" tar ((:commit . "abfe86474986a36c6c0daa56f8c4b6e1fb883743") (:authors ("Ag Ibragimov" . "agzam.ibragimov@gmail.com")) (:maintainers ("Ag Ibragimov" . "agzam.ibragimov@gmail.com")) (:maintainer "Ag Ibragimov" . "agzam.ibragimov@gmail.com") (:keywords "convenience" "tools") (:url . "https://github.com/babashka/neil"))]) (nemerle . [(20161029 2023) nil "major mode for editing nemerle programs" tar ((:commit . "8818c5af5598e16ea59189e1e3245f0a3d7c78f0") (:authors ("Jacek Sliwerski (rzyjontko)" . "rzyj@o2.pl")) (:maintainers ("Jacek Sliwerski (rzyjontko)" . "rzyj@o2.pl")) (:maintainer "Jacek Sliwerski (rzyjontko)" . "rzyj@o2.pl") (:keywords "nemerle" "mode" "languages"))]) (neon-mode . [(20180406 1156) nil "Simple major mode for editing neon files" tar ((:commit . "99d15e46beaf1e7d71e39a00cce810df1f33229d") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "conf"))]) (neotree . [(20230815 219) ((cl-lib (0 5))) "A tree plugin like NerdTree for Vim" tar ((:commit . "2b0cb8285352202c62b1e46a8aa265a5e4f9d966") (:authors ("jaypei" . "jaypei97159@gmail.com")) (:maintainers ("jaypei" . "jaypei97159@gmail.com")) (:maintainer "jaypei" . "jaypei97159@gmail.com") (:url . "https://github.com/jaypei/emacs-neotree"))]) - (nerd-icons . [(20230828 309) ((emacs (24 3))) "Emacs Nerd Font Icons Library" tar ((:commit . "93185612749c74a99a9b2c0934b4625eb34e1ff6") (:authors ("Hongyu Ding , Vincent Zhang" . "seagle0128@gmail.com")) (:maintainers ("Hongyu Ding , Vincent Zhang" . "seagle0128@gmail.com")) (:maintainer "Hongyu Ding , Vincent Zhang" . "seagle0128@gmail.com") (:keywords "lisp") (:url . "https://github.com/rainstormstudio/nerd-icons.el"))]) + (nerd-icons . [(20240319 833) ((emacs (24 3))) "Emacs Nerd Font Icons Library" tar ((:commit . "8095215a503d8048739de8b4ea4066598edb8cbb") (:authors ("Hongyu Ding , Vincent Zhang" . "seagle0128@gmail.com")) (:maintainers ("Hongyu Ding , Vincent Zhang" . "seagle0128@gmail.com")) (:maintainer "Hongyu Ding , Vincent Zhang" . "seagle0128@gmail.com") (:keywords "lisp") (:url . "https://github.com/rainstormstudio/nerd-icons.el"))]) (nerd-icons-completion . [(20230430 1611) ((emacs (25 1)) (nerd-icons (0 0 1))) "Add icons to completion candidates" tar ((:commit . "5cfee6ff1b9647c783bae944402d60440ce04cbb") (:authors ("Hongyu Ding" . "rainstormstudio@yahoo.com")) (:maintainers ("Hongyu Ding" . "rainstormstudio@yahoo.com")) (:maintainer "Hongyu Ding" . "rainstormstudio@yahoo.com") (:keywords "lisp") (:url . "https://github.com/rainstormstudio/nerd-icons-completion"))]) - (nerd-icons-dired . [(20230803 1848) ((emacs (24 4)) (nerd-icons (0 0 1))) "Shows icons for each file in dired mode" tar ((:commit . "00038929395a2a10ed5614b59161f29f9e0ffddc") (:authors ("Hongyu Ding" . "rainstormstudio@yahoo.com")) (:maintainers ("Hongyu Ding" . "rainstormstudio@yahoo.com")) (:maintainer "Hongyu Ding" . "rainstormstudio@yahoo.com") (:keywords "lisp") (:url . "https://github.com/rainstormstudio/nerd-icons-dired"))]) + (nerd-icons-corfu . [(20231019 1618) ((emacs (27 1)) (nerd-icons (0 1 0))) "Icons for Corfu via nerd-icons" tar ((:commit . "7077bb76fefc15aed967476406a19dc5c2500b3c") (:authors ("Luigi Sartor Piucco" . "luigipiucco@gmail.com")) (:maintainers ("Luigi Sartor Piucco" . "luigipiucco@gmail.com")) (:maintainer "Luigi Sartor Piucco" . "luigipiucco@gmail.com") (:keywords "convenience" "files" "icons") (:url . "https://github.com/LuigiPiucco/nerd-icons-corfu"))]) + (nerd-icons-dired . [(20231214 2155) ((emacs (24 4)) (nerd-icons (0 0 1))) "Shows icons for each file in dired mode" tar ((:commit . "c1c73488630cc1d19ce1677359f614122ae4c1b9") (:authors ("Hongyu Ding" . "rainstormstudio@yahoo.com")) (:maintainers ("Hongyu Ding" . "rainstormstudio@yahoo.com")) (:maintainer "Hongyu Ding" . "rainstormstudio@yahoo.com") (:keywords "lisp") (:url . "https://github.com/rainstormstudio/nerd-icons-dired"))]) (nerd-icons-ibuffer . [(20230417 1549) ((emacs (24 3)) (nerd-icons (0 0 1))) "Display nerd icons in ibuffer" tar ((:commit . "18c00c03a0d7193bab5e3374ec02c5428db057fd") (:authors ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainers ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainer "Vincent Zhang" . "seagle0128@gmail.com") (:keywords "convenience" "icons" "ibuffer") (:url . "https://github.com/seagle0128/nerd-icons-ibuffer"))]) (nerd-icons-ivy-rich . [(20230721 357) ((emacs (26 1)) (ivy-rich (0 1 0)) (nerd-icons (0 0 1))) "Excellent experience with nerd icons for ivy/counsel" tar ((:commit . "b3b605efa03d464d6138454ac3f60dcae50e7acb") (:authors ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainers ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainer "Vincent Zhang" . "seagle0128@gmail.com") (:keywords "convenience" "icons" "ivy") (:url . "https://github.com/seagle0128/nerd-icons-ivy-rich"))]) (nerdtab . [(20180811 339) ((emacs (24 5))) "Keyboard-oriented tabs" tar ((:commit . "601d531fa3748db733fbdff157a0f1cdf8a66416") (:authors ("Yuan Fu" . "casouri@gmail.com")) (:maintainers ("Yuan Fu" . "casouri@gmail.com")) (:maintainer "Yuan Fu" . "casouri@gmail.com") (:keywords "convenience") (:url . "https://github.com/casouri/nerdtab"))]) - (netease-cloud-music . [(20220305 1224) ((emacs (27 1)) (request (0 3 3))) "Netease Cloud Music client" tar ((:commit . "f238d1d45bbeee32e0a8d169f39de4360be908f4") (:authors ("SpringHan")) (:maintainers ("SpringHan")) (:maintainer "SpringHan") (:keywords "multimedia") (:url . "https://github.com/SpringHan/netease-cloud-music.git"))]) + (netease-cloud-music . [(20231226 1525) ((emacs (27 1)) (request (0 3 3))) "Netease Cloud Music client" tar ((:commit . "f5d622e2d376d995f412aef93d031836d8c9997c") (:authors ("SpringHan")) (:maintainers ("SpringHan")) (:maintainer "SpringHan") (:keywords "multimedia") (:url . "https://github.com/SpringHan/netease-cloud-music.git"))]) (netease-music . [(20210411 603) ((names (0 5)) (emacs (25))) "listen netease music" tar ((:commit . "db7f1eef2d8544983509db679be1cbe6a5678071") (:authors ("hiro方圆" . "wfy11235813@gmail.com")) (:maintainers ("hiro方圆" . "wfy11235813@gmail.com")) (:maintainer "hiro方圆" . "wfy11235813@gmail.com") (:keywords "multimedia" "chinese" "music") (:url . "https://github.com/nicehiro/netease-music"))]) (netherlands-holidays . [(20150202 1617) nil "Netherlands holidays for Emacs calendar." tar ((:commit . "26236178cdd650df9958bf5a086e184096559f00") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "calendar") (:url . "https://github.com/abo-abo/netherlands-holidays"))]) (netrunner . [(20160910 2332) ((popup (0 5 3)) (company (0 9 0)) (helm (1 9 5))) "Create Android: Netrunner decklists using Company, Helm and org-mode" tar ((:commit . "c64672992175c8c1073c0f56c2e471839db71a0f") (:authors ("Erik Sjöstrand")) (:maintainers ("Erik Sjöstrand")) (:maintainer "Erik Sjöstrand") (:keywords "games") (:url . "http://github.com/Kungsgeten/netrunner"))]) @@ -3419,8 +3506,8 @@ (night-owl-theme . [(20200622 1943) ((emacs (24))) "A color theme for the night owls out there" tar ((:commit . "50315d6a4e170dccc83bf2d59a8a761f5ea32bb6") (:authors ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainers ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainer "Aaron Jensen" . "aaronjensen@gmail.com") (:url . "http://github.com/aaronjensen/night-owl-theme"))]) (nikki . [(20210228 428) ((emacs (24 3))) "A simple diary mode" tar ((:commit . "b2ea20d04a061df88d72bd8dd0412a6e7876458d") (:authors ("Taiki Harada" . "thdev994@gmail.com")) (:maintainers ("Taiki Harada" . "thdev994@gmail.com")) (:maintainer "Taiki Harada" . "thdev994@gmail.com") (:keywords "convenience") (:url . "https://github.com/th994/nikki"))]) (nikola . [(20170703 2021) ((async (1 5)) (emacs (24 3))) "Simple wrapper for nikola" tar ((:commit . "964715ac30943c9d6976999cad208dc60d09def0") (:authors (": drymer ")) (:maintainers (": drymer ")) (:maintainer ": drymer ") (:keywords ":" "nikola") (:url . ": https://git.daemons.it/drymer/nikola.el"))]) - (nim-mode . [(20211102 917) ((emacs (24 4)) (epc (0 1 1)) (let-alist (1 0 1)) (commenter (0 5 1)) (flycheck-nimsuggest (0 8 1))) "A major mode for the Nim programming language" tar ((:commit . "744e076f0bea1c5ddc49f92397d9aa98ffa7eff8") (:authors ("Simon Hafner")) (:maintainers ("Simon Hafner" . "hafnersimon@gmail.com")) (:maintainer "Simon Hafner" . "hafnersimon@gmail.com") (:keywords "nim" "languages"))]) - (nimbus-theme . [(20230611 1619) ((emacs (24 1))) "Nimbus dark theme" tar ((:commit . "ae88d2997da80efaaece33ab7f554184ad72d962") (:authors ("Marcin Swieczkowski" . "marcin@realemail.net")) (:maintainers ("Marcin Swieczkowski" . "marcin@realemail.net")) (:maintainer "Marcin Swieczkowski" . "marcin@realemail.net") (:keywords "faces") (:url . "https://github.com/mrcnski/nimbus-theme"))]) + (nim-mode . [(20240220 1033) ((emacs (24 4)) (epc (0 1 1)) (let-alist (1 0 1)) (commenter (0 5 1)) (flycheck-nimsuggest (0 8 1))) "A major mode for the Nim programming language" tar ((:commit . "625cc023bd75a741b7d4e629e5bec3a52f45b4be") (:authors ("Simon Hafner")) (:maintainers ("Simon Hafner" . "hafnersimon@gmail.com")) (:maintainer "Simon Hafner" . "hafnersimon@gmail.com") (:keywords "nim" "languages") (:url . "https://github.com/nim-lang/nim-mode"))]) + (nimbus-theme . [(20231227 1644) ((emacs (24 1))) "Nimbus dark theme" tar ((:commit . "09e6dcdd491c7aa5aa355e441a03492991830ad1") (:authors ("Marcin Swieczkowski" . "marcin@realemail.net")) (:maintainers ("Marcin Swieczkowski" . "marcin@realemail.net")) (:maintainer "Marcin Swieczkowski" . "marcin@realemail.net") (:keywords "faces") (:url . "https://github.com/mrcnski/nimbus-theme"))]) (ninja-mode . [(20230421 1748) ((emacs (24))) "Major mode for editing .ninja files" tar ((:commit . "adf9bddd73869084a505fac83246e55c35880079"))]) (nix-buffer . [(20180212 1518) ((f (0 17 3)) (emacs (24 4))) "Set up buffer environments with nix" tar ((:commit . "db57cda36e7477bdc7ef5a136357b971b1d4d099") (:authors ("Shea Levy")) (:maintainers ("Shea Levy")) (:maintainer "Shea Levy") (:url . "https://github.com/shlevy/nix-buffer/tree/master/"))]) (nix-env-install . [(20200812 1305) ((emacs (25 1))) "Install packages using nix-env" tar ((:commit . "79c34bc117ba1cebeb67fab32c364951d2ec37a0") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainers ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:keywords "processes" "tools") (:url . "https://github.com/akirak/nix-env-install"))]) @@ -3428,7 +3515,7 @@ (nix-mode . [(20230421 2036) ((emacs (25 1)) (magit-section (0)) (transient (0 3))) "Major mode for editing .nix files" tar ((:commit . "719feb7868fb567ecfe5578f6119892c771ac5e5") (:maintainers ("Matthew Bauer" . "mjbauer95@gmail.com")) (:maintainer "Matthew Bauer" . "mjbauer95@gmail.com") (:keywords "nix" "languages" "tools" "unix") (:url . "https://github.com/NixOS/nix-mode"))]) (nix-modeline . [(20210405 742) ((emacs (25 1))) "Info about in-progress Nix evaluations on your modeline" tar ((:commit . "9a6116a11bdacf649f2c50ae1f2f4b12c03bed70") (:authors ("Jordan Mulcahey" . "snhjordy@gmail.com")) (:maintainers ("Jordan Mulcahey" . "snhjordy@gmail.com")) (:maintainer "Jordan Mulcahey" . "snhjordy@gmail.com") (:keywords "processes" "unix" "tools") (:url . "https://github.com/ocelot-project/nix-modeline"))]) (nix-sandbox . [(20210325 1622) ((dash (2 12 1)) (s (1 10 0))) "Utility functions to work with nix-shell sandboxes" tar ((:commit . "d3ec98405f1f9dac833abf9e146249b1b943870d") (:authors ("Sven Keidel" . "svenkeidel@gmail.com")) (:maintainers ("Sven Keidel" . "svenkeidel@gmail.com")) (:maintainer "Sven Keidel" . "svenkeidel@gmail.com") (:url . "https://github.com/travisbhartwell/nix-emacs"))]) - (nix-ts-mode . [(20230821 1334) ((emacs (29 1))) "Major mode for Nix expressions, powered by tree-sitter" tar ((:commit . "670023ec3d4e2f667a387a27990b4879e06ef60b") (:maintainers ("Remi Gelinas" . "mail@remigelin.as")) (:maintainer "Remi Gelinas" . "mail@remigelin.as") (:keywords "nix" "languages") (:url . "https://github.com/remi-gelinas/nix-ts-mode"))]) + (nix-ts-mode . [(20231107 1639) ((emacs (29 1))) "Major mode for Nix expressions, powered by tree-sitter" tar ((:commit . "2dddc6e9ca33be211675afca3896fd661fc38a0c") (:maintainers ("Remi Gelinas" . "mail@remigelin.as")) (:maintainer "Remi Gelinas" . "mail@remigelin.as") (:keywords "nix" "languages") (:url . "https://github.com/remi-gelinas/nix-ts-mode"))]) (nix-update . [(20220816 2212) ((emacs (25))) "Update \"fetch\" blocks in .nix expressions" tar ((:commit . "aab70a38165575a9cb41726f1cc67df60fbf2832") (:authors ("John Wiegley" . "johnw@newartisans.com")) (:maintainers ("John Wiegley" . "johnw@newartisans.com")) (:maintainer "John Wiegley" . "johnw@newartisans.com") (:keywords "nix") (:url . "https://github.com/jwiegley/nix-update-el"))]) (nixos-options . [(20160209 1841) ((emacs (24))) "Interface for browsing and completing NixOS options." tar ((:commit . "045825c2e1cf0a4fb0a472e72c1dae8f55202cef") (:authors ("Diego Berrocal" . "cestdiego@gmail.com") ("Travis B. Hartwell" . "nafai@travishartwell.net")) (:maintainers ("Diego Berrocal" . "cestdiego@gmail.com")) (:maintainer "Diego Berrocal" . "cestdiego@gmail.com") (:keywords "unix") (:url . "http://www.github.com/travisbhartwell/nix-emacs/"))]) (nixpkgs-fmt . [(20200327 2302) ((emacs (24)) (reformatter (0 3))) "Reformat Nix using nixpkgs-fmt" tar ((:commit . "83e03d6f20bdf79c1c448c15734367b1a7cc6b02") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "languages") (:url . "https://github.com/purcell/emacs-nixpkgs-fmt"))]) @@ -3439,35 +3526,37 @@ (nnir-est . [(20180710 2103) nil "Gnus nnir interface for HyperEstraier" tar ((:commit . "6d0d5c8e33f4e4ccbc22350324c0990d2676fb5a") (:authors ("KAWABATA, Taichi ")) (:maintainers ("KAWABATA, Taichi ")) (:maintainer "KAWABATA, Taichi ") (:keywords "mail") (:url . "https://github.com/kawabata/nnir-est"))]) (nnreddit . [(20230705 1328) ((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 . "221963fb0b7116729829145f055ed750d0e2f961") (:keywords "news") (:url . "https://github.com/dickmao/nnreddit"))]) (nntwitter . [(20230705 1110) ((emacs (25 1)) (dash (20190401)) (anaphora (20180618)) (request (20190819))) "Gnus Backend For Twitter" tar ((:commit . "e27acca9beeb6645dd13545d42f6d4d97d59d82c") (:keywords "news") (:url . "https://github.com/dickmao/nntwitter"))]) - (no-clown-fiesta-theme . [(20230220 1019) ((emacs (26 1)) (autothemer (0 2))) "Not-so-colorful-theme" tar ((:commit . "e143cdfa7cecac6383328eca88586105f308bca9") (:authors ("ranmaru22")) (:maintainers ("ranmaru22")) (:maintainer "ranmaru22") (:url . "https://github.com/ranmaru22/no-clown-fiesta-theme.el"))]) + (no-clown-fiesta-theme . [(20231214 2115) ((emacs (26 1)) (autothemer (0 2))) "Not-so-colorful-theme" tar ((:commit . "0cd04a72aa5dcf61e82e2a613670334816326b02") (:authors ("ranmaru22")) (:maintainers ("ranmaru22")) (:maintainer "ranmaru22") (:url . "https://github.com/ranmaru22/no-clown-fiesta-theme.el"))]) (no-emoji . [(20180515 1837) ((emacs (24))) "Show :emoji-name: instead of emoji characters" tar ((:commit . "ebceeab50dbfe4d60235180a57633745dbc18c77") (:authors ("Peter" . "craven@gmx.net")) (:maintainers ("Peter" . "craven@gmx.net")) (:maintainer "Peter" . "craven@gmx.net") (:keywords "extensions") (:url . "https://github.com/ecraven/no-emoji"))]) - (no-littering . [(20230801 1005) ((emacs (25 1)) (compat (29 1 4 2))) "Help keeping ~/.config/emacs clean" tar ((:commit . "fcfd51fbdf08469e6d1b59bc4bd2d75aa708c791") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience") (:url . "https://github.com/emacscollective/no-littering"))]) + (no-littering . [(20240228 1233) ((emacs (25 1)) (compat (29 1 4 2))) "Help keeping ~/.config/emacs clean" tar ((:commit . "5c2d4862cc967991a030067dad72ce20db97ae4c") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("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" tar ((:commit . "860860e4a0d59bd15c8e092dc42f5f7f769a428e") (:authors ("Daniel Phan" . "daniel.phan36@gmail.com")) (:maintainers ("Daniel Phan" . "daniel.phan36@gmail.com")) (:maintainer "Daniel Phan" . "daniel.phan36@gmail.com") (:keywords "keyboard" "tools") (:url . "https://github.com/mamapanda/no-spam"))]) - (noaa . [(20230718 526) ((emacs (27 1)) (kv (0 0 19)) (request (0 2 0)) (s (1 12 0))) "Get NOAA weather data" tar ((:commit . "0e40721ff97d1311e2b5d392344a961421fa75f0") (:authors ("David Thompson")) (:maintainers ("David Thompson")) (:maintainer "David Thompson") (:keywords "calendar") (:url . "https://github.com/thomp/noaa"))]) + (noaa . [(20240317 2321) ((emacs (27 1)) (kv (0 0 19)) (request (0 2 0)) (s (1 12 0))) "Get NOAA weather data" tar ((:commit . "7d68b5a580c64123f3bbd75f795a891dfdeb1746") (:authors ("David Thompson")) (:maintainers ("David Thompson")) (:maintainer "David Thompson") (:keywords "calendar") (:url . "https://codeberg.org/thomp/noaa"))]) (noccur . [(20191015 719) nil "Run multi-occur on project/dired files" tar ((:commit . "fa91647a305e89561d3dbe53da002fff49abe0bb") (:authors ("Nicolas Petton" . "petton.nicolas@gmail.com")) (:maintainers ("Nicolas Petton" . "petton.nicolas@gmail.com")) (:maintainer "Nicolas Petton" . "petton.nicolas@gmail.com") (:keywords "convenience"))]) (nocomments-mode . [(20170213 2037) nil "Minor mode that makes comments invisible." tar ((:commit . "5a41a20cc44dfe4a9ea584354ed6dbc15dd92f46") (:authors ("Anders Lindgren")) (:maintainers ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:url . "https://github.com/Lindydancer/nocomments-mode"))]) (noctilux-theme . [(20161113 1442) ((emacs (24))) "Dark theme inspired by LightTable" tar ((:commit . "a3265a1be7f4d73f44acce6d968ca6f7add1f2ca") (:authors ("Simon Manning" . "simon@ecksdee.org")) (:maintainers ("Simon Manning" . "simon@ecksdee.org")) (:maintainer "Simon Manning" . "simon@ecksdee.org") (:url . "https://github.com/sjrmanning/noctilux-theme"))]) (node-resolver . [(20140930 1723) ((cl-lib (0 5))) "hook to install node modules in background" tar ((:commit . "ef9d0486907a746a80b02ffc6208a09c168a9f7c") (:authors ("Dave Justice")) (:maintainers ("Dave Justice")) (:maintainer "Dave Justice") (:keywords "convenience" "nodejs" "javascript" "npm") (:url . "https://github.com/meandavejustice/node-resolver.el"))]) - (nodejs-repl . [(20200802 1310) nil "Run Node.js REPL" tar ((:commit . "3b841055cad00f442e4a9159b1056f59411b6646") (:authors ("Takeshi Arabiki")) (:maintainers ("Takeshi Arabiki")) (:maintainer "Takeshi Arabiki"))]) + (nodejs-repl . [(20240218 2357) nil "Run Node.js REPL" tar ((:commit . "77a864ca72a6c30217085f1c4db5de72e47eb4da") (:authors ("Takeshi Arabiki")) (:maintainers ("Takeshi Arabiki")) (:maintainer "Takeshi Arabiki"))]) (nodemcu-mode . [(20180501 2225) ((emacs (25))) "Minor mode for NodeMCU" tar ((:commit . "8effd9f3df40b6b92a2f05e4d54750b624afc4a7") (:authors ("Andreas Müller" . "code@0x7.ch")) (:maintainers ("Andreas Müller" . "code@0x7.ch")) (:maintainer "Andreas Müller" . "code@0x7.ch") (:keywords "tools") (:url . "https://github.com/andrmuel/nodemcu-mode"))]) (noflet . [(20141102 1454) nil "locally override functions" tar ((:commit . "7ae84dc3257637af7334101456dafe1759c6b68a") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainers ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:keywords "lisp") (:url . "https://github.com/nicferrier/emacs-noflet"))]) (nofrils-acme-theme . [(20180620 1248) ((emacs (24))) "Port of \"No Frils Acme\" Vim theme." tar ((:commit . "98ad7bfaff1d85b33dc162645670285b067c6f92") (:authors ("Eric Sessoms" . "esessoms@protonmail.com")) (:maintainers ("Eric Sessoms" . "esessoms@protonmail.com")) (:maintainer "Eric Sessoms" . "esessoms@protonmail.com") (:url . "https://gitlab.com/esessoms/nofrils-theme"))]) (noir-mode . [(20230726 2309) ((emacs (25 1)) (rust-mode (1 0 5))) "Description" tar ((:commit . "aa6686e15a63498af327cc64f1d79e84c60bda42") (:authors ("Hamza Hamud")) (:maintainers ("Hamza Hamud")) (:maintainer "Hamza Hamud") (:keywords "languages") (:url . "https://github.com/hhamud/noir-mode"))]) + (noir-ts-mode . [(20230827 2052) ((emacs (29 1))) "tree-sitter support for Noir" tar ((:commit . "bb47c9b770b7401c0ecdac0bb54466df6ca62d29") (:authors ("Hamza Hamud" . "self@hamzahamud.com")) (:maintainers ("Hamza Hamud" . "self@hamzahamud.com")) (:maintainer "Hamza Hamud" . "self@hamzahamud.com") (:keywords "noir" "languages" "tree-sitter") (:url . "https://github.com/hhamud/noir-ts-mode"))]) + (non-edit-mode . [(20230926 1404) ((emacs (24 1))) "Minor mode that disables editing" tar ((:commit . "bc9d29e437d70675c725f3ef8a66abe574b9a142") (:authors ("aragaer" . "aragaer@gmail.com")) (:maintainers ("aragaer" . "aragaer@gmail.com")) (:maintainer "aragaer" . "aragaer@gmail.com") (:keywords "convenience") (:url . "https://gitlab.com/aragaer/non-edit-mode"))]) (nord-theme . [(20230311 1131) ((emacs (24))) "An arctic, north-bluish clean and elegant theme" tar ((:commit . "5335a7e782fd4ea5b33cd630feae37d902709024") (:authors ("Sven Greb" . "development@svengreb.de")) (:maintainers ("Sven Greb" . "development@svengreb.de")) (:maintainer "Sven Greb" . "development@svengreb.de") (:url . "https://github.com/nordtheme/emacs"))]) - (nordic-night-theme . [(20230822 1608) ((emacs (24 1))) "A darker, more colorful version of the lovely Nord theme" tar ((:commit . "66aa555af2552fe6d1efd3170f199edd0d44fced") (:authors ("Ashton Wiersdorf" . "mail@wiersdorf.dev")) (:maintainers ("Ashton Wiersdorf" . "mail@wiersdorf.dev")) (:maintainer "Ashton Wiersdorf" . "mail@wiersdorf.dev") (:url . "https://sr.ht/~ashton314/nordic-night/"))]) + (nordic-night-theme . [(20240311 2147) ((emacs (24 1))) "A darker, more colorful version of the lovely Nord theme" tar ((:commit . "a9e5918c7755ccb1fa20d3d8e3a3ea069455f87b") (:authors ("Ashton Wiersdorf" . "mail@wiersdorf.dev")) (:maintainers ("Ashton Wiersdorf" . "mail@wiersdorf.dev")) (:maintainer "Ashton Wiersdorf" . "mail@wiersdorf.dev") (:url . "https://codeberg.org/ashton314/nordic-night"))]) (nordless-theme . [(20201222 1627) ((colorless-themes (0 2))) "A mostly colorless version of nord-theme" tar ((:commit . "1b2a507b3b7f9559c944af8fc7531a60b38ae0c3") (:authors ("Thomas Letan" . "lthms@soap.coffee")) (:maintainers ("Thomas Letan" . "lthms@soap.coffee")) (:maintainer "Thomas Letan" . "lthms@soap.coffee") (:keywords "faces" "theme") (:url . "https://git.sr.ht/~lthms/colorless-themes.el"))]) (norns . [(20230820 2157) ((emacs (27 1)) (dash (2 17 0)) (s (1 12 0)) (f (0 20 0)) (request (0 3 2)) (websocket (1 13)) (lua-mode (20221218 605))) "Interactive development environment for monome norns" tar ((:commit . "7e8b73b621db7494a22914b16c614ef80521f7f7") (:keywords "processes" "terminals") (:url . "https://github.com/p3r7/norns.el"))]) (northcode-theme . [(20180423 1649) ((emacs (24))) "A dark theme focused on blue and orange colors." tar ((:commit . "4d3750461ba25ec45321318b5f1af4e8fdf16147") (:authors ("Andreas Larsen" . "andreas@northcode.no")) (:maintainers ("Andreas Larsen" . "andreas@northcode.no")) (:maintainer "Andreas Larsen" . "andreas@northcode.no") (:url . "https://github.com/Northcode/northcode-theme.el"))]) (nothing-theme . [(20200504 402) ((emacs (24 1))) "Monochrome theme" tar ((:commit . "17fc9ecc94af0c919a24c4fe92bb48890bb4c3b0") (:authors ("Jared Gorski," . "jaredgorski6@gmail.com")) (:maintainers ("Jared Gorski," . "jaredgorski6@gmail.com")) (:maintainer "Jared Gorski," . "jaredgorski6@gmail.com") (:url . "https://github.com/jaredgorski/nothing.el"))]) (notink-theme . [(20220114 1955) ((emacs (26 1))) "A custom theme inspired by e-ink displays" tar ((:commit . "6115857fe75c1adbbce4165a2b77a11a271aaf31") (:authors ("MetroWind" . "chris.corsair@gmail.com")) (:maintainers ("MetroWind" . "chris.corsair@gmail.com")) (:maintainer "MetroWind" . "chris.corsair@gmail.com") (:keywords "faces") (:url . "https://github.com/MetroWind/notink-theme"))]) - (notmuch . [(20230221 1455) nil "run notmuch within emacs" tar ((:commit . "48d774bbf4dc6e442e1be96aab712947b408fc5a") (:url . "https://notmuchmail.org"))]) - (notmuch-addr . [(20230511 2057) ((emacs (27 1)) (compat (29 1 4 1)) (notmuch (0 37))) "An alternative to notmuch-address.el" tar ((:commit . "89ced49cf3fb4d62bd4fea8bf9bd53ec8e4c7176") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "mail") (:url . "https://git.sr.ht/~tarsius/notmuch-addr"))]) + (notmuch . [(20231006 2337) nil "run notmuch within emacs" tar ((:commit . "e4ead7656c72092bf30c43283057c2d4c4107962") (:url . "https://notmuchmail.org"))]) + (notmuch-addr . [(20240101 2221) ((emacs (27 1)) (compat (29 1 4 1)) (notmuch (0 37))) "An alternative to notmuch-address.el" tar ((:commit . "1253c6ff1359acef42f04c021c6204b8e726b071") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "mail") (:url . "https://git.sr.ht/~tarsius/notmuch-addr"))]) (notmuch-bookmarks . [(20230727 1504) ((seq (2 20)) (emacs (26 1)) (notmuch (0 29 3))) "Add bookmark handling for notmuch buffers" tar ((:commit . "7c053fd2d278dc3a9f07f86975867bfbb4e7448d") (:authors ("Jörg Volbers" . "joerg@joergvolbers.de")) (:maintainers ("Jörg Volbers" . "joerg@joergvolbers.de")) (:maintainer "Jörg Volbers" . "joerg@joergvolbers.de") (:keywords "mail") (:url . "https://github.com/publicimageltd/notmuch-bookmarks"))]) (notmuch-labeler . [(20131230 1719) ((notmuch (0))) "Improve notmuch way of displaying labels" tar ((:commit . "d65d1129555d368243df4770ecc1e7ccb88efc58") (:authors ("Damien Cassou" . "damien.cassou@gmail.com")) (:maintainers ("Damien Cassou" . "damien.cassou@gmail.com")) (:maintainer "Damien Cassou" . "damien.cassou@gmail.com") (:keywords "emacs" "package" "elisp" "notmuch" "emails") (:url . "https://github.com/DamienCassou/notmuch-labeler"))]) - (notmuch-maildir . [(20230511 2056) ((emacs (26 1)) (compat (29 1 4 1)) (notmuch (0 37))) "Visualize maildirs as a tree" tar ((:commit . "4686e8e7b6d88439d4b0c39c7b17502b102a6f58") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "mail") (:url . "https://git.sr.ht/~tarsius/notmuch-maildir"))]) - (notmuch-transient . [(20230511 2054) ((emacs (27 1)) (compat (29 1 4 1)) (notmuch (0 37)) (transient (0 4 0))) "Command dispatchers for Notmuch" tar ((:commit . "3eeabdd9c922836d24433786265ef7c25fb599b2") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "mail") (:url . "https://git.sr.ht/~tarsius/notmuch-transient"))]) + (notmuch-maildir . [(20240101 2221) ((emacs (26 1)) (compat (29 1 4 1)) (notmuch (0 37))) "Visualize maildirs as a tree" tar ((:commit . "2b6a49c8b1f35338bb231f39155b6da0a0b639d5") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "mail") (:url . "https://git.sr.ht/~tarsius/notmuch-maildir"))]) + (notmuch-transient . [(20240302 2332) ((emacs (27 1)) (compat (29 1 4 4)) (notmuch (0 38 2)) (transient (0 5 2))) "Command dispatchers for Notmuch" tar ((:commit . "f08ef922b88d90a7cad348743c8470f443b1fa8e") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "mail") (:url . "https://git.sr.ht/~tarsius/notmuch-transient"))]) (nov . [(20230715 1434) ((esxml (0 3 6)) (emacs (25 1))) "Featureful EPUB reader mode" tar ((:commit . "cc31ce0356226c3a2128119b08de6107e38fdd17") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainers ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de") (:keywords "hypermedia" "multimedia" "epub") (:url . "https://depp.brause.cc/nov.el"))]) - (nova-theme . [(20230824 401) ((emacs (24 3))) "A dark, pastel color theme" tar ((:commit . "c11aea3ce572cc940bc201cb5a33c0d2014cf8c4") (:authors ("Muir Manders" . "muir+emacs@mnd.rs")) (:maintainers ("Muir Manders" . "muir+emacs@mnd.rs")) (:maintainer "Muir Manders" . "muir+emacs@mnd.rs") (:keywords "theme" "dark" "nova" "pastel" "faces") (:url . "https://github.com/muirmanders/emacs-nova-theme"))]) + (nova-theme . [(20230906 1542) ((emacs (24 3))) "A dark, pastel color theme" tar ((:commit . "ca1a4cb71452ece3e18c0c46f9e7abc20f7123ca") (:authors ("Muir Manders" . "muir+emacs@mnd.rs")) (:maintainers ("Muir Manders" . "muir+emacs@mnd.rs")) (:maintainer "Muir Manders" . "muir+emacs@mnd.rs") (:keywords "theme" "dark" "nova" "pastel" "faces") (:url . "https://github.com/muirmanders/emacs-nova-theme"))]) (noxml-fold . [(20170823 1357) nil "Fold away XML things." tar ((:commit . "46c7f6a008672213238a9f8d7a416ce80916aa62") (:authors ("Patrick McAllister" . "pma@rdorte.org")) (:maintainers ("Patrick McAllister" . "pma@rdorte.org")) (:maintainer "Patrick McAllister" . "pma@rdorte.org") (:keywords "xml" "folding") (:url . "https://github.com/paddymcall/noxml-fold"))]) (npm . [(20220428 927) ((emacs (25 1)) (transient (0 1 0)) (jest (20200625))) "Run your npm workflows" tar ((:commit . "6eb0a58274870dd75bf848cf5a916a9f2c6ddae5") (:authors ("Shane Kennedy")) (:maintainers ("Shane Kennedy")) (:maintainer "Shane Kennedy") (:keywords "tools") (:url . "https://github.com/shaneikennedy/npm.el"))]) (npm-mode . [(20190616 2025) ((emacs (24 1))) "minor mode for working with npm projects" tar ((:commit . "3ee7c0bad5b7a041d4739ef3aaa06a3dc764e5eb") (:authors ("Allen Gooch" . "allen.gooch@gmail.com")) (:maintainers ("Allen Gooch" . "allen.gooch@gmail.com")) (:maintainer "Allen Gooch" . "allen.gooch@gmail.com") (:keywords "convenience" "project" "javascript" "node" "npm") (:url . "https://github.com/mojochao/npm-mode"))]) @@ -3482,9 +3571,9 @@ (number-lock . [(20160830 200) nil "Enter symbols on your number keys without pressing shift" tar ((:commit . "1ac1b1a269128ddac820df7d45a8d0c703e9c05c") (:authors ("Liu233w" . "wwwlsmcom@outlook.com")) (:maintainers ("Liu233w" . "wwwlsmcom@outlook.com")) (:maintainer "Liu233w" . "wwwlsmcom@outlook.com") (:keywords "convenience") (:url . "https://github.com/Liu233w/number-lock.el"))]) (numbers . [(20170802 1134) ((emacs (24))) "Display information and trivia about numbers" tar ((:commit . "dd02508b788a13b7d4dbcc4923fa23134b783ab3") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainers ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:keywords "games" "trivia" "maths" "numbers") (:url . "https://github.com/davep/numbers.el"))]) (numbex . [(20230601 1618) ((emacs (26 1))) "Manage numbered examples" tar ((:commit . "b64f51388726363fc0d154219e2270c6b9c5ce19") (:authors ("Enrico Flor" . "enrico@eflor.net")) (:maintainers ("Enrico Flor" . "enrico@eflor.net")) (:maintainer "Enrico Flor" . "enrico@eflor.net") (:url . "https://github.com/enricoflor/numbex"))]) - (nummm-mode . [(20131117 1014) nil "Display the number of minor modes instead of their names" tar ((:commit . "73b1aa8643d86197c82cd28acdaefcb48a1e0abe") (:authors ("Andreu Gil" . "agpchil@gmail.com")) (:maintainers ("Andreu Gil" . "agpchil@gmail.com")) (:maintainer "Andreu Gil" . "agpchil@gmail.com") (:url . "http://github.com/agpchil/nummm-mode"))]) (numpydoc . [(20230811 1708) ((emacs (25 1)) (s (1 12 0)) (dash (2 18 0))) "NumPy style docstring insertion" tar ((:commit . "77e2893442c6e20af9c99b9ba2c6c11988fe0e80") (:authors ("Doug Davis" . "ddavis@ddavis.io")) (:maintainers ("Doug Davis" . "ddavis@ddavis.io")) (:maintainer "Doug Davis" . "ddavis@ddavis.io") (:keywords "convenience") (:url . "https://github.com/douglasdavis/numpydoc.el"))]) - (nushell-mode . [(20230612 726) ((emacs (24 4))) "Major mode for Nushell scripts" tar ((:commit . "ff8f8013af3076c041bd5235a54776890f4c4d0e") (:authors ("Azzam S.A" . "vcs@azzamsa.com")) (:maintainers ("Azzam S.A" . "vcs@azzamsa.com")) (:maintainer "Azzam S.A" . "vcs@azzamsa.com") (:keywords "languages" "unix") (:url . "https://github.com/mrkkrp/nushell-mode"))]) + (nushell-mode . [(20231204 1233) ((emacs (24 4))) "Major mode for Nushell scripts" tar ((:commit . "e92791e06ea13b93be38874111b83172d6de67c1") (:authors ("Azzam S.A" . "vcs@azzamsa.com")) (:maintainers ("Azzam S.A" . "vcs@azzamsa.com")) (:maintainer "Azzam S.A" . "vcs@azzamsa.com") (:keywords "languages" "unix") (:url . "https://github.com/mrkkrp/nushell-mode"))]) + (nushell-ts-mode . [(20230911 152) ((emacs (29 1))) "Tree-sitter support for Nushell" tar ((:commit . "68afe1a8275880995b4d9a122fecf4accca15183") (:authors ("Herbert Jones" . "jones.herbert@gmail.com")) (:maintainers ("Herbert Jones" . "jones.herbert@gmail.com")) (:maintainer "Herbert Jones" . "jones.herbert@gmail.com") (:keywords "nu" "nushell" "languages" "tree-sitter") (:url . "https://github.com/herbertjones/nushell-ts-mode"))]) (nv-delete-back . [(20170224 1249) ((emacs (24))) "backward delete like modern text editors" tar ((:commit . "44d506105989873dc1725e0cfc675925b35c9c98") (:authors ("Nicolas Vaughan ")) (:maintainers ("Nicolas Vaughan ")) (:maintainer "Nicolas Vaughan ") (:keywords "lisp"))]) (nvm . [(20210826 1000) ((s (1 8 0)) (dash (2 18 0)) (f (0 14 0))) "Manage Node versions within Emacs" tar ((:commit . "c214762fd6f539ec3e1fd8198cefbdb4b428b19c") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainers ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:keywords "node" "nvm") (:url . "http://github.com/rejeep/nvm.el"))]) (nxml-uxml . [(20220606 1213) ((emacs (25))) "MicroXML support for nXML" tar ((:commit . "95bbd0018ab218b9f39f5bf1f1e809f60fbc3edc") (:authors ("Daphne Preston-Kendal")) (:maintainers ("Daphne Preston-Kendal")) (:maintainer "Daphne Preston-Kendal") (:keywords "languages" "xml" "microxml") (:url . "https://gitlab.com/dpk/nxml-uxml"))]) @@ -3496,19 +3585,20 @@ (ob-applescript . [(20190709 1607) nil "Org-babel functions for AppleScript" tar ((:commit . "2b07b77b75bd02f2102f62e6d52ffdd0f921439a") (:authors ("Stig Brautaset")) (:maintainers ("Stig Brautaset")) (:maintainer "Stig Brautaset") (:keywords "literate programming" "reproducible research" "mac") (:url . "http://github.com/stig/ob-applescript.el"))]) (ob-async . [(20210428 2052) ((async (1 9)) (org (9 0 1)) (emacs (24 4)) (dash (2 14 1))) "Asynchronous org-babel src block execution" tar ((:commit . "9aac486073f5c356ada20e716571be33a350a982") (:authors ("Andrew Stahlman" . "andrewstahlman@gmail.com")) (:maintainers ("Andrew Stahlman" . "andrewstahlman@gmail.com")) (:maintainer "Andrew Stahlman" . "andrewstahlman@gmail.com") (:keywords "tools") (:url . "https://github.com/astahlman/ob-async"))]) (ob-axiom . [(20220612 1535) ((emacs (24 2)) (axiom-environment (20171021))) "An org-babel backend for the axiom-environment system" tar ((:commit . "01d88daa0c864af9918db5a147fbb5e435dec199") (:authors ("Paul Onions")) (:maintainers ("Paul Onions")) (:maintainer "Paul Onions") (:keywords "axiom" "openaxiom" "fricas"))]) + (ob-base64 . [(20240211 1201) ((emacs (26 1))) "Org-babel for base64 content" tar ((:commit . "28a8f448fd706a071b351634482e5c46f80e7d46") (:authors ("Peter Badida" . "keyweeusr@gmail.com")) (:maintainers ("Peter Badida" . "keyweeusr@gmail.com")) (:maintainer "Peter Badida" . "keyweeusr@gmail.com") (:keywords "convenience" "embedding" "orgmode" "base64" "rendering") (:url . "https://github.com/keyweeusr/ob-base64"))]) (ob-bitfield . [(20220401 600) ((emacs (24 4))) "Babel Functions for bitfield" tar ((:commit . "abe3d8fe49dc53c4663def689ceb5c0433638652") (:authors ("Gulshan Singh")) (:maintainers ("Gulshan Singh")) (:maintainer "Gulshan Singh") (:url . "https://github.com/gsingh93/ob-bitfield"))]) (ob-blockdiag . [(20210412 1541) nil "org-babel functions for blockdiag evaluation" tar ((:commit . "e997644e81cc67a7092e6e9bb13c66f160491efb") (:authors ("Dmitry Moskowski")) (:maintainers ("Dmitry Moskowski")) (:maintainer "Dmitry Moskowski") (:keywords "tools" "convenience") (:url . "https://github.com/corpix/ob-blockdiag.el"))]) (ob-browser . [(20170720 1918) ((org (8))) "Render HTML in org-mode blocks." tar ((:commit . "a347d9df1c87b7eb660be8723982c7ad2563631a") (:authors ("Kris Jenkins" . "krisajenkins@gmail.com")) (:maintainers ("Kris Jenkins" . "krisajenkins@gmail.com")) (:maintainer "Kris Jenkins" . "krisajenkins@gmail.com") (:keywords "org" "babel" "browser" "phantomjs") (:url . "https://github.com/krisajenkins/ob-browser"))]) (ob-cfengine3 . [(20230226 1954) ((emacs (24 1))) "Org Babel functions for CFEngine 3" tar ((:commit . "52aa32fdfa412860837e795d17d50dac237e56e4") (:authors ("Nick Anderson" . "nick@cmdln.org")) (:maintainers ("Nick Anderson" . "nick@cmdln.org")) (:maintainer "Nick Anderson" . "nick@cmdln.org") (:keywords "tools" "convenience") (:url . "https://github.com/nickanderson/ob-cfengine3"))]) - (ob-chatgpt-shell . [(20230708 1957) ((emacs (27 1)) (chatgpt-shell (0 60 1))) "Org babel functions for ChatGPT evaluation" tar ((:commit . "345f9d0e9047091474a2cea3d12b6e52b804ae36") (:authors ("Alvaro Ramirez")) (:maintainers ("Alvaro Ramirez")) (:maintainer "Alvaro Ramirez") (:url . "https://github.com/xenodium/chatgpt-shell"))]) + (ob-chatgpt-shell . [(20240213 1729) ((emacs (27 1)) (chatgpt-shell (1 0 3))) "Org babel functions for ChatGPT evaluation" tar ((:commit . "2657079cb4d83d4fdcc0de4d5d225ed7e960ac9b") (:authors ("Alvaro Ramirez")) (:maintainers ("Alvaro Ramirez")) (:maintainer "Alvaro Ramirez") (:url . "https://github.com/xenodium/chatgpt-shell"))]) (ob-clojurescript . [(20180406 1828) ((emacs (24 4)) (org (9 0))) "org-babel functions for ClojureScript evaluation" tar ((:commit . "17ee1558aa94c7b0246fd03f684884122806cfe7") (:authors ("Larry Staton Jr.")) (:maintainers ("Larry Staton Jr.")) (:maintainer "Larry Staton Jr.") (:keywords "literate programming" "reproducible research") (:url . "https://gitlab.com/statonjr/ob-clojurescript"))]) (ob-coffee . [(20170725 1424) ((org (8))) "org-babel functions for coffee-script evaluation" tar ((:commit . "7f0b330273e8af7777de87a75fe52a89798e4548") (:authors ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainers ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainer "ZHOU Feng" . "zf.pascal@gmail.com") (:keywords "org" "babel" "coffee-script") (:url . "http://github.com/zweifisch/ob-coffee"))]) (ob-coffeescript . [(20180126 719) ((emacs (24 4))) "org-babel functions for coffee-script evaluation, and fully implementation!" tar ((:commit . "5a5bb04aea9c2a6eab5b05f90f5c7cb6de7b4261") (:authors ("Brantou" . "brantou89@gmail.com")) (:maintainers ("Brantou" . "brantou89@gmail.com")) (:maintainer "Brantou" . "brantou89@gmail.com") (:keywords "coffee-script" "literate programming" "reproducible research") (:url . "https://github.com/brantou/ob-coffeescript"))]) - (ob-compile . [(20220830 315) ((emacs (24 4))) "Run compile by org-babel" tar ((:commit . "9a16b3dd0f467c091e91944b90a2ca3d646d6617") (:authors ("Giap Tran" . "txgvnn@gmail.com")) (:maintainers ("Giap Tran" . "txgvnn@gmail.com")) (:maintainer "Giap Tran" . "txgvnn@gmail.com") (:keywords "literate programming" "reproducible" "processes") (:url . "https://github.com/TxGVNN/ob-compile"))]) + (ob-compile . [(20240311 1613) ((emacs (24 4))) "Run compile by org-babel" tar ((:commit . "ee94c0d432b98d4b003b179e2109c3114ea54d9b") (:authors ("Giap Tran" . "txgvnn@gmail.com")) (:maintainers ("Giap Tran" . "txgvnn@gmail.com")) (:maintainer "Giap Tran" . "txgvnn@gmail.com") (:keywords "literate programming" "reproducible" "processes" "compilation") (:url . "https://github.com/TxGVNN/ob-compile"))]) (ob-crystal . [(20180126 718) ((emacs (24 3))) "org-babel functions for Crystal evaluation" tar ((:commit . "b3bb27a21a4cefef3f5aeef52718b694bd51245b") (:authors ("Brantou" . "brantou89@gmail.com")) (:maintainers ("Brantou" . "brantou89@gmail.com")) (:maintainer "Brantou" . "brantou89@gmail.com") (:keywords "crystal" "literate programming" "reproducible research") (:url . "https://github.com/brantou/ob-crystal"))]) (ob-cypher . [(20200521 936) ((s (1 9 0)) (cypher-mode (0 0 6)) (dash (2 10 0)) (dash-functional (1 2 0))) "query neo4j using cypher in org-mode blocks" tar ((:commit . "da9f97339474a48d759fc128cee610c0bc9ae6c0") (:authors ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainers ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainer "ZHOU Feng" . "zf.pascal@gmail.com") (:keywords "org" "babel" "cypher" "neo4j") (:url . "http://github.com/zweifisch/ob-cypher"))]) (ob-d2 . [(20230314 352) ((emacs (24 1))) "Org-babel functions for d2" tar ((:commit . "5d197f8225a9fb4da997235b231abe30049c6825") (:authors ("Xavier Capaldi")) (:maintainers ("Xavier Capaldi")) (:maintainer "Xavier Capaldi") (:keywords "languages") (:url . "https://github.com/xcapaldi/ob-d2"))]) - (ob-dall-e-shell . [(20230708 1957) ((emacs (27 1)) (dall-e-shell (0 30 1))) "Org babel functions for DALL-E evaluation" tar ((:commit . "345f9d0e9047091474a2cea3d12b6e52b804ae36") (:authors ("Alvaro Ramirez")) (:maintainers ("Alvaro Ramirez")) (:maintainer "Alvaro Ramirez") (:url . "https://github.com/xenodium/chatgpt-shell"))]) + (ob-dall-e-shell . [(20231129 130) ((emacs (27 1)) (dall-e-shell (0 37 1))) "Org babel functions for DALL-E evaluation" tar ((:commit . "f27fc3ff5d01db4bae3e5c22c4ec208e387b7af1") (:authors ("Alvaro Ramirez")) (:maintainers ("Alvaro Ramirez")) (:maintainer "Alvaro Ramirez") (:url . "https://github.com/xenodium/chatgpt-shell"))]) (ob-dao . [(20170816 1558) ((org (8))) "Org Babel Functions for Dao" tar ((:commit . "8c62bd800b1f572860e30be4b72c71fa415a2e31") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainers ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me") (:keywords "literate programming" "reproducible research" "org" "babel" "dao") (:url . "https://github.com/xuchunyang/ob-dao"))]) (ob-dart . [(20221201 633) ((emacs (24 4))) "Evaluate Dart source blocks in org-mode" tar ((:commit . "f6d5664d5cc8b15e002f6899f8adedcb10ced5f1") (:authors ("Milan Zimmermann")) (:maintainers ("Milan Zimmermann")) (:maintainer "Milan Zimmermann") (:keywords "languages") (:url . "http://github.org/mzimmerm/ob-dart"))]) (ob-deno . [(20201019 101) ((emacs (26 1))) "Babel Functions for Javascript/TypeScript with Deno" tar ((:commit . "e3b06d7662687e402905b9de4ad1d5816e89b842") (:authors ("HIGASHI Taiju")) (:maintainers ("HIGASHI Taiju")) (:maintainer "HIGASHI Taiju") (:keywords "literate programming" "reproducible research" "javascript" "typescript" "tools") (:url . "https://github.com/taiju/ob-deno"))]) @@ -3543,12 +3633,12 @@ (ob-nix . [(20221224 334) ((emacs (24 1))) "Simple org-babel support for nix" tar ((:commit . "76d71b37fb031f25bd52ff9c98b29292ebe0424e") (:authors ("Wilko Meyer" . "w-devel@wmeyer.eu")) (:maintainers ("Wilko Meyer" . "w-devel@wmeyer.eu")) (:maintainer "Wilko Meyer" . "w-devel@wmeyer.eu") (:keywords "lisp" "tools") (:url . "https://codeberg.org/theesm/ob-nix"))]) (ob-p5js . [(20230802 1613) ((emacs (25 1))) "Support for p5js in org-babel" tar ((:commit . "6a1684a02f5baf6c433bfaf700b8c33b0f6ff12e") (:authors ("Alejandro Gallo" . "aamsgallo@gmail.com")) (:maintainers ("Alejandro Gallo" . "aamsgallo@gmail.com")) (:maintainer "Alejandro Gallo" . "aamsgallo@gmail.com") (:keywords "javascript" "graphics" "multimedia" "p5js" "processing" "org-babel") (:url . "https://github.com/alejandrogallo/p5js"))]) (ob-php . [(20220221 1254) ((org (8))) "Execute PHP within org-mode source blocks." tar ((:commit . "6ebf7799e9ded1d5114094f46785960a50000614") (:authors ("stardiviner" . "numbchild@gmail.com")) (:maintainers ("stardiviner" . "numbchild@gmail.com")) (:maintainer "stardiviner" . "numbchild@gmail.com") (:keywords "org" "babel" "php") (:url . "https://repo.or.cz/ob-php.git"))]) - (ob-powershell . [(20220314 1359) ((emacs (26 1))) "Run Powershell from org mode source blocks" tar ((:commit . "f351429590ed68b26a9c8f9847066ca4205e524b") (:authors ("Rob Kiggen" . "robby.kiggen@essential-it.be")) (:maintainers ("Mois Moshev" . "mois.moshev@bottleshipvfx.com")) (:maintainer "Mois Moshev" . "mois.moshev@bottleshipvfx.com") (:keywords "powershell" "shell" "execute" "outlines" "processes") (:url . "https://github.com/rkiggen/ob-powershell"))]) + (ob-powershell . [(20221227 1106) ((emacs (26 1))) "Run Powershell from org mode source blocks" tar ((:commit . "e514efa7fbbdac80082761580ed23fd5ae3abc5d") (:authors ("Rob Kiggen" . "robby.kiggen@essential-it.be")) (:maintainers ("Mois Moshev" . "mois.moshev@bottleshipvfx.com")) (:maintainer "Mois Moshev" . "mois.moshev@bottleshipvfx.com") (:keywords "powershell" "shell" "execute" "outlines" "processes") (:url . "https://github.com/rkiggen/ob-powershell"))]) (ob-prolog . [(20190410 2130) nil "org-babel functions for prolog evaluation." tar ((:commit . "149abd3832fc5a6a1cb01a586a1622a8f25887dc") (:authors ("Bjarte Johansen")) (:maintainers ("Bjarte Johansen")) (:maintainer "Bjarte Johansen") (:keywords "literate programming" "reproducible research") (:url . "https://github.com/ljos/ob-prolog"))]) (ob-raku . [(20221013 1938) ((emacs (24 1))) "Provides raku support for org-babel" tar ((:commit . "21aa77a0ca70b7bef0ecf7d4d9c5272d71f0210c") (:authors ("Tim Van den Langenbergh https://github.com/tmtvl")) (:maintainers ("Tim Van den Langenbergh https://github.com/tmtvl")) (:maintainer "Tim Van den Langenbergh https://github.com/tmtvl") (:keywords "literate programming" "reproducible research" "languages") (:url . "https://github.com/masukomi/ob-raku"))]) (ob-redis . [(20220221 1249) ((org (8))) "Execute Redis queries within org-mode blocks." tar ((:commit . "44c83636ccbea0b3e9838b0180471905c30224c5") (:authors ("stardiviner" . "numbchild@gmail.com")) (:maintainers ("stardiviner" . "numbchild@gmail.com")) (:maintainer "stardiviner" . "numbchild@gmail.com") (:keywords "org" "babel" "redis") (:url . "https://repo.or.cz/ob-redis.git"))]) - (ob-restclient . [(20230301 1951) ((restclient (0))) "org-babel functions for restclient-mode" tar ((:commit . "ded3b7eb7b0592328a7a08ecce6f25278cba4a1d") (:authors ("Alf Lervåg")) (:maintainers ("Alf Lervåg")) (:maintainer "Alf Lervåg") (:keywords "literate programming" "reproducible research") (:url . "https://github.com/alf/ob-restclient.el"))]) - (ob-reticulate . [(20210214 2229) ((org (9 4)) (emacs (24 4))) "Babel Functions for reticulate" tar ((:commit . "56f4d74f5a2218927aeacce61442b373a0a189e3") (:authors ("Jack Kamm")) (:maintainers ("Jack Kamm")) (:maintainer "Jack Kamm") (:keywords "literate programming" "reproducible research" "r" "python" "statistics" "languages" "outlines" "processes") (:url . "https://github.com/jackkamm/ob-reticulate"))]) + (ob-restclient . [(20231228 1403) ((restclient (0))) "org-babel functions for restclient-mode" tar ((:commit . "8183f8af08838854cf145ca4855b373f3e7c44b0") (:authors ("Alf Lervåg")) (:maintainers ("Alf Lervåg")) (:maintainer "Alf Lervåg") (:keywords "literate programming" "reproducible research") (:url . "https://github.com/alf/ob-restclient.el"))]) + (ob-reticulate . [(20240224 1615) ((org (9 4)) (emacs (24 4))) "Babel Functions for reticulate" tar ((:commit . "dc08d43df967b15446f3d229fdc6bd600b7ea0df") (:authors ("Jack Kamm")) (:maintainers ("Jack Kamm")) (:maintainer "Jack Kamm") (:keywords "literate programming" "reproducible research" "r" "python" "statistics" "languages" "outlines" "processes") (:url . "https://github.com/jackkamm/ob-reticulate"))]) (ob-rust . [(20220824 1923) nil "Org-babel functions for Rust" tar ((:commit . "be059d231fafeb24a658db212a55ccdc55c0c500") (:authors ("Mican Zhang")) (:maintainers ("Mican Zhang")) (:maintainer "Mican Zhang") (:keywords "rust" "languages" "org" "babel") (:url . "https://github.com/micanzhang/ob-rust"))]) (ob-sagemath . [(20191106 828) ((sage-shell-mode (0 0 8)) (s (1 8 0)) (emacs (24))) "org-babel functions for SageMath evaluation" tar ((:commit . "79645bce0c25a650bae61e550434bed836995dce") (:authors ("Sho Takemori" . "stakemorii@gmail.com")) (:maintainers ("Sho Takemori" . "stakemorii@gmail.com")) (:maintainer "Sho Takemori" . "stakemorii@gmail.com") (:keywords "sagemath" "org-babel") (:url . "https://github.com/stakemori/ob-sagemath"))]) (ob-smiles . [(20220221 1255) ((smiles-mode (0 0 1)) (org (8))) "Org-mode Babel support for SMILES." tar ((:commit . "d178f3d4a7e3c1ca9910f0a063d2a3cfd97d8609") (:authors (nil . "John Kitchin [jkitchin@andrew.cmu.edu]")) (:maintainers (nil . "stardiviner [numbchild@gmail.com]")) (:maintainer nil . "stardiviner [numbchild@gmail.com]") (:keywords "org" "babel" "smiles") (:url . "https://repo.or.cz/ob-smiles.git"))]) @@ -3558,20 +3648,20 @@ (ob-sql-mode . [(20190421 1539) ((emacs (24 4))) "SQL code blocks evaluated by sql-mode" tar ((:commit . "b31a016585324ad91f1742ff6205bcb76f3ece6e") (:authors (nil . "Nik Clayton nik@google.com")) (:maintainers (nil . "Nik Clayton nik@google.com")) (:maintainer nil . "Nik Clayton nik@google.com") (:keywords "languages" "org" "org-babel" "sql") (:url . "http://github.com/nikclayton/ob-sql-mode"))]) (ob-svgbob . [(20190911 300) ((emacs (24))) "Babel Functions for svgbob" tar ((:commit . "5747f96fb4fdb8711546b3313df9412177eb3c1a") (:authors ("Marcio Giaxa" . "i@mgxm.me")) (:maintainers ("Marcio Giaxa" . "i@mgxm.me")) (:maintainer "Marcio Giaxa" . "i@mgxm.me") (:keywords "tools" "files") (:url . "https://github.com/mgxm/ob-svgbob"))]) (ob-swift . [(20170921 1325) ((org (8))) "org-babel functions for swift evaluation" tar ((:commit . "ed478ddbbe41ce5373efde06b4dd0c3663c9055f") (:authors ("Feng Zhou" . "zf.pascal@gmail.com")) (:maintainers ("Feng Zhou" . "zf.pascal@gmail.com")) (:maintainer "Feng Zhou" . "zf.pascal@gmail.com") (:keywords "org" "babel" "swift") (:url . "http://github.com/zweifisch/ob-swift"))]) - (ob-swiftui . [(20230421 1542) ((emacs (25 1)) (swift-mode (8 2 0)) (org (9 2 0))) "Org babel functions for SwiftUI evaluation" tar ((:commit . "da6bd8d13da6bf6b949c4c9b1d4754fecb0345c7") (:authors ("Alvaro Ramirez")) (:maintainers ("Alvaro Ramirez")) (:maintainer "Alvaro Ramirez") (:url . "https://github.com/xenodium/ob-swiftui"))]) + (ob-swiftui . [(20231009 918) ((emacs (25 1)) (swift-mode (8 2 0)) (org (9 2 0))) "Org babel functions for SwiftUI evaluation" tar ((:commit . "af65a8e60602ca90ab3f61811190a3da67ac0414") (:authors ("Alvaro Ramirez")) (:maintainers ("Alvaro Ramirez")) (:maintainer "Alvaro Ramirez") (:url . "https://github.com/xenodium/ob-swiftui"))]) (ob-tmux . [(20221005 2025) ((emacs (25 1)) (seq (2 3)) (s (1 9 0))) "Babel Support for Interactive Terminal" tar ((:commit . "e672ca5a9534b9f33ed7aa5cd21b88189ccc5697") (:authors ("Allard Hendriksen")) (:maintainers ("Allard Hendriksen")) (:maintainer "Allard Hendriksen") (:keywords "literate programming" "interactive shell" "tmux") (:url . "https://github.com/ahendriksen/ob-tmux"))]) (ob-translate . [(20170720 1919) ((google-translate (0 11)) (org (8))) "Translation of text blocks in org-mode." tar ((:commit . "9d9054a51bafd5a29a8135964069b4fa3a80b169") (:authors ("Kris Jenkins" . "krisajenkins@gmail.com")) (:maintainers ("Kris Jenkins" . "krisajenkins@gmail.com")) (:maintainer "Kris Jenkins" . "krisajenkins@gmail.com") (:keywords "org" "babel" "translate" "translation") (:url . "https://github.com/krisajenkins/ob-translate"))]) - (ob-typescript . [(20230523 131) ((emacs (24)) (org (8 0))) "org-babel functions for typescript evaluation" tar ((:commit . "abf36f1f3b2476e71c63721dc907d7e6914aef3d") (:authors ("KURASHIKI Satoru")) (:maintainers ("KURASHIKI Satoru")) (:maintainer "KURASHIKI Satoru") (:keywords "literate programming" "reproducible research" "typescript") (:url . "https://github.com/lurdan/ob-typescript"))]) + (ob-typescript . [(20231227 311) ((emacs (24)) (org (8 0))) "org-babel functions for typescript evaluation" tar ((:commit . "5fe1762f8d8692dd5b6f1697bedbbf4cae9ef036") (:authors ("KURASHIKI Satoru")) (:maintainers ("KURASHIKI Satoru")) (:maintainer "KURASHIKI Satoru") (:keywords "literate programming" "reproducible research" "typescript") (:url . "https://github.com/lurdan/ob-typescript"))]) (ob-uart . [(20170521 858) nil "org-babel support for UART communication" tar ((:commit . "90daeac90a9e75c20cdcf71234c67b812110c50e") (:authors ("Andreas Müller")) (:maintainers ("Andreas Müller")) (:maintainer "Andreas Müller") (:keywords "tools" "comm" "org-mode" "uart" "literate programming" "reproducible development") (:url . "https://www.0x7.ch"))]) (oberon . [(20120715 909) nil "Major mode for editing Oberon/Oberon-2 program texts" tar ((:commit . "fb57d18ce13835a8a69b6bafecdd9193ca9a59a3") (:authors ("Karl Landström" . "karl@karllandstrom.se")) (:maintainers ("Karl Landström" . "karl@karllandstrom.se")) (:maintainer "Karl Landström" . "karl@karllandstrom.se") (:keywords "oberon" "oberon-2" "languages" "oop"))]) (obfusurl . [(20170809 1524) ((cl-lib (0 5))) "Obfuscate URLs so they aren't spoilers" tar ((:commit . "7a5a41905000ce2ec1fd72509a5567e5fd9f47e5") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainers ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:keywords "convenience" "web" "text") (:url . "https://github.com/davep/obfusurl.el"))]) (objc-font-lock . [(20141021 1822) nil "Highlight Objective-C method calls." tar ((:commit . "34b457d577f97ca94b8792d025f9a909c7610612") (:authors ("Anders Lindgren")) (:maintainers ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "languages" "faces") (:url . "https://github.com/Lindydancer/objc-font-lock"))]) (objed . [(20200911 1435) ((emacs (25)) (cl-lib (0 5))) "Navigate and edit text objects." tar ((:commit . "e93dda73bd932563d35e76f1c2f1b50895b640cf") (:authors ("Clemens Radermacher" . "clemera@posteo.net")) (:maintainers ("Clemens Radermacher" . "clemera@posteo.net")) (:maintainer "Clemens Radermacher" . "clemera@posteo.net") (:keywords "convenience") (:url . "https://github.com/clemera/objed"))]) - (oblivion-theme . [(20230415 551) ((emacs (24 1))) "A port of GEdit oblivion theme" tar ((:commit . "f0b180eeb5ed19bacbce9d6a39e3123f4751f54b") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.org/ideasman42/emacs-oblivion-theme"))]) - (obsidian . [(20230821 1111) ((emacs (27 2)) (s (1 12 0)) (dash (2 13)) (markdown-mode (2 5)) (elgrep (1 0 0)) (yaml (0 5 1))) "Obsidian Notes interface" tar ((:commit . "c7cec01bcc4bbee18c9e5b5e7ddb33e4b09d03ff") (:authors ("Mykhaylo Bilyanskyy")) (:maintainers ("Mykhaylo Bilyanskyy")) (:maintainer "Mykhaylo Bilyanskyy") (:keywords "obsidian" "pkm" "convenience") (:url . "https://github.com./licht1stein/obsidian.el"))]) + (oblivion-theme . [(20240320 1152) ((emacs (24 1))) "A port of GEdit oblivion theme" tar ((:commit . "8b7ed6627ee3c838acd2ec9bfd5a6fb02228edfb") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.org/ideasman42/emacs-theme-oblivion"))]) + (obsidian . [(20231218 1043) ((emacs (27 2)) (f (0 2 0)) (s (1 12 0)) (dash (2 13)) (markdown-mode (2 5)) (elgrep (1 0 0)) (yaml (0 5 1))) "Obsidian Notes interface" tar ((:commit . "24ff6ef051ba1f1a1e80a2132fdada37e77eaad6") (:authors ("Mykhaylo Bilyanskyy")) (:maintainers ("Mykhaylo Bilyanskyy")) (:maintainer "Mykhaylo Bilyanskyy") (:keywords "obsidian" "pkm" "convenience") (:url . "https://github.com./licht1stein/obsidian.el"))]) (obsidian-theme . [(20170719 948) nil "port of the eclipse obsidian theme" tar ((:commit . "f45efb2ebe9942466c1db6abbe2d0e6847b785ea") (:authors ("martin haesler")) (:maintainers ("martin haesler")) (:maintainer "martin haesler") (:url . "http://github.com/mswift42/obsidian-theme"))]) (ocaml-ts-mode . [(20230820 1946) ((emacs (29 1))) "Major mode for OCaml using tree-sitter" tar ((:commit . "bb8c86bd49e4e98f41e45fb0ec82e38f90bc3ee4") (:authors ("dmitrig")) (:maintainers ("dmitrig")) (:maintainer "dmitrig") (:keywords "ocaml" "languages" "tree-sitter") (:url . "https://github.com/dmitrig/ocaml-ts-mode"))]) - (ocamlformat . [(20230718 1531) ((emacs (24 3))) "Utility functions to format ocaml code" tar ((:commit . "fe70498a8982bef951311b37aa8568218ce8801a") (:keywords "languages" "ocaml") (:url . "https://github.com/ocaml-ppx/ocamlformat"))]) + (ocamlformat . [(20230915 941) ((emacs (24 3))) "Utility functions to format ocaml code" tar ((:commit . "6734dfc1992eb782f0a936ce3cd7c78b7c1d39d3") (:keywords "languages" "ocaml") (:url . "https://github.com/ocaml-ppx/ocamlformat"))]) (occidental-theme . [(20130312 1958) nil "Custom theme for faces based on Adwaita" tar ((:commit . "fd2db7256d4f78c43d99c3cddb1c39106d479816") (:authors ("William Stevenson" . "yhvh2000@gmail.com") ("Erik Timan" . "dev@timan.info")) (:maintainers ("William Stevenson" . "yhvh2000@gmail.com")) (:maintainer "William Stevenson" . "yhvh2000@gmail.com") (:url . "http://github.com/olcai/occidental-theme"))]) (occur-context-resize . [(20210121 50) nil "dynamically resize context around matches in occur-mode" tar ((:commit . "9d62a5b5c39ab7921dfc12dd0ab139b38dd16582") (:authors ("Charles L.G. Comstock" . "dgtized@gmail.com")) (:maintainers ("Charles L.G. Comstock" . "dgtized@gmail.com")) (:maintainer "Charles L.G. Comstock" . "dgtized@gmail.com") (:keywords "matching") (:url . "https://github.com/dgtized/occur-context-resize.el"))]) (occur-x . [(20130610 1343) nil "Extra functionality for occur" tar ((:commit . "352f5fab207d8a1d3dd048073ff127a83e97c82b") (:authors ("Juan-Leon Lahoz" . "juanleon1@gmail.com")) (:maintainers ("Juan-Leon Lahoz" . "juanleon1@gmail.com")) (:maintainer "Juan-Leon Lahoz" . "juanleon1@gmail.com") (:keywords "occur" "search" "convenience"))]) @@ -3582,15 +3672,15 @@ (octicons . [(20151101 340) ((cl-lib (0 5))) "octicons utility" tar ((:commit . "229286a6166dba8ddabc8c4d338798c6cd3cf67d") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-octicons"))]) (octo-mode . [(20161008 1229) ((emacs (24))) "Major mode for Octo assembly language" tar ((:commit . "4b2ed4a61674f73a6ccd390b5ae123474bd0c977") (:authors ("John Olsson" . "john@cryon.se")) (:maintainers ("John Olsson" . "john@cryon.se")) (:maintainer "John Olsson" . "john@cryon.se") (:keywords "languages") (:url . "https://github.com/cryon/octo-mode"))]) (octopress . [(20190123 107) nil "A lightweight wrapper for Jekyll and Octopress." tar ((:commit . "f2c92d5420f14fc9167c7de1873836510e652de2") (:authors ("Aaron Bieber" . "aaron@aaronbieber.com")) (:maintainers ("Aaron Bieber" . "aaron@aaronbieber.com")) (:maintainer "Aaron Bieber" . "aaron@aaronbieber.com") (:keywords "octopress" "blog") (:url . "https://github.com/aaronbieber/octopress.el"))]) - (oer-reveal . [(20230403 1322) ((emacs (24 4)) (org-re-reveal (3 1 0))) "OER with reveal.js, plugins, and org-re-reveal" tar ((:commit . "f7b0d952c9ab0969dbb9c003df4f298ec9d3ee79") (:authors ("Jens Lechtenbörger")) (:maintainers ("Jens Lechtenbörger")) (:maintainer "Jens Lechtenbörger") (:keywords "hypermedia" "tools" "slideshow" "presentation" "oer") (:url . "https://gitlab.com/oer/oer-reveal"))]) + (oer-reveal . [(20240319 1005) ((emacs (24 4)) (org-re-reveal (3 22 0))) "OER with reveal.js, plugins, and org-re-reveal" tar ((:commit . "0a44a385a565b8e39908c36dd32d5b231ffee9bd") (:authors ("Jens Lechtenbörger")) (:maintainers ("Jens Lechtenbörger")) (:maintainer "Jens Lechtenbörger") (:keywords "hypermedia" "tools" "slideshow" "presentation" "oer") (:url . "https://gitlab.com/oer/oer-reveal"))]) (offlineimap . [(20150916 1158) nil "Run OfflineIMAP from Emacs" tar ((:commit . "cc3e067e6237a1eb7b21c575a41683b1febb47f1") (:authors ("Julien Danjou" . "julien@danjou.info")) (:maintainers ("Julien Danjou" . "julien@danjou.info")) (:maintainer "Julien Danjou" . "julien@danjou.info") (:url . "http://julien.danjou.info/offlineimap-el.html"))]) (oj . [(20230212 148) ((emacs (26 1)) (quickrun (2 2))) "Competitive programming tools client for AtCoder, Codeforces" tar ((:commit . "6d586cb108c642bc166c64df113e03193f4d1495") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "convenience") (:url . "https://github.com/conao3/oj.el"))]) - (ol-notmuch . [(20230511 2048) ((emacs (25 1)) (compat (29 1 4 1)) (notmuch (0 37)) (org (9 6 5))) "Links to notmuch messages" tar ((:commit . "781c3518a537da2a8b5e8a4424f9441df463a147") (:authors ("Matthieu Lemerre" . "racin@free.fr")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "hypermedia" "mail") (:url . "https://git.sr.ht/~tarsius/ol-notmuch"))]) + (ol-notmuch . [(20240101 2222) ((emacs (25 1)) (compat (29 1 4 1)) (notmuch (0 37)) (org (9 6 5))) "Links to notmuch messages" tar ((:commit . "881991d94a1ad750633fcf1f2d8a9e0616979be3") (:authors ("Matthieu Lemerre" . "racin@free.fr")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "hypermedia" "mail") (:url . "https://git.sr.ht/~tarsius/ol-notmuch"))]) (ol-tmsu . [(20230207 1457) ((emacs (28 1)) (tmsu (0 9))) "Org-mode links to TMSU queries" tar ((:commit . "9672d193a51f2848696445528de757aa21b2b686") (:authors ("Wojciech Siewierski")) (:maintainers ("Wojciech Siewierski")) (:maintainer "Wojciech Siewierski") (:keywords "files" "outlines" "hypermedia") (:url . "https://github.com/vifon/tmsu.el"))]) (olc . [(20200818 1221) ((emacs (25 1))) "Open location code library" tar ((:commit . "d2dc62dbc3cf6460cc12bd96857a988bc80ac37e") (:authors ("David Byers" . "david.byers@liu.se")) (:maintainers ("David Byers" . "david.byers@liu.se")) (:maintainer "David Byers" . "david.byers@liu.se") (:keywords "extensions" "lisp") (:url . "https://gitlab.liu.se/davby02/olc"))]) (old-norse-input . [(20170816 1842) ((emacs (24))) "An input method for Old Norse" tar ((:commit . "c2e21ee72c3768e9152aff6baf12a19cde1d0c53") (:authors ("David Christiansen" . "david@davidchristiansen.dk")) (:maintainers ("David Christiansen" . "david@davidchristiansen.dk")) (:maintainer "David Christiansen" . "david@davidchristiansen.dk") (:keywords "languages") (:url . "https://github.com/david-christiansen/emacs-old-norse-input"))]) (oldlace-theme . [(20150705 1300) ((emacs (24))) "Emacs 24 theme with an 'oldlace' background." tar ((:commit . "9ecbef999b63021c967846a3c80b3fbfc81f1290") (:authors ("martin haesler")) (:maintainers ("martin haesler")) (:maintainer "martin haesler"))]) - (olivetti . [(20230729 403) ((emacs (24 4))) "Minor mode for a nice writing environment" tar ((:commit . "a644ee9d24c7283435ce42e11498951e100608c9") (:authors ("Paul W. Rankin" . "hello@paulwrankin.com")) (:maintainers ("Paul W. Rankin" . "hello@paulwrankin.com")) (:maintainer "Paul W. Rankin" . "hello@paulwrankin.com") (:keywords "wp" "text") (:url . "https://github.com/rnkn/olivetti"))]) + (olivetti . [(20231104 538) ((emacs (24 4))) "Minor mode for a nice writing environment" tar ((:commit . "1f8b3d5cb155f7497083001037a09a972befab21") (:authors ("Paul W. Rankin" . "hello@paulwrankin.com")) (:maintainers ("Paul W. Rankin" . "hello@paulwrankin.com")) (:maintainer "Paul W. Rankin" . "hello@paulwrankin.com") (:keywords "wp" "text") (:url . "https://github.com/rnkn/olivetti"))]) (om-mode . [(20140915 2110) nil "Insert Om component template with life cycle." tar ((:commit . "5a6b380f8d1293a865d8a37aa4816d7412c512ce") (:authors ("Daniel Szmulewicz" . "daniel.szmulewicz@gmail.com")) (:maintainers ("Daniel Szmulewicz" . "daniel.szmulewicz@gmail.com")) (:maintainer "Daniel Szmulewicz" . "daniel.szmulewicz@gmail.com") (:keywords "clojurescript"))]) (omni-kill . [(20171016 2140) nil "Kill all the things" tar ((:commit . "904549c8fd6ac3cf22b5d7111ca8944e179cffea") (:authors ("Adrien Becchis" . "adriean.khisbe@live.fr")) (:maintainers ("Adrien Becchis" . "adriean.khisbe@live.fr")) (:maintainer "Adrien Becchis" . "adriean.khisbe@live.fr") (:keywords "convenience" "editing" "tools"))]) (omni-log . [(20200304 2229) ((emacs (24)) (ht (2 0)) (s (1 6 1)) (dash (2 13 0))) "Logging utilities" tar ((:commit . "0a240660ccdd0b6588b4e3c322743b5ab1161338") (:authors ("Adrien Becchis" . "adriean.khisbe@live.fr")) (:maintainers ("Adrien Becchis" . "adriean.khisbe@live.fr")) (:maintainer "Adrien Becchis" . "adriean.khisbe@live.fr") (:keywords "convenience" "languages" "tools") (:url . "https://github.com/AdrieanKhisbe/omni-log.el"))]) @@ -3602,10 +3692,12 @@ (omtose-phellack-theme . [(20161111 2120) nil "A dark theme, with cold bluish touch." tar ((:commit . "66f99633e199e65bd28641626435e8e59246529a"))]) (on-parens . [(20210928 1913) ((dash (2 10 0)) (emacs (24)) (evil (1 1 6)) (smartparens (1 6 3))) "smartparens wrapper to fit with evil-mode/vim normal-state" tar ((:commit . "b8ee8cea45c9b34820fcb951f522f13e3736d216") (:authors ("William G Hatch")) (:maintainers ("William G Hatch")) (:maintainer "William G Hatch") (:keywords "evil" "smartparens"))]) (on-screen . [(20160302 950) ((cl-lib (0))) "guide your eyes while scrolling" tar ((:commit . "206468aa4de299ad26c2db12b757f5ad7290912f") (:authors ("Michael Heerdegen" . "michael_heerdegen@web.de")) (:maintainers ("Michael Heerdegen" . "michael_heerdegen@web.de")) (:maintainer "Michael Heerdegen" . "michael_heerdegen@web.de") (:keywords "convenience") (:url . "https://github.com/michael-heerdegen/on-screen.el"))]) + (one . [(20231205 1423) ((emacs (28 1)) (jack (1 0)) (htmlize (1 57))) "Static Site Generator for org-mode users" tar ((:commit . "fa52cf0144f89eabee06f598b021a37087c69670") (:authors ("Tony Aldon" . "tony@tonyaldon.com")) (:maintainers ("Tony Aldon" . "tony@tonyaldon.com")) (:maintainer "Tony Aldon" . "tony@tonyaldon.com") (:keywords "hypermedia" "outlines") (:url . "https://github.com/tonyaldon/one.el"))]) (one-themes . [(20200720 1444) ((emacs (24))) "One Colorscheme" tar ((:commit . "16aa7318490c0f47aca328a8c6cfe3267a80bb76") (:authors ("Balaji Sivaraman" . "balaji@balajisivaraman.com")) (:maintainers ("Balaji Sivaraman" . "balaji@balajisivaraman.com")) (:maintainer "Balaji Sivaraman" . "balaji@balajisivaraman.com") (:url . "http://github.com/balajisivaraman/emacs-one-themes"))]) (one-time-pad-encrypt . [(20160329 1513) nil "One time pad encryption within file" tar ((:commit . "87cc1f124024ce3d277299ca0ac703f182937d9f") (:authors ("Garvin Guan" . "garvin.guan@gmail.com")) (:maintainers ("Garvin Guan" . "garvin.guan@gmail.com")) (:maintainer "Garvin Guan" . "garvin.guan@gmail.com") (:keywords "convenience") (:url . "https://github.com/garvinguan/emacs-one-time-pad/"))]) (opam . [(20150719 1220) ((emacs (24 1))) "OPAM tools" tar ((:commit . "4d589de5765728f56af7078fae328b6792de8600") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainers ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn.com") (:keywords "convenience") (:url . "https://github.com/lunaryorn/opam.el"))]) (opam-switch-mode . [(20230802 917) ((emacs (25 1))) "Select OCaml opam switches via a menu" tar ((:commit . "1069e56a662f23ea09d4e05611bdedeb99257012") (:maintainers (nil . "proof-general-maintainers@groupes.renater.fr")) (:maintainer nil . "proof-general-maintainers@groupes.renater.fr") (:url . "https://github.com/ProofGeneral/opam-switch-mode"))]) + (open-color . [(20231220 1921) ((emacs (25 1))) "Open Color color palette" tar ((:commit . "4db381311d4b659922566236697a424f5f3fde6f") (:authors ("DK" . "a13@users.noreply.github.com")) (:maintainers ("DK" . "a13@users.noreply.github.com")) (:maintainer "DK" . "a13@users.noreply.github.com") (:keywords "faces") (:url . "https://github.com/a13/open-color.el"))]) (open-in-msvs . [(20170123 2228) nil "Open current file:line:column in Microsoft Visual Studio" tar ((:commit . "e0d071c83188ad5db8f3297d6ce784b4ed554a04") (:authors ("Evgeny Panasyuk")) (:maintainers ("Evgeny Panasyuk")) (:maintainer "Evgeny Panasyuk") (:keywords "convenience" "usability" "integration" "visual studio" "msvs" "ide") (:url . "https://github.com/evgeny-panasyuk/open-in-msvs"))]) (open-junk-file . [(20161210 1114) nil "Open a junk (memo) file to try-and-error" tar ((:commit . "558bec7372b0fed4c4cb6074ab906535fae615bd") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "convenience" "tools") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/open-junk-file.el"))]) (opencc . [(20170722 816) ((emacs (24 4))) "中文简繁转换 <-> 中文簡繁轉換 (Convert Chinese with OpenCC)" tar ((:commit . "959d9ffbae095752182026e3bd9b8fd61178c39f") (:authors ("徐春阳" . "mail@xuchunyang.me")) (:maintainers ("徐春阳" . "mail@xuchunyang.me")) (:maintainer "徐春阳" . "mail@xuchunyang.me") (:keywords "chinese") (:url . "https://github.com/xuchunyang/emacs-opencc"))]) @@ -3616,47 +3708,52 @@ (openstack-cgit-browse-file . [(20130819 927) nil "Browse the current file in OpenStack cgit" tar ((:commit . "244219288b9aef41155044697bb114b7af83ab8f") (:authors ("Chmouel Boudjnah" . "chmouel@chmouel.com")) (:maintainers ("Chmouel Boudjnah" . "chmouel@chmouel.com")) (:maintainer "Chmouel Boudjnah" . "chmouel@chmouel.com") (:keywords "convenience" "vc" "git" "cgit" "gerrit" "openstack") (:url . "https://github.com/chmouel/openstack-cgit-browse-file"))]) (opensub . [(20230716 1018) ((emacs (25 1))) "Search and download from open-subtitles" tar ((:commit . "216f60baf8cfd527fd84676b7389f463a04ae80c") (:authors ("Daniel Fleischer" . "danflscr@gmail.com")) (:maintainers ("Daniel Fleischer" . "danflscr@gmail.com")) (:maintainer "Daniel Fleischer" . "danflscr@gmail.com") (:keywords "multimedia") (:url . "https://github.com/danielfleischer/opensub"))]) (openwith . [(20120531 2136) nil "Open files with external programs" tar ((:commit . "dd1f0e2a527535086c2b0ae12031dbf3ab7c5fd7") (:authors ("Markus Triska" . "markus.triska@gmx.at")) (:maintainers ("Markus Triska" . "markus.triska@gmx.at")) (:maintainer "Markus Triska" . "markus.triska@gmx.at") (:keywords "files" "processes") (:url . "https://bitbucket.org/jpkotta/openwith"))]) - (operate-on-number . [(20150707 623) nil "Operate on number at point with arithmetic functions" tar ((:commit . "ceb3be565a29326c1098244fac0c50606723a56e") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainers ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:keywords "editing") (:url . "https://github.com/knu/operate-on-number.el"))]) + (operate-on-number . [(20231114 1921) nil "Operate on number at point with arithmetic functions" tar ((:commit . "0ddebae1885c1b54eae1d79e66204d6d83c5065b") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainers ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:keywords "editing") (:url . "https://github.com/knu/operate-on-number.el"))]) (orangey-bits-theme . [(20220822 324) ((autothemer (0 2)) (emacs (27 1))) "A Theme with smashing orangey bits" tar ((:commit . "533856d399cb4098300bcaf4a2d20920395746f8") (:url . "http://github.com/emacsfodder/emacs-theme-orangey-bits"))]) (orca . [(20220828 4) ((emacs (24 3)) (zoutline (0 1 0))) "Org Capture" tar ((:commit . "0687f416a5573f63b691d384454f5a793266ed97") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "org" "convenience") (:url . "https://github.com/abo-abo/orca"))]) - (orderless . [(20230802 218) ((emacs (26 1))) "Completion style for matching regexps in any order" tar ((:commit . "6936fe46ef07df168a423f04efeda130b4e69753") (:authors ("Omar Antolín Camarena" . "omar@matem.unam.mx")) (:maintainers ("Omar Antolín Camarena" . "omar@matem.unam.mx")) (:maintainer "Omar Antolín Camarena" . "omar@matem.unam.mx") (:keywords "extensions") (:url . "https://github.com/oantolin/orderless"))]) + (orderless . [(20240312 1914) ((emacs (27 1))) "Completion style for matching regexps in any order" tar ((:commit . "dc7a781acf2e58ac7d20d1b522be0cde5213e057") (:authors ("Omar Antolín Camarena" . "omar@matem.unam.mx")) (:maintainers ("Omar Antolín Camarena" . "omar@matem.unam.mx")) (:maintainer "Omar Antolín Camarena" . "omar@matem.unam.mx") (:keywords "extensions") (:url . "https://github.com/oantolin/orderless"))]) (ordinal . [(20210519 1442) ((emacs (24 3))) "Convert number to ordinal number notation" tar ((:commit . "a7f378306290b6807fb6b87cee3ef79b31cec711") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "lisp") (:url . "https://github.com/zonuexe/ordinal.el"))]) (org-ac . [(20170401 1307) ((auto-complete-pcmp (0 0 1)) (log4e (0 2 0)) (yaxception (0 1))) "Some auto-complete sources for org-mode" tar ((:commit . "41e3ef8e4039619d0370c23c66730b3b2e9e32ed") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "org" "completion") (:url . "https://github.com/aki2o/org-ac"))]) + (org-agenda-files-track . [(20231209 1529) ((emacs (27 1))) "Fine-track `org-agenda-files' to speed-up `org-agenda'" tar ((:commit . "c0f5f7746ec023a32ba106ec24812eca5cbe15df") (:authors ("Nicolas Graves" . "ngraves@ngraves.fr")) (:maintainers ("Nicolas Graves" . "ngraves@ngraves.fr")) (:maintainer "Nicolas Graves" . "ngraves@ngraves.fr") (:keywords "data" "files" "tools") (:url . "https://git.sr.ht/~ngraves/org-agenda-files-track"))]) + (org-agenda-files-track-ql . [(20231218 627) ((emacs (27 1)) (org-ql (0 7 3))) "Fine-track `org-agenda-files' to speed-up `org-ql-views'" tar ((:commit . "832cffe62c35f32850afb800e9a3b8a20a05ad7b") (:authors ("Nicolas Graves" . "ngraves@ngraves.fr")) (:maintainers ("Nicolas Graves" . "ngraves@ngraves.fr")) (:maintainer "Nicolas Graves" . "ngraves@ngraves.fr") (:keywords "data" "files" "tools") (:url . "https://git.sr.ht/~ngraves/org-agenda-files-track"))]) (org-agenda-property . [(20140626 2116) ((emacs (24 2))) "Display org properties in the agenda buffer." tar ((:commit . "01afb36072eb27846eb09310dfca7991dbae831e") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainers ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com") (:keywords "calendar") (:url . "http://github.com/Bruce-Connor/org-agenda-property"))]) - (org-ai . [(20230820 1230) ((emacs (27))) "Your AI assistant with ChatGPT, DALL-E, Whisper, Stable Diffusion" tar ((:commit . "e188f2b3506da47452142746f7ea9e08e97a9c09") (:authors ("Robert Krahn" . "robert@kra.hn")) (:maintainers ("Robert Krahn" . "robert@kra.hn")) (:maintainer "Robert Krahn" . "robert@kra.hn") (:url . "https://github.com/rksm/org-ai"))]) - (org-alert . [(20230520 1449) ((org (9 0)) (alert (1 2))) "Notify org deadlines via notify-send" tar ((:commit . "87abaeac60e37fda530787988e00307a1f72fedb") (:authors ("Stephen Pegoraro" . "spegoraro@tutive.com")) (:maintainers ("Stephen Pegoraro" . "spegoraro@tutive.com")) (:maintainer "Stephen Pegoraro" . "spegoraro@tutive.com") (:keywords "org" "org-mode" "notify" "notifications" "calendar") (:url . "https://github.com/spegoraro/org-alert"))]) + (org-ai . [(20240103 235) ((emacs (27 1)) (websocket (1 15))) "Use ChatGPT and other LLMs in org-mode and beyond" tar ((:commit . "329bebaf90f013a54449806e6e65f2fab04cee1f") (:authors ("Robert Krahn" . "robert@kra.hn")) (:maintainers ("Robert Krahn" . "robert@kra.hn")) (:maintainer "Robert Krahn" . "robert@kra.hn") (:url . "https://github.com/rksm/org-ai"))]) + (org-alert . [(20240122 1728) ((org (9 0)) (alert (1 2))) "Notify org deadlines via notify-send" tar ((:commit . "b4bfd4cead89215cc9a46162234f7a4836da4dad") (:authors ("Stephen Pegoraro" . "spegoraro@tutive.com")) (:maintainers ("Stephen Pegoraro" . "spegoraro@tutive.com")) (:maintainer "Stephen Pegoraro" . "spegoraro@tutive.com") (:keywords "org" "org-mode" "notify" "notifications" "calendar") (:url . "https://github.com/spegoraro/org-alert"))]) (org-analyzer . [(20191001 1717) nil "org-analyzer is a tool that extracts time tracking data from org files." tar ((:commit . "19da62aa4dcf1090be8f574f6f2d4c7e116163a8") (:authors ("Robert Krahn" . "robert@kra.hn")) (:maintainer "Robert Krahn" . "robert@kra.hn") (:keywords "calendar") (:url . "https://github.com/rksm/clj-org-analyzer"))]) - (org-anki . [(20230804 1244) ((emacs (27 1)) (request (0 3 2)) (dash (2 17)) (promise (1 1))) "Synchronize org-mode entries to Anki" tar ((:commit . "1bc1bc1a6f06d0d9fe3ac3b8a86e061b80a32462") (:authors ("Markus Läll" . "markus.l2ll@gmail.com")) (:maintainers ("Markus Läll" . "markus.l2ll@gmail.com")) (:maintainer "Markus Läll" . "markus.l2ll@gmail.com") (:keywords "outlines" "flashcards" "memory") (:url . "https://github.com/eyeinsky/org-anki"))]) - (org-appear . [(20220617 2355) ((emacs (25 1)) (org (9 3))) "Auto-toggle Org elements" tar ((:commit . "60ba267c5da336e75e603f8c7ab3f44e6f4e4dac") (:authors ("Alice Istleyeva" . "awth13@gmail.com")) (:maintainers ("Alice Istleyeva" . "awth13@gmail.com")) (:maintainer "Alice Istleyeva" . "awth13@gmail.com") (:url . "https://github.com/awth13/org-appear"))]) + (org-anki . [(20240311 2016) ((emacs (27 1)) (request (0 3 2)) (dash (2 17)) (promise (1 1))) "Synchronize org-mode entries to Anki" tar ((:commit . "f4737a04a82f8592ef623da40e65881ee5aed718") (:authors ("Markus Läll" . "markus.l2ll@gmail.com")) (:maintainers ("Markus Läll" . "markus.l2ll@gmail.com")) (:maintainer "Markus Läll" . "markus.l2ll@gmail.com") (:keywords "outlines" "flashcards" "memory") (:url . "https://github.com/eyeinsky/org-anki"))]) + (org-appear . [(20231127 1052) ((emacs (25 1)) (org (9 3))) "Auto-toggle Org elements" tar ((:commit . "81eba5d7a5b74cdb1bad091d85667e836f16b997") (:authors ("Alice Istleyeva" . "awth13@gmail.com")) (:maintainers ("Alice Istleyeva" . "awth13@gmail.com")) (:maintainer "Alice Istleyeva" . "awth13@gmail.com") (:url . "https://github.com/awth13/org-appear"))]) (org-arbeitszeit . [(20220816 1447) ((emacs (27 1))) "Calculate your worktime" tar ((:commit . "2598fb45a182d22e6d7579d55139db80e8af0b02") (:authors ("Benjamin Kästner" . "benjamin.kaestner@gmail.com")) (:maintainers ("Benjamin Kästner" . "benjamin.kaestner@gmail.com")) (:maintainer "Benjamin Kästner" . "benjamin.kaestner@gmail.com") (:keywords "tools" "org" "calendar" "convenience") (:url . "https://github.com/bkaestner/org-arbeitszeit"))]) (org-assistant . [(20230623 1439) ((emacs (28 1)) (uuidgen (1 2)) (deferred (0 5 1)) (s (1 12 0)) (dash (2 19 1)) (ht (0 9))) "Org babel extension for Chat Assistant APIs" tar ((:commit . "d036f82072e22a7fc985e94853deaf65c41d5967") (:authors ("Tyler Dodge" . "tyler@tdodge.consulting")) (:maintainers ("Tyler Dodge" . "tyler@tdodge.consulting")) (:maintainer "Tyler Dodge" . "tyler@tdodge.consulting") (:keywords "convenience") (:url . "https://github.com/tyler-dodge/org-assistant"))]) (org-attach-screenshot . [(20210221 1336) ((emacs (24 3))) "Screenshots integrated with org attachment dirs" tar ((:commit . "14240909b64605fa966955a14c6045df0f402367") (:authors ("Derek Feichtinger" . "derek.feichtinger@psi.ch")) (:maintainers ("Derek Feichtinger" . "derek.feichtinger@psi.ch")) (:maintainer "Derek Feichtinger" . "derek.feichtinger@psi.ch") (:keywords "org" "multimedia") (:url . "https://github.com/dfeich/org-screenshot"))]) - (org-auto-expand . [(20210923 243) ((emacs (26 1))) "Automatically expand certain headings" tar ((:commit . "dfb909d9fd0a658df8a05613a5b95b645b855344") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "convenience" "outlines" "org") (:url . "https://github.com/alphapapa/org-auto-expand"))]) + (org-auto-expand . [(20231006 854) ((emacs (26 1)) (org (9 6))) "Automatically expand certain headings" tar ((:commit . "86e3b24e894ab377ea005b1a574e77daace0451d") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "convenience" "outlines" "org") (:url . "https://github.com/alphapapa/org-auto-expand"))]) (org-auto-tangle . [(20220812 2327) ((emacs (24 1)) (async (1 9 3))) "Automatically and Asynchronously tangles org files on save" tar ((:commit . "2494a6f78c9db5311123abc7cad119851a29a55c") (:authors ("Yilkal Argaw" . "yilkalargawworkneh@gmail.com")) (:maintainers ("Yilkal Argaw" . "yilkalargawworkneh@gmail.com")) (:maintainer "Yilkal Argaw" . "yilkalargawworkneh@gmail.com") (:keywords "outlines") (:url . "https://github.com/yilkalargaw/org-auto-tangle"))]) (org-autolist . [(20220530 1620) nil "Improved list management in org-mode" tar ((:commit . "da3a45f95f2e9f7281d533d1e5cec1764ae26a9c") (:authors ("Calvin Young")) (:maintainers ("Calvin Young")) (:maintainer "Calvin Young") (:keywords "lists" "checklists" "org-mode") (:url . "https://github.com/calvinwyoung/org-autolist"))]) (org-babel-eval-in-repl . [(20201206 1540) ((eval-in-repl (0 9 2)) (matlab-mode (3 3 6)) (ess (16 10)) (emacs (24))) "Eval org-mode babel code blocks in various REPLs." tar ((:commit . "3591f062873de2d64cc6f83b3555d030506e6ee7") (:authors ("Takeshi Teshima" . "diadochos.developer@gmail.com")) (:maintainers ("Takeshi Teshima" . "diadochos.developer@gmail.com")) (:maintainer "Takeshi Teshima" . "diadochos.developer@gmail.com") (:keywords "literate programming" "reproducible research" "async execution") (:url . "https://github.com/diadochos/org-babel-eval-in-repl"))]) (org-beautify-theme . [(20170908 2218) nil "A sub-theme to make org-mode more beautiful." tar ((:commit . "df6a1114fda313e1689363e196c8284fbe2a2738") (:authors ("Jonathan Arkell" . "jonnay@jonnay.net")) (:maintainers ("Jonathan Arkell" . "jonnay@jonnay.net")) (:maintainer "Jonathan Arkell" . "jonnay@jonnay.net") (:keywords "org" "theme"))]) (org-board . [(20230408 1041) nil "bookmarking and web archival system for Org mode." tar ((:commit . "500fe02bc114e5b535a2eb2ab73954d79428168f") (:authors ("Charles A. Roelli " . "charles@aurox.ch")) (:maintainers ("Charles A. Roelli " . "charles@aurox.ch")) (:maintainer "Charles A. Roelli " . "charles@aurox.ch") (:keywords "org" "bookmarks" "archives") (:url . "https://github.com/scallywag/org-board"))]) - (org-bookmark-heading . [(20230517 1141) ((emacs (24 4))) "Emacs bookmark support for Org mode" tar ((:commit . "4e97fab8cf0307fc338df50efac103ed966c7914") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "hypermedia" "outlines") (:url . "http://github.com/alphapapa/org-bookmark-heading"))]) + (org-bookmark-heading . [(20231216 1234) ((emacs (24 4))) "Emacs bookmark support for Org mode" tar ((:commit . "ed8b7fe2a08b06a1d750d1e1230e6728815e0bcd") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "hypermedia" "outlines") (:url . "http://github.com/alphapapa/org-bookmark-heading"))]) (org-bookmarks-extractor . [(20220829 146) ((emacs (25 1))) "Extract bookmarks from Org mode" tar ((:commit . "26d810d4d58de1f64f0bbd649e13816f96663d73") (:authors ("Xuqing Jia" . "jxq@jxq.me")) (:maintainers ("Xuqing Jia" . "jxq@jxq.me")) (:maintainer "Xuqing Jia" . "jxq@jxq.me") (:keywords "convenience" "org") (:url . "https://github.com/jxq0/org-bookmarks-extractor"))]) (org-books . [(20210408 1913) ((enlive (0 0 1)) (s (1 11 0)) (helm (2 9 2)) (helm-org (1 0)) (dash (2 14 1)) (org (9 3)) (emacs (25))) "Reading list management with Org mode and helm" tar ((:commit . "9f4ec4a981bfc5eebff993c3ad49a4bed26aebd1") (:authors ("Abhinav Tushar" . "abhinav@lepisma.xyz")) (:maintainers ("Abhinav Tushar" . "abhinav@lepisma.xyz")) (:maintainer "Abhinav Tushar" . "abhinav@lepisma.xyz") (:keywords "outlines") (:url . "https://github.com/lepisma/org-books"))]) (org-brain . [(20230217 1908) ((emacs (25 1)) (org (9 2))) "Org-mode concept mapping" tar ((:commit . "2bad7732aae1a3051e2a14de2e30f970bbe43c25") (:authors ("Erik Sjöstrand" . "sjostrand.erik@gmail.com")) (:maintainers ("Erik Sjöstrand" . "sjostrand.erik@gmail.com")) (:maintainer "Erik Sjöstrand" . "sjostrand.erik@gmail.com") (:keywords "outlines" "hypermedia") (:url . "http://github.com/Kungsgeten/org-brain"))]) (org-bulletproof . [(20230615 640) ((emacs (27 1))) "Automatic plain list bullet cycling" tar ((:commit . "8ae80a53f8034914f502a8655f420c55078e02e1") (:authors ("Pontus Andersson" . "pondersson@gmail.com")) (:maintainers ("Pontus Andersson" . "pondersson@gmail.com")) (:maintainer "Pontus Andersson" . "pondersson@gmail.com") (:keywords "outlines" "convenience") (:url . "https://github.com/pondersson/org-bulletproof"))]) (org-bullets . [(20200317 1740) nil "Show bullets in org-mode as UTF-8 characters" tar ((:commit . "9ec0dbd30be7c6310804141ee952ac8c5f753557") (:authors ("sabof")) (:maintainers ("D. Williams" . "d.williams@posteo.net")) (:maintainer "D. Williams" . "d.williams@posteo.net") (:url . "https://github.com/integral-dw/org-bullets"))]) - (org-caldav . [(20230708 134) ((emacs (26 3)) (org (9 1))) "Sync org files with external calendar through CalDAV" tar ((:commit . "f6bf3c402918d0a5f958a7d18e86ad9df2e4a9bc") (:authors ("David Engster" . "deng@randomsample.de")) (:maintainers ("David Engster" . "deng@randomsample.de")) (:maintainer "David Engster" . "deng@randomsample.de") (:keywords "calendar" "caldav") (:url . "https://github.com/dengste/org-caldav/"))]) + (org-caldav . [(20240302 2226) ((emacs (26 3)) (org (9 1))) "Sync org files with external calendar through CalDAV" tar ((:commit . "21da50c95b279b5fa528b353181275f935de1e1d") (:authors ("David Engster" . "deng@randomsample.de")) (:maintainers ("David Engster" . "deng@randomsample.de")) (:maintainer "David Engster" . "deng@randomsample.de") (:keywords "calendar" "caldav") (:url . "https://github.com/dengste/org-caldav/"))]) (org-calibre-notes . [(20221202 1657) ((emacs (27 1))) "Extract highlights and notes from Calibre EPUB reader" tar ((:commit . "3120797ecbcb58827b91e3610e65579593d9a402") (:authors ("Bibek Panthi" . "bpanthi977@gmail.com")) (:maintainers ("Bibek Panthi" . "bpanthi977@gmail.com")) (:maintainer "Bibek Panthi" . "bpanthi977@gmail.com") (:url . "https://github.com/bpanthi977/org-calibre-notes"))]) (org-capture-pop-frame . [(20230516 236) ((emacs (24 4))) "Run org-capture in a new pop frame" tar ((:commit . "d88b75cc02fc53716701051dbdd906db0515de8c") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainers ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:url . "https://github.com/tumashu/org-capture-pop-frame.git"))]) - (org-category-capture . [(20230817 816) ((org (9 0 0)) (emacs (24))) "Contextualy capture of org-mode TODOs." tar ((:commit . "ad8daa991698df265a21b161e62a41e04979d98f") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainers ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:keywords "org-mode" "todo" "tools" "outlines") (:url . "https://github.com/IvanMalison/org-project-capture"))]) - (org-change . [(20230505 150) ((emacs (26 1)) (org (9 3))) "Annotate changes in org-mode files" tar ((:commit . "45898a67701ade93f310db8e5820b8bfc4a28846") (:keywords "wp" "convenience") (:url . "https://github.com/drghirlanda/org-change"))]) - (org-chef . [(20230814 1312) ((org (0)) (emacs (24))) "Cookbook and recipe management with org-mode." tar ((:commit . "66d434b52a306222fe7e13ce4c0cec4a0408fbac") (:authors ("Calvin Beck" . "hobbes@ualberta.ca")) (:maintainers ("Calvin Beck" . "hobbes@ualberta.ca")) (:maintainer "Calvin Beck" . "hobbes@ualberta.ca") (:keywords "convenience" "abbrev" "outlines" "org" "food" "recipes" "cooking") (:url . "https://github.com/Chobbes/org-chef"))]) + (org-category-capture . [(20230830 1733) ((org (9 0 0)) (emacs (24))) "Contextualy capture of org-mode TODOs." tar ((:commit . "bf1c30b750020ab8dd634dd66b2c7b76c56286c5") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainers ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:keywords "org-mode" "todo" "tools" "outlines") (:url . "https://github.com/IvanMalison/org-project-capture"))]) + (org-change . [(20240318 2003) ((emacs (29 1)) (org (9 3))) "Annotate changes in org-mode files" tar ((:commit . "e944bb4a0943cdd06abd9032e6e6cbd34424ea42") (:keywords "wp" "convenience") (:url . "https://github.com/drghirlanda/org-change"))]) + (org-chef . [(20231127 1601) ((org (0)) (emacs (24))) "Cookbook and recipe management with org-mode." tar ((:commit . "1710b54441ed744dcdfb125d08fb88cfaf452f10") (:authors ("Calvin Beck" . "hobbes@ualberta.ca")) (:maintainers ("Calvin Beck" . "hobbes@ualberta.ca")) (:maintainer "Calvin Beck" . "hobbes@ualberta.ca") (:keywords "convenience" "abbrev" "outlines" "org" "food" "recipes" "cooking") (:url . "https://github.com/Chobbes/org-chef"))]) + (org-cite-overlay . [(20240207 1611) ((emacs (28 1)) (citeproc (0 9 4))) "Overlays for org-cite citations" tar ((:commit . "cb401787b4569f43815cac55be8a319c489de3de") (:authors ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainers ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainer "Samuel W. Flint" . "me@samuelwflint.com") (:keywords "bib" "tex") (:url . "https://git.sr.ht/~swflint/org-cite-overlay"))]) + (org-cite-overlay-sidecar . [(20240213 1802) ((emacs (28 1)) (citeproc (0 9 4)) (org-cite-overlay (0 1 0)) (universal-sidecar (1 5 0)) (universal-sidecar-citeproc (1 0 0))) "Show Sidecar for overlaid org-cite citations" tar ((:commit . "bb23142f5d0d390196839fa9b3ce27ce4d149b59") (:authors ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainers ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainer "Samuel W. Flint" . "me@samuelwflint.com") (:keywords "bib") (:url . "https://git.sr.ht/~swflint/org-cite-overlay"))]) (org-cliplink . [(20201126 1020) ((emacs (24 4))) "insert org-mode links from the clipboard" tar ((:commit . "13e0940b65d22bec34e2de4bc8cba1412a7abfbc") (:authors ("Alexey Kutepov" . "reximkut@gmail.com")) (:maintainers ("Alexey Kutepov" . "reximkut@gmail.com")) (:maintainer "Alexey Kutepov" . "reximkut@gmail.com") (:url . "http://github.com/rexim/org-cliplink"))]) + (org-clock-agenda-daytime-mode . [(20240303 846) ((org (9 6 18)) (emacs (26 1))) "Display the time clocked today in the modeline" tar ((:commit . "82e2cd5a523f5fda75176a08eb120a0872700add") (:authors ("Arne Babenhauserheide" . "arne_bab@web.de")) (:maintainers ("Arne Babenhauserheide" . "arne_bab@web.de")) (:maintainer "Arne Babenhauserheide" . "arne_bab@web.de") (:keywords "org" "lisp" "clock" "time" "agenda") (:url . "https://www.draketo.de/software/emacs-daytime"))]) (org-clock-convenience . [(20230424 2101) ((org (8)) (emacs (24 3))) "Convenience functions for org time tracking" tar ((:commit . "08417dfd51deb400b890cf71c87b57393fc5ac8c") (:authors ("Derek Feichtinger ")) (:maintainers ("Derek Feichtinger ")) (:maintainer "Derek Feichtinger ") (:keywords "convenience") (:url . "https://github.com/dfeich/org-clock-convenience"))]) (org-clock-csv . [(20201222 1506) ((org (8 3)) (s (1 0))) "Export `org-mode' clock entries to CSV format." tar ((:commit . "af94b58c2e179a5bcc938f339e93de0eee3da99c") (:authors ("Aaron Jacobs" . "atheriel@gmail.com")) (:maintainers ("Aaron Jacobs" . "atheriel@gmail.com")) (:maintainer "Aaron Jacobs" . "atheriel@gmail.com") (:keywords "calendar" "data" "org") (:url . "https://github.com/atheriel/org-clock-csv"))]) (org-clock-reminder . [(20230222 1956) ((emacs (26 1))) "Notifications that remind you about clocked-in tasks" tar ((:commit . "d3bf97113fd519aa08198e2283ba9c236a6df168") (:authors ("Nikolay Brovko" . "i@nickey.ru")) (:maintainers ("Nikolay Brovko" . "i@nickey.ru")) (:maintainer "Nikolay Brovko" . "i@nickey.ru") (:keywords "calendar" "convenience") (:url . "https://github.com/inickey/org-clock-reminder"))]) (org-clock-split . [(20200331 526) ((emacs (24))) "Split clock entries" tar ((:commit . "39e1d2912a7a7223e2356a5fc4dff03507ae084d") (:authors ("Justin Taft ")) (:maintainers ("Justin Taft ")) (:maintainer "Justin Taft ") (:keywords "calendar") (:url . "https://github.com/justintaft/emacs-org-clock-split"))]) (org-clock-today . [(20220918 514) ((emacs (25))) "Show total clocked time of the current day in the mode line" tar ((:commit . "b73cca120eb64538ab0666892a8b97b6d65b4d6b") (:authors ("Tijs Mallaerts" . "tijs.mallaerts@gmail.com")) (:maintainers ("Tijs Mallaerts" . "tijs.mallaerts@gmail.com")) (:maintainer "Tijs Mallaerts" . "tijs.mallaerts@gmail.com") (:url . "https://github.com/mallt/org-clock-today-mode"))]) (org-commentary . [(20160802 637) ((dash (2 0)) (emacs (24 4)) (org (8 0))) "generate or update conventional library headers using Org mode files" tar ((:commit . "821ccb994811359c42f4e3d459e0e88849d42b75") (:authors ("Sergei Maximov" . "s.b.maximov@gmail.com")) (:maintainers ("Sergei Maximov" . "s.b.maximov@gmail.com")) (:maintainer "Sergei Maximov" . "s.b.maximov@gmail.com") (:keywords "convenience" "docs" "tools") (:url . "https://github.com/smaximov/org-commentary"))]) - (org-contacts . [(20230721 151) ((emacs (27 1)) (org (9 3 4))) "Contacts management system for Org Mode" tar ((:commit . "7f03eafaad2e5746949c0bebb98353e939c51ade") (:authors ("Julien Danjou" . "julien@danjou.info")) (:maintainers ("stardiviner" . "numbchild@gmail.com")) (:maintainer "stardiviner" . "numbchild@gmail.com") (:keywords "contacts" "org-mode" "outlines" "hypermedia" "calendar") (:url . "https://repo.or.cz/org-contacts.git"))]) + (org-contacts . [(20240311 850) ((emacs (27 1)) (org (9 3 4))) "Contacts management system for Org mode" tar ((:commit . "6660db078f7687af3bc31f702e3e957d4d7654bd") (:authors ("Julien Danjou" . "julien@danjou.info")) (:maintainers ("stardiviner" . "numbchild@gmail.com")) (:maintainer "stardiviner" . "numbchild@gmail.com") (:keywords "contacts" "org-mode" "outlines" "hypermedia" "calendar") (:url . "https://repo.or.cz/org-contacts.git"))]) (org-context . [(20220606 1339) nil "Contextual capture and agenda commands for Org-mode" tar ((:commit . "47bd45149cb74dab2ebecccfb918f6f8502a4f2c") (:authors ("Sylvain Rousseau ")) (:maintainers ("Sylvain Rousseau ")) (:maintainer "Sylvain Rousseau ") (:keywords "org" "capture" "agenda" "convenience") (:url . "https://github.com/thisirs/org-context"))]) (org-cua-dwim . [(20120203 534) nil "Org-mode and Cua mode compatibility layer" tar ((:commit . "a55d6c7009fc0b22f1110c07de629acc955c85e4") (:authors ("Matthew L. Fidler")) (:maintainers ("Matthew L. Fidler")) (:maintainer "Matthew L. Fidler") (:keywords "org-mode" "cua-mode"))]) (org-custom-cookies . [(20220928 114) ((emacs (25 1)) (org (9 4))) "Custom cookies for org-mode" tar ((:commit . "e57e0de5b8200224bf5d44b62481c542986f2f13") (:authors ("Gulshan Singh" . "gsingh2011@gmail.com")) (:maintainers ("Gulshan Singh" . "gsingh2011@gmail.com")) (:maintainer "Gulshan Singh" . "gsingh2011@gmail.com") (:url . "https://github.com/gsingh93/org-custom-cookies"))]) @@ -3666,6 +3763,7 @@ (org-dotemacs . [(20211126 2038) ((org (7 9 3)) (cl-lib (0 5))) "Store your emacs config as an org file, and choose which bits to load." tar ((:commit . "598759f4a139f94da62836e8f8064da6377536b2") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainers ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com") (:keywords "local") (:url . "https://github.com/vapniks/org-dotemacs"))]) (org-download . [(20220906 1929) ((emacs (24 3)) (async (1 2))) "Image drag-and-drop for Org-mode." tar ((:commit . "19e166f0a8c539b4144cfbc614309d47a9b2a9b7") (:authors ("Oleh Krehel")) (:maintainers ("Oleh Krehel")) (:maintainer "Oleh Krehel") (:keywords "multimedia" "images" "screenshots" "download") (:url . "https://github.com/abo-abo/org-download"))]) (org-dp . [(20180311 923) ((cl-lib (0 5))) "Declarative Local Programming with Org Elements" tar ((:commit . "334fefd06eb925c86b1642787b2a088aa0932bab") (:authors ("Thorsten Jolitz ")) (:maintainers ("Thorsten Jolitz ")) (:maintainer "Thorsten Jolitz ") (:url . "https://github.com/tj64/org-dp"))]) + (org-drawio . [(20240213 38) ((org (9 6 6)) (emacs (28 1))) "Convert and include drawio image to orgmode" tar ((:commit . "6b25d0ecf7de364da96c96da30a995df8a4cb835") (:authors ("Kimi Ma" . "kimi.im@outlook.com")) (:maintainers ("Kimi Ma" . "kimi.im@outlook.com")) (:maintainer "Kimi Ma" . "kimi.im@outlook.com") (:keywords "multimedia" "convenience") (:url . "https://github.com/kimim/org-drawio"))]) (org-drill . [(20210427 2003) ((emacs (25 3)) (seq (2 14)) (org (9 3)) (persist (0 3))) "Self-testing using spaced repetition" tar ((:commit . "e55415221eedba2f2bd37a30cb71c842e344b5ee") (:authors ("Paul Sexton" . "eeeickythump@gmail.com")) (:maintainers ("Phillip Lord" . "phillip.lord@russet.org.uk")) (:maintainer "Phillip Lord" . "phillip.lord@russet.org.uk") (:keywords "games" "outlines" "multimedia") (:url . "https://gitlab.com/phillord/org-drill/issues"))]) (org-drill-table . [(20180115 1009) ((s (1 7 0)) (dash (2 2 0)) (cl-lib (0 3)) (org (8 2)) (emacs (24 1))) "Generate drill cards from org tables" tar ((:commit . "e4c4c1b0a17f51cb8de67eafe06a6bffc754f525") (:authors ("Chris Barrett" . "chris.d.barrett@me.com")) (:maintainers ("Chris Barrett" . "chris.d.barrett@me.com")) (:maintainer "Chris Barrett" . "chris.d.barrett@me.com"))]) (org-dropbox . [(20150114 509) ((dash (2 2)) (names (20150000)) (emacs (24))) "move Dropbox notes from phone into org-mode datetree" tar ((:commit . "2dc677a770c9e82f928ad8e97a7707eb368e58ed") (:authors ("Heikki Lehvaslaiho" . "heikki.lehvaslaiho@gmail.com")) (:maintainers ("Heikki Lehvaslaiho" . "heikki.lehvaslaiho@gmail.com")) (:maintainer "Heikki Lehvaslaiho" . "heikki.lehvaslaiho@gmail.com") (:keywords "dropbox" "android" "notes" "org-mode") (:url . "https://github.com/heikkil/org-dropbox"))]) @@ -3676,6 +3774,7 @@ (org-elisp-help . [(20161122 55) ((cl-lib (0 5)) (org (9 0))) "org links to emacs-lisp documentation" tar ((:commit . "3e33ab1a2933dd7f2782ef91d667a37f12d633ab") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "org" "remember" "lisp") (:url . "https://github.com/tarsius/org-elisp-help"))]) (org-elp . [(20210329 1535) ((emacs (27 1))) "Preview latex equations in org mode while editing" tar ((:commit . "36b5ab2ed3fa3b5917f058e3acf8dff2df69efae") (:authors ("Yilun Guan")) (:maintainers ("Yilun Guan")) (:maintainer "Yilun Guan") (:keywords "lisp" "tex" "org") (:url . "https://github.com/guanyilun/org-elp"))]) (org-emms . [(20230626 1102) ((emacs (24 1)) (org (9 3)) (emms (0 0))) "Playback multimedia files from Org documents" tar ((:commit . "13c8f245885a7f4f87bf88c5ad5612af03be1e77") (:authors ("Jonathan Gregory ")) (:maintainers ("Jonathan Gregory ")) (:maintainer "Jonathan Gregory ") (:keywords "multimedia") (:url . "https://git.sr.ht/~jagrg/org-emms"))]) + (org-epa-gpg . [(20240208 20) ((emacs (26 1))) "Patch to enable EasyPG .gpg images in Org mode inline" tar ((:commit . "817b8e732c72bacddd8574f2c8f64fb26a1cfcc9") (:authors ("Peter Badida" . "keyweeusr@gmail.com")) (:maintainers ("Peter Badida" . "keyweeusr@gmail.com")) (:maintainer "Peter Badida" . "keyweeusr@gmail.com") (:keywords "lisp" "org" "gpg" "pgp" "epa" "encryption" "image" "inline" "patch") (:url . "https://github.com/KeyWeeUsr/org-epa-gpg"))]) (org-evil . [(20210809 1724) ((dash (2 19 0)) (evil (0)) (org (9 4 4))) "Evil extensions for Org." tar ((:commit . "981b0931d043d3b0eb61fcab6258b5a88cc74d15") (:authors ("Ben Moon" . "software@guiltydolphin.com")) (:maintainers ("Ben Moon" . "software@guiltydolphin.com")) (:maintainer "Ben Moon" . "software@guiltydolphin.com") (:keywords "convenience" "evil" "org") (:url . "https://github.com/guiltydolphin/org-evil"))]) (org-fancy-priorities . [(20210830 1657) nil "Display org priorities as custom strings" tar ((:commit . "7f677c6c14ecf05eab8e0efbfe7f1b00ae68eb1d") (:authors ("Harry Bournis" . "harrybournis@gmail.com")) (:maintainers ("Harry Bournis" . "harrybournis@gmail.com")) (:maintainer "Harry Bournis" . "harrybournis@gmail.com") (:keywords "convenience" "faces" "outlines") (:url . "https://github.com/harrybournis/org-fancy-priorities"))]) (org-fragtog . [(20220714 2146) ((emacs (27 1))) "Auto-toggle Org LaTeX fragments" tar ((:commit . "c675563af3f9ab5558cfd5ea460e2a07477b0cfd") (:authors ("Benjamin Levy" . "blevy@protonmail.com")) (:maintainers ("Benjamin Levy" . "blevy@protonmail.com")) (:maintainer "Benjamin Levy" . "blevy@protonmail.com") (:url . "https://github.com/io12/org-fragtog"))]) @@ -3684,44 +3783,46 @@ (org-generate . [(20200815 736) ((emacs (26 1)) (org (9 3)) (mustache (0 23))) "Generate template files/folders from org document" tar ((:commit . "98825efb73c4537f05f653ce40e639a220d2ee5d") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "convenience") (:url . "https://github.com/conao3/org-generate.el"))]) (org-gnome . [(20150614 1457) ((alert (1 2)) (telepathy (0 1)) (gnome-calendar (0 1))) "Orgmode integration with the GNOME desktop" tar ((:commit . "1012d47886cfd30eed25b73d9f18e475e0155f88") (:authors ("Nicolas Petton" . "petton.nicolas@gmail.com")) (:maintainers ("Nicolas Petton" . "petton.nicolas@gmail.com")) (:maintainer "Nicolas Petton" . "petton.nicolas@gmail.com") (:keywords "org" "gnome"))]) (org-grep . [(20230821 2356) ((emacs (26 1))) "Kind of M-x rgrep adapted for Org mode" tar ((:commit . "64d23c2ca11ca68db85fc2c500377c9151e8e40b") (:authors ("François Pinard" . "pinard@iro.umontreal.ca")) (:maintainers ("Greg Minshall" . "minshall@umich.edu")) (:maintainer "Greg Minshall" . "minshall@umich.edu") (:url . "https://sr.ht/~minshall/org-grep/"))]) - (org-gtd . [(20230718 54) ((emacs (27 2)) (org-edna (1 1 2)) (f (0 20 0)) (org (9 6)) (org-agenda-property (1 3 1)) (transient (0 3 7))) "An implementation of GTD." tar ((:commit . "4f50c27d1afe90cf764cd10cecf91a085694c8bd") (:authors ("Aldric Giacomoni" . "trevoke@gmail.com")) (:maintainer "Aldric Giacomoni" . "trevoke@gmail.com") (:url . "https://github.com/Trevoke/org-gtd.el"))]) - (org-habit-stats . [(20230412 515) ((emacs (25 1))) "Display info about habits" tar ((:commit . "9cb389f1c409d1f7aaea28378b4d7c7e975aefd4") (:authors ("ml729")) (:maintainers ("ml729")) (:maintainer "ml729") (:keywords "calendar" "org-mode" "org-habit" "habits" "stats" "statistics" "charts" "graphs") (:url . "https://github.com/ml729/org-habit-stats/"))]) + (org-gtd . [(20231224 1639) ((emacs (27 2)) (org-edna (1 1 2)) (f (0 20 0)) (org (9 6)) (org-agenda-property (1 3 1)) (transient (0 3 7))) "An implementation of GTD." tar ((:commit . "f82eb971db0008b773a57c207120751f913bde6b") (:authors ("Aldric Giacomoni" . "trevoke@gmail.com")) (:maintainer "Aldric Giacomoni" . "trevoke@gmail.com") (:url . "https://github.com/Trevoke/org-gtd.el"))]) + (org-habit-stats . [(20240208 323) ((emacs (25 1))) "Display info about habits" tar ((:commit . "d500f3a1b269b26097dd2f4cd414c3cb7c68ca23") (:authors ("ml729")) (:maintainers ("ml729")) (:maintainer "ml729") (:keywords "calendar" "org-mode" "org-habit" "habits" "stats" "statistics" "charts" "graphs") (:url . "https://github.com/ml729/org-habit-stats/"))]) (org-hyperscheduler . [(20220704 2140) ((emacs (27 1)) (websocket (1 13)) (log4e (0 3 3))) "UI (web) representation of org-agenda" tar ((:commit . "b7f33e7bf19b7ce7c81dbac4de765a854ee7f52f") (:authors ("Dmitry Markushevich" . "dmitrym@gmail.com")) (:maintainers ("Dmitry Markushevich" . "dmitrym@gmail.com")) (:maintainer "Dmitry Markushevich" . "dmitrym@gmail.com") (:keywords "org-mode" "calendar") (:url . "https://github.com/dmitrym0/org-hyperscheduler"))]) - (org-id-cleanup . [(20230803 1640) ((org (9 3)) (dash (2 12)) (emacs (26 3))) "Interactively find, present and maybe delete unused IDs of org-id" tar ((:commit . "588acb063f1c73025f973cbbba64a9f65a737bdd") (:authors ("Marc Ihm" . "marc@ihm.name")) (:maintainers ("Marc Ihm" . "marc@ihm.name")) (:maintainer "Marc Ihm" . "marc@ihm.name") (:url . "https://github.com/marcIhm/org-id-cleanup"))]) + (org-id-cleanup . [(20230922 1258) ((org (9 3)) (dash (2 12)) (emacs (26 3))) "Interactively find, present and maybe delete unused IDs of org-id" tar ((:commit . "45b598c7971d149ce4eae5f790469d89f691c8e6") (:authors ("Marc Ihm" . "marc@ihm.name")) (:maintainers ("Marc Ihm" . "marc@ihm.name")) (:maintainer "Marc Ihm" . "marc@ihm.name") (:url . "https://github.com/marcIhm/org-id-cleanup"))]) (org-if . [(20150920 1513) nil "Interactive Fiction Authoring System for Org-Mode." tar ((:commit . "fab602cc1bbee7a4e99c0083e129219d3f9ed2e8") (:authors ("Philip Woods" . "elzairthesorcerer@gmail.com")) (:maintainer "Philip Woods" . "elzairthesorcerer@gmail.com") (:keywords "if" "org-if" "org org-mode"))]) (org-incoming . [(20230209 1509) ((emacs (24 4)) (dash (2 19 1)) (datetime (0 7 2)) (s (1 13 1))) "Sort incoming PDFs into your org files" tar ((:commit . "5c5a5cc034a0b9ed808e5cbbf4876d489a6c7d28") (:authors ("Lukas Barth" . "mail@tinloaf.de")) (:maintainers ("Lukas Barth" . "mail@tinloaf.de")) (:maintainer "Lukas Barth" . "mail@tinloaf.de") (:keywords "files") (:url . "https://github.com/tinloaf/org-incoming"))]) - (org-index . [(20230803 1629) ((org (9 3)) (dash (2 12)) (s (1 12)) (emacs (26 3))) "Ranked and incremental search among selected org-headlines" tar ((:commit . "1bf6e8d540774da3880d7c8e78eee15805409470") (:authors ("Marc Ihm" . "marc@ihm.name")) (:maintainers ("Marc Ihm" . "marc@ihm.name")) (:maintainer "Marc Ihm" . "marc@ihm.name") (:url . "https://github.com/marcIhm/org-index"))]) + (org-index . [(20240202 1157) ((org (9 3)) (dash (2 12)) (s (1 12)) (emacs (26 3))) "Ranked and incremental search among selected org-headlines" tar ((:commit . "dca10e5e90a06c20515208f2d9f3a90455507fa6") (:authors ("Marc Ihm" . "marc@ihm.name")) (:maintainers ("Marc Ihm" . "marc@ihm.name")) (:maintainer "Marc Ihm" . "marc@ihm.name") (:url . "https://github.com/marcIhm/org-index"))]) (org-inline-anim . [(20230610 1504) ((emacs (25 3)) (org (9 4))) "Inline playback of animated GIF/PNG for Org" tar ((:commit . "488fed644748b578dffe7e3847970ec25dcfd24d") (:authors ("Shigeaki Nishina")) (:maintainers ("Shigeaki Nishina")) (:maintainer "Shigeaki Nishina") (:keywords "org" "outlines" "hypermedia" "multimedia") (:url . "https://github.com/shg/org-inline-anim.el"))]) (org-inline-pdf . [(20230826 1220) ((emacs (25 1)) (org (9 4))) "Inline PDF previewing for Org" tar ((:commit . "2460c429e0977587863f41176aafe1ca858c13e8") (:authors ("Shigeaki Nishina")) (:maintainers ("Shigeaki Nishina")) (:maintainer "Shigeaki Nishina") (:keywords "org" "outlines" "hypermedia") (:url . "https://github.com/shg/org-inline-pdf.el"))]) (org-iv . [(20171001 1022) ((impatient-mode (1 0 0)) (org (8 0)) (cl-lib (0 5))) "a tool used to view html (in browser) generated by org-file once the org-file changes" tar ((:commit . "7f2bb1b32647655fd9d6684f6f09dcc66b61b0cd") (:authors ("kuangdash" . "kuangdash@163.com")) (:maintainer "kuangdash" . "kuangdash@163.com") (:url . "https://github.com/kuangdash/org-iv"))]) - (org-ivy-search . [(20230222 514) ((emacs (25 1)) (ivy (0 10 0)) (org (0 10 0)) (beacon (1 3 4))) "Full text search for org files powered by ivy" tar ((:commit . "7f2afd8c196e3723ae6ac4dd229367ece9acd3bf") (:authors ("Huming Chen" . "chenhuming@gmail.com")) (:maintainers ("Huming Chen" . "chenhuming@gmail.com")) (:maintainer "Huming Chen" . "chenhuming@gmail.com") (:keywords "convenience" "tool" "org") (:url . "https://github.com/beacoder/org-ivy-search"))]) - (org-jami-bot . [(20230605 950) ((emacs (28 1)) (jami-bot (0 0 1))) "Capture GNU Jami messages as notes and todos in Org mode" tar ((:commit . "6d80549e9aaacd04cff410b22e7f265373f4d73b") (:authors ("Hanno Perrey ")) (:maintainers ("Hanno Perrey" . "hanno@hoowl.se")) (:maintainer "Hanno Perrey" . "hanno@hoowl.se") (:keywords "comm" "outlines" "org-capture" "jami") (:url . "https://gitlab.com/hperrey/org-jami-bot"))]) - (org-jira . [(20230816 2037) ((emacs (24 5)) (cl-lib (0 5)) (request (0 2 0)) (dash (2 14 1))) "Syncing between Jira and Org-mode." tar ((:commit . "ad60d2834eb37d55f4ee89788818c9bc4b2125b1") (:maintainers ("Matthew Carter" . "m@ahungry.com")) (:maintainer "Matthew Carter" . "m@ahungry.com") (:keywords "ahungry" "jira" "org" "bug" "tracker") (:url . "https://github.com/ahungry/org-jira"))]) - (org-journal . [(20230309 1240) ((emacs (25 1)) (org (9 1))) "a simple org-mode based journaling mode" tar ((:commit . "18df4d5ae5e15580df42562c143d007c6d28d75f") (:authors ("Bastian Bechtold") ("Christian Schwarzgruber")) (:maintainers ("Bastian Bechtold")) (:maintainer "Bastian Bechtold") (:url . "http://github.com/bastibe/org-journal"))]) + (org-ivy-search . [(20231213 857) ((emacs (25 1)) (ivy (0 10 0)) (org (0 10 0)) (beacon (1 3 4))) "Full text search for org files powered by ivy" tar ((:commit . "aeff31203c4c407d3f921124b6798ffd04772a11") (:authors ("Huming Chen" . "chenhuming@gmail.com")) (:maintainers ("Huming Chen" . "chenhuming@gmail.com")) (:maintainer "Huming Chen" . "chenhuming@gmail.com") (:keywords "convenience" "tool" "org") (:url . "https://github.com/beacoder/org-ivy-search"))]) + (org-jami-bot . [(20240203 1016) ((emacs (28 1)) (jami-bot (0 0 4))) "Capture GNU Jami messages as notes and todos in Org mode" tar ((:commit . "020b03f299dad438f65d7bcbf93553b273fd7c33") (:authors ("Hanno Perrey" . "hanno@hoowl.se")) (:maintainers ("Hanno Perrey" . "hanno@hoowl.se")) (:maintainer "Hanno Perrey" . "hanno@hoowl.se") (:keywords "comm" "outlines" "org-capture" "jami") (:url . "https://gitlab.com/hperrey/org-jami-bot"))]) + (org-jira . [(20230915 57) ((emacs (24 5)) (cl-lib (0 5)) (request (0 2 0)) (dash (2 14 1))) "Syncing between Jira and Org-mode." tar ((:commit . "295b01ede42952c848bd8d76bc8c456a87876cbc") (:maintainers ("Matthew Carter" . "m@ahungry.com")) (:maintainer "Matthew Carter" . "m@ahungry.com") (:keywords "ahungry" "jira" "org" "bug" "tracker") (:url . "https://github.com/ahungry/org-jira"))]) + (org-journal . [(20240218 1645) ((emacs (26 1)) (org (9 1))) "a simple org-mode based journaling mode" tar ((:commit . "859dc19168dc6b10eba3843f24980a7db79f6869") (:authors ("Bastian Bechtold") ("Christian Schwarzgruber")) (:maintainers ("Bastian Bechtold")) (:maintainer "Bastian Bechtold") (:url . "http://github.com/bastibe/org-journal"))]) (org-journal-list . [(20190221 2052) ((emacs (25))) "Org mode Journal List" tar ((:commit . "2b26d00181bb49bff64b31ad020490acd1b6ae02") (:authors ("Huy Tran" . "huytd189@gmail.com")) (:maintainers ("Huy Tran" . "huytd189@gmail.com")) (:maintainer "Huy Tran" . "huytd189@gmail.com") (:url . "https://github.com/huytd/org-journal-list"))]) - (org-journal-tags . [(20230704 2026) ((emacs (27 1)) (org-journal (2 1 2)) (magit-section (3 3 0)) (transient (0 3 7))) "Tagging and querying system for org-journal" tar ((:commit . "f6433d0810f87a80847f4f3674db4ac89a59c69c") (:authors ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainers ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainer "Korytov Pavel" . "thexcloud@gmail.com") (:url . "https://github.com/SqrtMinusOne/org-journal-tags"))]) + (org-journal-tags . [(20240101 4) ((emacs (27 1)) (org-journal (2 1 2)) (magit-section (3 3 0)) (transient (0 3 7))) "Tagging and querying system for org-journal" tar ((:commit . "a68e40a8473ff18bef58a171245a9cdef6eee622") (:authors ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainers ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainer "Korytov Pavel" . "thexcloud@gmail.com") (:url . "https://github.com/SqrtMinusOne/org-journal-tags"))]) (org-kanban . [(20220723 1216) ((s (0)) (dash (2 17 0)) (emacs (24 4)) (org (9 1))) "kanban dynamic block for org-mode." tar ((:commit . "e78deb03880ae89d6bceae6563ef1383526233a1") (:authors ("Christian Köstlin" . "christian.koestlin@gmail.com")) (:maintainers ("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." tar ((:commit . "fadcfd62e254d0c45e87d63128a82a08ae21869a") (:keywords "org" "link" "ebook" "kindle" "epub" "azw3" "mobi") (:url . "https://repo.or.cz/org-kindle.git"))]) (org-latex-impatient . [(20221111 623) ((emacs (26)) (s (1 8 0)) (posframe (0 8 0)) (org (9 3)) (dash (2 17 0))) "Preview org-latex Fragments Instantly via MathJax" tar ((:commit . "031025a8be9bf7255aa047388d027642cd2d6183") (:authors ("Sheng Yang" . "styang@fastmail.com")) (:maintainers ("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 . [(20230807 1144) ((emacs (28 1)) (nerd-icons (0 0 1)) (fb2-reader (0 1 1))) "Beautify Org Links" tar ((:commit . "af5fdf59fb77424845ac98416826bb9c42e15528") (:keywords "hypermedia") (:url . "https://repo.or.cz/org-link-beautify.git"))]) + (org-link-beautify . [(20240312 529) ((emacs (28 1)) (nerd-icons (0 0 1)) (fb2-reader (0 1 1)) (qrencode (1 2))) "Beautify Org Links" tar ((:commit . "c77338cfac89a41f90eafea80d11d8134e8096f4") (: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" tar ((:commit . "596615ad8373d9090bd4138da683524f0ad0bda5") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("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")) (:maintainers ("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" tar ((:commit . "075e0e6d36eb50406a608bc8a2f0dd359ec63938") (:authors ("Derek Feichtinger" . "dfeich@gmail.com")) (:maintainers ("Derek Feichtinger" . "dfeich@gmail.com")) (:maintainer "Derek Feichtinger" . "dfeich@gmail.com") (:keywords "convenience") (:url . "https://github.com/dfeich/org-listcruncher"))]) - (org-mac-link . [(20230228 1127) ((emacs (27 1))) "Insert org-mode links to items selected in various Mac apps" tar ((:commit . "3a30a937e135a6637a5126e2ac096b6c90584045") (:authors ("Anthony Lander" . "anthony.lander@gmail.com") ("John Wiegley" . "johnw@gnu.org") ("Christopher Suckling ") ("Daniil Frumin" . "difrumin@gmail.com") ("Alan Schmitt" . "alan.schmitt@polytechnique.org") ("Mike McLean" . "mike.mclean@pobox.com")) (:maintainers ("Aimé Bertrand" . "aime.bertrand@macowners.club")) (:maintainer "Aimé Bertrand" . "aime.bertrand@macowners.club") (:keywords "files" "wp" "url" "org") (:url . "https://gitlab.com/aimebertrand/org-mac-link"))]) - (org-make-toc . [(20200409 1436) ((emacs (26 1)) (dash (2 12)) (s (1 10 0)) (org (9 0))) "Automatic tables of contents for Org files" tar ((:commit . "43d4a2490a048b01ca5a6f44c5b4f24a458dfc95") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "org" "convenience") (:url . "http://github.com/alphapapa/org-make-toc"))]) - (org-mime . [(20230321 2341) ((emacs (25 1))) "org html export for text/html MIME emails" tar ((:commit . "d368bd4119bfcf2997a6a23bbf5f41e043164d29") (:authors ("Eric Schulte")) (:maintainers ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainer "Chen Bin" . "chenbin.sh@gmail.com") (:keywords "mime" "mail" "email" "html") (:url . "http://github.com/org-mime/org-mime"))]) + (org-mac-link . [(20231016 2047) ((emacs (27 1))) "Insert org-mode links to items selected in various Mac apps" tar ((:commit . "e30171a6e98db90787ab8a23b3a7dc4fd13b10f9") (:authors ("Anthony Lander" . "anthony.lander@gmail.com") ("John Wiegley" . "johnw@gnu.org") ("Christopher Suckling ") ("Daniil Frumin" . "difrumin@gmail.com") ("Alan Schmitt" . "alan.schmitt@polytechnique.org") ("Mike McLean" . "mike.mclean@pobox.com")) (:maintainers ("Aimé Bertrand" . "aime.bertrand@macowners.club")) (:maintainer "Aimé Bertrand" . "aime.bertrand@macowners.club") (:keywords "files" "wp" "url" "org") (:url . "https://gitlab.com/aimebertrand/org-mac-link"))]) + (org-make-toc . [(20240229 724) ((emacs (26 1)) (dash (2 12)) (s (1 10 0)) (org (9 3)) (compat (29 1))) "Automatic tables of contents for Org files" tar ((:commit . "3ac2024694a9f974a7d263748642182fc7e829d1") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "org" "convenience") (:url . "http://github.com/alphapapa/org-make-toc"))]) + (org-mime . [(20240129 2327) ((emacs (25 1))) "org html export for text/html MIME emails" tar ((:commit . "9d4584651d89806b79d5993b286d32d6f70499a9") (:authors ("Eric Schulte")) (:maintainers ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainer "Chen Bin" . "chenbin.sh@gmail.com") (:keywords "mime" "mail" "email" "html") (:url . "http://github.com/org-mime/org-mime"))]) (org-mind-map . [(20180826 2340) ((emacs (24)) (dash (1 8 0)) (org (8 2 10))) "Creates a directed graph from org-mode files" tar ((:commit . "41df4b2e30455494f1848b4e06cc9208aa9e902b") (:authors ("Ted Wiles" . "theodore.wiles@gmail.com")) (:maintainers ("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 . [(20230410 30) ((emacs (27 1)) (org (9 3)) (dash (2 17)) (s (1 12))) "Functional Org Mode API" tar ((:commit . "f57336a9126a168ad32ccce017c072474555395a") (:authors ("Nathan Dwarshuis" . "ndwar@yavin4.ch")) (:maintainers ("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" tar ((:commit . "06764b943a528827df1e2acc6bc7806cc2c1351f") (:authors ("steckerhalter")) (:maintainers ("steckerhalter")) (:maintainer "steckerhalter") (:keywords "org-mode" "org" "mobile" "sync" "todo") (:url . "https://framagit.org/steckerhalter/org-mobile-sync"))]) - (org-modern . [(20230816 2034) ((emacs (27 1)) (compat (29 1 4 0))) "Modern looks for Org" tar ((:commit . "905a601796d02283e94a603b6011a537ee7e6090") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainers ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:keywords "outlines" "hypermedia" "wp") (:url . "https://github.com/minad/org-modern"))]) + (org-modern . [(20240316 1109) ((emacs (27 1)) (compat (29 1 4 4))) "Modern looks for Org" tar ((:commit . "a2ff4c8e9cac412e8cb9c7faf618ac18146107ea") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainers ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:keywords "outlines" "hypermedia" "text") (: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" tar ((:commit . "e96fecaffa2924de64a507aa31d2934e667ee1ea") (:authors ("Anh T Nguyen")) (:maintainers ("Anh T Nguyen")) (:maintainer "Anh T Nguyen") (:keywords "hypermedia" "outlines" "org") (:url . "https://github.com/teeann/org-movies"))]) - (org-mpv-notes . [(20230828 1747) ((emacs (27 1)) (mpv (0 2 0))) "Take notes in org mode while watching videos in mpv" tar ((:commit . "04ff69a0494a2f81f2f982caf31326a03cb2135b") (:authors ("Bibek Panthi" . "bpanthi977@gmail.com")) (:maintainers ("Bibek Panthi" . "bpanthi977@gmail.com")) (:maintainer "Bibek Panthi" . "bpanthi977@gmail.com") (:url . "https://github.com/bpanthi977/org-mpv-notes"))]) + (org-mpv-notes . [(20231210 628) ((emacs (28 1))) "Take notes in org mode while watching videos in mpv" tar ((:commit . "01d6d52a1f964e7bb61f0f65ac4fb2ccfa986f34") (:authors ("Bibek Panthi" . "bpanthi977@gmail.com")) (:maintainers ("Bibek Panthi" . "bpanthi977@gmail.com")) (:maintainer "Bibek Panthi" . "bpanthi977@gmail.com") (:url . "https://github.com/bpanthi977/org-mpv-notes"))]) (org-mru-clock . [(20230704 850) ((emacs (26 1))) "Clock in/out of tasks with completion and persistent history" tar ((:commit . "66fe744df9100efc4ec68089f7d0ce56a0d38b8b") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainers ("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 . [(20230530 2006) ((emacs (24 4)) (htmlize (1 54))) "Org mode to send and reply to email in HTML." tar ((:commit . "055de4abf611c5d5e12c770fe149c1861b402817") (:authors ("Jérémy Compostella" . "jeremy.compostella@gmail.com")) (:maintainers ("Jérémy Compostella" . "jeremy.compostella@gmail.com")) (:maintainer "Jérémy Compostella" . "jeremy.compostella@gmail.com") (:keywords "extensions" "mail") (:url . "https://github.com/jeremy-compostella/org-msg"))]) + (org-msg . [(20240319 1947) ((emacs (24 4)) (htmlize (1 54))) "Org mode to send and reply to email in HTML." tar ((:commit . "8ce92fecae371b7cfd5ef3c0a3ac280e5664487d") (:authors ("Jérémy Compostella" . "jeremy.compostella@gmail.com")) (:maintainers ("Jérémy Compostella" . "jeremy.compostella@gmail.com")) (:maintainer "Jérémy Compostella" . "jeremy.compostella@gmail.com") (:keywords "extensions" "mail") (:url . "https://github.com/jeremy-compostella/org-msg"))]) (org-multi-wiki . [(20210324 1820) ((emacs (26 1)) (dash (2 12)) (s (1 12)) (org-ql (0 5)) (org (9 3))) "Multiple wikis based on Org mode" tar ((:commit . "bf8039aadddaf02569fab473f766071ef7e63563") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainers ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:keywords "org" "outlines" "files") (:url . "https://github.com/akirak/org-multi-wiki"))]) (org-multiple-keymap . [(20191017 1920) ((org (8 2 4)) (emacs (24)) (cl-lib (0 5))) "Set keymap to elements, such as timestamp and priority." tar ((:commit . "4eb8aa0aada012b2346cc7f0c55e07783141a2c3") (:authors ("myuhe ")) (:maintainers ("myuhe")) (:maintainer "myuhe") (:keywords "convenience" "org-mode") (:url . "https://github.com/myuhe/org-multiple-keymap.el"))]) + (org-newtab . [(20240227 155) ((emacs (27 1)) (websocket (1 14)) (async (1 9 7))) "Supercharge your browser's new tab page" tar ((:commit . "eca494a43e242558bd8db24d321ad62a8ec86c02") (:authors ("Zweihänder" . "zweidev@zweihander.me")) (:maintainers ("Zweihänder" . "zweidev@zweihander.me")) (:maintainer "Zweihänder" . "zweidev@zweihander.me") (:keywords "outlines") (:url . "https://github.com/Zweihander-Main/org-newtab"))]) + (org-nix-shell . [(20240205 1642) ((emacs (27 1)) (org (9 4))) "Org local nix-shell" tar ((:commit . "d9843aa0f62a39b9938a89388e25129ecb39a4cc") (:maintainers ("Anton Hakansson" . "anton@hakanssn.com")) (:maintainer "Anton Hakansson" . "anton@hakanssn.com") (:keywords "processes" "outlines") (:url . "https://github.com/AntonHakansson/"))]) (org-notebook . [(20170322 452) ((emacs (24)) (org (8)) (cl-lib (0 5))) "Ease the use of org-mode as a notebook" tar ((:commit . "d90c4aeca2442161e6dd89de175561af85aace03") (:authors ("Paul Elder" . "paul.elder@amanokami.net")) (:maintainers ("Paul Elder" . "paul.elder@amanokami.net")) (:maintainer "Paul Elder" . "paul.elder@amanokami.net") (:keywords "convenience" "tools"))]) - (org-noter . [(20230827 301) ((emacs (24 4)) (cl-lib (0 6)) (org (9 0))) "A synchronized, Org-mode, document annotator" tar ((:commit . "7f7ce199edb91cddee61222120f1571da6db568f") (:authors ("Gonçalo Santos (github.com/weirdNox)" . "in@bsentia") (" Maintainer Dmitry M" . "dmitrym@gmail.com")) (:maintainers ("Peter Mao" . "peter.mao@gmail.com")) (:maintainer "Peter Mao" . "peter.mao@gmail.com") (:keywords "lisp" "pdf" "interleave" "annotate" "external" "sync" "notes" "documents" "org-mode") (:url . "https://github.com/org-noter/org-noter"))]) + (org-noter . [(20240207 2329) ((emacs (24 4)) (cl-lib (0 6)) (org (9 4))) "A synchronized, Org-mode, document annotator" tar ((:commit . "9e4f57957b8f54db20a4e13bf8d6b32e004ab3e8") (:authors ("Gonçalo Santos (github.com/weirdNox)" . "in@bsentia") (" Maintainer Dmitry M" . "dmitrym@gmail.com")) (:maintainers ("Peter Mao" . "peter.mao@gmail.com")) (:maintainer "Peter Mao" . "peter.mao@gmail.com") (:keywords "lisp" "pdf" "interleave" "annotate" "external" "sync" "notes" "documents" "org-mode") (:url . "https://github.com/org-noter/org-noter"))]) (org-noter-pdftools . [(20230725 1433) ((emacs (26 1)) (org (9 4)) (pdf-tools (0 8)) (org-pdftools (1 0)) (org-noter (1 4 1))) "Integration between org-pdftools and org-noter" tar ((:commit . "4e420233a153a9c4ab3d1a7e1d7d3211c836f0ac") (:authors ("Alexander Fu Xi" . "fuxialexander@gmail.com")) (:maintainers ("Alexander Fu Xi" . "fuxialexnader@gmail.com")) (:maintainer "Alexander Fu Xi" . "fuxialexnader@gmail.com") (:keywords "convenience") (:url . "https://github.com/fuxialexander/org-pdftools"))]) (org-notifications . [(20210918 1827) ((emacs (25 1)) (org (9 0)) (sound-wav (0 2)) (alert (1 2)) (seq (2 21))) "Creates notifications for org-mode entries" tar ((:commit . "b8032f8adfbeb328962a5657c6dd173e64cc76e5") (:authors ("doppelc")) (:maintainers ("doppelc")) (:maintainer "doppelc") (:keywords "outlines") (:url . "https://github.com/doppelc/org-notifications"))]) (org-octopress . [(20170821 415) ((org (9 0)) (orglue (0 1)) (ctable (0 1 1))) "Compose octopress articles using org-mode." tar ((:commit . "38598ef98d04076a8eb78d549907ddfde8d3a652") (:authors ("Yoshinari Nomura" . "nom@quickhack.net")) (:maintainers ("Yoshinari Nomura" . "nom@quickhack.net")) (:maintainer "Yoshinari Nomura" . "nom@quickhack.net") (:keywords "org" "jekyll" "octopress" "blog"))]) @@ -3738,31 +3839,31 @@ (org-present-remote . [(20221107 1139) ((org-present (9)) (elnode (0 9)) (emacs (25)) (fakir (20140729 1652)) (s (20210616 619)) (web (20141231 2001))) "A web-based remote control for org-present" tar ((:commit . "95ea38b985b5aaa49b8039010bbe5fda5188a197") (:authors ("Duncan Bayne" . "duncan@bayne.id.au")) (:maintainers ("Duncan Bayne" . "duncan@bayne.id.au")) (:maintainer "Duncan Bayne" . "duncan@bayne.id.au") (:keywords "comm" "docs") (:url . "https://gitlab.com/duncan-bayne/org-present-remote"))]) (org-pretty-tags . [(20211228 1546) ((emacs (25))) "Surrogates for tags" tar ((:commit . "e127a1e08df8273b909a99594ffaad84960ff212") (:authors ("Marco Wahl" . "marcowahlsoft@gmail.com")) (:maintainers ("Marco Wahl" . "marcowahlsoft@gmail.com")) (:maintainer "Marco Wahl" . "marcowahlsoft@gmail.com") (:keywords "reading" "outlines") (:url . "https://gitlab.com/marcowahl/org-pretty-tags"))]) (org-preview-html . [(20220809 1033) ((emacs (25 1)) (org (8 0))) "Automatically preview org-exported HTML files within Emacs" tar ((:commit . "785e1f5c99c0f2d76a9a6611a06b4552a343e221") (:authors ("Jake B" . "jakebox0@protonmail.com")) (:maintainers ("Jake B" . "jakebox0@protonmail.com")) (:maintainer "Jake B" . "jakebox0@protonmail.com") (:keywords "org" "convenience" "outlines") (:url . "https://github.com/jakebox/org-preview-html"))]) - (org-project-capture . [(20230817 816) ((dash (2 10 0)) (emacs (28)) (s (1 9 0)) (org-category-capture (1 0 0))) "Repository todo capture and management for org-mode" tar ((:commit . "ad8daa991698df265a21b161e62a41e04979d98f") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainers ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:keywords "org-mode" "todo" "tools" "outlines" "project" "capture") (:url . "https://github.com/colonelpanic8/org-project-capture"))]) + (org-project-capture . [(20230830 1733) ((dash (2 10 0)) (emacs (28)) (s (1 9 0)) (org-category-capture (1 0 0))) "Repository todo capture and management for org-mode" tar ((:commit . "581ca06383b957e2927c24290debd3cf83355456") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainers ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:keywords "org-mode" "todo" "tools" "outlines" "project" "capture") (:url . "https://github.com/colonelpanic8/org-project-capture"))]) (org-projectile . [(20230817 851) ((projectile (2 3 0)) (dash (2 10 0)) (org-project-capture (3 0 1)) (org-category-capture (3 0 1))) "Repository todo capture and management for org-mode with projectile" tar ((:commit . "4ca2667d498fa259772e46ff5e101285446d70b6") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainers ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:keywords "org-mode" "projectile" "todo" "tools" "outlines" "project" "capture") (:url . "https://github.com/colonelpanic8/org-project-capture"))]) (org-projectile-helm . [(20230817 801) ((org-projectile (1 0 0)) (helm (2 3 1)) (emacs (25))) "helm functions for org-projectile" tar ((:commit . "214a6068c467323a795b27996c1e7b75ae42dc68") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainers ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:keywords "org" "projectile" "todo" "helm" "outlines") (:url . "https://github.com/IvanMalison/org-projectile"))]) (org-protocol-jekyll . [(20170328 1639) ((cl-lib (0 5))) "Jekyll's handler for org-protocol" tar ((:commit . "dec064a42d6dfe81dfde7ba59ece5ca103ac6334") (:authors ("Vladimir S. Ivanov" . "ivvl82@gmail.com")) (:maintainers ("Vladimir S. Ivanov" . "ivvl82@gmail.com")) (:maintainer "Vladimir S. Ivanov" . "ivvl82@gmail.com"))]) - (org-ql . [(20230525 1548) ((emacs (26 1)) (dash (2 18 1)) (f (0 17 2)) (map (2 1)) (org (9 0)) (org-super-agenda (1 2)) (ov (1 0 6)) (peg (1 0 1)) (s (1 12 0)) (transient (0 1)) (ts (0 2 -1))) "Org Query Language, search command, and agenda-like view" tar ((:commit . "eb5377320fcfd38354d6e9e3e655969ae3c0e052") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "hypermedia" "outlines" "org" "agenda") (:url . "https://github.com/alphapapa/org-ql"))]) + (org-ql . [(20240222 200) ((emacs (27 1)) (compat (29 1)) (dash (2 18 1)) (f (0 17 2)) (map (2 1)) (org (9 0)) (org-super-agenda (1 2)) (ov (1 0 6)) (peg (1 0 1)) (s (1 12 0)) (transient (0 1)) (ts (0 2 -1))) "Org Query Language, search command, and agenda-like view" tar ((:commit . "e41fe9018a4699532ec875bedddc9746f8e362aa") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "hypermedia" "outlines" "org" "agenda") (:url . "https://github.com/alphapapa/org-ql"))]) (org-radiobutton . [(20210519 1225) ((dash (2 13 0)) (emacs (24))) "Radiobutton for org-mode lists." tar ((:commit . "4ba26bbd26102c45c234bc6ce9a8e9c655c6a0a2") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "outlines") (:url . "https://github.com/Fuco1/org-radiobutton"))]) - (org-rainbow-tags . [(20230607 1927) ((emacs (28 1))) "Colorize org tags automatically" tar ((:commit . "550cc521013ba631bb3ad5fc4acdb72b655b24b7") (:authors ("Furkan Karataş" . "furkan.karatas02@gmail.com")) (:maintainers ("Furkan Karataş" . "furkan.karatas02@gmail.com")) (:maintainer "Furkan Karataş" . "furkan.karatas02@gmail.com") (:keywords "faces" "outlines") (:url . "https://github.com/KaratasFurkan/org-rainbow-tags"))]) + (org-rainbow-tags . [(20230921 2038) ((emacs (28 1))) "Colorize org tags automatically" tar ((:commit . "fd0b68921302fdc3f0d086db7a09b5196251160f") (:authors ("Furkan Karataş" . "furkan.karatas02@gmail.com")) (:maintainers ("Furkan Karataş" . "furkan.karatas02@gmail.com")) (:maintainer "Furkan Karataş" . "furkan.karatas02@gmail.com") (:keywords "faces" "outlines") (:url . "https://github.com/KaratasFurkan/org-rainbow-tags"))]) (org-random-todo . [(20190214 2057) ((emacs (24 3)) (alert (1 3))) "show a random TODO (with alert) every so often" tar ((:commit . "4f7677af740e8f3f7cfaf630ae2e594a125af760") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainers ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org") (:keywords "org" "todo" "notification" "calendar") (:url . "https://github.com/unhammer/org-random-todo"))]) (org-randomnote . [(20200110 1407) ((f (0 19 0)) (dash (2 12 0)) (org (0))) "Find a random note in your Org-Mode files" tar ((:commit . "ea8cf4385970637efffff8f79e14576ba6d7ad13") (:authors ("Michael Fogleman" . "michaelwfogleman@gmail.com")) (:maintainers ("Michael Fogleman" . "michaelwfogleman@gmail.com")) (:maintainer "Michael Fogleman" . "michaelwfogleman@gmail.com") (:url . "http://github.com/mwfogleman/org-randomnote"))]) - (org-re-reveal . [(20230824 1005) ((emacs (24 4)) (org (8 3)) (htmlize (1 34))) "Org export to reveal.js presentations" tar ((:commit . "d12b4acd6e1d9b1bec7e253bc417bcc830ed9da1") (:keywords "tools" "outlines" "hypermedia" "slideshow" "presentation" "oer") (:url . "https://gitlab.com/oer/org-re-reveal"))]) + (org-re-reveal . [(20240318 645) ((emacs (24 4)) (org (8 3)) (htmlize (1 34))) "Org export to reveal.js presentations" tar ((:commit . "827961d69d56a2c9a777dc6280d8cd832ede125b") (:keywords "tools" "outlines" "hypermedia" "slideshow" "presentation" "oer") (:url . "https://gitlab.com/oer/org-re-reveal"))]) (org-re-reveal-citeproc . [(20211028 1328) ((emacs (25 1)) (org (9 5)) (citeproc (0 9)) (org-re-reveal (3 0 0))) "Citations and bibliography for org-re-reveal" tar ((:commit . "faa9ea387917b20bd1499ad90199ff3d417c00c2") (:authors ("Jens Lechtenbörger")) (:maintainers ("Jens Lechtenbörger")) (:maintainer "Jens Lechtenbörger") (:keywords "hypermedia" "tools" "slideshow" "presentation" "bibliography") (:url . "https://gitlab.com/oer/org-re-reveal-citeproc"))]) (org-re-reveal-ref . [(20211029 551) ((emacs (25 1)) (org-ref (1 1 1)) (org-re-reveal (0 9 3))) "Citations and bibliography for org-re-reveal" tar ((:commit . "ea9661864d5fbef87b12b78f516c13a40c683f24") (:authors ("Jens Lechtenbörger")) (:maintainers ("Jens Lechtenbörger")) (:maintainer "Jens Lechtenbörger") (:keywords "hypermedia" "tools" "slideshow" "presentation" "bibliography") (:url . "https://gitlab.com/oer/org-re-reveal-ref"))]) (org-recent-headings . [(20211011 1519) ((emacs (26 1)) (org (9 0 5)) (dash (2 18 0)) (frecency (0 1)) (s (1 12 0))) "Jump to recently used Org headings" tar ((:commit . "97418d581ea030f0718794e50b005e9bae44582e") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "hypermedia" "outlines" "org") (:url . "http://github.com/alphapapa/org-recent-headings"))]) (org-recur . [(20230124 1532) ((emacs (24 1)) (org (9 0)) (dash (2 7 0))) "Recurring org-mode tasks" tar ((:commit . "628099883a63d219f76cd9631cc914fe6ec8a3e3") (:authors ("Marcin Swieczkowski" . "marcin.swieczkowski@gmail.com")) (:maintainers ("Marcin Swieczkowski" . "marcin.swieczkowski@gmail.com")) (:maintainer "Marcin Swieczkowski" . "marcin.swieczkowski@gmail.com") (:url . "https://github.com/mrcnski/org-recur"))]) (org-redmine . [(20160711 1114) nil "Redmine tools using Emacs OrgMode" tar ((:commit . "a526c3ac802634486bf10de9c2283ccb1a30ec8d") (:authors ("Wataru MIYAGUNI" . "gonngo@gmail.com")) (:maintainers ("Wataru MIYAGUNI" . "gonngo@gmail.com")) (:maintainer "Wataru MIYAGUNI" . "gonngo@gmail.com") (:keywords "redmine" "org") (:url . "https://github.com/gongo/org-redmine"))]) - (org-ref . [(20230830 9) ((org (9 4)) (dash (0)) (s (0)) (f (0)) (htmlize (0)) (hydra (0)) (avy (0)) (parsebib (0)) (bibtex-completion (0)) (citeproc (0)) (ox-pandoc (0))) "citations, cross-references and bibliographies in org-mode" tar ((:commit . "af103782f077bd4044062e723af52f9a4c591f5a") (:authors ("John Kitchin" . "jkitchin@andrew.cmu.edu")) (:maintainers ("John Kitchin" . "jkitchin@andrew.cmu.edu")) (:maintainer "John Kitchin" . "jkitchin@andrew.cmu.edu") (:keywords "org-mode" "cite" "ref" "label") (:url . "https://github.com/jkitchin/org-ref"))]) + (org-ref . [(20240307 1757) ((org (9 4)) (dash (0)) (s (0)) (f (0)) (htmlize (0)) (hydra (0)) (avy (0)) (parsebib (0)) (bibtex-completion (0)) (citeproc (0)) (ox-pandoc (0)) (request (0))) "citations, cross-references and bibliographies in org-mode" tar ((:commit . "190248311f90cfc4f0cceef20c7bd52a5d5aa66f") (:authors ("John Kitchin" . "jkitchin@andrew.cmu.edu")) (:maintainers ("John Kitchin" . "jkitchin@andrew.cmu.edu")) (:maintainer "John Kitchin" . "jkitchin@andrew.cmu.edu") (:keywords "org-mode" "cite" "ref" "label") (:url . "https://github.com/jkitchin/org-ref"))]) (org-ref-prettify . [(20220507 649) ((emacs (24 3)) (org-ref (3 0)) (bibtex-completion (1 0 0))) "Prettify org-ref citation links" tar ((:commit . "0ec3b6e398ee117c8b8a787a0422b95d9e95f7bb") (:authors ("Alex Kost" . "alezost@gmail.com") ("Vitus Schäfftlein" . "vitusschaefftlein@live.de")) (:maintainers ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:keywords "convenience") (:url . "https://github.com/alezost/org-ref-prettify.el"))]) (org-repo-todo . [(20171228 119) nil "Simple repository todo management with org-mode" tar ((:commit . "f73ebd91399c5760ad52c6ad9033de1066042003") (:authors ("justin talbott" . "justin@waymondo.com")) (:maintainers ("justin talbott" . "justin@waymondo.com")) (:maintainer "justin talbott" . "justin@waymondo.com") (:keywords "convenience") (:url . "https://github.com/waymondo/org-repo-todo"))]) (org-reverse-datetree . [(20221203 259) ((emacs (28 1)) (dash (2 19)) (org (9 5))) "Create reverse date trees in org-mode" tar ((:commit . "fca95cd22ed29653f3217034c71ec0ab0a7c7734") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainers ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:keywords "outlines") (:url . "https://github.com/akirak/org-reverse-datetree"))]) (org-review . [(20230119 1706) nil "schedule reviews for Org entries" tar ((:commit . "77211e40db8a9558b866f5660c7127922b459e6c") (:authors ("Alan Schmitt" . "alan.schmitt@polytechnique.org")) (:maintainers ("Alan Schmitt" . "alan.schmitt@polytechnique.org")) (:maintainer "Alan Schmitt" . "alan.schmitt@polytechnique.org") (:keywords "org" "review") (:url . "https://github.com/brabalan/org-review"))]) - (org-rich-yank . [(20230605 824) ((emacs (24 4))) "Paste with org-mode markup and link to source" tar ((:commit . "9d840c04cba45d245d0dbb4147d6a2b865f45cb5") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainers ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org") (:keywords "convenience" "hypermedia" "org") (:url . "https://github.com/unhammer/org-rich-yank"))]) - (org-roam . [(20230307 1721) ((emacs (26 1)) (dash (2 13)) (org (9 4)) (emacsql (20230228)) (magit-section (3 0 0))) "A database abstraction layer for Org-mode" tar ((:commit . "5c06471c3a11348342719fd9011486455adeb701") (:authors ("Jethro Kuan" . "jethrokuan95@gmail.com")) (:maintainers ("Jethro Kuan" . "jethrokuan95@gmail.com")) (:maintainer "Jethro Kuan" . "jethrokuan95@gmail.com") (:keywords "org-mode" "roam" "convenience") (:url . "https://github.com/org-roam/org-roam"))]) - (org-roam-bibtex . [(20230628 2036) ((emacs (27 1)) (org-roam (2 2 0)) (bibtex-completion (2 0 0))) "Org Roam meets BibTeX" tar ((:commit . "f90ac12b7ae5ba7bcdebfe53796fd0417946e5e1") (:authors ("Mykhailo Shevchuk" . "mail@mshevchuk.com") ("Leo Vivier" . "leo.vivier+dev@gmail.com")) (:maintainers ("Mykhailo Shevchuk" . "mail@mshevchuk.com")) (:maintainer "Mykhailo Shevchuk" . "mail@mshevchuk.com") (:keywords "bib" "hypermedia" "outlines" "wp") (:url . "https://github.com/org-roam/org-roam-bibtex"))]) - (org-roam-ql . [(20230823 2249) ((emacs (28)) (org-roam (2 2 0)) (s (1 12 0)) (magit-section (3 3 0)) (transient (0 4)) (org-super-agenda (1 2))) "Interface to query and view results from org-roam" tar ((:commit . "85d46926b15946c894fc19044dcf869116de94d6") (:authors ("Shariff AM Faleel")) (:maintainers ("Shariff AM Faleel")) (:maintainer "Shariff AM Faleel") (:url . "https://github.com/ahmed-shariff/org-roam-ql"))]) - (org-roam-ql-ql . [(20230820 1942) ((emacs (28)) (org-roam-ql (0 1)) (org-ql (0 7)) (org-roam (2 2 0)) (s (1 12 0)) (transient (0 4))) "Intgrating org-roam and org-ql" tar ((:commit . "e5ee7db483c220f11b1517d1de92905fcc8e5879") (:authors ("Shariff AM Faleel")) (:maintainers ("Shariff AM Faleel")) (:maintainer "Shariff AM Faleel") (:url . "https://github.com/ahmed-shariff/org-roam-ql"))]) + (org-rich-yank . [(20240302 659) ((emacs (25 1))) "Paste with org-mode markup and link to source" tar ((:commit . "50925a1183a51a6b3a9cf9ce23c425735e622e42") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainers ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org") (:keywords "convenience" "hypermedia" "org") (:url . "https://github.com/unhammer/org-rich-yank"))]) + (org-roam . [(20240114 1941) ((emacs (26 1)) (dash (2 13)) (org (9 4)) (emacsql (20230228)) (magit-section (3 0 0))) "A database abstraction layer for Org-mode" tar ((:commit . "2e94f55cc58f6dce2772a6f33521eb5afcf67265") (:authors ("Jethro Kuan" . "jethrokuan95@gmail.com")) (:maintainers ("Jethro Kuan" . "jethrokuan95@gmail.com")) (:maintainer "Jethro Kuan" . "jethrokuan95@gmail.com") (:keywords "org-mode" "roam" "convenience") (:url . "https://github.com/org-roam/org-roam"))]) + (org-roam-bibtex . [(20240229 1913) ((emacs (27 1)) (org-roam (2 2 0)) (bibtex-completion (1 0 0))) "Org Roam meets BibTeX" tar ((:commit . "d9b8a57cfca832e3e7c7f414bf93060acbf63573") (:authors ("Mykhailo Shevchuk" . "mail@mshevchuk.com") ("Leo Vivier" . "leo.vivier+dev@gmail.com")) (:maintainers ("Mykhailo Shevchuk" . "mail@mshevchuk.com")) (:maintainer "Mykhailo Shevchuk" . "mail@mshevchuk.com") (:keywords "bib" "hypermedia" "outlines" "wp") (:url . "https://github.com/org-roam/org-roam-bibtex"))]) + (org-roam-ql . [(20240226 1311) ((emacs (28)) (org-roam (2 2 0)) (s (1 12 0)) (magit-section (3 3 0)) (transient (0 4)) (org-super-agenda (1 2))) "Interface to query and view results from org-roam" tar ((:commit . "2bd7c59ce1216b5d76e2a067be2f25807cd4d831") (:authors ("Shariff AM Faleel")) (:maintainers ("Shariff AM Faleel")) (:maintainer "Shariff AM Faleel") (:url . "https://github.com/ahmed-shariff/org-roam-ql"))]) + (org-roam-ql-ql . [(20230902 613) ((emacs (28)) (org-roam-ql (0 1)) (org-ql (0 7)) (org-roam (2 2 0)) (s (1 12 0)) (transient (0 4))) "Intgrating org-roam and org-ql" tar ((:commit . "31b7de04430e2e989564cc58d82c2b92f2383ee4") (:authors ("Shariff AM Faleel")) (:maintainers ("Shariff AM Faleel")) (:maintainer "Shariff AM Faleel") (:url . "https://github.com/ahmed-shariff/org-roam-ql"))]) (org-roam-timestamps . [(20221104 1544) ((emacs (26 1)) (org-roam (2 0 0))) "Keep track of modification times for org-roam" tar ((:commit . "c4ff1e2f5b0905b5caa917249aab56ddc1de1ab3") (:authors ("Thomas F. K. Jorna ")) (:maintainers ("Thomas F. K. Jorna" . "jorna@jtrialerror.com")) (:maintainer "Thomas F. K. Jorna" . "jorna@jtrialerror.com") (:keywords "calendar" "outlines" "files") (:url . "https://github.com/ThomasFKJorna/org-roam-timestamps/"))]) (org-roam-ui . [(20221105 1040) ((emacs (27 1)) (org-roam (2 0 0)) (simple-httpd (20191103 1446)) (websocket (1 13))) "User Interface for Org-roam" tar ((:commit . "5ac74960231db0bf7783c2ba7a19a60f582e91ab") (:authors ("Kirill Rogovoy, Thomas Jorna")) (:maintainers ("Kirill Rogovoy, Thomas Jorna")) (:maintainer "Kirill Rogovoy, Thomas Jorna") (:keywords "files" "outlines") (:url . "https://github.com/org-roam/org-roam-ui"))]) (org-ros . [(20220320 1705) ((emacs (24 1))) "Rahul's Org-Mode Screenshot" tar ((:commit . "70e0f33ee027ca1dce68351ad14a9e47a452fc17") (:authors ("Rahul Martim Juliato" . "rahul.juliato@gmail.com")) (:maintainers ("Rahul Martim Juliato" . "rahul.juliato@gmail.com")) (:maintainer "Rahul Martim Juliato" . "rahul.juliato@gmail.com") (:url . "https://github.com/LionyxML/ros"))]) @@ -3771,28 +3872,30 @@ (org-scrum . [(20200131 1129) ((emacs (24 5)) (org (8 2)) (seq (2 3)) (cl-lib (1 0))) "org mode extensions for scrum planning and reporting" tar ((:commit . "a383348ea80c2459bfb96fa0652b98f0059bd311") (:authors ("Ian Martins" . "ianxm@jhu.edu")) (:maintainers ("Ian Martins" . "ianxm@jhu.edu")) (:maintainer "Ian Martins" . "ianxm@jhu.edu") (:url . "https://github.com/ianxm/emacs-scrum"))]) (org-seek . [(20161217 502) ((emacs (24 3)) (ag (0 48))) "Searching Org-mode files with search tools." tar ((:commit . "1f51e6634e3b9a6a29d335d0d14370a6ffef2265") (:authors ("stardiviner" . "numbchild@gmail.com")) (:maintainers ("stardiviner" . "numbchild@gmail.com")) (:maintainer "stardiviner" . "numbchild@gmail.com") (:keywords "org" "search" "ag" "pt") (:url . "https://github.com/stardiviner/org-seek.el"))]) (org-shoplist . [(20210629 2157) ((emacs (25))) "Eat the world" tar ((:commit . "71ea7643e66c97d21df49fb8b600578ca0464f83") (:authors ("lordnik22")) (:maintainers ("lordnik22")) (:maintainer "lordnik22") (:keywords "extensions" "matching") (:url . "https://github.com/lordnik22"))]) - (org-sidebar . [(20210912 1321) ((emacs (26 1)) (s (1 10 0)) (dash (2 18)) (org (9 0)) (org-ql (0 2)) (org-super-agenda (1 0))) "Helpful sidebar for Org buffers" tar ((:commit . "288703b897449f5110c9c76e78eb9a928ffc0dcd") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "hypermedia" "outlines" "org" "agenda") (:url . "https://github.com/alphapapa/org-sidebar"))]) + (org-side-tree . [(20240130 656) ((emacs (28 1))) "Navigate Org outlines in side window tree" tar ((:commit . "62169a26edfafacd681ecaf84289dd6b58be6c32") (:authors ("Grant Rosson ")) (:maintainers ("Grant Rosson ")) (:maintainer "Grant Rosson ") (:url . "https://github.com/localauthor/org-side-tree"))]) + (org-sidebar . [(20240102 9) ((emacs (26 1)) (compat (29 1)) (s (1 10 0)) (dash (2 18)) (org (9 6)) (org-ql (0 2)) (org-super-agenda (1 0))) "Helpful sidebar for Org buffers" tar ((:commit . "1e06d1b4ab5f0d09301712cdecb757c9437a7179") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "hypermedia" "outlines" "org" "agenda") (:url . "https://github.com/alphapapa/org-sidebar"))]) (org-snooze . [(20181229 1424) ((emacs (24 4))) "Snooze your code, doc and feed" tar ((:commit . "8799adc14a20f3489063d279ff69312de3180bf9") (:authors ("Bill Xue")) (:maintainers ("Bill Xue")) (:maintainer "Bill Xue") (:keywords "extensions") (:url . "https://github.com/xueeinstein/org-snooze.el"))]) (org-special-block-extras . [(20230721 43) ((s (1 13 1)) (dash (2 18 1)) (emacs (27 1)) (org (9 1)) (lf (1 0)) (dad-joke (1 4)) (seq (2 0)) (lolcat (0))) "30 new custom blocks & 34 link types for Org-mode" tar ((:commit . "d7bdf9fcfe28f96f9470719f3985a6e413592de8") (:authors ("Musa Al-hassy" . "alhassy@gmail.com")) (:maintainers ("Musa Al-hassy" . "alhassy@gmail.com")) (:maintainer "Musa Al-hassy" . "alhassy@gmail.com") (:keywords "org" "blocks" "colors" "convenience") (:url . "https://alhassy.github.io/org-special-block-extras"))]) (org-sql . [(20220621 2252) ((emacs (27 1)) (s (1 12)) (f (0 20 0)) (dash (2 17)) (org-ml (5 6 1))) "Org-Mode SQL converter" tar ((:commit . "43376abf46b897a9a862cfcc1c087f4b8688634c") (:authors ("Nathan Dwarshuis" . "natedwarshuis@gmail.com")) (:maintainers ("Nathan Dwarshuis" . "natedwarshuis@gmail.com")) (:maintainer "Nathan Dwarshuis" . "natedwarshuis@gmail.com") (:keywords "org-mode" "data") (:url . "https://github.com/ndwarshuis/org-sql"))]) (org-starter . [(20220326 1106) ((emacs (25 1)) (dash (2 18))) "A basic configuration framework for org mode" tar ((:commit . "cd9c5c0402de941299d1c8901f26a8f24d755022") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainers ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:url . "https://github.com/akirak/org-starter"))]) (org-starter-swiper . [(20220326 1106) ((emacs (25 1)) (swiper (0 11)) (org-starter (0 2 4))) "Swiper for org-starter" tar ((:commit . "cd9c5c0402de941299d1c8901f26a8f24d755022") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainers ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:url . "https://github.com/akirak/org-starter"))]) - (org-static-blog . [(20230625 721) ((emacs (24 3))) "a simple org-mode based static blog generator" tar ((:commit . "eebf509c3acbda760faa7fd12b2e8902ae09482f") (:authors ("Bastian Bechtold")) (:maintainers ("Bastian Bechtold")) (:maintainer "Bastian Bechtold") (:url . "https://github.com/bastibe/org-static-blog"))]) + (org-static-blog . [(20240124 1550) ((emacs (24 3))) "a simple org-mode based static blog generator" tar ((:commit . "6459a46bd40abbfe21095504d229db0f66494e86") (:authors ("Bastian Bechtold")) (:maintainers ("Bastian Bechtold")) (:maintainer "Bastian Bechtold") (:url . "https://github.com/bastibe/org-static-blog"))]) (org-sticky-header . [(20201223 143) ((emacs (24 4)) (org (8 3 5))) "Show off-screen Org heading at top of window" tar ((:commit . "79136b8c54c48547ba8a07a72a9790cb8e23ecbd") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "hypermedia" "outlines" "org") (:url . "http://github.com/alphapapa/org-sticky-header"))]) - (org-super-agenda . [(20220826 2315) ((emacs (26 1)) (s (1 10 0)) (dash (2 13)) (org (9 0)) (ht (2 2)) (ts (0 2))) "Supercharge your agenda" tar ((:commit . "f4f528985397c833c870967884b013cf91a1da4a") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "hypermedia" "outlines" "org" "agenda") (:url . "http://github.com/alphapapa/org-super-agenda"))]) + (org-super-agenda . [(20240301 1602) ((emacs (26 1)) (compat (29 1 4 1)) (s (1 10 0)) (dash (2 13)) (org (9 0)) (ht (2 2)) (ts (0 2))) "Supercharge your agenda" tar ((:commit . "51c9da5ce7b791150758984bab469d2222516844") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "hypermedia" "outlines" "org" "agenda") (:url . "http://github.com/alphapapa/org-super-agenda"))]) (org-superstar . [(20230116 1358) ((org (9 1 9)) (emacs (26 1))) "Prettify headings and plain lists in Org mode" tar ((:commit . "29dbbc48ac925f36cc1636b36b4a3ccb3588e17f") (:authors ("D. Williams" . "d.williams@posteo.net")) (:maintainers ("D. Williams" . "d.williams@posteo.net")) (:maintainer "D. Williams" . "d.williams@posteo.net") (:keywords "faces" "outlines") (:url . "https://github.com/integral-dw/org-superstar-mode"))]) (org-sync . [(20181204 23) ((cl-lib (0 5)) (org (8 2)) (emacs (24))) "Synchronize Org documents with External Issue Trackers" tar ((:commit . "e34a385fa9e658c8341a0a6e6bc3472d4d536bb8") (:authors ("Aurelien Aptel ")) (:maintainers ("Andrei Beliankou" . "arbox@yandex.ru")) (:maintainer "Andrei Beliankou" . "arbox@yandex.ru") (:keywords "org" "synchronization" "issue tracking" "github" "redmine") (:url . "https://github.com/arbox/org-sync"))]) (org-sync-snippets . [(20210111 1726) ((org (8 3 5)) (emacs (24 3)) (f (0 17 3))) "Export snippets to org-mode and vice versa" tar ((:commit . "88f995dea188b8a645a3388c42b62a2bb88953d3") (:authors ("Adrien Brochard")) (:maintainers ("Adrien Brochard")) (:maintainer "Adrien Brochard") (:keywords "snippet" "org-mode" "yasnippet" "tools") (:url . "https://github.com/abrochard/org-sync-snippets"))]) (org-table-color . [(20220311 1927) ((emacs (26 1))) "Add color to your org-mode table cells" tar ((:commit . "2022f301ef323953c3a0e087a1b601da85e06da1") (:authors ("Colin Woodbury" . "colin@fosskers.ca")) (:maintainers ("Colin Woodbury" . "colin@fosskers.ca")) (:maintainer "Colin Woodbury" . "colin@fosskers.ca") (:keywords "data" "faces" "lisp") (:url . "https://github.com/fosskers/org-table-color"))]) (org-table-comment . [(20120209 1851) nil "Org table comment modes." tar ((:commit . "33b9966c33ecbc3e27cca67c2f2cdea04364d74e") (:authors ("Matthew L. Fidler ")) (:maintainers ("Matthew L. Fidler")) (:maintainer "Matthew L. Fidler") (:keywords "org-mode" "orgtbl") (:url . "http://github.com/mlf176f2/org-table-comment.el"))]) (org-table-sticky-header . [(20190924 506) ((org (8 2 10)) (emacs (24 4))) "Sticky header for org-mode tables" tar ((:commit . "b65442857128ab04724aaa301e60aa874a31a798") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainers ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions"))]) - (org-tag-beautify . [(20230721 203) ((emacs (26 1)) (nerd-icons (0 0 1))) "Beautify Org mode tags" tar ((:commit . "4805dd105eca312c8ef6033bd57d356b37063ace") (:keywords "hypermedia") (:url . "https://repo.or.cz/org-tag-beautify.git"))]) + (org-tag-beautify . [(20240216 939) ((emacs (26 1)) (nerd-icons (0 0 1))) "Beautify Org mode tags" tar ((:commit . "6ec9f65e98df1e7f8a55c98bd2a3c0433fbfc5db") (:keywords "hypermedia") (:url . "https://repo.or.cz/org-tag-beautify.git"))]) (org-tagged . [(20220926 2048) ((s (1 13 0)) (dash (2 19 1)) (emacs (28 1)) (org (9 5 2))) "Dynamic block for tagged org-mode todos" tar ((:commit . "4b0174473772fca976426e982bb3f4a3037c1e37") (:authors ("Christian Köstlin" . "christian.koestlin@gmail.com")) (:maintainers ("Christian Köstlin" . "christian.koestlin@gmail.com")) (:maintainer "Christian Köstlin" . "christian.koestlin@gmail.com") (:keywords "org-mode" "org" "gtd" "tools") (:url . "http://github.com/gizmomogwai/org-tagged"))]) (org-tanglesync . [(20200127 1616) ((emacs (24 4))) "Syncing org src blocks with tangled external files" tar ((:commit . "31aa5502d1d4f8b032807949908c016b00556684") (:authors ("Mehmet Tekman")) (:maintainers ("Mehmet Tekman")) (:maintainer "Mehmet Tekman") (:keywords "outlines") (:url . "https://github.com/mtekman/org-tanglesync.el"))]) (org-tfl . [(20170923 1218) ((org (0 16 2)) (cl-lib (0 5)) (emacs (24 1))) "Transport for London meets Orgmode" tar ((:commit . "f0d7d39106a1de5457f5160cddd98ab892b61066") (:authors ("storax (David Zuber), ")) (:maintainers ("storax (David Zuber), ")) (:maintainer "storax (David Zuber), ") (:keywords "org" "tfl") (:url . "https://github.com/storax/org-tfl"))]) (org-themis . [(20160122 404) ((cl-lib (0 4))) "Experimental project management mode for org-mode" tar ((:commit . "78aadbbe22b1993be5c4accd0d3f91a4e85c9a3c") (:maintainers ("Zachary Elliott" . "contact@zell.io")) (:maintainer "Zachary Elliott" . "contact@zell.io") (:keywords "org-mode" "elisp" "project") (:url . "http://github.com/zellio/org-themis"))]) - (org-tidy . [(20230829 53) ((emacs (27 1)) (dash (2 19 1))) "A minor mode to tidy org-mode buffers" tar ((:commit . "11f71638710d4c0fefd9bf7293145b9b24a7d70e") (:authors ("Xuqing Jia" . "jxq@jxq.me")) (:maintainers ("Xuqing Jia" . "jxq@jxq.me")) (:maintainer "Xuqing Jia" . "jxq@jxq.me") (:keywords "convenience" "org") (:url . "https://github.com/jxq0/org-tidy"))]) + (org-tidy . [(20240110 114) ((emacs (27 1)) (dash (2 19 1))) "A minor mode to tidy org-mode buffers" tar ((:commit . "26d9636f0c43f1ee3f0528880111a4c1dd2bed32") (:authors ("Xuqing Jia" . "jxq@jxq.me")) (:maintainers ("Xuqing Jia" . "jxq@jxq.me")) (:maintainer "Xuqing Jia" . "jxq@jxq.me") (:keywords "convenience" "org") (:url . "https://github.com/jxq0/org-tidy"))]) (org-time-budgets . [(20200715 1016) ((alert (0 5 10)) (cl-lib (0 5))) "Define time budgets and display clocked time." tar ((:commit . "1d6bfc323013bbf725167842d9e097fad805de03") (:authors ("Arthur Leonard Andersen" . "leoc.git@gmail.com")) (:maintainers ("Arthur Leonard Andersen" . "leoc.git@gmail.com")) (:maintainer "Arthur Leonard Andersen" . "leoc.git@gmail.com"))]) + (org-timeblock . [(20240212 649) ((emacs (28 1)) (compat (29 1 4 1)) (org (9 0)) (svg (1 1))) "Interactive SVG calendar for orgmode tasks" tar ((:commit . "b423b01712b9c25dff3e4203c7cde736225f62ef") (:authors ("Ilya Chernyshov" . "ichernyshovvv@gmail.com")) (:maintainers ("Ilya Chernyshov" . "ichernyshovvv@gmail.com")) (:maintainer "Ilya Chernyshov" . "ichernyshovvv@gmail.com") (:keywords "org" "calendar" "timeblocking" "agenda") (:url . "https://github.com/ichernyshovvv/org-timeblock"))]) (org-timeline . [(20211110 1952) ((dash (2 13 0)) (emacs (24 3))) "Add graphical view of agenda to agenda buffer." tar ((:commit . "2b300abc8adc9955418fa2334f55e0610bff79f5") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "calendar") (:url . "https://github.com/Fuco1/org-timeline/"))]) (org-toodledo . [(20150301 1113) ((request-deferred (0 2 0)) (emacs (24)) (cl-lib (0 5))) "Toodledo integration for Emacs Org mode" tar ((:commit . "01b53b637f304b89cd3bf2d29009b5ed6ad9466d") (:authors ("Christopher J. White" . "emacs@grierwhite.com")) (:maintainers ("Christopher J. White" . "emacs@grierwhite.com")) (:maintainer "Christopher J. White" . "emacs@grierwhite.com") (:keywords "outlines" "data"))]) (org-tracktable . [(20161118 1329) ((emacs (24)) (cl-lib (0 5))) "Track your writing progress in an org-table" tar ((:commit . "8e0e60a582a034bd66d5efb72d513140b7d4d90a") (:authors ("tty-tourist" . "andreasrasholm@protonmail.com")) (:maintainers ("tty-tourist" . "andreasrasholm@protonmail.com")) (:maintainer "tty-tourist" . "andreasrasholm@protonmail.com") (:keywords "org" "writing") (:url . "https://github.com/tty-tourist/org-tracktable"))]) @@ -3803,14 +3906,14 @@ (org-treeusage . [(20221011 1301) ((emacs (26 1)) (dash (2 17 0)) (org (9 1 6))) "Examine the usage of org headings in a tree-like manner" tar ((:commit . "c561b3d468aa35e70a43d9a18a4f505996ae882d") (:authors ("Mehmet Tekman")) (:maintainers ("Mehmet Tekman")) (:maintainer "Mehmet Tekman") (:keywords "outlines") (:url . "https://github.com/mtekman/org-treeusage.el"))]) (org-trello . [(20210314 1901) ((emacs (24 3)) (request-deferred (0 2 0)) (deferred (0 4 0)) (s (1 11 0)) (dash (2 18 0))) "Minor mode to synchronize org-mode buffer and trello board" tar ((:commit . "9c1c94dff1a46631669023286078b887d077c305") (:authors ("Antoine R. Dumont (@ardumont)" . "antoine.romain.dumont@gmail.com")) (:maintainer "Antoine R. Dumont (@ardumont)" . "antoine.romain.dumont@gmail.com") (:keywords "org-mode" "trello" "sync" "org-trello") (:url . "https://github.com/org-trello/org-trello"))]) (org-unique-id . [(20220907 821) ((emacs (25 1)) (org (9 3))) "Create unique IDs for org headers" tar ((:commit . "c3a0908ff2123c8786735f3c6f35e905efea2ef6") (:authors ("Lucien Cartier-Tilet" . "lucien@phundrak.com")) (:maintainers ("Lucien Cartier-Tilet" . "lucien@phundrak.com")) (:maintainer "Lucien Cartier-Tilet" . "lucien@phundrak.com") (:keywords "convenience") (:url . "https://labs.phundrak.com/phundrak/org-unique-id"))]) - (org-upcoming-modeline . [(20230809 957) ((emacs (26 1)) (ts (0 2)) (org-ql (0 6))) "Show next org event in mode line" tar ((:commit . "1f39a71fa04d6ee2808bced6dcacfed0f98b2e7e") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainers ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org") (:keywords "convenience" "calendar") (:url . "https://github.com/unhammer/org-upcoming-modeline"))]) + (org-upcoming-modeline . [(20231124 1726) ((emacs (26 1)) (ts (0 2)) (org-ql (0 6))) "Show next org event in mode line" tar ((:commit . "37634ddeeda85a0036987b056ac71199ac3bd03e") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainers ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org") (:keywords "convenience" "calendar") (:url . "https://github.com/unhammer/org-upcoming-modeline"))]) (org-variable-pitch . [(20220220 1757) ((emacs (25))) "Minor mode for variable pitch text in org mode." tar ((:commit . "350af0e5d53307c900e4f8b2617f3852f51a74d2") (:authors ("Göktuğ Kayaalp" . "self@gkayaalp.com")) (:maintainers ("Göktuğ Kayaalp" . "self@gkayaalp.com")) (:maintainer "Göktuğ Kayaalp" . "self@gkayaalp.com") (:keywords "faces") (:url . "https://dev.gkayaalp.com/elisp/index.html#ovp"))]) - (org-vcard . [(20221111 328) nil "org-mode support for vCard export and import." tar ((:commit . "92345fa9f1e1f928278a654ac5ad57d22d74dbef") (:authors ("Alexis , Will Dey" . "will123dey@gmail.com")) (:maintainers ("Alexis" . "flexibeast@gmail.com")) (:maintainer "Alexis" . "flexibeast@gmail.com") (:keywords "outlines" "org" "vcard") (:url . "https://github.com/flexibeast/org-vcard"))]) - (org-view-mode . [(20221208 327) ((emacs (25 1))) "Read-only viewer with less markup clutter in org mode files" tar ((:commit . "014f96acb7093ffae93c62aabff750e63c3babc5") (:authors ("Arthur Miller" . "arthur.miller@live.com")) (:maintainers ("Arthur Miller" . "arthur.miller@live.com")) (:maintainer "Arthur Miller" . "arthur.miller@live.com") (:keywords "convenience" "outlines" "tools") (:url . "https://github.com/amno1/org-view-mode"))]) + (org-vcard . [(20240309 839) nil "org-mode support for vCard export and import." tar ((:commit . "fab5ea81d8a4bb1123cdc0287b9b58c062d5b372") (:authors ("Alexis , Will Dey , pinoaffe" . "pinoaffe@gmail.com")) (:maintainers ("pinoaffe" . "pinoaffe@gmail.com")) (:maintainer "pinoaffe" . "pinoaffe@gmail.com") (:keywords "outlines" "org" "vcard") (:url . "https://github.com/pinoaffe/org-vcard"))]) + (org-view-mode . [(20240218 1930) ((emacs (25 1))) "Read-only viewer with less markup clutter in org mode files" tar ((:commit . "0d48e9c7e81d973f33e97d364e4ea77576d53f46") (:authors ("Arthur Miller" . "arthur.miller@live.com")) (:maintainers ("Arthur Miller" . "arthur.miller@live.com")) (:maintainer "Arthur Miller" . "arthur.miller@live.com") (:keywords "convenience" "outlines" "tools") (:url . "https://github.com/amno1/org-view-mode"))]) (org-visibility . [(20220929 1415) ((emacs (27 1))) "Persistent org tree visibility" tar ((:commit . "afa4b6f8ff274df87eb11f1afd0321084a45a2ab") (:authors ("Kyle W T Sherman" . "kylewsherman@gmail.com")) (:maintainers ("Kyle W T Sherman" . "kylewsherman@gmail.com")) (:maintainer "Kyle W T Sherman" . "kylewsherman@gmail.com") (:keywords "outlines" "convenience") (:url . "https://github.com/nullman/emacs-org-visibility"))]) (org-wc . [(20200731 2244) nil "Count words in org mode trees." tar ((:commit . "dbbf794e4ec6c4080d945f43338185e34a4a582d") (:authors ("Simon Guest")) (:maintainers ("Simon Guest")) (:maintainer "Simon Guest"))]) - (org-web-tools . [(20201212 1058) ((emacs (25 1)) (org (9 0)) (dash (2 12)) (esxml (0 3 4)) (s (1 10 0)) (request (0 3 0))) "Display and capture web content with Org-mode" tar ((:commit . "b94a07add8558ef7b0666173dbb8a2554f1d41a6") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "hypermedia" "outlines" "org" "web") (:url . "http://github.com/alphapapa/org-web-tools"))]) - (org-wild-notifier . [(20230828 1323) ((alert (1 2)) (async (1 9 3)) (dash (2 18 0)) (emacs (24 4))) "Customizable org-agenda notifications" tar ((:commit . "04d687730ce79cc12dff0de1e6df39d3b4292350") (:authors ("Artem Khramov" . "akhramov+emacs@pm.me")) (:maintainers ("Artem Khramov" . "akhramov+emacs@pm.me")) (:maintainer "Artem Khramov" . "akhramov+emacs@pm.me") (:keywords "notification" "alert" "org" "org-agenda" "agenda") (:url . "https://github.com/akhramov/org-wild-notifier.el"))]) + (org-web-tools . [(20231220 1515) ((emacs (27 1)) (org (9 0)) (compat (29 1 4 2)) (dash (2 12)) (esxml (0 3 4)) (s (1 10 0)) (plz (0 7 1)) (request (0 3 0))) "Display and capture web content with Org-mode" tar ((:commit . "7a6498f442fc7f29504745649948635c7165d847") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "hypermedia" "outlines" "org" "web") (:url . "http://github.com/alphapapa/org-web-tools"))]) + (org-wild-notifier . [(20240223 1211) ((alert (1 2)) (async (1 9 3)) (dash (2 18 0)) (emacs (26 1))) "Customizable org-agenda notifications" tar ((:commit . "1b04c4104ad72bbb3ced161ba99e1055ff766138") (:authors ("Artem Khramov" . "akhramov+emacs@pm.me")) (:maintainers ("Artem Khramov" . "akhramov+emacs@pm.me")) (:maintainer "Artem Khramov" . "akhramov+emacs@pm.me") (:keywords "notification" "alert" "org" "org-agenda" "agenda") (:url . "https://github.com/akhramov/org-wild-notifier.el"))]) (org-working-set . [(20230803 1640) ((org (9 3)) (dash (2 12)) (s (1 12)) (emacs (26 3))) "Manage and visit a small and changing set of org-nodes that you work on" tar ((:commit . "c83a63f34829dca137941bc06e29c34bf056a43b") (:authors ("Marc Ihm" . "marc@ihm.name")) (:maintainers ("Marc Ihm" . "marc@ihm.name")) (:maintainer "Marc Ihm" . "marc@ihm.name") (:url . "https://github.com/marcIhm/org-working-set"))]) (org-wunderlist . [(20191017 1917) ((request-deferred (0 2 0)) (alert (1 1)) (emacs (24)) (cl-lib (0 5)) (org (8 2 4)) (s (1 9 0))) "Org sync with Wunderlist" tar ((:commit . "1a084bb49be4b5a1066db9cd9b7da2f8efab293f") (:authors ("myuhe ")) (:maintainers ("myuhe")) (:maintainer "myuhe") (:keywords "convenience") (:url . "https://github.com/myuhe/org-wunderlist.el"))]) (org-xlatex . [(20230820 2133) ((emacs (29 1))) "Instant LaTeX preview in an xwidget" tar ((:commit . "f3cac5ea904e78ae2b47723fdce96e8e87edbe7c") (:authors ("ksqsf" . "justksqsf@gmail.com")) (:maintainers ("ksqsf" . "justksqsf@gmail.com")) (:maintainer "ksqsf" . "justksqsf@gmail.com") (:keywords "convenience" "org" "tex" "preview" "xwidget") (:url . "https://github.com/ksqsf/org-xlatex"))]) @@ -3821,42 +3924,43 @@ (org2issue . [(20190531 941) ((org (8 0)) (emacs (24 4)) (ox-gfm (0 1)) (gh (0 1)) (s (20160405 920))) "export org to github issue" tar ((:commit . "910b98c858762fd14b11d261626c5e979dde0833") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "convenience" "github" "org") (:url . "https://github.com/lujun9972/org2issue"))]) (org2jekyll . [(20210829 1113) ((dash (2 18 0)) (s (1 9 0))) "Minor mode to publish org-mode post to jekyll without specific yaml" tar ((:commit . "4393402448da722667f6f5a4d742fa817dec0c0f") (:authors ("Antoine R. Dumont (@ardumont)" . "antoine.romain.dumont@gmail.com")) (:maintainers ("Antoine R. Dumont (@ardumont)" . "antoine.romain.dumont@gmail.com")) (:maintainer "Antoine R. Dumont (@ardumont)" . "antoine.romain.dumont@gmail.com") (:keywords "org-mode" "jekyll" "blog" "publish") (:url . "https://github.com/ardumont/org2jekyll"))]) (org2web . [(20210203 324) ((cl-lib (1 0)) (ht (1 5)) (mustache (0 22)) (htmlize (1 47)) (org (8 0)) (dash (2 0 0)) (el2org (0 10)) (simple-httpd (0 1))) "A static site generator based on org mode." tar ((:commit . "6f5c5f0cc5c877ac3a383782bbe8751264d807b6") (:authors ("Feng Shu ") ("Jorge Javier Araya Navarro ") ("Kelvin Hu ")) (:maintainer "Feng Shu ") (:keywords "org-mode" "convenience" "beautify") (:url . "https://github.com/tumashu/org2web"))]) - (organic-green-theme . [(20230121 1815) nil "Low-contrast green color theme." tar ((:commit . "7ca93a1c42bba1bcced181bd8cc34cb57be39537"))]) - (organize-imports-java . [(20220704 657) ((emacs (25 1)) (f (0 20 0)) (s (1 12 0)) (dash (2 14 1)) (ht (2 2))) "Automatically organize imports in Java code" tar ((:commit . "5965228882c6b72a9e38ad61a047e599c8488d20") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "organize" "imports" "java" "eclipse") (:url . "https://github.com/jcs-elpa/organize-imports-java"))]) + (organic-green-theme . [(20231225 149) nil "Low-contrast green color theme." tar ((:commit . "9b669465c875edd86289d017731880172dc08b9d"))]) + (organize-imports-java . [(20240101 929) ((emacs (25 1)) (f (0 20 0)) (s (1 12 0)) (dash (2 14 1)) (ht (2 2))) "Automatically organize imports in Java code" tar ((:commit . "93b1d10a82103d38d8cba09d90b9faf219205df3") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "organize" "imports" "java" "eclipse") (:url . "https://github.com/jcs-elpa/organize-imports-java"))]) (orgbox . [(20180827 218) ((org (8 0)) (cl-lib (0 5))) "Mailbox-like task scheduling Org." tar ((:commit . "609e5e37348815ec3ba53ab6d643e38b0cc4fe17") (:authors ("Yasuhito Takamiya" . "yasuhito@gmail.com")) (:maintainers ("Yasuhito Takamiya" . "yasuhito@gmail.com")) (:maintainer "Yasuhito Takamiya" . "yasuhito@gmail.com") (:keywords "org") (:url . "https://github.com/yasuhito/orgbox"))]) - (orgit . [(20230511 2135) ((emacs (25 1)) (compat (29 1 4 1)) (magit (3 3 0)) (org (9 6 5))) "Support for Org links to Magit buffers" tar ((:commit . "4a585029875a1dbbe96d8ac157bd2fd02875f289") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "hypermedia" "vc") (:url . "https://github.com/magit/orgit"))]) - (orgit-forge . [(20230603 1232) ((emacs (25 1)) (compat (29 1 4 1)) (forge (0 3)) (magit (3 3)) (org (9 6)) (orgit (1 9))) "Org links to Forge issue buffers" tar ((:commit . "8ba92a54aee9693b1bf03baf14f83550a7c89b18") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "hypermedia" "vc") (:url . "https://github.com/magit/orgit-forge"))]) - (orglink . [(20230531 1610) ((emacs (25 1)) (compat (29 1 4 1)) (org (9 6 5)) (seq (2 23))) "Use Org Mode links in other modes" tar ((:commit . "afbeffdfa15a9fc532bba2e03626b9e82768ba2c") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "hypermedia") (:url . "https://github.com/tarsius/orglink"))]) + (orgit . [(20240101 2222) ((emacs (25 1)) (compat (29 1 4 1)) (magit (3 3 0)) (org (9 6 5))) "Support for Org links to Magit buffers" tar ((:commit . "84bcb5c318f01b9ffc8d5aa18a7c393fe9c714b2") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "hypermedia" "vc") (:url . "https://github.com/magit/orgit"))]) + (orgit-forge . [(20240101 2222) ((emacs (25 1)) (compat (29 1 4 1)) (forge (0 3)) (magit (3 3)) (org (9 6)) (orgit (1 9))) "Org links to Forge issue buffers" tar ((:commit . "f2ff9e5ad68b3e860379a1d368ad6d8a9696b719") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "hypermedia" "vc") (:url . "https://github.com/magit/orgit-forge"))]) + (orglink . [(20240101 2222) ((emacs (25 1)) (compat (29 1 4 1)) (org (9 6 5)) (seq (2 23))) "Use Org Mode links in other modes" tar ((:commit . "f62d2804026c10a1da0b7c4a4cb0d647bb2e4829") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "hypermedia") (:url . "https://github.com/tarsius/orglink"))]) (orglue . [(20200411 311) ((org (9 3)) (epic (0 2))) "more functionality to org-mode." tar ((:commit . "9d5a8e24be9acb8c55bb4d6aa8b98e30e2677401") (:authors ("Yoshinari Nomura" . "nom@quickhack.net")) (:maintainers ("Yoshinari Nomura" . "nom@quickhack.net")) (:maintainer "Yoshinari Nomura" . "nom@quickhack.net") (:keywords "org"))]) - (orgmdb . [(20230522 1817) ((emacs (27 1)) (dash (2 11 0)) (s (1 12 0)) (org (8 0 0))) "An OMDb API client with some convenience functions" tar ((:commit . "292a58b3bd19b61d24d897efefeee1a309a666fd") (:authors ("Isa Mert Gurbuz" . "isamert@protonmail.com")) (:maintainers ("Isa Mert Gurbuz" . "isamert@protonmail.com")) (:maintainer "Isa Mert Gurbuz" . "isamert@protonmail.com") (:url . "https://github.com/isamert/orgmdb"))]) + (orgmdb . [(20231003 2144) ((emacs (27 1)) (dash (2 11 0)) (s (1 12 0)) (org (8 0 0))) "An OMDb API client with some convenience functions" tar ((:commit . "4338a0a34d500a214df8293590960011f761fe24") (:authors ("Isa Mert Gurbuz" . "isamert@protonmail.com")) (:maintainers ("Isa Mert Gurbuz" . "isamert@protonmail.com")) (:maintainer "Isa Mert Gurbuz" . "isamert@protonmail.com") (:url . "https://github.com/isamert/orgmdb"))]) (orgnav . [(20170608 1713) ((helm (2 7 0)) (s (1 11 0)) (dash (1 11 0)) (emacs (24))) "Org tree navigation using helm" tar ((:commit . "9e2cac9c1a67af5f0080e60022e821bf7b70312d") (:authors ("Facet Framer" . "facet@facetframer.com")) (:maintainers ("Facet Framer" . "facet@facetframer.com")) (:maintainer "Facet Framer" . "facet@facetframer.com") (:keywords "convenience" "outlines") (:url . "http://github.com/facetframer/orgnav"))]) + (orgnote . [(20231211 2104) ((emacs (27 1))) "Sync org-roam notes with OrgNote app" tar ((:commit . "0919f9fd05b83870b8a7073eb94f77199e681241") (:authors ("Artur Yaroshenko" . "artawower@protonmail.com")) (:maintainers ("Artur Yaroshenko" . "artawower@protonmail.com")) (:maintainer "Artur Yaroshenko" . "artawower@protonmail.com") (:url . "https://github.com/Artawower/orgnote.el"))]) (orgstrap . [(20230408 2232) ((emacs (24 4))) "Bootstrap an Org file using file local variables" tar ((:commit . "f35bccde556b0f82515e79ee69f4379469276356") (:authors ("Tom Gillespie")) (:maintainers ("Tom Gillespie")) (:maintainer "Tom Gillespie") (:keywords "lisp" "org" "org-mode" "bootstrap") (:url . "https://github.com/tgbugs/orgstrap"))]) - (orgtbl-aggregate . [(20230806 1657) ((emacs (26 1))) "Create an aggregated Org table from another one" tar ((:commit . "7e158316ab43c92f6f41597e8646715870049abc") (:keywords "data" "extensions") (:url . "https://github.com/tbanel/orgaggregate/blob/master/README.org"))]) + (orgtbl-aggregate . [(20240228 720) ((emacs (26 1))) "Create an aggregated Org table from another one" tar ((:commit . "cc129b543c472c704c8dc074500a8192ac3d9f88") (:keywords "data" "extensions") (:url . "https://github.com/tbanel/orgaggregate/blob/master/README.org"))]) (orgtbl-ascii-plot . [(20230122 816) nil "ascii-art bar plots in org-mode tables" tar ((:commit . "4160128045b271bc1aef3d14dbf0c5b53ae58bd2") (:authors ("Thierry Banel tbanelwebmin at free dot fr") ("Michael Brand")) (:maintainers ("Thierry Banel tbanelwebmin at free dot fr")) (:maintainer "Thierry Banel tbanelwebmin at free dot fr") (:keywords "org" "table" "ascii" "plot"))]) - (orgtbl-fit . [(20230110 1544) ((emacs (24 4))) "Regression-fit a column in an Org Mode table" tar ((:commit . "5bde4902187b2578dc39ee3a02cd7c84c4470b8a") (:authors ("Thierry Banel tbanelwebmin at free dot fr")) (:maintainers ("Thierry Banel tbanelwebmin at free dot fr")) (:maintainer "Thierry Banel tbanelwebmin at free dot fr") (:keywords "data" "extensions") (:url . "https://github.com/tbanel/orgtblfit/blob/master/README.org"))]) - (orgtbl-join . [(20230127 2133) ((emacs (24 3))) "Join columns from another Org Mode table" tar ((:commit . "257bd101a142aaad2fc3993f7752fe839d1663e0") (:authors ("Thierry Banel tbanelwebmin at free dot fr")) (:maintainers ("Thierry Banel tbanelwebmin at free dot fr")) (:maintainer "Thierry Banel tbanelwebmin at free dot fr") (:keywords "data" "extensions") (:url . "https://github.com/tbanel/orgtbljoin/blob/master/README.org"))]) - (orgtbl-show-header . [(20141031 1547) nil "Show the header of the current column in the minibuffer" tar ((:commit . "f0f48ccc0f96d4aa2a676ff609d9dddd71748e6f") (:authors ("Damien Cassou" . "damien.cassou@gmail.com")) (:maintainers ("Damien Cassou" . "damien.cassou@gmail.com")) (:maintainer "Damien Cassou" . "damien.cassou@gmail.com"))]) + (orgtbl-fit . [(20240228 716) ((emacs (24 4))) "Regression-fit a column in an Org Mode table" tar ((:commit . "a22f3a137f3590d7f13c3be38bbd1e55d39cb2ad") (:authors ("Thierry Banel tbanelwebmin at free dot fr")) (:maintainers ("Thierry Banel tbanelwebmin at free dot fr")) (:maintainer "Thierry Banel tbanelwebmin at free dot fr") (:keywords "data" "extensions") (:url . "https://github.com/tbanel/orgtblfit/blob/master/README.org"))]) + (orgtbl-join . [(20240228 719) ((emacs (24 3))) "Join columns from another Org Mode table" tar ((:commit . "f243511ec4b3a712d0b868ecbc4c7b1310a3382d") (:authors ("Thierry Banel tbanelwebmin at free dot fr")) (:maintainers ("Thierry Banel tbanelwebmin at free dot fr")) (:maintainer "Thierry Banel tbanelwebmin at free dot fr") (:keywords "data" "extensions") (:url . "https://github.com/tbanel/orgtbljoin/blob/master/README.org"))]) + (orgtbl-show-header . [(20230903 903) nil "Show the header of the current column in the minibuffer" tar ((:commit . "1ab18f5afa2b01e67618ada0d40e6b7a65d9d14c") (:authors ("Damien Cassou" . "damien.cassou@gmail.com")) (:maintainers ("Damien Cassou" . "damien.cassou@gmail.com")) (:maintainer "Damien Cassou" . "damien.cassou@gmail.com"))]) (origami . [(20200331 1019) ((s (1 9 0)) (dash (2 5 0)) (emacs (24)) (cl-lib (0 5))) "Flexible text folding" tar ((:commit . "e558710a975e8511b9386edc81cd6bdd0a5bda74") (:authors ("Greg Sexton" . "gregsexton@gmail.com")) (:maintainers ("Greg Sexton" . "gregsexton@gmail.com")) (:maintainer "Greg Sexton" . "gregsexton@gmail.com") (:keywords "folding") (:url . "https://github.com/gregsexton/origami.el"))]) (origami-predef . [(20200615 1044) ((emacs (24 3)) (origami (1 0))) "Apply folding when finding (opening) files" tar ((:commit . "edcba971ba52a14f69a436ad47888827d7927982") (:authors ("Álvaro González Sotillo" . "alvarogonzalezsotillo@gmail.com")) (:maintainers ("Álvaro González Sotillo" . "alvarogonzalezsotillo@gmail.com")) (:maintainer "Álvaro González Sotillo" . "alvarogonzalezsotillo@gmail.com") (:keywords "convenience" "folding") (:url . "https://github.com/alvarogonzalezsotillo/origami-predef"))]) (ormolu . [(20220530 921) ((emacs (24)) (reformatter (0 4))) "Format Haskell source code using the \"ormolu\" program" tar ((:commit . "a6b1d3f8838d067ac5352fb0673c3c3dae7abd73") (:authors ("Vasiliy Yorkin" . "vasiliy.yorkin@gmail.com")) (:maintainers ("Vasiliy Yorkin")) (:maintainer "Vasiliy Yorkin") (:keywords "files" "tools") (:url . "https://github.com/vyorkin/ormolu.el"))]) (orthodox-christian-new-calendar-holidays . [(20210830 1657) nil "Feasts (NS)" tar ((:commit . "6869024ecd45eefd0ec648979c6a59d7c79770e0") (:authors ("Carson Chittom" . "carson@wistly.net")) (:maintainers ("Carson Chittom" . "carson@wistly.net")) (:maintainer "Carson Chittom" . "carson@wistly.net") (:keywords "calendar") (:url . "https://github.com/cmchittom/orthodox-christian-new-calendar-holidays"))]) (osa . [(20200522 2103) ((emacs (25 1))) "OSA (JavaScript / AppleScript) bridge" tar ((:commit . "615ca9eef4131a23d9971691fa0d0f20fe59d01b") (:authors ("xristos" . "xristos@sdf.org")) (:maintainers ("xristos" . "xristos@sdf.org")) (:maintainer "xristos" . "xristos@sdf.org") (:keywords "extensions") (:url . "https://github.com/atomontage/osa"))]) (osa-chrome . [(20230515 237) ((emacs (25 1)) (osa (1 0))) "Google Chrome remote tab control" tar ((:commit . "981c35136102eeca77d0e1a41e7c95e8486a1dce") (:authors ("xristos" . "xristos@sdf.org")) (:maintainers ("xristos" . "xristos@sdf.org")) (:maintainer "xristos" . "xristos@sdf.org") (:keywords "comm") (:url . "https://github.com/atomontage/osa-chrome"))]) - (osm . [(20230825 919) ((emacs (27 1)) (compat (29 1 4 0))) "OpenStreetMap viewer" tar ((:commit . "7961f5bf615a994a6ca756218c809bb998790946") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainers ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:keywords "network" "multimedia" "hypermedia" "mouse") (:url . "https://github.com/minad/osm"))]) + (osm . [(20240122 2255) ((emacs (27 1)) (compat (29 1 4 4))) "OpenStreetMap viewer" tar ((:commit . "5dffbc00e4acfcddc13677f3b76a65dc3b6aee30") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainers ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:keywords "network" "multimedia" "hypermedia" "mouse") (:url . "https://github.com/minad/osm"))]) (osx-browse . [(20140508 2041) ((string-utils (0 3 2)) (browse-url-dwim (0 6 6))) "Web browsing helpers for OS X" tar ((:commit . "838b81625853e04919fbb56fd21f387762b2e3f5") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "hypermedia" "external") (:url . "http://github.com/rolandwalker/osx-browse"))]) (osx-clipboard . [(20141012 717) nil "Use the OS X clipboard from terminal Emacs" tar ((:commit . "e46dd31327a3f92f77b013b4c9b1e5fdd0e5c73d") (:authors ("Jon Oddie ")) (:maintainers ("Jon Oddie ")) (:maintainer "Jon Oddie ") (:url . "https://github.com/joddie/osx-clipboard-mode"))]) - (osx-dictionary . [(20220801 1542) ((cl-lib (0 5))) "Interface for OSX Dictionary.app" tar ((:commit . "0715e5a3ac659df32a0f0fabfbbeef0228fbd9a9") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainers ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me") (:keywords "mac" "dictionary") (:url . "https://github.com/xuchunyang/osx-dictionary.el"))]) + (osx-dictionary . [(20240226 511) ((cl-lib (0 5))) "Interface for OSX Dictionary.app" tar ((:commit . "8f16ffb465b64c9dd566c8b7316b34896ce4c52b") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainers ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me") (:keywords "mac" "dictionary") (:url . "https://github.com/xuchunyang/osx-dictionary.el"))]) (osx-lib . [(20211206 619) ((emacs (24 4))) "Basic functions for Apple/OSX" tar ((:commit . "7afdb57edd5725e8a66f841a90fa571a4cbb81e7") (:authors ("Raghav Kumar Gautam" . "raghav@apache.org")) (:maintainers ("Raghav Kumar Gautam" . "raghav@apache.org")) (:maintainer "Raghav Kumar Gautam" . "raghav@apache.org") (:keywords "apple" "applescript" "osx" "finder" "emacs" "elisp" "vpn" "speech") (:url . "https://github.com/raghavgautam/osx-lib"))]) (osx-location . [(20200304 2209) ((emacs (24 1))) "Watch and respond to changes in geographical location on OS X" tar ((:commit . "733f116dbc56ac73bee3cebe4a489dc9eb37ab78") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "convenience" "calendar") (:url . "https://github.com/purcell/osx-location"))]) (osx-org-clock-menubar . [(20150205 2111) nil "simple menubar integration for org-clock" tar ((:commit . "9964d2a97cc2fb6570dc4116da44f73bd8eb7cb3") (:authors ("Jordon Biondo" . "jordonbiondo@gmail.com")) (:maintainers ("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" tar ((:commit . "cd86c03a52eab9b1a1496618809155b25b030ba6") (:authors ("Theresa O'Connor" . "tess@oconnor.cx")) (:maintainers ("Neil Okamoto" . "neil.okamoto+melpa@gmail.com")) (: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." tar ((:commit . "564b006835facc4a8df247d8a47ab1030d7e7beb") (:authors ("Ryan C. Thompson")) (:maintainers ("Ryan C. Thompson")) (:maintainer "Ryan C. Thompson") (:keywords "convenience" "osx") (:url . "https://github.com/DarwinAwardWinner/osx-pseudo-daemon"))]) + (osx-pseudo-daemon . [(20211208 137) nil "Daemon mode that plays nice with OSX." tar ((:commit . "b95260ff605f67bce40fce6b3e35811859ce12bb") (:authors ("Ryan C. Thompson")) (:maintainers ("Ryan C. Thompson")) (:maintainer "Ryan C. Thompson") (:keywords "convenience" "osx") (:url . "https://github.com/DarwinAwardWinner/mac-pseudo-daemon"))]) (osx-trash . [(20220913 1736) ((emacs (24 1))) "System trash for OS X" tar ((:commit . "90f0c99206022fec646206018fcd63d9d2e57325") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainers ("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" tar ((:commit . "b69e0740846ace7885b0c0717f7abe8d0419eefd") (:authors ("Yoshinari Nomura" . "nom@quickhack.net")) (:maintainers ("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" tar ((:commit . "8ace5acafef65daabf0c6619eff60733d7f5d792") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainers ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:keywords "tools") (:url . "https://github.com/xuchunyang/other-emacs-eval"))]) (ouroboros . [(20230606 1150) ((emacs (27 1)) (dash (2 19 0)) (cbor (0 2 5)) (bech32 (0 2 1))) "Ouroboros network mini-protocol" tar ((:commit . "cf85424b305e8f89debb756dc67eebc84639f711") (:authors ("Oscar Najera ")) (:maintainers ("Oscar Najera" . "hi@oscarnajera.com")) (:maintainer "Oscar Najera" . "hi@oscarnajera.com") (:url . "https://github.com/Titan-C/cardano.el"))]) (outline-magic . [(20180619 1819) nil "outline mode extensions for Emacs" tar ((:commit . "2a5f07417b696cf7541d435c43bafcc64817636b") (:authors ("Carsten Dominik" . "dominik@science.uva.nl")) (:maintainers ("Thorsten Jolitz ")) (:maintainer "Thorsten Jolitz ") (:keywords "outlines"))]) - (outline-minor-faces . [(20230514 1801) ((emacs (25 1)) (compat (29 1 4 1))) "Highlight only section headings" tar ((:commit . "57c4a0fac36a26cfa8d1296e76afbcf7a5b87a57") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "faces" "outlines") (:url . "https://github.com/tarsius/outline-minor-faces"))]) + (outline-minor-faces . [(20240101 2223) ((emacs (25 1)) (compat (29 1 4 1))) "Highlight only section headings" tar ((:commit . "77dd2a24f3db3641980cca515fbc4cfafdf03630") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "faces" "outlines") (:url . "https://github.com/tarsius/outline-minor-faces"))]) (outline-toc . [(20200401 1208) nil "Sidebar showing a \"table of contents\"." tar ((:commit . "81d373633b40628cc3a6b6fb534fd7730076bcdb") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainers ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:keywords "convenience" "outlines") (:url . "https://github.com/abingham/outline-toc.el"))]) (outlook . [(20180428 1430) ((emacs (24 4))) "send emails in MS Outlook style" tar ((:commit . "b6a7a06b996d84647e8024412876e9e76ca884e4") (:authors ("Andrew Savonichev")) (:maintainers ("Andrew Savonichev")) (:maintainer "Andrew Savonichev") (:keywords "mail") (:url . "https://github.com/asavonic/outlook.el"))]) (outorg . [(20190720 2002) ((emacs (24 4))) "Org-style comment editing" tar ((:commit . "ef0f86f4b893b30be8bcf8b43a5ec357a6c70f07") (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:url . "https://github.com/alphapapa/outorg"))]) @@ -3864,38 +3968,38 @@ (outshine . [(20220326 540) ((outorg (2 0)) (cl-lib (0 5))) "outline with outshine outshines outline" tar ((:commit . "bf1eed10dd7a89b63d0fc014944033db397c1e23") (:authors ("Thorsten Jolitz")) (:maintainers ("Thibault Polge" . "thibault@thb.lt")) (:maintainer "Thibault Polge" . "thibault@thb.lt") (:keywords "convenience" "outlines" "org") (:url . "https://github.com/alphapapa/outshine"))]) (ov . [(20230522 1117) ((emacs (24 3))) "Overlay library for Emacs Lisp" tar ((:commit . "e2971ad986b6ac441e9849031d34c56c980cf40b") (:authors ("Shingo Fukuyama - http://fukuyama.co")) (:maintainers ("Shingo Fukuyama - http://fukuyama.co")) (:maintainer "Shingo Fukuyama - http://fukuyama.co") (:keywords "convenience" "overlay") (:url . "https://github.com/ShingoFukuyama/ov.el"))]) (overcast-theme . [(20200425 1601) ((emacs (24))) "A dark but vibrant color theme for Emacs" tar ((:commit . "e02b835a08919ead079d7221d513348ac02ba92e") (:authors ("Mohammed Ismail Ansari" . "team.terminal@gmail.com")) (:maintainers ("Mohammed Ismail Ansari" . "team.terminal@gmail.com")) (:maintainer "Mohammed Ismail Ansari" . "team.terminal@gmail.com") (:keywords "theme") (:url . "http://ismail.teamfluxion.com"))]) - (overseer . [(20180226 619) ((emacs (24)) (dash (2 10 0)) (pkg-info (0 4)) (f (0 18 1))) "Ert-runner Integration Into Emacs" tar ((:commit . "02d49f582e80e36b4334c9187801c5ecfb027789") (:authors ("Samuel Tonini" . "tonini.samuel@gmail.com")) (:maintainers ("Samuel Tonini" . "tonini.samuel@gmail.com")) (:maintainer "Samuel Tonini" . "tonini.samuel@gmail.com") (:url . "http://www.github.com/tonini/overseer.el"))]) + (overseer . [(20240109 800) ((emacs (24)) (dash (2 10 0)) (pkg-info (0 4)) (f (0 18 1))) "Ert-runner Integration Into Emacs" tar ((:commit . "7fdcf1a6fba6b1569a09c1666b4e51bcde266ed9") (:authors ("Samuel Tonini" . "tonini.samuel@gmail.com")) (:maintainers ("Samuel Tonini" . "tonini.samuel@gmail.com")) (:maintainer "Samuel Tonini" . "tonini.samuel@gmail.com") (:url . "http://www.github.com/tonini/overseer.el"))]) (ovpn-mode . [(20210403 440) ((emacs (25)) (cl-lib (0 5))) "an openvpn management mode" tar ((:commit . "4492098c771d094dd0661a5bc6906f65fb530825") (:authors ("Bas Alberts" . "bas@anti.computer")) (:maintainers ("Bas Alberts" . "bas@anti.computer")) (:maintainer "Bas Alberts" . "bas@anti.computer") (:keywords "comm") (:url . "https://github.com/anticomputer/ovpn-mode"))]) (owcmd . [(20200517 2039) ((emacs (26 3))) "Run a single command in the other window" tar ((:commit . "05fb8f8f81838b5888fdec8b3947096dd2222e61") (:authors ("Jacob First" . "jacob.first@member.fsf.org")) (:maintainers ("Jacob First" . "jacob.first@member.fsf.org")) (:maintainer "Jacob First" . "jacob.first@member.fsf.org") (:keywords "convenience") (:url . "https://github.com/fishyfriend/owcmd"))]) - (owdriver . [(20200410 1901) ((smartrep (0 0 3)) (log4e (0 2 0)) (yaxception (0 2 0))) "Quickly perform various actions on other windows" tar ((:commit . "3c52a7b11c8275fdb2e4cf98f68f2a48ad09a3ae") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "convenience") (:url . "https://github.com/aki2o/owdriver"))]) + (owdriver . [(20240211 457) ((log4e (0 4 1)) (yaxception (1 0 0))) "Quickly perform various actions on other windows" tar ((:commit . "ae96f3ff7aca560a872c77d40999f1527f7f84eb") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "convenience") (:url . "https://github.com/aki2o/owdriver"))]) (ox-750words . [(20220625 1407) ((emacs (24 4)) (750words (0 0 1))) "Org mode exporter for 750words.com" tar ((:commit . "43eee19428fc8f5a133192398510d7313eb33d97") (:authors ("Diego Zamboni ")) (:maintainers ("Diego Zamboni" . "diego@zzamboni.org")) (:maintainer "Diego Zamboni" . "diego@zzamboni.org") (:keywords "files" "org" "writing") (:url . "https://github.com/zzamboni/750words-client"))]) - (ox-asciidoc . [(20220625 2321) ((org (8 1))) "AsciiDoc Back-End for Org Export Engine" tar ((:commit . "a55ac6adef39124c9434be47fe9cc0c75c4bfea2") (:authors ("Yasushi SHOJI" . "yasushi.shoji@gmail.com")) (:maintainers ("Yasushi SHOJI" . "yasushi.shoji@gmail.com")) (:maintainer "Yasushi SHOJI" . "yasushi.shoji@gmail.com") (:keywords "org" "asciidoc") (:url . "https://github.com/yashi/org-asciidoc"))]) + (ox-asciidoc . [(20240316 1959) ((org (8 1))) "AsciiDoc Back-End for Org Export Engine" tar ((:commit . "d6736852a5479c73c253d2ea8b352dcb232d02f8") (:authors ("Yasushi SHOJI" . "yasushi.shoji@gmail.com")) (:maintainers ("Yasushi SHOJI" . "yasushi.shoji@gmail.com")) (:maintainer "Yasushi SHOJI" . "yasushi.shoji@gmail.com") (:keywords "org" "asciidoc") (:url . "https://github.com/yashi/org-asciidoc"))]) (ox-bb . [(20210222 2002) ((emacs (24 4)) (org (8 0))) "BBCode Back-End for Org Export Engine" tar ((:commit . "a79dc519cd28c000ebca4254a4744ce2b9b82168") (:authors ("Christian Garbs" . "mitch@cgarbs.de")) (:maintainers ("Christian Garbs" . "mitch@cgarbs.de")) (:maintainer "Christian Garbs" . "mitch@cgarbs.de") (:keywords "bbcode" "org" "export" "outlines") (:url . "https://github.com/mmitch/ox-bb"))]) (ox-bibtex-chinese . [(20170723 309) ((emacs (24 4))) "Let ox-bibtex work well for Chinese users" tar ((:commit . "2ad2364399229144110db7ef6365ad0461d6a38c") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:url . "https://github.com/tumashu/ox-bibtex-chinese.git"))]) - (ox-clip . [(20220117 1909) ((org (8 2)) (htmlize (0))) "Cross-platform formatted copying for org-mode" tar ((:commit . "ff117cf3c619eef12eccc0ccbfa3f11adb73ea68") (:authors ("John Kitchin" . "jkitchin@andrew.cmu.edu")) (:maintainers ("John Kitchin" . "jkitchin@andrew.cmu.edu")) (:maintainer "John Kitchin" . "jkitchin@andrew.cmu.edu") (:keywords "org-mode") (:url . "https://github.com/jkitchin/ox-clip"))]) + (ox-clip . [(20240310 1513) ((org (8 2)) (htmlize (0))) "Cross-platform formatted copying for org-mode" tar ((:commit . "a549cc8e1747beb6b7e567ffac27e31ba45cb8e8") (:authors ("John Kitchin" . "jkitchin@andrew.cmu.edu")) (:maintainers ("John Kitchin" . "jkitchin@andrew.cmu.edu")) (:maintainer "John Kitchin" . "jkitchin@andrew.cmu.edu") (:keywords "org-mode") (:url . "https://github.com/jkitchin/ox-clip"))]) (ox-epub . [(20181101 1854) ((emacs (24 3)) (org (9))) "Export org mode projects to EPUB" tar ((:commit . "a66eeb00daa01ad403ac1a1db953ddbf9054be07") (:authors ("Mark Meyer" . "mark@ofosos.org")) (:maintainers ("Mark Meyer" . "mark@ofosos.org")) (:maintainer "Mark Meyer" . "mark@ofosos.org") (:keywords "hypermedia") (:url . "http://github.com/ofosos/org-epub"))]) - (ox-gemini . [(20230517 1559) ((emacs (26 1))) "Output gemini formatted documents from org-mode" tar ((:commit . "799eb6aa0ee9ead7642836962d28e650eccd0ba3") (:authors ("Justin Abrahms" . "justin@abrah.ms")) (:maintainers ("Justin Abrahms" . "justin@abrah.ms")) (:maintainer "Justin Abrahms" . "justin@abrah.ms") (:keywords "lisp" "gemini") (:url . "https://git.sr.ht/~abrahms/ox-gemini"))]) - (ox-gfm . [(20220910 1321) nil "Github Flavored Markdown Back-End for Org Export Engine" tar ((:commit . "46faa67dbb3fb0cd7a76c3fe518f16e4195c22c7") (:authors ("Lars Tveito")) (:maintainers ("Lars Tveito")) (:maintainer "Lars Tveito") (:keywords "org" "wp" "markdown" "github"))]) + (ox-gemini . [(20240221 2127) ((emacs (26 1))) "Output gemini formatted documents from org-mode" tar ((:commit . "50818de823b7929f2d3207833e7c581280a60289") (:authors ("Justin Abrahms" . "justin@abrah.ms")) (:maintainers ("Justin Abrahms" . "justin@abrah.ms")) (:maintainer "Justin Abrahms" . "justin@abrah.ms") (:keywords "lisp" "gemini") (:url . "https://git.sr.ht/~abrahms/ox-gemini"))]) + (ox-gfm . [(20231215 1901) nil "Github Flavored Markdown Back-End for Org Export Engine" tar ((:commit . "4f774f13d34b3db9ea4ddb0b1edc070b1526ccbb") (:authors ("Lars Tveito")) (:maintainers ("Lars Tveito")) (:maintainer "Lars Tveito") (:keywords "org" "wp" "markdown" "github"))]) (ox-gist . [(20220410 2034) ((emacs (26 1)) (gist (1 4 0)) (s (1 12 0))) "Export Org mode buffers and subtrees to GitHub gists" tar ((:commit . "e9f1f11af0e97fee30c2b15b56c236b1f4e1f400") (:authors ("Puneeth Chaganti" . "punchagan+emacs@muse-amuse.in")) (:maintainers ("Puneeth Chaganti" . "punchagan+emacs@muse-amuse.in")) (:maintainer "Puneeth Chaganti" . "punchagan+emacs@muse-amuse.in") (:keywords "org" "lisp" "gist" "github") (:url . "https://github.com/punchagan/org2gist/"))]) (ox-haunt . [(20230725 1) ((emacs (26 1))) "Haunt-flavored HTML backend for the Org export engine" tar ((:commit . "1c8c70e3173f98206768c15cb2e4de706559f151") (:authors ("Jakob L. Kreuze" . "zerodaysfordays@sdf.lonestar.org")) (:maintainers ("Jakob L. Kreuze" . "zerodaysfordays@sdf.lonestar.org")) (:maintainer "Jakob L. Kreuze" . "zerodaysfordays@sdf.lonestar.org") (:keywords "convenience" "hypermedia" "wp") (:url . "https://git.sr.ht/~jakob/ox-haunt"))]) (ox-html5slide . [(20221025 521) ((org (8 0))) "Export org-mode to HTML5 slide." tar ((:commit . "4e0d9026c96e1dde22cca7c700669f1f863a9d07") (:authors ("coldnew" . "coldnew.tw@gmail.com")) (:maintainers ("coldnew" . "coldnew.tw@gmail.com")) (:maintainer "coldnew" . "coldnew.tw@gmail.com") (:keywords "html" "presentation") (:url . "http://github.com/coldnew/org-html5slide"))]) - (ox-hugo . [(20221028 1631) ((emacs (26 3)) (tomelr (0 4 3))) "Hugo Markdown Back-End for Org Export Engine" tar ((:commit . "a66063a9915c859c57944564f0b8dbc7949d4449") (:authors ("Kaushal Modi" . "kaushal.modi@gmail.com") ("Matt Price" . "moptop99@gmail.com")) (:maintainers ("Kaushal Modi" . "kaushal.modi@gmail.com")) (:maintainer "Kaushal Modi" . "kaushal.modi@gmail.com") (:keywords "org" "markdown" "docs") (:url . "https://ox-hugo.scripter.co"))]) + (ox-hugo . [(20240305 1923) ((emacs (26 3)) (tomelr (0 4 3))) "Hugo Markdown Back-End for Org Export Engine" tar ((:commit . "c4156d9d383bf97853ba9e16271b7c4d5e697f49") (:authors ("Kaushal Modi" . "kaushal.modi@gmail.com") ("Matt Price" . "moptop99@gmail.com")) (:maintainers ("Kaushal Modi" . "kaushal.modi@gmail.com")) (:maintainer "Kaushal Modi" . "kaushal.modi@gmail.com") (:keywords "org" "markdown" "docs") (:url . "https://ox-hugo.scripter.co"))]) (ox-impress-js . [(20150412 1716) ((org (8))) "impress.js Back-End for Org Export Engine" tar ((:commit . "91c6d2af6af308ade352a03355c4fb551b238c6b") (:authors ("Takumi Kinjo ")) (:maintainers ("Takumi Kinjo ")) (:maintainer "Takumi Kinjo ") (:keywords "outlines" "hypermedia" "calendar" "wp") (:url . "https://github.com/kinjo/org-impress-js.el"))]) (ox-ioslide . [(20161015 1338) ((emacs (24 1)) (org (8 0)) (cl-lib (0 5)) (f (0 17 2)) (makey (0 3))) "Export org-mode to Google I/O HTML5 slide." tar ((:commit . "6555680be5364c8ddd2bf446865cb1a82adb6b9e") (:authors ("coldnew" . "coldnew.tw@gmail.com")) (:maintainers ("coldnew" . "coldnew.tw@gmail.com")) (:maintainer "coldnew" . "coldnew.tw@gmail.com") (:keywords "html" "presentation") (:url . "http://github.com/coldnew/org-ioslide"))]) (ox-jekyll-md . [(20211222 1718) nil "Export Jekyll on Markdown articles using org-mode." tar ((:commit . "26edb3f4575bcb0f1a2aed56237cd89694284449") (:authors ("Elsa Gonsiorowski" . "gonsie@me.com")) (:maintainers ("Elsa Gonsiorowski" . "gonsie@me.com")) (:maintainer "Elsa Gonsiorowski" . "gonsie@me.com") (:keywords "org" "jekyll"))]) (ox-jira . [(20220423 1403) ((org (8 3))) "JIRA Backend for Org Export Engine" tar ((:commit . "00184f8fdef02a3a359a253712e8769cbfbea3ba") (:authors ("Stig Brautaset" . "stig@brautaset.org")) (:maintainers ("Stig Brautaset" . "stig@brautaset.org")) (:maintainer "Stig Brautaset" . "stig@brautaset.org") (:keywords "outlines" "hypermedia" "wp") (:url . "https://github.com/stig/ox-jira.el"))]) - (ox-json . [(20210928 347) ((emacs (24)) (org (9 2)) (s (1 12))) "JSON export backend for Org mode" tar ((:commit . "4d2e0aa7f92d07e16cea2dd5e1d250a3f243c3cf") (:authors ("Jared Lumpe" . "mjlumpe@gmail.com")) (:maintainers ("Jared Lumpe" . "mjlumpe@gmail.com")) (:maintainer "Jared Lumpe" . "mjlumpe@gmail.com") (:keywords "outlines") (:url . "https://github.com/jlumpe/ox-json"))]) + (ox-json . [(20240106 2116) ((emacs (26 1)) (org (9)) (s (1 12))) "JSON export backend for Org mode" tar ((:commit . "57a43e3b3e400d219b80008c51373796b844c6b8") (:authors ("Jared Lumpe" . "jared@jaredlumpe.com")) (:maintainers ("Jared Lumpe" . "jared@jaredlumpe.com")) (:maintainer "Jared Lumpe" . "jared@jaredlumpe.com") (:keywords "outlines") (:url . "https://github.com/jlumpe/ox-json"))]) (ox-latex-subfigure . [(20200326 919) ((emacs (24 4)) (org (9 0))) "Subfigure for latex export" tar ((:commit . "be0a0dde62fde8cdf8d72b6968344906aa8c6f54") (:authors ("Quang Linh LE" . "linktohack@gmail.com")) (:maintainers ("Quang Linh LE" . "linktohack@gmail.com")) (:maintainer "Quang Linh LE" . "linktohack@gmail.com") (:keywords "convenience" "ox" "latex" "subfigure" "org" "org-mode") (:url . "http://github.com/linktohack/ox-latex-subfigure"))]) (ox-leanpub . [(20230415 2139) ((org (9 1)) (ox-gfm (1 0)) (emacs (26 1)) (s (1 12 0))) "Export Org documents to Leanpub book format" tar ((:commit . "e8cd440632fd46812d7311360f565828a12380b7") (:authors ("Diego Zamboni" . "diego@zzamboni.org")) (:maintainers ("Diego Zamboni" . "diego@zzamboni.org")) (:maintainer "Diego Zamboni" . "diego@zzamboni.org") (:keywords "files" "org" "leanpub") (:url . "https://gitlab.com/zzamboni/ox-leanpub"))]) - (ox-linuxmag-fr . [(20230611 1229) ((emacs (28 1))) "Org-mode exporter for the French GNU/Linux Magazine" tar ((:commit . "535f7228a845b69a9f70d81b30d304a2bf01cd3d") (:url . "https://github.com/DamienCassou/ox-linuxmag-fr"))]) + (ox-linuxmag-fr . [(20240319 2034) ((emacs (28 1))) "Org-mode exporter for the French GNU/Linux Magazine" tar ((:commit . "eab473296b8319a052ca30d27e07508e876ca8d9") (:url . "https://github.com/DamienCassou/ox-linuxmag-fr"))]) (ox-mdx-deck . [(20181115 1847) ((emacs (24)) (ox-hugo (0 7))) "org-mode to mdx-deck exporter" tar ((:commit . "f3dbc35870b69a5d8971b1647da8c5468f520c5d") (:authors ("Joshua Wolfe")) (:maintainers ("Joshua Wolfe")) (:maintainer "Joshua Wolfe") (:keywords "lisp" "org" "ox" "mdx" "deck") (:url . "https://github.com/WolfeCub/ox-mdx-deck/"))]) (ox-mediawiki . [(20230425 115) ((cl-lib (0 5)) (s (1 9 0))) "Mediawiki Back-End for Org Export Engine" tar ((:commit . "fa4954c12ab339ac8adf2830141390e71ee13067") (:authors ("Tom Alexander" . "tomalexander@paphus.com")) (:maintainers ("Tom Alexander" . "tomalexander@paphus.com")) (:maintainer "Tom Alexander" . "tomalexander@paphus.com") (:keywords "org" "wp" "mediawiki") (:url . "https://github.com/tomalexander/orgmode-mediawiki"))]) (ox-minutes . [(20180202 1734) ((emacs (24 4))) "Plain text backend for Org for Meeting Minutes" tar ((:commit . "27c29f3fdb9181322ae56f8bace8d95e621230e5") (:authors ("Kaushal Modi" . "kaushal.modi@gmail.com")) (:maintainers ("Kaushal Modi" . "kaushal.modi@gmail.com")) (:maintainer "Kaushal Modi" . "kaushal.modi@gmail.com") (:keywords "org" "exporter" "notes") (:url . "https://github.com/kaushalmodi/ox-minutes"))]) (ox-nikola . [(20151114 1116) ((emacs (24 4)) (org (8 2 4)) (ox-rst (0 2))) "Export Nikola articles using org-mode." tar ((:commit . "5bcbc1a38f6619f62294194f13ca0cd4ca14dd48") (:authors ("IGARASHI Masanao" . "syoux2@gmail.com")) (:maintainers ("IGARASHI Masanao" . "syoux2@gmail.com")) (:maintainer "IGARASHI Masanao" . "syoux2@gmail.com") (:keywords "org" "nikola") (:url . "https://github.com/masayuko/ox-nikola"))]) - (ox-pandoc . [(20230627 643) ((org (8 2)) (emacs (24 4)) (dash (2 8)) (ht (2 0))) "An Org-mode exporter using pandoc" tar ((:commit . "0f758517f512e375825679541b5d905be40342eb") (:authors ("KAWABATA, Taichi" . "kawabata.taichi@gmail.com") ("FENTON, Alex" . "a-fent@github")) (:maintainers ("FENTON, Alex" . "a-fent@github")) (:maintainer "FENTON, Alex" . "a-fent@github") (:keywords "tools") (:url . "https://github.com/a-fent/ox-pandoc"))]) + (ox-pandoc . [(20231222 1103) ((org (8 2)) (emacs (24 4)) (dash (2 8)) (ht (2 0))) "An Org-mode exporter using pandoc" tar ((:commit . "399d787b6e2124bd782615338b845c3724a47718") (:authors ("KAWABATA, Taichi" . "kawabata.taichi@gmail.com") ("FENTON, Alex" . "a-fent@github")) (:maintainers ("FENTON, Alex" . "a-fent@github")) (:maintainer "FENTON, Alex" . "a-fent@github") (:keywords "tools") (:url . "https://github.com/a-fent/ox-pandoc"))]) (ox-pukiwiki . [(20150124 1716) ((org (8 1))) "Pukiwiki Back-End for Org Export Engine" tar ((:commit . "b53920abf698fa6682623d671108393e92c68bd7") (:authors ("Yasushi SHOJI" . "yasushi.shoji@gmail.com")) (:maintainers ("Yasushi SHOJI" . "yasushi.shoji@gmail.com")) (:maintainer "Yasushi SHOJI" . "yasushi.shoji@gmail.com") (:keywords "org" "pukiwiki") (:url . "https://github.com/yashi/org-pukiwiki"))]) (ox-qmd . [(20230325 1315) ((emacs (27 2)) (request (0 3 3)) (mimetypes (1 0))) "Qiita Markdown Back-End for Org Export Engine" tar ((:commit . "0b5fa1e20aaa48d93600e1b8d09c3b6f55af3373") (:authors ("0x60DF" . "0x60DF@gmail.com")) (:maintainers ("0x60DF" . "0x60DF@gmail.com")) (:maintainer "0x60DF" . "0x60DF@gmail.com") (:keywords "wp") (:url . "https://github.com/0x60df/ox-qmd"))]) - (ox-report . [(20230712 1639) ((emacs (24 4)) (org-msg (3 9))) "Export your org file to minutes report PDF file" tar ((:commit . "91e047968c4730dfe10d1e94836e0747de8c7361") (:authors ("Matthias David" . "db@gnu.re")) (:maintainers ("Matthias David" . "db@gnu.re")) (:maintainer "Matthias David" . "db@gnu.re") (:keywords "org" "outlines" "report" "exporter" "meeting" "minutes") (:url . "https://github.com/DarkBuffalo/ox-report"))]) + (ox-report . [(20231220 1625) ((emacs (24 4)) (org-msg (3 9))) "Export your org file to minutes report PDF file" tar ((:commit . "36e7f5e6e8cd836bbfcb0e85be01faab21f725fd") (:authors ("Matthias David" . "db@gnu.re")) (:maintainers ("Matthias David" . "db@gnu.re")) (:maintainer "Matthias David" . "db@gnu.re") (:keywords "org" "outlines" "report" "exporter" "meeting" "minutes") (:url . "https://github.com/DarkBuffalo/ox-report"))]) (ox-reveal . [(20221127 814) ((org (8 3))) "reveal.js Presentation Back-End for Org Export Engine" tar ((:commit . "f55c851bf6aeb1bb2a7f6cf0f2b7bd0e79c4a5a0") (:authors ("Yujie Wen ")) (:maintainers ("Yujie Wen ")) (:maintainer "Yujie Wen ") (:keywords "outlines" "hypermedia" "slideshow" "presentation"))]) (ox-review . [(20220619 724) ((emacs (26 1)) (org (9))) "Re:VIEW Back-End for Org Export Engine" tar ((:commit . "f7dc418f9812088afc0ee0d08f778a5654686ef3") (:authors ("Masashi Fujimoto")) (:maintainers ("Masashi Fujimoto")) (:maintainer "Masashi Fujimoto") (:keywords "outlines" "hypermedia") (:url . "https://github.com/masfj/ox-review"))]) (ox-rfc . [(20230619 338) ((emacs (24 3)) (org (8 3))) "RFC Back-End for Org Export Engine" tar ((:commit . "ad1885233774e3473ea697c7240e248381a84d3e") (:authors ("Christian Hopps" . "chopps@devhopps.com")) (:maintainers ("Christian Hopps" . "chopps@devhopps.com")) (:maintainer "Christian Hopps" . "chopps@devhopps.com") (:keywords "org" "rfc" "wp" "xml") (:url . "https://github.com/choppsv1/org-rfc-export"))]) @@ -3908,64 +4012,64 @@ (ox-tiddly . [(20200927 857) ((org (8)) (emacs (24 4))) "Org TiddlyWiki exporter" tar ((:commit . "3377d8732aa916e736ce5822c7a9a4fbdc894e37") (:authors ("Derek Feichtinger" . "derek.feichtinger@psi.ch")) (:maintainers ("Derek Feichtinger" . "derek.feichtinger@psi.ch")) (:maintainer "Derek Feichtinger" . "derek.feichtinger@psi.ch") (:keywords "org") (:url . "https://github.com/dfeich/org8-wikiexporters"))]) (ox-timeline . [(20220321 2115) ((emacs (24 4))) "HTML Timeline Back-End for Org Export Engine" tar ((:commit . "b28bd4ccd5fa114c0f51b9766f0b9be7fe05fdd8") (:authors ("Joel Bryan Juliano ")) (:maintainers ("Joel Bryan Juliano ")) (:maintainer "Joel Bryan Juliano ") (:keywords "simple timeline" "timeline" "hypermedia" "html timeline") (:url . "https://github.com/jjuliano/org-simple-timeline"))]) (ox-trac . [(20171026 1823) ((org (9 0))) "Org Export Backend to Trac WikiFormat" tar ((:commit . "5ac6c81bbc18db6c17e267d6399778c3fb5bf1ee") (:authors ("Brian J. Carlson ")) (:maintainers ("Brian J. Carlson ")) (:maintainer "Brian J. Carlson ") (:keywords "org-mode" "trac") (:url . "https://github.com/JalapenoGremlin/ox-trac"))]) - (ox-tufte . [(20230828 1531) ((org (9 5)) (emacs (27 1))) "Tufte HTML org-mode export backend" tar ((:commit . "55e095ae4790c84a5d1d5b91b3c492af7f51b98c") (:authors ("M. Lee Hinman")) (:maintainers ("The Bayesians Inc.")) (:maintainer "The Bayesians Inc.") (:keywords "org" "tufte" "html" "outlines" "hypermedia" "calendar" "wp") (:url . "https://github.com/ox-tufte/ox-tufte"))]) + (ox-tufte . [(20240317 2053) ((org (9 5)) (emacs (27 1))) "Tufte HTML org-mode export backend" tar ((:commit . "ebdde02e4d33c3321543d67db8f1aef80adc03bd") (:authors ("The Bayesians Inc.") ("M. Lee Hinman")) (:maintainers ("The Bayesians Inc.")) (:maintainer "The Bayesians Inc.") (:keywords "org" "tufte" "html" "outlines" "hypermedia" "calendar" "wp") (:url . "https://github.com/ox-tufte/ox-tufte"))]) (ox-twbs . [(20200628 1949) nil "Bootstrap compatible HTML Back-End for Org" tar ((:commit . "e8a27dc78b7be494d9918f26db7a3bbb6b45020b") (:authors ("Carsten Dominik ") ("Jambunathan K ") ("Brandon van Beekum ")) (:maintainers ("Carsten Dominik ")) (:maintainer "Carsten Dominik ") (:keywords "org" "html" "publish" "twitter" "bootstrap") (:url . "https://github.com/marsmining/ox-twbs"))]) (ox-twiki . [(20200927 857) ((org (8)) (emacs (24 4))) "Org Twiki and Foswiki export" tar ((:commit . "3377d8732aa916e736ce5822c7a9a4fbdc894e37") (:authors ("Derek Feichtinger" . "derek.feichtinger@psi.ch")) (:maintainers ("Derek Feichtinger" . "derek.feichtinger@psi.ch")) (:maintainer "Derek Feichtinger" . "derek.feichtinger@psi.ch") (:keywords "org") (:url . "https://github.com/dfeich/org8-wikiexporters"))]) (ox-wk . [(20191231 2058) ((emacs (24 4)) (org (8 3))) "Wiki Back-End for Org Export Engine" tar ((:commit . "d34d1b72e4e940745a377bfa745dfb618900a09e") (:authors ("Vilibald Wanča" . "vilibald@wvi.cz")) (:maintainers ("Vilibald Wanča" . "vilibald@wvi.cz")) (:maintainer "Vilibald Wanča" . "vilibald@wvi.cz") (:keywords "org" "wp" "wiki") (:url . "https://github.com/w-vi/ox-wk.el"))]) (ox-yaow . [(20220629 1539) ((emacs (27)) (f (0 2 0)) (s (1 12 0)) (dash (2 17 0))) "Generate html pages from org files" tar ((:commit . "71d7cee736542f6504c4733d040601d2d2086443") (:authors ("Laurence Warne")) (:maintainers ("Laurence Warne")) (:maintainer "Laurence Warne") (:keywords "outlines" "hypermedia") (:url . "https://github.com/LaurenceWarne/ox-yaow.el"))]) (ox-zenn . [(20200924 1607) ((emacs (27 1)) (org (9 0))) "Zenn flavored markdown backend for org export engine" tar ((:commit . "b53bd82116c9f7dbb5b476d2cfcc8ed0f3bc9c78") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "convenience") (:url . "https://github.com/conao3/ox-zenn.el"))]) (p4 . [(20150721 1937) nil "Simple Perforce-Emacs Integration" tar ((:commit . "eff047caa75dbe4965defca9d1212454cdb755d5") (:authors ("Gareth Rees" . "gdr@garethrees.org")) (:maintainers ("Gareth Rees" . "gdr@garethrees.org")) (:maintainer "Gareth Rees" . "gdr@garethrees.org") (:url . "https://github.com/gareth-rees/p4.el"))]) - (pabbrev . [(20160320 2101) nil "Predictive abbreviation expansion" tar ((:commit . "56400d5d256b42ffe45c229ea9827f026b650cf5") (:authors ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) (:maintainers ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) (:maintainer "Phillip Lord" . "phillip.lord@newcastle.ac.uk"))]) + (pabbrev . [(20240216 439) ((emacs (25 1))) "Predictive abbreviation expansion" tar ((:commit . "bf8a498f2ddd268981d43fb71cf98aa2e4be3942") (:authors ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) (:maintainers ("Arthur Miller" . "arthur.miller@live.com")) (:maintainer "Arthur Miller" . "arthur.miller@live.com") (:url . "https://github.com/phillord/pabbrev"))]) + (pacdiff . [(20240219 1606) ((emacs (28 1))) "Manage pacdiff files" tar ((:commit . "74996064f7270a3b8fc57bbc8b166f3966c0a4c1") (:authors ("Fabian Brosda" . "fabi3141@gmx.de") ("Nicholas Vollmer")) (:maintainers ("Fabian Brosda" . "fabi3141@gmx.de")) (:maintainer "Fabian Brosda" . "fabi3141@gmx.de") (:url . "https://github.com/fbrosda/pacdiff.el"))]) (pacfiles-mode . [(20230503 1523) ((emacs (26 1))) "The pacnew and pacsave merging tool" tar ((:commit . "a613d1d88dba4cb293ecaf42a9aeff7d8a3ce8aa") (:authors ("Carlos G. Cordero ")) (:maintainers ("Carlos G. Cordero" . "pacfiles@binarycharly.com")) (:maintainer "Carlos G. Cordero" . "pacfiles@binarycharly.com") (:keywords "files" "pacman" "arch" "pacnew" "pacsave" "update" "linux") (:url . "https://github.com/UndeadKernel/pacfiles-mode"))]) (pack . [(20191017 456) ((emacs (24)) (cl-lib (0 5))) "Pack and unpack archive files" tar ((:commit . "85cd856fdc00a2365e88b50373b99f1b3d2227be") (:authors ("10sr" . "8.slashes@gmail.com")) (:maintainers ("10sr" . "8.slashes@gmail.com")) (:maintainer "10sr" . "8.slashes@gmail.com") (:keywords "files" "dired") (:url . "https://github.com/10sr/pack-el"))]) (package+ . [(20230805 2115) ((emacs (24 3))) "Extensions for the package library." tar ((:commit . "57a53a1da75d76a9dcd17008d1c1d77475b9671a") (:authors ("Ryan Davis" . "ryand-ruby@zenspider.com")) (:maintainers ("Ryan Davis" . "ryand-ruby@zenspider.com")) (:maintainer "Ryan Davis" . "ryand-ruby@zenspider.com") (:keywords "extensions" "tools") (:url . "https://github.com/zenspider/package"))]) - (package-build . [(20230820 1650) ((emacs (26 1))) "Tools for assembling a package archive" tar ((:commit . "c399e2cf1f7de6e078efd68043db62740c771299") (:authors ("Donald Ephraim Curtis" . "dcurtis@milkbox.net") ("Steve Purcell" . "steve@sanityinc.com") ("Jonas Bernoulli" . "jonas@bernoul.li") ("Phil Hagelberg" . "technomancy@gmail.com")) (:maintainers ("Donald Ephraim Curtis" . "dcurtis@milkbox.net")) (:maintainer "Donald Ephraim Curtis" . "dcurtis@milkbox.net") (:keywords "maint" "tools") (:url . "https://github.com/melpa/package-build"))]) + (package-build . [(20240306 2234) ((emacs (26 1)) (compat (27 1))) "Tools for assembling a package archive" tar ((:commit . "236ef4e4d615699d4ba8b7ad28bd40b87d269411") (:authors ("Donald Ephraim Curtis" . "dcurtis@milkbox.net") ("Steve Purcell" . "steve@sanityinc.com") ("Jonas Bernoulli" . "jonas@bernoul.li") ("Phil Hagelberg" . "technomancy@gmail.com")) (:maintainers ("Donald Ephraim Curtis" . "dcurtis@milkbox.net")) (:maintainer "Donald Ephraim Curtis" . "dcurtis@milkbox.net") (:keywords "maint" "tools") (:url . "https://github.com/melpa/package-build"))]) (package-filter . [(20161122 719) nil "package archive whitelist and blacklist" tar ((:commit . "c8e2531227c02c4c5e9d593f2cdb6a4ab4a6849b") (:authors ("Donald Ephraim Curtis" . "dcurtis@milkbox.net")) (:maintainers ("Donald Ephraim Curtis" . "dcurtis@milkbox.net")) (:maintainer "Donald Ephraim Curtis" . "dcurtis@milkbox.net") (:url . "https://github.com/milkypostman/package-filter"))]) - (package-lint . [(20230806 1331) ((cl-lib (0 5)) (emacs (24 1)) (let-alist (1 0 6))) "A linting library for elisp package authors" tar ((:commit . "91d0f1077c78753e09973d63fb3e571413a4c206") (:authors ("Steve Purcell" . "steve@sanityinc.com") ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "lisp") (:url . "https://github.com/purcell/package-lint"))]) - (package-lint-flymake . [(20230806 1331) ((emacs (26 1)) (package-lint (0 5))) "A package-lint Flymake backend" tar ((:commit . "91d0f1077c78753e09973d63fb3e571413a4c206") (:url . "https://github.com/purcell/package-lint"))]) + (package-lint . [(20240220 2303) ((emacs (24 4)) (let-alist (1 0 6))) "A linting library for elisp package authors" tar ((:commit . "eeb585eaceeba483d9bc7ab543e7422c82920e35") (:authors ("Steve Purcell" . "steve@sanityinc.com") ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "lisp") (:url . "https://github.com/purcell/package-lint"))]) + (package-lint-flymake . [(20231113 1518) ((emacs (26 1)) (package-lint (0 5))) "A package-lint Flymake backend" tar ((:commit . "dd81a5b9224cc6e6dc4bbb6b4a2928df89c01317") (:url . "https://github.com/purcell/package-lint"))]) (package-loading-notifier . [(20230809 446) ((emacs (25))) "Notify a package is being loaded" tar ((:commit . "f64f994cb1a55f9d59444deaec884bff0ed2b26e") (:authors ("SeungKi Kim" . "tttuuu888@gmail.com")) (:maintainers ("SeungKi Kim" . "tttuuu888@gmail.com")) (:maintainer "SeungKi Kim" . "tttuuu888@gmail.com") (:keywords "convenience" "faces" "config" "startup") (:url . "https://github.com/tttuuu888/package-loading-notifier"))]) - (package-safe-delete . [(20150116 1607) ((emacs (24)) (epl (0 7 -4))) "Safely delete package.el packages" tar ((:commit . "138171e4fc03c0ef05a8260cbb5cd2e114c1c194") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainers ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com") (:url . "https://github.com/Fanael/package-safe-delete"))]) (package-utils . [(20220630 2345) ((restart-emacs (0 1 1))) "Extensions for package.el" tar ((:commit . "0168172062467b1bff913ea955b2ef709b43ecfa") (:authors ("Philippe Vaucher" . "philippe.vaucher@gmail.com")) (:maintainers ("Philippe Vaucher" . "philippe.vaucher@gmail.com")) (:maintainer "Philippe Vaucher" . "philippe.vaucher@gmail.com") (:keywords "package" "convenience") (:url . "https://github.com/Silex/package-utils"))]) (packed . [(20221130 2228) ((emacs (25 1)) (compat (28 1 1 0))) "[DEPRECATED] Package manager agnostic Emacs Lisp package utilities" tar ((:commit . "169064f7acfe198cc7dd43d02518b773691e1314") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "lisp") (:url . "https://github.com/emacscollective/packed"))]) (pacmacs . [(20220106 2248) ((emacs (24 4)) (dash (2 18 0)) (cl-lib (0 5)) (f (0 18 0))) "Pacman for Emacs" tar ((:commit . "25a8c30210f6bd94634a7ff743a2f8be391ed3b3") (:authors ("Codingteam" . "codingteam@conference.jabber.ru")) (:maintainers ("Alexey Kutepov" . "reximkut@gmail.com")) (:maintainer "Alexey Kutepov" . "reximkut@gmail.com") (:url . "http://github.com/codingteam/pacmacs.el"))]) (pact-mode . [(20201219 2223) ((emacs (24 3))) "Mode for Pact, a LISPlike smart contract language." tar ((:commit . "f48a4faf5f8f8435423bda3888eca6ee67ee13a9") (:authors ("Stuart Popejoy")) (:maintainers ("Stuart Popejoy" . "stuart@kadena.io")) (:maintainer "Stuart Popejoy" . "stuart@kadena.io") (:keywords "pact" "lisp" "languages" "blockchain" "smartcontracts" "tools" "mode") (:url . "https://github.com/kadena-io/pact-mode"))]) (paganini-theme . [(20180815 1921) ((emacs (24 0))) "A colorful, dark and warm theme." tar ((:commit . "255c5a2a8abee9c5935465ec42b9c3604c178c3c") (:authors ("Onur Temizkan")) (:maintainers ("Onur Temizkan")) (:maintainer "Onur Temizkan") (:url . "https://github.com/onurtemizkan/paganini"))]) - (page-break-lines . [(20230804 658) ((emacs (24 4))) "Display ^L page breaks as tidy horizontal lines" tar ((:commit . "c4283f580fa4feeb9abcaebb99709007db0a3159") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "convenience" "faces") (:url . "https://github.com/purcell/page-break-lines"))]) + (page-break-lines . [(20240311 1026) ((emacs (25 1))) "Display ^L page breaks as tidy horizontal lines" tar ((:commit . "e33426ae7f10c60253afe4850450902919fc87fd") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "convenience" "faces") (:url . "https://github.com/purcell/page-break-lines"))]) (pager . [(20151202 120) nil "windows-scroll commands" tar ((:commit . "5c791ed23f1136e04040d6f4bc9b4ca5b6dc919f") (:authors (nil . "Mikael Sjödin -- mic@docs.uu.se")) (:maintainers (nil . "Mikael Sjödin -- mic@docs.uu.se")) (:maintainer nil . "Mikael Sjödin -- mic@docs.uu.se"))]) (pager-default-keybindings . [(20130719 2057) ((pager (1 0))) "Add the default keybindings suggested for pager.el" tar ((:commit . "dbbd49c2ac5906d1dabf9e9c832bfebc1ab405b3") (:authors ("Nathaniel Flath" . "nflath@gmail.com")) (:maintainers ("Nathaniel Flath" . "nflath@gmail.com")) (:maintainer "Nathaniel Flath" . "nflath@gmail.com") (:url . "http://github.com/nflath/pager-default-keybindings"))]) (paimon . [(20230521 1002) ((aio (1 0)) (closql (20230520 1519)) (emacs (28 1)) (emacsql (20230417 1448)) (f (0 20 0)) (ht (2 4)) (transient (0 3 7)) (request (0 3 3))) "A major mode for Splunk" tar ((:commit . "4c71bea56d0cfdca8ea90c5a6d8d584647d053af") (:authors ("r0man" . "roman@burningswell.com")) (:maintainers ("r0man" . "roman@burningswell.com")) (:maintainer "r0man" . "roman@burningswell.com") (:keywords "paimon" "search" "tools") (:url . "https://github.com/r0man/paimon.el"))]) (pair-tree . [(20211219 1816) ((emacs (27 1)) (dash (2 17 0))) "Visualize a list" tar ((:commit . "00bdaf9df933aaacbed66b5d666e2abc29870103") (:authors ("Zainab Ali ")) (:maintainers ("Zainab Ali ")) (:maintainer "Zainab Ali ") (:keywords "lisp" "tools") (:url . "https://github.com/zainab-ali/pair-tree"))]) (palimpsest . [(20200804 2308) nil "Various deletion strategies when editing" tar ((:commit . "5310c4a026954254ab82e5f3fe9f98dde2bb5c8b") (:authors ("Daniel Szmulewicz" . "daniel.szmulewicz@gmail.com")) (:maintainers ("Daniel Szmulewicz" . "daniel.szmulewicz@gmail.com")) (:maintainer "Daniel Szmulewicz" . "daniel.szmulewicz@gmail.com"))]) (pamparam . [(20210105 1513) ((emacs (26 1)) (lispy (0 27 0)) (worf (0 1 0)) (ivy-posframe (0 5 5))) "Simple and fast flashcards." tar ((:commit . "0ba91149095bee8c43688c68f83f4d365fbe6771") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "outlines" "hypermedia" "flashcards" "memory") (:url . "https://github.com/abo-abo/pamparam"))]) - (panda . [(20200715 338) ((emacs (25))) "Client for Bamboo's REST API." tar ((:commit . "6508ac3228975c39d10a1caa70b9ce34ff3ed21d") (:authors ("Sebastian Monia" . "smonia@outlook.com")) (:maintainers ("Sebastian Monia" . "smonia@outlook.com")) (:maintainer "Sebastian Monia" . "smonia@outlook.com") (:keywords "maint" "tool") (:url . "https://github.com/sebasmonia/panda"))]) + (panda . [(20240102 348) ((emacs (25))) "Client for Bamboo's REST API." tar ((:commit . "286785687d4ffe29fd1d95c699d378743d32ac00") (:authors ("Sebastian Monia" . "smonia@outlook.com")) (:maintainers ("Sebastian Monia" . "smonia@outlook.com")) (:maintainer "Sebastian Monia" . "smonia@outlook.com") (:keywords "maint" "tool") (:url . "https://github.com/sebasmonia/panda"))]) (panda-theme . [(20181128 1738) ((emacs (24))) "Panda Theme" tar ((:commit . "60aa47c7a930377807da0d601351ad91e8ca446a") (:authors ("jamiecollinson" . "jamiecollinson@gmail.com")) (:maintainers ("jamiecollinson" . "jamiecollinson@gmail.com")) (:maintainer "jamiecollinson" . "jamiecollinson@gmail.com") (:url . "https://github.com/jamiecollinson/emacs-panda-theme"))]) (pandoc . [(20161128 1157) ((emacs (24 4))) "Pandoc interface" tar ((:commit . "198d262d09e30448f1672338b0b5a81cf75e1eaa") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "hypermedia" "documentation" "markup" "converter") (:url . "https://github.com/zonuexe/pandoc.el"))]) - (pandoc-mode . [(20230416 952) ((hydra (0 10 0)) (dash (2 10 0))) "Minor mode for interacting with Pandoc" tar ((:commit . "da3f0f5238a8b1e5f09f2ec97e683dc488d25be0") (:authors ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainers ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm") (:keywords "text" "pandoc") (:url . "http://joostkremers.github.io/pandoc-mode/"))]) + (pandoc-mode . [(20240311 2218) ((hydra (0 10 0)) (dash (2 10 0))) "Minor mode for interacting with Pandoc" tar ((:commit . "c7fa568ab9cfbb2abfb9b22f419d28ce570d7b22") (:authors ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainers ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm") (:keywords "text" "pandoc") (:url . "http://joostkremers.github.io/pandoc-mode/"))]) (pangu-spacing . [(20221025 522) nil "Minor-mode to add space between Chinese and English characters." tar ((:commit . "2303013e5cd7852136f1429162fea0e1c8cb0221") (:authors ("coldnew" . "coldnew.tw@gmail.com")) (:maintainers ("coldnew" . "coldnew.tw@gmail.com")) (:maintainer "coldnew" . "coldnew.tw@gmail.com") (:url . "http://github.com/coldnew/pangu-spacing"))]) (paper-theme . [(20230318 48) ((emacs (24))) "A minimal Emacs colour theme." tar ((:commit . "8d337b85592ae44e1fa3ad03f0c65ca99036f9e2") (:authors ("Göktuğ Kayaalp")) (:maintainers ("Göktuğ Kayaalp")) (:maintainer "Göktuğ Kayaalp") (:keywords "theme" "paper") (:url . "https://dev.gkayaalp.com/elisp/index.html#paper"))]) - (paperless . [(20230204 1815) ((emacs (29 1)) (f (0 11 0)) (s (1 10 0)) (cl-lib (0 6 1))) "A major mode for sorting and filing PDF documents." tar ((:commit . "e524e31350d74f13319968d24b7326a4a412e105") (:authors ("Anthony Green" . "green@moxielogic.com")) (:maintainers ("Anthony Green" . "green@moxielogic.com")) (:maintainer "Anthony Green" . "green@moxielogic.com") (:keywords "pdf" "convenience") (:url . "http://github.com/atgreen/paperless"))]) + (paperless . [(20240130 1048) ((emacs (29 1)) (f (0 11 0)) (s (1 10 0)) (cl-lib (0 7 1))) "A major mode for sorting and filing PDF documents" tar ((:commit . "ef2e7ef5aeaffa997794f5d6e27be6631ba05d34") (:authors ("Anthony Green" . "green@moxielogic.com")) (:maintainers ("Anthony Green" . "green@moxielogic.com")) (:maintainer "Anthony Green" . "green@moxielogic.com") (:keywords "pdf" "convenience") (:url . "https://github.com/atgreen/paperless"))]) (paradox . [(20191011 1119) ((emacs (24 4)) (seq (1 7)) (let-alist (1 0 3)) (spinner (1 7 3)) (hydra (0 13 2))) "A modern Packages Menu. Colored, with package ratings, and customizable." tar ((:commit . "96401577ed02f433debe7604e49afd478e9eda61") (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainers ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") (:keywords "package" "packages") (:url . "https://github.com/Malabarba/paradox"))]) (parchment-theme . [(20221206 1541) ((autothemer (0 2))) "Light theme inspired by Acme and Leuven" tar ((:commit . "07c9887be6e7d94a8546db625c7d62c54d2e5923") (:authors ("Alex Griffin" . "a@ajgrf.com")) (:maintainers ("Alex Griffin" . "a@ajgrf.com")) (:maintainer "Alex Griffin" . "a@ajgrf.com") (:url . "https://gitlab.com/ajgrf/parchment"))]) (paredit . [(20221127 1452) nil "minor mode for editing parentheses" tar ((:commit . "d700549d8aad684f1fabcfff565a9ad8b468199b") (:authors ("Taylor R. Campbell" . "campbell@paredit.org")) (:maintainers ("Taylor R. Campbell" . "campbell@paredit.org")) (:maintainer "Taylor R. Campbell" . "campbell@paredit.org") (:keywords "lisp") (:url . "https://paredit.org"))]) (paredit-everywhere . [(20210510 531) ((paredit (22))) "Enable some paredit features in non-lisp buffers" tar ((:commit . "b81e5d5356c85001a71640941b469aea9cf2e309") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "languages" "convenience"))]) (paredit-menu . [(20160128 1733) ((paredit (25))) "Adds a menu to paredit.el as memory aid" tar ((:commit . "cc0ae85bd819f9ebfa4f2a419ab3b2d70e39c9c8") (:authors ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) (:maintainers ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) (:maintainer "Phillip Lord" . "phillip.lord@newcastle.ac.uk") (:keywords "paredit"))]) (paren-completer . [(20160501 1052) ((emacs (24 3))) "Automatically, language agnostically, fill in delimiters." tar ((:commit . "74183a8e13fa1266271bdcbcb4bfb29a4f915f0a") (:authors ("Matthew Bregg")) (:maintainers ("Matthew Bregg")) (:maintainer "Matthew Bregg") (:keywords "convenience") (:url . "https://github.com/MatthewBregg/paren-completer"))]) - (paren-face . [(20230511 2101) ((emacs (25 1)) (compat (29 1 4 1))) "A face for parentheses in lisp modes" tar ((:commit . "8b575bc215e715525644ed66152a9bcefde3bd08") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "faces" "lisp") (:url . "https://github.com/tarsius/paren-face"))]) - (parent-mode . [(20150824 2300) nil "get major mode's parent modes" tar ((:commit . "db692cf08deff2f0e973e6e86e26662b44813d1b") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainers ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com") (:url . "https://github.com/Fanael/parent-mode"))]) - (parinfer-rust-mode . [(20230204 1915) ((emacs (26 1))) "An interface for the parinfer-rust library" tar ((:commit . "332c7f47426f0519dc5c24dda82afdb1aa8b61ee") (:authors ("Justin Barclay" . "justinbarclay@gmail.com")) (:maintainers ("Justin Barclay" . "justinbarclay@gmail.com")) (:maintainer "Justin Barclay" . "justinbarclay@gmail.com") (:keywords "lisp" "tools") (:url . "https://github.com/justinbarclay/parinfer-rust-mode"))]) + (paren-face . [(20240101 2224) ((emacs (25 1)) (compat (29 1 4 1))) "A face for parentheses in lisp modes" tar ((:commit . "d36fab3529aa3e046493ec373f2c080874cc184f") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "faces" "lisp") (:url . "https://github.com/tarsius/paren-face"))]) + (parent-mode . [(20240210 1906) nil "get major mode's parent modes" tar ((:commit . "9fe5363b2a190619641c79b3a40d874d8c8f9f40") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainers ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com") (:url . "https://github.com/Fanael/parent-mode"))]) + (parinfer-rust-mode . [(20240319 1546) ((emacs (26 1))) "An interface for the parinfer-rust library" tar ((:commit . "3e95b19cd1e0ec5a8f92ea0a4a1f74ce6a8997ba") (:authors ("Justin Barclay" . "justinbarclay@gmail.com")) (:maintainers ("Justin Barclay" . "justinbarclay@gmail.com")) (:maintainer "Justin Barclay" . "justinbarclay@gmail.com") (:keywords "lisp" "tools") (:url . "https://github.com/justinbarclay/parinfer-rust-mode"))]) (parrot . [(20220101 518) ((emacs (24 1))) "Party Parrot rotates gracefully in mode-line." tar ((:commit . "1d381f24d74242018e306d1a0c891bed9a465ac3") (:authors ("Daniel Ting" . "deep.paren.12@gmail.com")) (:maintainers ("Daniel Ting" . "deep.paren.12@gmail.com")) (:maintainer "Daniel Ting" . "deep.paren.12@gmail.com") (:keywords "party" "parrot" "rotate" "sirocco" "kakapo" "games") (:url . "https://github.com/dp12/parrot.git"))]) (parse-csv . [(20160512 1723) nil "Parse strings with CSV fields into s-expressions" tar ((:commit . "96bef1ffbc89ea12d13311c9fa239c5c3e864890") (:authors ("Edward Marco Baringer (Common Lisp)") ("Matt Curtis" . "matt.r.curtis@gmail.com")) (:maintainers ("Matt Curtis" . "matt.r.curtis@gmail.com")) (:maintainer "Matt Curtis" . "matt.r.curtis@gmail.com") (:keywords "csv") (:url . "https://github.com/mrc/el-csv"))]) - (parse-it . [(20220704 640) ((emacs (25 1)) (s (1 12 0))) "Basic Parser in Emacs Lisp" tar ((:commit . "c1b5ce15a5bcb80595f45e2fc3bda828f525859f") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "parse" "parser" "lex" "lexer" "ast") (:url . "https://github.com/jcs-elpa/parse-it"))]) + (parse-it . [(20240101 946) ((emacs (25 1)) (s (1 12 0))) "Basic Parser in Emacs Lisp" tar ((:commit . "cdc4386ef8e94ccdeff3700021d4a944034ae559") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "parse" "parser" "lex" "lexer" "ast") (:url . "https://github.com/jcs-elpa/parse-it"))]) (parsebib . [(20230228 1530) ((emacs (25 1))) "A library for parsing bib files" tar ((:commit . "ace9df707108b17759c004c7387655277122d4c1") (:authors ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainers ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm") (:keywords "text" "bibtex") (:url . "https://github.com/joostkremers/parsebib"))]) (parsec . [(20180730 16) ((emacs (24)) (cl-lib (0 5))) "Parser combinator library" tar ((:commit . "2cbbbc2254aa7bcaa4fb5e07c8c1bf2f381dba26") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainers ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions") (:url . "https://github.com/cute-jumper/parsec.el"))]) - (parseclj . [(20220422 936) ((emacs (25))) "Clojure/EDN parser" tar ((:commit . "4d0e780e00f1828b00c43099e6eebc6582998f72") (:authors ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainers ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainer "Arne Brasseur" . "arne@arnebrasseur.net") (:keywords "lisp" "clojure" "edn" "parser"))]) - (parseedn . [(20220520 835) ((emacs (26)) (parseclj (1 1 0)) (map (2))) "Clojure/EDN parser" tar ((:commit . "a09686fbb9113b8b1b4f20c9e1dc0d6fea01a64f") (:authors ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainers ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainer "Arne Brasseur" . "arne@arnebrasseur.net") (:keywords "lisp" "clojure" "edn" "parser"))]) + (parseclj . [(20231203 1905) ((emacs (25))) "Clojure/EDN parser" tar ((:commit . "6af22372e0fe14df882dd300b22b12ba2d7e00b0") (:authors ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainers ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainer "Arne Brasseur" . "arne@arnebrasseur.net") (:keywords "lisp" "clojure" "edn" "parser"))]) + (parseedn . [(20231203 1909) ((emacs (26)) (parseclj (1 1 1)) (map (2))) "Clojure/EDN parser" tar ((:commit . "3407e4530a367b6c2b857dae261cdbb67a440aaa") (:authors ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainers ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainer "Arne Brasseur" . "arne@arnebrasseur.net") (:keywords "lisp" "clojure" "edn" "parser") (:url . "http://www.github.com/clojure-emacs/parseedn"))]) (pasp-mode . [(20180404 1700) ((emacs (24 3))) "- A major mode for editing Answer Set Programs." tar ((:commit . "59385eb0e8ebcfc8c11dd811fb145d4b0fa3cc92") (:authors ("Henrik Jürges" . "juerges.henrik@gmail.com")) (:maintainers ("Henrik Jürges" . "juerges.henrik@gmail.com")) (:maintainer "Henrik Jürges" . "juerges.henrik@gmail.com") (:keywords "asp" "pasp" "answer set programs" "potassco answer set programs" "major mode" "languages") (:url . "https://github.com/santifa/pasp-mode"))]) - (pass . [(20210203 810) ((emacs (25)) (password-store (2 1 0)) (password-store-otp (0 1 5)) (f (0 17))) "Major mode for password-store.el" tar ((:commit . "5651da53137db9adcb125b4897c2fe27eeb4368d") (:authors ("Nicolas Petton" . "petton.nicolas@gmail.com") ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Nicolas Petton" . "petton.nicolas@gmail.com")) (:maintainer "Nicolas Petton" . "petton.nicolas@gmail.com") (:keywords "password-store" "password" "keychain"))]) + (pass . [(20231206 736) ((emacs (25)) (password-store (1 7 4)) (password-store-otp (0 1 5)) (f (0 17))) "Major mode for password-store.el" tar ((:commit . "ed7031c5c33a384d07da2d15c9d5f854027a26a2") (:authors ("Nicolas Petton" . "petton.nicolas@gmail.com") ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Nicolas Petton" . "petton.nicolas@gmail.com")) (:maintainer "Nicolas Petton" . "petton.nicolas@gmail.com") (:keywords "password-store" "password" "keychain") (:url . "https://github.com/NicolasPetton/pass"))]) (passmm . [(20221204 1927) ((emacs (25)) (password-store (1 7 4))) "A minor mode for pass (Password Store)" tar ((:commit . "66691e301dff476eaff7c6e817ed9df96d4404c8") (:authors ("Peter Jones" . "pjones@devalot.com")) (:maintainers ("Peter Jones" . "pjones@devalot.com")) (:maintainer "Peter Jones" . "pjones@devalot.com") (:url . "https://github.com/pjones/passmm"))]) (password-generator . [(20210425 2227) nil "Password generator for humans. Good, Bad, Phonetic passwords included." tar ((:commit . "c1da9790d594bc745cdbcc8003153e408aa92a5f") (:authors ("Vandrlexay")) (:maintainers ("Vandrlexay")) (:maintainer "Vandrlexay") (:url . "http://github.com/vandrlexay/emacs-password-genarator"))]) (password-mode . [(20220706 507) ((emacs (25 1))) "Hide password text using overlays" tar ((:commit . "883981d9f8d0e2a8ec479c89f5f6b2492c22e01a") (:authors ("Jürgen Hötzel" . "juergen@archlinux.org")) (:maintainers ("Jürgen Hötzel" . "juergen@archlinux.org")) (:maintainer "Jürgen Hötzel" . "juergen@archlinux.org") (:keywords "docs" "password" "passphrase") (:url . "https://github.com/juergenhoetzel/password-mode"))]) - (password-store . [(20230503 619) ((emacs (26)) (with-editor (2 5 11))) "Password store (pass) support" tar ((:commit . "28cec11f1dbe6c4273d30370af45b69c9f408386") (:authors ("Svend Sorensen" . "svend@svends.net")) (:maintainers ("Tino Calancha" . "tino.calancha@gmail.com")) (:maintainer "Tino Calancha" . "tino.calancha@gmail.com") (:keywords "tools" "pass" "password" "password-store") (:url . "https://www.passwordstore.org/"))]) + (password-store . [(20231201 954) ((emacs (26 1)) (with-editor (2 5 11))) "Password store (pass) support" tar ((:commit . "b5e965a838bb68c1227caa2cdd874ba496f10149") (:authors ("Svend Sorensen" . "svend@svends.net")) (:maintainers ("Tino Calancha" . "tino.calancha@gmail.com")) (:maintainer "Tino Calancha" . "tino.calancha@gmail.com") (:keywords "tools" "pass" "password" "password-store" "gpg") (:url . "https://www.passwordstore.org/"))]) (password-store-otp . [(20220128 1320) ((emacs (25)) (s (1 9 0)) (password-store (0 1))) "Password store (pass) OTP extension support" tar ((:commit . "be3a00a981921ed1b2f78012944dc25eb5a0beca") (:authors ("Daniel Barreto")) (:maintainers ("Daniel Barreto")) (:maintainer "Daniel Barreto") (:keywords "tools" "pass") (:url . "https://github.com/volrath/password-store-otp.el"))]) (password-vault . [(20220321 1521) ((cl-lib (0 2)) (emacs (24))) "A Password manager for Emacs." tar ((:commit . "56bc893372a435b4fb3c8937c7f811bca3475f12") (:authors ("Javier \"PuercoPop\" Olaechea" . "pirata@gmail.com")) (:maintainers ("Javier \"PuercoPop\" Olaechea" . "pirata@gmail.com")) (:maintainer "Javier \"PuercoPop\" Olaechea" . "pirata@gmail.com") (:keywords "password" "productivity") (:url . "http://github.com/PuercoPop/password-vault"))]) (paste-of-code . [(20170709 2355) ((emacs (24 3)) (request (0 2 0))) "paste code on https://paste.ofcode.org" tar ((:commit . "92d258e8ec98598d847ecab82903f9224c7c2050") (:authors ("Bernhard Specht" . "bernhard@specht.net")) (:maintainers ("Bernhard Specht" . "bernhard@specht.net")) (:maintainer "Bernhard Specht" . "bernhard@specht.net") (:keywords "lisp"))]) @@ -3986,13 +4090,13 @@ (pcmpl-homebrew . [(20200911 742) nil "pcomplete for homebrew" tar ((:commit . "a2044042dd498abad1dc06162a8ee0d70314ca40") (:authors ("zwild" . "judezhao@outlook.com")) (:maintainers ("zwild" . "judezhao@outlook.com")) (:maintainer "zwild" . "judezhao@outlook.com") (:keywords "pcomplete" "homebrew" "tools" "cask" "services"))]) (pcmpl-pip . [(20181229 1420) ((s (1 12 0)) (f (0 19 0)) (seq (2 15))) "pcomplete for pip" tar ((:commit . "ebb672d4494f876f611639e65df4e28e566c06b5") (:authors ("zwild" . "judezhao@outlook.com")) (:maintainers ("zwild" . "judezhao@outlook.com")) (:maintainer "zwild" . "judezhao@outlook.com") (:keywords "pcomplete" "pip" "python" "tools"))]) (pcomplete-extension . [(20190928 519) ((emacs (24)) (cl-lib (0 5))) "additional completion for pcomplete" tar ((:commit . "bc5eb204fee659e0980056009409b44bc7655716") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainers ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://github.com/thierryvolpiatto/pcomplete-extension"))]) - (pcre2el . [(20230828 1544) ((emacs (25 1))) "regexp syntax converter" tar ((:commit . "018531ba0cf8e2b28d1108136a0e031b6a45f1c1") (:authors ("joddie ")) (:maintainers ("joddie ")) (:maintainer "joddie ") (:url . "https://github.com/joddie/pcre2el"))]) - (pcsv . [(20230207 757) ((emacs (24 1))) "Parser of csv" tar ((:commit . "4b5e801d213a460a6cb3cb2997a0a6cd33c7bc58") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "data") (:url . "https://github.com/mhayashi1120/Emacs-pcsv"))]) + (pcre2el . [(20240220 1530) ((emacs (25 1))) "regexp syntax converter" tar ((:commit . "380723b2701cceb75c266440fb8db918f3340d50") (:authors ("joddie ")) (:maintainers ("joddie ")) (:maintainer "joddie ") (:url . "https://github.com/joddie/pcre2el"))]) + (pcsv . [(20240112 1431) ((emacs (25 1))) "Parser of csv" tar ((:commit . "aa421d12c0da0adb9bc74a050a591dcbabf934ae") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "data") (:url . "https://github.com/mhayashi1120/Emacs-pcsv"))]) (pd-remote . [(20230314 428) ((emacs (24 3)) (faust-mode (0 6)) (lua-mode (20210802))) "Pd remote control helper" tar ((:commit . "dcd68097d2b7468303517d91cb76682bfb47db63") (:authors ("Albert Graef" . "aggraef@gmail.com")) (:maintainers ("Albert Graef" . "aggraef@gmail.com")) (:maintainer "Albert Graef" . "aggraef@gmail.com") (:keywords "multimedia" "pure-data") (:url . "https://github.com/agraef/pd-remote"))]) (pdb-capf . [(20200419 1237) ((emacs (25 1))) "Completion-at-point function for python debugger" tar ((:commit . "2f4099aa1330f87df4e9cd526de057ee9b71de6c") (:authors ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainers ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainer "Andrii Kolomoiets" . "andreyk.mad@gmail.com") (:keywords "languages" "abbrev" "convenience") (:url . "https://github.com/muffinmad/emacs-pdb-capf"))]) (pdb-mode . [(20150128 1751) nil "Major mode for editing Protein Data Bank files" tar ((:commit . "855fb18ebb73b5df30c8d7677c2bcd0f361b138a") (:authors (nil . "charles.bond@uwa.edu.au")) (:maintainers (nil . "aix.bing@gmail.com")) (:maintainer nil . "aix.bing@gmail.com") (:keywords "data" "pdb") (:url . "http://bondxray.org/software/pdb-mode/"))]) - (pdf-tools . [(20230611 239) ((emacs (26 3)) (tablist (1 0)) (let-alist (1 0 4))) "Support library for PDF documents" tar ((:commit . "c69e7656a4678fe25afbd29f3503dd19ee7f9896") (:authors ("Andreas Politz" . "mail@andreas-politz.de")) (:maintainers ("Vedang Manerikar" . "vedang.manerikar@gmail.com")) (:maintainer "Vedang Manerikar" . "vedang.manerikar@gmail.com") (:keywords "files" "multimedia") (:url . "http://github.com/vedang/pdf-tools/"))]) - (pdf-view-pagemark . [(20230825 1247) ((pdf-tools (0 90)) (posframe (1 4 2)) (emacs (26 0))) "Add indicator in pdfview mode to show the page remaining" tar ((:commit . "eadbc335aa57627c6075b23922cfcafb56ca59b0") (:authors ("Kimi Ma" . "kimi.im@outlook.com")) (:maintainers ("Kimi Ma" . "kimi.im@outlook.com")) (:maintainer "Kimi Ma" . "kimi.im@outlook.com") (:keywords "multimedia" "convenience") (:url . "https://github.com/kimim/pdf-view-pagemark"))]) + (pdf-tools . [(20240317 848) ((emacs (26 3)) (tablist (1 0)) (let-alist (1 0 4))) "Support library for PDF documents" tar ((:commit . "93e74924517d39483b432d6c3c9b8f8b8f0eb50c") (:authors ("Andreas Politz" . "mail@andreas-politz.de")) (:maintainers ("Vedang Manerikar" . "vedang.manerikar@gmail.com")) (:maintainer "Vedang Manerikar" . "vedang.manerikar@gmail.com") (:keywords "files" "multimedia") (:url . "http://github.com/vedang/pdf-tools/"))]) + (pdf-view-pagemark . [(20230901 2245) ((pdf-tools (0 90)) (posframe (1 4 2)) (emacs (26 0))) "Add indicator in pdfview mode to show the page remaining" tar ((:commit . "5a044bead5855c5fd46a691fee01dc931c959cab") (:authors ("Kimi Ma" . "kimi.im@outlook.com")) (:maintainers ("Kimi Ma" . "kimi.im@outlook.com")) (:maintainer "Kimi Ma" . "kimi.im@outlook.com") (:keywords "multimedia" "convenience") (:url . "https://github.com/kimim/pdf-view-pagemark"))]) (pdf-view-restore . [(20190904 1708) ((pdf-tools (0 90)) (emacs (26 0))) "Support for opening last known pdf position in pdfview mode" tar ((:commit . "5a1947c01a3edecc9e0fe7629041a2f53e0610c9") (:authors ("Kevin Kim" . "kevinkim1991@gmail.com")) (:maintainers ("Kevin Kim" . "kevinkim1991@gmail.com")) (:maintainer "Kevin Kim" . "kevinkim1991@gmail.com") (:keywords "files" "convenience") (:url . "https://github.com/007kevin/pdf-view-restore"))]) (pdfgrep . [(20210203 1730) ((emacs (24 4))) "run `pdfgrep' and display the results." tar ((:commit . "a4ca0a1e6521de93f28bb6736a5344b4974d144c") (:authors ("Jérémy Compostella" . "jeremy.compostella@gmail.com")) (:maintainers ("Jérémy Compostella" . "jeremy.compostella@gmail.com")) (:maintainer "Jérémy Compostella" . "jeremy.compostella@gmail.com") (:keywords "extensions" "mail" "pdf" "grep") (:url . "https://github.com/jeremy-compostella/pdfgrep"))]) (peacock-theme . [(20170808 1320) ((emacs (24 0))) "an Emacs 24 theme based on Peacock (tmTheme)" tar ((:commit . "9e46fbfb562b6e26c6e3d6d618b044b3694da4c8") (:authors ("Jason Milkins")) (:maintainers ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/tmtheme-to-deftheme"))]) @@ -4001,9 +4105,9 @@ (peep-dired . [(20160321 2237) nil "Peep at files in another window from dired buffers" tar ((:commit . "12d7e52cd5ae29fd828db0bf1fbf648020077145") (:authors ("Adam Sokolnicki" . "adam.sokolnicki@gmail.com")) (:maintainers ("Adam Sokolnicki" . "adam.sokolnicki@gmail.com")) (:maintainer "Adam Sokolnicki" . "adam.sokolnicki@gmail.com") (:keywords "files" "convenience"))]) (peertube . [(20210101 1007) ((emacs (25 1)) (transmission (0 12 1))) "Query and download PeerTube videos" tar ((:commit . "bb529db154596e86327829edbd7144b67cf72255") (:authors ("yoctocell" . "public@yoctocell.xyz")) (:maintainers ("yoctocell" . "public@yoctocell.xyz")) (:maintainer "yoctocell" . "public@yoctocell.xyz") (:keywords "peertube" "multimedia") (:url . "https://git.sr.ht/~yoctocell/peertube"))]) (pelican-mode . [(20190124 2336) ((emacs (25))) "Minor mode for editing Pelican sites" tar ((:commit . "a69934885c7a3b303049e2418333b3915b8f8fb8") (:authors ("Joe Wreschnig" . "joe.wreschnig@gmail.com")) (:maintainers ("Joe Wreschnig" . "joe.wreschnig@gmail.com")) (:maintainer "Joe Wreschnig" . "joe.wreschnig@gmail.com") (:keywords "convenience" "editing") (:url . "https://git.korewanetadesu.com/pelican-mode.git"))]) - (pepita . [(20200228 2257) ((emacs (25)) (csv (2 1))) "Run Splunk search commands, export results to CSV/HTML/JSON" tar ((:commit . "263d6d940d7e4203bbecda46dbaa89b7af1db54f") (:authors ("Sebastian Monia" . "smonia@outlook.com")) (:maintainers ("Sebastian Monia" . "smonia@outlook.com")) (:maintainer "Sebastian Monia" . "smonia@outlook.com") (:keywords "tools" "convenience" "matching") (:url . "https://github.com/sebasmonia/pepita.git"))]) + (pepita . [(20240102 401) ((emacs (25)) (csv (2 1))) "Run Splunk search commands, export results to CSV/HTML/JSON" tar ((:commit . "02ac00ad23b9a3e19797fc76ac569c2d46da54b9") (:authors ("Sebastian Monia" . "smonia@outlook.com")) (:maintainers ("Sebastian Monia" . "smonia@outlook.com")) (:maintainer "Sebastian Monia" . "smonia@outlook.com") (:keywords "tools" "convenience" "matching") (:url . "https://github.com/sebasmonia/pepita.git"))]) (per-buffer-theme . [(20221002 2219) ((emacs (25 1))) "Change theme and font according to buffer name or major mode." tar ((:commit . "2cbb15c05edff4ce23ce61858cf16e8953cd58b3") (:authors ("Iñigo Serna" . "inigoserna@gmx.com")) (:maintainers ("Iñigo Serna" . "inigoserna@gmx.com")) (:maintainer "Iñigo Serna" . "inigoserna@gmx.com") (:keywords "themes") (:url . "https://hg.serna.eu/emacs/per-buffer-theme"))]) - (perfect-margin . [(20220426 1701) ((emacs (24 0)) (cl-lib (0 5))) "auto center windows, work with minimap and/or linum-mode" tar ((:commit . "e811665951cd48819a63e477e7206c43232a78bd") (:authors ("Randall Wang" . "randall.wjz@gmail.com")) (:maintainers ("Randall Wang" . "randall.wjz@gmail.com")) (:maintainer "Randall Wang" . "randall.wjz@gmail.com") (:keywords "convenience" "frames") (:url . "https://github.com/mpwang/perfect-margin"))]) + (perfect-margin . [(20240111 1158) ((emacs (25 1))) "Auto center windows, works with line numbers" tar ((:commit . "bd15823219c93261536966b4dc65c1ae45a404cf") (:authors ("Randall Wang" . "randall.wjz@gmail.com")) (:maintainers ("Randall Wang" . "randall.wjz@gmail.com")) (:maintainer "Randall Wang" . "randall.wjz@gmail.com") (:keywords "convenience" "frames") (:url . "https://github.com/mpwang/perfect-margin"))]) (perject . [(20230605 841) ((emacs (27 1)) (dash (2 10)) (transient (0 3 7))) "Session-persistent project management" tar ((:commit . "6357ab199c717191e7695a3e3c2545918b97a942") (:authors ("overideal")) (:maintainers ("overideal")) (:maintainer "overideal") (:url . "https://github.com/overideal/perject"))]) (perlbrew . [(20230823 1652) nil "A perlbrew wrapper for Emacs" tar ((:commit . "527b7f6a6a5edd2b779ae98029e60994391c0903") (:authors ("Kentaro Kuribayashi" . "kentarok@gmail.com")) (:maintainers ("Kentaro Kuribayashi" . "kentarok@gmail.com")) (:maintainer "Kentaro Kuribayashi" . "kentarok@gmail.com") (:keywords "emacs" "perl"))]) (persist-state . [(20230728 714) ((emacs (28 2))) "Regularly persist bookmarks, history, recent files and more" tar ((:commit . "0b0dd8dca90414db3395860c2bf32a4c736acfb4") (:authors ("Bram Schoenmakers" . "me@bramschoenmakers.nl")) (:maintainers ("Bram Schoenmakers" . "me@bramschoenmakers.nl")) (:maintainer "Bram Schoenmakers" . "me@bramschoenmakers.nl") (:keywords "convenience") (:url . "https://codeberg.org/bram85/emacs-persist-state.git"))]) @@ -4011,17 +4115,18 @@ (persistent-scratch . [(20230225 1439) ((emacs (24))) "Preserve the scratch buffer across Emacs sessions" tar ((:commit . "5ff41262f158d3eb966826314516f23e0cb86c04") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainers ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com") (:url . "https://github.com/Fanael/persistent-scratch"))]) (persistent-soft . [(20150223 1853) ((pcache (0 3 1)) (list-utils (0 4 2))) "Persistent storage, returning nil on failure" tar ((:commit . "a1e0ddf2a12a6f18cab565dee250f070384cbe02") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "data" "extensions") (:url . "http://github.com/rolandwalker/persistent-soft"))]) (persp-fr . [(20191108 754) ((emacs (25 1)) (persp-mode (2 9 6)) (dash (2 13 0))) "In persp-mode, show perspective list in the GUI window title" tar ((:commit . "1adbb6a9f9a4db580a9b7ed8b4091738e01345e6") (:authors ("Francesc Rocher" . "francesc.rocher@gmail.com")) (:maintainers ("Francesc Rocher" . "francesc.rocher@gmail.com")) (:maintainer "Francesc Rocher" . "francesc.rocher@gmail.com") (:keywords "perspectives" "workspace" "windows" "convenience") (:url . "http://github.com/rocher/persp-fr"))]) - (persp-mode . [(20230110 1045) ((emacs (24 3))) "windows/buffers sets shared among frames + save/load." tar ((:commit . "df95ea710e2a72f7a88293b72137acb0ca024d90") (:authors ("Constantin Kulikov (Bad_ptr)" . "zxnotdead@gmail.com")) (:maintainers ("Constantin Kulikov (Bad_ptr)" . "zxnotdead@gmail.com")) (:maintainer "Constantin Kulikov (Bad_ptr)" . "zxnotdead@gmail.com") (:keywords "perspectives" "session" "workspace" "persistence" "windows" "buffers" "convenience") (:url . "https://github.com/Bad-ptr/persp-mode.el"))]) + (persp-mode . [(20231010 1804) ((emacs (24 3))) "windows/buffers sets shared among frames + save/load." tar ((:commit . "345baaa520ab2d62205f85cc5f29d57d6063c141") (:authors ("Constantin Kulikov (Bad_ptr)" . "zxnotdead@gmail.com")) (:maintainers ("Constantin Kulikov (Bad_ptr)" . "zxnotdead@gmail.com")) (:maintainer "Constantin Kulikov (Bad_ptr)" . "zxnotdead@gmail.com") (:keywords "perspectives" "session" "workspace" "persistence" "windows" "buffers" "convenience") (:url . "https://github.com/Bad-ptr/persp-mode.el"))]) (persp-mode-project-bridge . [(20220115 602) ((emacs (27 1)) (persp-mode (2 9))) "Integration of persp-mode + project.el" tar ((:commit . "cacc22942ca5dffdfc3d16cf88576ce0bd9e3a68") (:authors ("Constantin Kulikov (Bad_ptr)" . "zxnotdead@gmail.com") ("Siavash Askari Nasr" . "siavash.askari.nasr@gmail.com")) (:maintainers ("Siavash Askari Nasr" . "siavash.askari.nasr@gmail.com")) (:maintainer "Siavash Askari Nasr" . "siavash.askari.nasr@gmail.com") (:keywords "vc" "persp-mode" "perspective" "project" "project.el") (:url . "https://github.com/CIAvash/persp-mode-project-bridge"))]) (persp-mode-projectile-bridge . [(20170315 1120) ((persp-mode (2 9)) (projectile (0 13 0)) (cl-lib (0 5))) "persp-mode + projectile integration." tar ((:commit . "f6453cd7b8b4352c06e771706f2c5b7e2cdff1ce") (:authors ("Constantin Kulikov (Bad_ptr)" . "zxnotdead@gmail.com")) (:maintainers ("Constantin Kulikov (Bad_ptr)" . "zxnotdead@gmail.com")) (:maintainer "Constantin Kulikov (Bad_ptr)" . "zxnotdead@gmail.com") (:keywords "persp-mode" "projectile") (:url . "https://github.com/Bad-ptr/persp-mode-projectile-bridge.el"))]) (persp-projectile . [(20210618 708) ((perspective (1 9)) (projectile (2 4)) (cl-lib (0 3))) "Perspective integration with Projectile" tar ((:commit . "6e4c2e017d59d10d627cf95b2bb9f9fa2b22a3a3") (:authors ("Daniel Wu")) (:maintainers ("Daniel Wu")) (:maintainer "Daniel Wu") (:keywords "project" "convenience"))]) - (perspective . [(20220921 346) ((emacs (24 4)) (cl-lib (0 5))) "switch between named \"perspectives\" of the editor" tar ((:commit . "8a69512639ae915c32c5055d1308ebf4b278266c") (:authors ("Natalie Weizenbaum" . "nex342@gmail.com")) (:maintainers ("Natalie Weizenbaum" . "nex342@gmail.com")) (:maintainer "Natalie Weizenbaum" . "nex342@gmail.com") (:keywords "workspace" "convenience" "frames") (:url . "http://github.com/nex3/perspective-el"))]) - (perspective-exwm . [(20230218 1358) ((emacs (27 1)) (burly (0 2 -1)) (exwm (0 26)) (perspective (2 17))) "Better integration for perspective.el and EXWM" tar ((:commit . "01d51f5c92a30b65e8346582ed1ce6513570bb0a") (:authors ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainers ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainer "Korytov Pavel" . "thexcloud@gmail.com") (:url . "https://github.com/SqrtMinusOne/perspective-exwm.el"))]) + (perspective . [(20240218 437) ((emacs (24 4)) (cl-lib (0 5))) "switch between named \"perspectives\" of the editor" tar ((:commit . "460311b6e76f33de947908da74b6cbf66118d487") (:authors ("Natalie Weizenbaum" . "nex342@gmail.com")) (:maintainers ("Natalie Weizenbaum" . "nex342@gmail.com")) (:maintainer "Natalie Weizenbaum" . "nex342@gmail.com") (:keywords "workspace" "convenience" "frames") (:url . "http://github.com/nex3/perspective-el"))]) + (perspective-exwm . [(20231225 2313) ((emacs (27 1)) (burly (0 2 -1)) (exwm (0 26)) (perspective (2 17))) "Better integration for perspective.el and EXWM" tar ((:commit . "68fb0ca2d482e0f4a92c4ceb19bf2262ea937e95") (:authors ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainers ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainer "Korytov Pavel" . "thexcloud@gmail.com") (:url . "https://github.com/SqrtMinusOne/perspective-exwm.el"))]) + (perspective-project-bridge . [(20231024 1737) ((emacs (27 1)) (perspective (2 18))) "Integration of perspective.el + project.el" tar ((:commit . "7b65b08a0151b8279fc3ae75f0016cb8d5eadb53") (:authors ("Arunkumar Vaidyanathan" . "arunkumarmv1997@gmail.com")) (:maintainers ("Arunkumar Vaidyanathan" . "arunkumarmv1997@gmail.com")) (:maintainer "Arunkumar Vaidyanathan" . "arunkumarmv1997@gmail.com") (:keywords "perspective" "project" "convenience" "frames") (:url . "https://github.com/arunkmv/perspective-project-bridge"))]) (perspeen . [(20171203 1021) ((emacs (25 0)) (powerline (2 4))) "An package for multi-workspace" tar ((:commit . "edb70c530bda50ff3d1756e32a703d5fef5e5480") (:authors ("Peng Li" . "seudut@gmail.com")) (:maintainers ("Peng Li" . "seudut@gmail.com")) (:maintainer "Peng Li" . "seudut@gmail.com") (:keywords "lisp") (:url . "https://github.com/seudut/perspeen"))]) (pest-mode . [(20221231 15) ((emacs (26 3))) "Major mode for editing Pest files" tar ((:commit . "8023a92ce59c34dcd1587cbd85ed144f206ddb89") (:authors ("ksqsf" . "i@ksqsf.moe")) (:maintainers ("ksqsf" . "i@ksqsf.moe")) (:maintainer "ksqsf" . "i@ksqsf.moe") (:keywords "languages") (:url . "https://github.com/ksqsf/pest-mode"))]) - (pet . [(20230824 1919) ((emacs (26 1)) (f (0 6 0))) "Executable and virtualenv tracker for python-mode" tar ((:commit . "eb0c01380f1930825844027d9af6f4a263238a89") (:authors ("Jimmy Yuen Ho Wong" . "wyuenho@gmail.com")) (:maintainers ("Jimmy Yuen Ho Wong" . "wyuenho@gmail.com")) (:maintainer "Jimmy Yuen Ho Wong" . "wyuenho@gmail.com") (:keywords "tools") (:url . "https://github.com/wyuenho/emacs-pet/"))]) + (pet . [(20230906 46) ((emacs (26 1)) (f (0 6 0)) (map (3 3 1)) (seq (2 24))) "Executable and virtualenv tracker for python-mode" tar ((:commit . "acd54c5b0171a82f88988b4fe2e6db112df5bf9a") (:authors ("Jimmy Yuen Ho Wong" . "wyuenho@gmail.com")) (:maintainers ("Jimmy Yuen Ho Wong" . "wyuenho@gmail.com")) (:maintainer "Jimmy Yuen Ho Wong" . "wyuenho@gmail.com") (:keywords "tools") (:url . "https://github.com/wyuenho/emacs-pet/"))]) (pfuture . [(20220913 1401) ((emacs (25 2))) "a simple wrapper around asynchronous processes" tar ((:commit . "19b53aebbc0f2da31de6326c495038901bffb73c") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainers ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/pfuture"))]) - (pg . [(20230820 1414) ((emacs (26 1))) "Emacs Lisp socket-level interface to the PostgreSQL RDBMS" tar ((:commit . "e6b71c4c2315e186c53796ffdbc6533d5bcd40c5") (:authors ("Eric Marsden" . "eric.marsden@risk-engineering.org")) (:maintainers ("Eric Marsden" . "eric.marsden@risk-engineering.org")) (:maintainer "Eric Marsden" . "eric.marsden@risk-engineering.org") (:keywords "data" "comm" "database" "postgresql") (:url . "https://github.com/emarsden/pg-el"))]) + (pg . [(20240314 1247) ((emacs (28 1))) "Emacs Lisp socket-level interface to the PostgreSQL RDBMS" tar ((:commit . "686dbe8cc7a94c65faf933695093645e53aa3318") (:authors ("Eric Marsden" . "eric.marsden@risk-engineering.org")) (:maintainers ("Eric Marsden" . "eric.marsden@risk-engineering.org")) (:maintainer "Eric Marsden" . "eric.marsden@risk-engineering.org") (:keywords "data" "comm" "database" "postgresql") (:url . "https://github.com/emarsden/pg-el"))]) (pgdevenv . [(20150105 2236) nil "Manage your PostgreSQL development envs" tar ((:commit . "7f1d5bc734750aca98cf67a9491cdbd5615fd132") (:authors ("Dimitri Fontaine" . "dim@tapoueh.org")) (:maintainers ("Dimitri Fontaine" . "dim@tapoueh.org")) (:maintainer "Dimitri Fontaine" . "dim@tapoueh.org") (:keywords "emacs" "postgresql" "development" "environment" "shell" "debug" "gdb"))]) (ph . [(20161029 1522) ((emacs (24 3))) "A global minor mode for managing multiple projects." tar ((:commit . "a66e38637d1898b2ec31ee611033ac3f295fd97f") (:authors ("Alexander Gromnitsky" . "alexander.gromnitsky@gmail.com")) (:maintainer "Alexander Gromnitsky" . "alexander.gromnitsky@gmail.com"))]) (phabricator . [(20160510 1425) ((emacs (24 4)) (dash (1 0)) (projectile (0 13 0)) (s (1 10 0)) (f (0 17 2))) "Phabricator/Arcanist helpers for Emacs." tar ((:commit . "d09d6f059aea92d3b11c68664a5e80c901182ab8") (:authors ("Andrew Tulloch")) (:maintainers ("Andrew Tulloch")) (:maintainer "Andrew Tulloch") (:keywords "phabricator" "arcanist" "diffusion") (:url . "https://github.com/ajtulloch/phabricator.el"))]) @@ -4031,7 +4136,7 @@ (phi-rectangle . [(20200911 204) nil "another rectangle-mark command (rewrite of rect-mark)" tar ((:commit . "43ee8aea9998b34a9fdb28d7da2e4f75e4154030") (:authors ("zk_phi")) (:maintainers ("zk_phi")) (:maintainer "zk_phi") (:url . "http://zk-phi.github.io/"))]) (phi-search . [(20200510 906) nil "another incremental search & replace, compatible with \"multiple-cursors\"" tar ((:commit . "c34f5800968922d1f9e7b10092b8705d6640ad18") (:authors ("zk_phi")) (:maintainers ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))]) (phi-search-dired . [(20200816 1542) ((phi-search (2 2 0))) "interactive filtering for dired powered by phi-search" tar ((:commit . "f014a9fb0b6a94af2df0e22f91ef79ce6996afd7") (:authors ("zk_phi")) (:maintainers ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))]) - (phi-search-mc . [(20160324 1503) ((phi-search (2 0 0)) (multiple-cursors (1 2 1))) "multiple-cursors extension for phi-search" tar ((:commit . "7aa671910f766437089aec26c3aa7814222d1356") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainers ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:keywords "search" "cursors") (:url . "https://github.com/knu/phi-search-mc.el"))]) + (phi-search-mc . [(20231213 841) ((phi-search (2 0 0)) (multiple-cursors (1 2 1)) (emacs (25 1))) "multiple-cursors extension for phi-search" tar ((:commit . "8670eb007604555baa7ef017684a46fc97d254dc") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainers ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:keywords "search" "cursors") (:url . "https://github.com/knu/phi-search-mc.el"))]) (phi-search-migemo . [(20170618 921) ((phi-search (2 2 0)) (migemo (1 9 1))) "migemo extension for phi-search" tar ((:commit . "723b584d386639d59298d872ad7a035d3f8008b0") (:authors ("zk_phi")) (:maintainers ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))]) (phoenix-dark-mono-theme . [(20170729 1406) nil "Monochromatic version of the Phoenix theme" tar ((:commit . "a54f515d162148bcb38676980bc2316adb3d7b8b") (:authors ("J Irving" . "j@lollyshouse.ca")) (:maintainers ("J Irving" . "j@lollyshouse.ca")) (:maintainer "J Irving" . "j@lollyshouse.ca") (:url . "http://github.com/j0ni/phoenix-dark-mono"))]) (phoenix-dark-pink-theme . [(20190821 48) nil "Originally a port of the Sublime Text 2 theme" tar ((:commit . "ddd98a45775be105984ec598384e68df3d3e8046") (:authors ("J Irving" . "j@lollyshouse.ca")) (:maintainers ("J Irving" . "j@lollyshouse.ca")) (:maintainer "J Irving" . "j@lollyshouse.ca") (:url . "http://github.com/j0ni/phoenix-dark-pink"))]) @@ -4039,7 +4144,7 @@ (php-boris-minor-mode . [(20140209 1835) ((php-boris (0 0 1)) (highlight (0))) "a minor mode to evaluate PHP code in the Boris repl" tar ((:commit . "8648eba604e4ff82ef6594a2c5ee4cb4825e6235") (:authors ("steckerhalter")) (:maintainers ("steckerhalter")) (:maintainer "steckerhalter") (:keywords "php" "repl" "eval") (:url . "https://github.com/steckerhalter/php-boris-minor-mode"))]) (php-cs-fixer . [(20220516 1008) ((cl-lib (0 5))) "php-cs-fixer wrapper." tar ((:commit . "efe4368d891f1eec6311363cfd6be3e9eadb5e0a") (:authors ("Philippe Ivaldi for OVYA")) (:maintainers ("Philippe Ivaldi for OVYA")) (:maintainer "Philippe Ivaldi for OVYA") (:keywords "languages" "php") (:url . "https://github.com/OVYA/php-cs-fixer"))]) (php-eldoc . [(20140202 1941) nil "eldoc backend for php" tar ((:commit . "df05064146b884d9081e10657e32dc480f070cfe") (:authors ("sabof")) (:maintainers ("sabof")) (:maintainer "sabof") (:url . "https://github.com/sabof/php-eldoc"))]) - (php-mode . [(20230815 1051) ((emacs (26 1))) "Major mode for editing PHP code" tar ((:commit . "c421658d7049a2b1dfe04e75c1e8a9e4a9e5e21e") (:authors ("Eric James Michael Ritz")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "languages" "php") (:url . "https://github.com/emacs-php/php-mode"))]) + (php-mode . [(20240118 1458) ((emacs (26 1))) "Major mode for editing PHP code" tar ((:commit . "f0a14387427244251883889ba616c7f042323f6d") (:authors ("Eric James Michael Ritz")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "languages" "php") (:url . "https://github.com/emacs-php/php-mode"))]) (php-quickhelp . [(20210819 2025) ((emacs (25 1))) "Quickhelp at point for php" tar ((:commit . "d5e11b7a6bad64550521e8822139a33218b8c9bb") (:authors ("Vincenzo Pupillo")) (:maintainers ("Vincenzo Pupillo")) (:maintainer "Vincenzo Pupillo") (:url . "https://github.com/vpxyz/php-quickhelp"))]) (php-refactor-mode . [(20171124 635) nil "Minor mode to quickly and safely perform common refactorings" tar ((:commit . "d06dabd9ca743a04067e02282b69d7b7467fb4b7") (:authors ("Matthew M. Keeler" . "keelerm84@gmail.com")) (:maintainers ("Matthew M. Keeler" . "keelerm84@gmail.com")) (:maintainer "Matthew M. Keeler" . "keelerm84@gmail.com") (:keywords "php" "refactor") (:url . "https://github.com/keelerm84/php-refactor-mode.el"))]) (php-runtime . [(20230404 1713) ((emacs (25 1)) (compat (29))) "Language binding bridge to PHP" tar ((:commit . "ba64f30e716f89f9cf2c3bd44c5d00da69736868") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "processes" "php" "lisp") (:url . "https://github.com/emacs-php/php-runtime.el"))]) @@ -4061,7 +4166,8 @@ (pine-script-mode . [(20210629 1257) ((emacs (24))) "Trading View Pine Script major mode" tar ((:commit . "c04309be9fb73012b4c5c839741b1abcfe0b8aa9") (:authors ("Eric Crosson" . "eric.s.crosson@utexas.edu")) (:maintainers ("Eric Crosson" . "eric.s.crosson@utexas.edu")) (:maintainer "Eric Crosson" . "eric.s.crosson@utexas.edu") (:keywords "extensions") (:url . "https://github.com/ericcrosson/pine-script-mode"))]) (pinot . [(20140211 2026) nil "Emacs interface to pinot-search" tar ((:commit . "67fda555a155b22bb2ce44ba618b4bd6fc5f144a") (:authors ("Takafumi Arakaki ")) (:maintainers ("Takafumi Arakaki ")) (:maintainer "Takafumi Arakaki "))]) (pinyin . [(20220815 1239) ((cl-lib (0 5)) (emacs (24))) "Convert Hanzi to Pinyin (汉字转拼音)" tar ((:commit . "b7a0aad8ff35e50d1c536df4c0e73fc7e9d06700") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainers ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:keywords "extensions") (:url . "https://github.com/xuchunyang/pinyin.el"))]) - (pinyin-search . [(20160515 358) ((pinyinlib (0 1 0))) "Search Chinese by Pinyin" tar ((:commit . "2e877a76851009d41bde66eb33182a03a7f04262") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainers ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com") (:keywords "chinese" "search") (:url . "https://github.com/xuchunyang/pinyin-search.el"))]) + (pinyin-isearch . [(20240224 709) ((emacs (28 1))) "Pinyin mode for isearch" tar ((:commit . "bb956213c6ccd3067d5e3c33d7695bdc5ba58133") (:authors ("Anoncheg1")) (:maintainers ("Anoncheg1")) (:maintainer "Anoncheg1") (:keywords "chinese" "pinyin" "matching" "convenience") (:url . "https://github.com/Anoncheg1/pinyin-isearch"))]) + (pinyin-search . [(20230919 538) ((pinyinlib (0 1 0))) "Search Chinese by Pinyin" tar ((:commit . "3632bb98a5b8c0a396cd0a9d107e323e1ed3b7e7") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainers ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com") (:keywords "chinese" "search") (:url . "https://github.com/xuchunyang/pinyin-search.el"))]) (pinyinlib . [(20200911 1723) nil "Convert first letter of Pinyin to Simplified/Traditional Chinese characters" tar ((:commit . "1772c79b6f319b26b6a394a8dda065be3ea4498d") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainers ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions"))]) (pip-frame . [(20220802 1914) ((emacs (25 1))) "Display and manage a PIP frame" tar ((:commit . "8c396a11f532a1beb594b65e99e594f1e9f1c2c8") (:authors ("Milan Zamazal" . "pdm@zamazal.org")) (:maintainers ("Milan Zamazal" . "pdm@zamazal.org")) (:maintainer "Milan Zamazal" . "pdm@zamazal.org") (:keywords "frames") (:url . "https://git.zamazal.org/pdm/pip-frame"))]) (pip-requirements . [(20181027 1629) ((dash (2 8 0))) "A major mode for editing pip requirements files." tar ((:commit . "216cd1690f80cc965d4ae47b8753fc185f778ff6") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))]) @@ -4095,15 +4201,15 @@ (plur . [(20160504 924) ((emacs (24 4))) "Easily search and replace multiple variants of a word" tar ((:commit . "5bdd3b9a2f0624414bd596e798644713cd1545f0") (:authors ("Chunyang Xu" . "xuchunyang.me@gmail.com")) (:maintainers ("Chunyang Xu" . "xuchunyang.me@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang.me@gmail.com") (:url . "https://github.com/xuchunyang/plur"))]) (pmdm . [(20191101 2346) nil "poor man's desktop-mode alternative." tar ((:commit . "6d2af9f9e88e6c91eb74dafaddb5f009e1de4907") (:authors ("Iñigo Serna" . "inigoserna@gmx.com")) (:maintainers ("Iñigo Serna" . "inigoserna@gmx.com")) (:maintainer "Iñigo Serna" . "inigoserna@gmx.com") (:url . "https://hg.serna.eu/emacs/pmdm"))]) (pnpm-mode . [(20200527 557) ((emacs (24 1))) "Minor mode for working with pnpm projects" tar ((:commit . "ec66ba36ba6e07883b029569c33fd461d28eed75") (:authors ("Rajasegar Chandran" . "rajasegar.c@gmail.com")) (:maintainers ("Rajasegar Chandran" . "rajasegar.c@gmail.com")) (:maintainer "Rajasegar Chandran" . "rajasegar.c@gmail.com") (:keywords "convenience" "project" "javascript" "node" "npm" "pnpm") (:url . "https://github.com/rajasegar/pnpm-mode"))]) - (po-mode . [(20230617 1058) nil "major mode for GNU gettext PO files" tar ((:commit . "d68aa1da2b95a17d7fe400afd414ce3ede09db86") (:keywords "i18n" "gettext"))]) + (po-mode . [(20231006 1425) nil "major mode for GNU gettext PO files" tar ((:commit . "ca125eba813a6b29b5fbe7ea8a2e3d92f225ab8c") (:keywords "i18n" "gettext"))]) (pocket-api . [(20180403 109) ((emacs (24 4)) (request (0 2))) "another pocket api" tar ((:commit . "3eb9430b9db90bc02e736e433eb86389f7655189") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "convenience" "pocket") (:url . "https://github.com/lujun9972/pocket-api.el"))]) (pocket-lib . [(20190720 1957) ((emacs (25 1)) (request (0 2)) (dash (2 13 0)) (kv (0 0 19)) (s (1 12 0))) "Library for accessing getpocket.com API" tar ((:commit . "f794e3e619e1f6cad25bbfd5fe019a7e62820bf4") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "pocket") (:url . "https://github.com/alphapapa/pocket-lib.el"))]) (pocket-mode . [(20171201 1315) ((emacs (24 4)) (pocket-api (0 1))) "Manage your pocket" tar ((:commit . "229de7d35b7e5605797591c46aa8200d7efc363c") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "convenience" "pocket"))]) - (pocket-reader . [(20220630 844) ((emacs (25 1)) (dash (2 13 0)) (kv (0 0 19)) (pocket-lib (0 1)) (s (1 10)) (ov (1 0 6)) (rainbow-identifiers (0 2 2)) (org-web-tools (0 1)) (ht (2 2))) "Client for Pocket reading list" tar ((:commit . "88d1e6019a3408835745e117cb5b83a8e31f11fe") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "pocket") (:url . "https://github.com/alphapapa/pocket-reader.el"))]) + (pocket-reader . [(20230904 539) ((emacs (25 1)) (dash (2 13 0)) (kv (0 0 19)) (peg (1 0 1)) (pocket-lib (0 1)) (s (1 10)) (ov (1 0 6)) (rainbow-identifiers (0 2 2)) (org-web-tools (0 1)) (ht (2 2))) "Client for Pocket reading list" tar ((:commit . "ef6b6892ef13eff3479d79c7f6bc918dd0444e88") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "pocket") (:url . "https://github.com/alphapapa/pocket-reader.el"))]) (podcaster . [(20200607 1054) ((cl-lib (0 5))) "Podcast client" tar ((:commit . "7a21173da0c57e6aa41dbdc33383047386b35eb5") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:url . "https://github.com/lujun9972/podcaster"))]) (poe-lootfilter-mode . [(20190330 1117) ((emacs (24 3))) "Major mode for editing Path of Exile lootfilters" tar ((:commit . "5ef06684cb2b17b090ee1f303c2b789fa71bc106") (:authors ("Jeremiah Dodds" . "jeremiah.dodds@gmail.com")) (:maintainers ("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-theme . [(20200606 2343) ((emacs (24 1))) "A theme for prose" tar ((:commit . "16eb694f0755c04c4db98614d0eca1199fddad70") (:authors ("Kunal Bhalla" . "bhalla.kunal@gmail.com")) (:maintainers ("Kunal Bhalla" . "bhalla.kunal@gmail.com")) (:maintainer "Kunal Bhalla" . "bhalla.kunal@gmail.com") (:keywords "faces" "theme" "prose") (:url . "https://github.com/kunalb/poet/"))]) - (poetry . [(20230304 1540) ((transient (0 2 0)) (pyvenv (1 2)) (emacs (25 1))) "Interface to Poetry" tar ((:commit . "5ca52b221e57bb9dce7c89f62e7b01da1346a273") (:authors ("Gaby Launay" . "gaby.launay@protonmail.com")) (:maintainers ("Gaby Launay" . "gaby.launay@protonmail.com")) (:maintainer "Gaby Launay" . "gaby.launay@protonmail.com") (:keywords "python" "tools") (:url . "https://github.com/galaunay/poetry.el"))]) + (poetry . [(20240103 947) ((transient (0 2 0)) (pyvenv (1 2)) (emacs (25 1))) "Interface to Poetry" tar ((:commit . "ca2cffb0b174e9d814ad95178af84b525dd2b64d") (:authors ("Gaby Launay" . "gaby.launay@protonmail.com")) (:maintainers ("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" tar ((:commit . "4cd0f8c8d1296c5c64f708b6a5835e8520c51b68") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainers ("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" tar ((:commit . "cddcea2c91038710c245819b3cda2dd739726134") (:authors ("Matt Harrison" . "matthewharrison@gmail.com") ("Dmitry Gutov" . "dgutov@yandex.ru")) (:maintainers ("Matt Harrison" . "matthewharrison@gmail.com")) (: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")) (:maintainers ("Ryan Miller" . "ryan@devopsmachine.com")) (:maintainer "Ryan Miller" . "ryan@devopsmachine.com") (:keywords "pokemon" "fun" "mode-line" "mouse") (:url . "https://github.com/RyanMillerC/poke-line/"))]) @@ -4121,29 +4227,28 @@ (polybar-sesman . [(20210901 1336) ((emacs (25 1)) (dash (2 19 1)) (sesman (0 3 0))) "Display active sesman connections in polybar" tar ((:commit . "5b8ff640ada92da98400206ba9a61140093a823f") (:authors ("Mark Dawson" . "markgdawson@gmail.com")) (:maintainers ("Mark Dawson" . "markgdawson@gmail.com")) (:maintainer "Mark Dawson" . "markgdawson@gmail.com") (:keywords "project" "convenience") (:url . "https://github.com/markgdawson/polybar-sesman.el"))]) (polymode . [(20230317 1218) ((emacs (25))) "Extensible framework for multiple major modes" tar ((:commit . "ca060e081a1f849a880732670dc15370ac987b89") (:authors ("Vitalie Spinu")) (:maintainers ("Vitalie Spinu" . "spinuvit@gmail.com")) (:maintainer "Vitalie Spinu" . "spinuvit@gmail.com") (:keywords "languages" "multi-modes" "processes") (:url . "https://github.com/polymode/polymode"))]) (pomidor . [(20220714 1932) ((emacs (24 3)) (alert (1 2)) (dash (2 17 0))) "Simple and cool pomodoro timer" tar ((:commit . "394a52f95587b1d10d0c3bdca503d2cc876db35b") (:authors ("TatriX" . "tatrics@gmail.com")) (:maintainers ("TatriX" . "tatrics@gmail.com")) (:maintainer "TatriX" . "tatrics@gmail.com") (:keywords "tools" "time" "applications" "pomodoro technique") (:url . "https://github.com/TatriX/pomidor"))]) - (pomm . [(20230602 2045) ((emacs (27 1)) (alert (1 2)) (seq (2 22)) (transient (0 3 0))) "Pomodoro and Third Time timers" tar ((:commit . "d05d9cb3339ce7fdaf535065b235a5e9bba681f9") (:authors ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainers ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainer "Korytov Pavel" . "thexcloud@gmail.com") (:url . "https://github.com/SqrtMinusOne/pomm.el"))]) + (pomm . [(20240130 2126) ((emacs (27 1)) (alert (1 2)) (seq (2 22)) (transient (0 3 0))) "Pomodoro and Third Time timers" tar ((:commit . "a95343f643b5674ad7714dc62f8436ba87ad8335") (:authors ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainers ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainer "Korytov Pavel" . "thexcloud@gmail.com") (:url . "https://github.com/SqrtMinusOne/pomm.el"))]) (pomodoro . [(20210225 2018) nil "A timer for the Pomodoro Technique" tar ((:commit . "ed888b24d0b89a5dec6f5278b1064c530c827321") (:authors ("David Kerschner" . "dkerschner@gmail.com")) (:maintainers ("David Kerschner" . "dkerschner@gmail.com")) (:maintainer "David Kerschner" . "dkerschner@gmail.com"))]) (pony-mode . [(20170807 1522) nil "Minor mode for working with Django Projects" tar ((:commit . "760684d30b6c234d1b88c9a4673a808f36f7f341") (:authors ("David Miller" . "david@deadpansincerity.com")) (:maintainer "David Miller" . "david@deadpansincerity.com") (:keywords "python" "django") (:url . "https://github.com/davidmiller/pony-mode"))]) (pony-snippets . [(20200418 354) ((yasnippet (0 8 0))) "Yasnippets for Pony" tar ((:commit . "115a0d5066f89554bee9cb1045bcda5a18ebd441") (:keywords "snippets" "pony") (:url . "https://github.com/seantallen/pony-snippets"))]) (ponylang-mode . [(20211015 331) ((emacs (25 1)) (dash (2 17 0)) (hydra (0 15 0)) (hl-todo (3 1 2)) (yafolding (0 4 1)) (yasnippet (0 14 0)) (company-ctags (0 0 4)) (rainbow-delimiters (2 1 4)) (fill-column-indicator (1 90))) "A major mode for the Pony programming language" tar ((:commit . "1abf04bc8f4f09a6add4b587c7cf5ca23735e7c0") (:keywords "languages" "programming") (:url . "https://github.com/ponylang/ponylang-mode"))]) - (pophint . [(20200420 1429) ((log4e (0 3 3)) (yaxception (0 3))) "Provide navigation using pop-up tips, like Firefox's Vimperator Hint Mode" tar ((:commit . "5e13da4578ae7ba00e6f7bae31eb546d713cc19d") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "popup") (:url . "https://github.com/aki2o/emacs-pophint"))]) + (pophint . [(20240107 1043) ((log4e (0 4 0)) (yaxception (1 0 0))) "Provide navigation using pop-up tips, like Firefox's Vimperator Hint Mode" tar ((:commit . "92854bb12c275980c89c9f6f33eaa36b633db6d7") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "popup") (:url . "https://github.com/aki2o/emacs-pophint"))]) (poporg . [(20170403 751) nil "Pop a comment or string to an empty buffer for text editing" tar ((:commit . "2c58d68c81ecca4140bf179f19ed153ec804b65a") (:authors ("François Pinard" . "pinard@iro.umontreal.ca") ("Joseph Rabinoff" . "rabinoff@post.harvard.edu")) (:maintainers ("Joseph Rabinoff" . "rabinoff@post.harvard.edu")) (:maintainer "Joseph Rabinoff" . "rabinoff@post.harvard.edu") (:keywords "outlines" "tools") (:url . "https://github.com/QBobWatson/poporg"))]) - (popper . [(20230802 238) ((emacs (26 1))) "Summon and dismiss buffers as popups" tar ((:commit . "a93ff38ab648eefa1a8eca393b0a357ff41411a0") (:authors ("Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com")) (:maintainers ("Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com")) (:maintainer "Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com") (:keywords "convenience") (:url . "https://github.com/karthink/popper"))]) - (popup . [(20230819 2306) ((emacs (24 3))) "Visual Popup User Interface" tar ((:commit . "769318d0391e6d9a718e227678234f27f7c13a47") (:authors ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "lisp") (:url . "https://github.com/auto-complete/popup-el"))]) + (popper . [(20230909 56) ((emacs (26 1))) "Summon and dismiss buffers as popups" tar ((:commit . "3804068a5bece44184e044ca0cf1bcaec90f5690") (:authors ("Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com")) (:maintainers ("Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com")) (:maintainer "Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com") (:keywords "convenience") (:url . "https://github.com/karthink/popper"))]) + (popup . [(20240101 830) ((emacs (24 3))) "Visual Popup User Interface" tar ((:commit . "6fa7c440879ade009dd0ea37eccc771ced0ef86d") (:authors ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "lisp") (:url . "https://github.com/auto-complete/popup-el"))]) (popup-complete . [(20141109 308) ((popup (0 5 0))) "completion with popup" tar ((:commit . "e362d4a005b36646ffbaa6be604e9e31bc406ca9") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-popup-complete"))]) (popup-edit-menu . [(20170404 1425) ((emacs (24))) "a popup context edit menu package" tar ((:commit . "925600a6e29183841199e866cf55e566a6a1b002") (:authors ("Debugfan Chin" . "debugfanchin@gmail.com")) (:maintainers ("Debugfan Chin" . "debugfanchin@gmail.com")) (:maintainer "Debugfan Chin" . "debugfanchin@gmail.com") (:keywords "lisp" "pop-up" "context" "edit" "menu"))]) (popup-imenu . [(20210404 1153) ((dash (2 12 1)) (popup (0 5 3)) (flx-ido (0 6 1))) "imenu index popup" tar ((:commit . "b00c4d503cbbaf01c136b1647329e6a6257d012c") (:authors ("Igor Shymko" . "igor.shimko@gmail.com")) (:maintainers ("Igor Shymko" . "igor.shimko@gmail.com")) (:maintainer "Igor Shymko" . "igor.shimko@gmail.com") (:keywords "popup" "imenu") (:url . "https://github.com/ancane/popup-imenu"))]) (popup-kill-ring . [(20131020 1854) ((popup (0 4)) (pos-tip (0 4))) "interactively insert item from kill-ring" tar ((:commit . "dc50b62ae8b7c2675dde96bb410d9bf0e8643f6a") (:authors ("khiker" . "khiker.mail+elisp@gmail.com")) (:maintainers ("khiker" . "khiker.mail+elisp@gmail.com")) (:maintainer "khiker" . "khiker.mail+elisp@gmail.com") (:keywords "popup" "kill-ring" "pos-tip") (:url . "https://github.com/waymondo/popup-kill-ring"))]) - (popup-switcher . [(20210402 1208) ((cl-lib (0 3)) (popup (0 5 3)) (dash (2 10 0))) "switch to other buffers and files via popup." tar ((:commit . "94e01b9ea7970e86ed0f2fbeaa8cd320b60ae821") (:authors ("Kostafey" . "kostafey@gmail.com")) (:maintainers ("Kostafey" . "kostafey@gmail.com")) (:maintainer "Kostafey" . "kostafey@gmail.com") (:keywords "popup" "switch" "buffers" "functions") (:url . "https://github.com/kostafey/popup-switcher"))]) + (popup-switcher . [(20201216 2229) ((cl-lib (0 3)) (popup (0 5 3))) "switch to other buffers and files via popup." tar ((:commit . "166a90c13310b829bd392235bf7cc1e45188faff") (:authors ("Kostafey" . "kostafey@gmail.com")) (:maintainers ("Kostafey" . "kostafey@gmail.com")) (:maintainer "Kostafey" . "kostafey@gmail.com") (:keywords "popup" "switch" "buffers" "functions") (:url . "https://github.com/kostafey/popup-switcher"))]) (popwin . [(20210215 1849) ((emacs (24 3))) "Popup Window Manager" tar ((:commit . "1184368d3610bd0d0ca4a3db4068048c562c2b50") (:authors ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainers ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainer "Tomohiro Matsuyama" . "m2ym.pub@gmail.com") (:keywords "convenience") (:url . "https://github.com/emacsorphanage/popwin"))]) (portage-navi . [(20141208 1355) ((concurrent (0 3 1)) (ctable (0 1 2))) "portage viewer" tar ((:commit . "8016c3e99fe6cef101d479a3d69185796b22ca2f") (:authors ("")) (:maintainers ("")) (:maintainer "") (:keywords "tools" "gentoo") (:url . "https://github.com/kiwanami/emacs-portage-navi"))]) (porthole . [(20200404 1454) ((emacs (26)) (web-server (0 1 2)) (f (0 19 0)) (json-rpc-server (0 1 2))) "RPC Servers in Emacs" tar ((:commit . "9e68b419acf9245208f8094e10041b7f04511473") (:authors ("GitHub user \"Jcaw\"")) (:maintainers ("GitHub user \"Jcaw\"")) (:maintainer "GitHub user \"Jcaw\"") (:keywords "comm" "rpc" "http" "json") (:url . "https://github.com/jcaw/porthole"))]) - (pos-tip . [(20230721 834) nil "Show tooltip at point" tar ((:commit . "90a9babc829b298af36be695009894fc00a97935") (:authors ("S. Irie")) (:maintainers ("S. Irie")) (:maintainer "S. Irie") (:keywords "tooltip"))]) + (pos-tip . [(20240209 837) nil "Show tooltip at point" tar ((:commit . "4889e08cf9077c8589ea6fea4e2ce558614dfcde") (:authors ("S. Irie")) (:maintainers ("S. Irie")) (:maintainer "S. Irie") (:keywords "tooltip"))]) (posframe . [(20230714 227) ((emacs (26 1))) "Pop a posframe (just a frame) at point" tar ((:commit . "017deece88360c7297265680d78a0bb316470716") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainers ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:keywords "convenience" "tooltip") (:url . "https://github.com/tumashu/posframe"))]) - (posix-manual . [(20200301 1103) ((emacs (24))) "POSIX manual page lookup" tar ((:commit . "ebaacd7266ae7a66605317f57b9f42e9cfb2ce1e") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "languages" "util") (:url . "https://github.com/lassik/emacs-posix-manual"))]) + (posix-manual . [(20231215 1604) ((emacs (24))) "POSIX manual page lookup" tar ((:commit . "428b10d011082a57db0ce310fad6cd092267e139") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "languages" "util") (:url . "https://github.com/lassik/emacs-posix-manual"))]) (postcss-sorting . [(20180211 956) ((emacs (24))) "postcss-sorting interface" tar ((:commit . "deb0c935d2904c11a965758a9aee5a0e905f21fc") (:authors ("Peiwen Lu" . "hi@peiwen.lu")) (:maintainers ("Peiwen Lu" . "hi@peiwen.lu")) (:maintainer "Peiwen Lu" . "hi@peiwen.lu") (:url . "https://github.com/P233/postcss-sorting.el"))]) (pov-mode . [(20161115 743) nil "Major mode for editing POV-Ray scene files." tar ((:commit . "9fc1db3aab7c27155674dd1a87ec62606035d074") (:authors ("Peter Boettcher" . "pwb@andrew.cmu.edu")) (:maintainer "Marco Pessotto" . "melmothx@gmail.com") (:keywords "pov" "povray"))]) - (pow . [(20140420 806) ((emacs (24)) (cl-lib (0 5))) "pow (http://pow.cx/) manager for emacs" tar ((:commit . "782532d5d3582fe8fd67014507b20077f3f2d292") (:authors ("yukihiro hara" . "yukihr@gmail.com")) (:maintainers ("yukihiro hara" . "yukihr@gmail.com")) (:maintainer "yukihiro hara" . "yukihr@gmail.com") (:keywords "develop" "web" "pow") (:url . "http://github.com/yukihr/emacs-pow"))]) (power-mode . [(20220817 429) ((emacs (26 1))) "Imbue Emacs with power!" tar ((:commit . "313698d9c7766c17b077a70b31a2d0f52496d767") (:authors ("Eliza Velasquez")) (:maintainers ("Eliza Velasquez")) (:maintainer "Eliza Velasquez") (:keywords "games") (:url . "https://github.com/elizagamedev/power-mode.el"))]) (powerline . [(20221110 1956) ((cl-lib (0 2))) "Rewrite of Powerline" tar ((:commit . "c35c35bdf5ce2d992882c1f06f0f078058870d4a") (:authors ("Donald Ephraim Curtis" . "dcurtis@milkbox.net")) (:maintainers ("Donald Ephraim Curtis" . "dcurtis@milkbox.net")) (:maintainer "Donald Ephraim Curtis" . "dcurtis@milkbox.net") (:keywords "mode-line") (:url . "http://github.com/milkypostman/powerline/"))]) (powerline-evil . [(20190603 340) ((evil (1 0 8)) (powerline (2 3))) "Utilities for better Evil support for Powerline" tar ((:commit . "b77e2cf571e9990734f2b30d826f3a362b559fd1") (:authors ("Chris Johnson" . "chris@christophermjohnson.net")) (:maintainers ("Chris Johnson" . "chris@christophermjohnson.net")) (:maintainer "Chris Johnson" . "chris@christophermjohnson.net") (:keywords "evil" "mode-line" "powerline") (:url . "http://github.com/johnson-christopher/powerline-evil/"))]) @@ -4152,25 +4257,26 @@ (ppcompile . [(20220619 1535) ((emacs (25 1))) "Ping-pong compile projects on remote machines" tar ((:commit . "4c287c9ebc0e78dbbe75195bb5eb3fe82e0bfaff") (:authors ("Guangwang Huang" . "whatacold@gmail.com")) (:maintainers ("Guangwang Huang")) (:maintainer "Guangwang Huang") (:keywords "tools") (:url . "https://github.com/whatacold/ppcompile"))]) (ppd-sr-speedbar . [(20151108 1224) ((sr-speedbar (20140914 2339)) (project-persist-drawer (0 0 4))) "Sr Speedbar adaptor for project-persist-drawer." tar ((:commit . "19d3e924407f40a6bb38c8fe427a159af755adce") (:authors ("Robert Dallas Gray")) (:maintainer "Robert Dallas Gray") (:keywords "projects" "drawer") (:url . "https://github.com/rdallasgrayppd-sr-speedbar"))]) (ppp . [(20220211 1529) ((emacs (25 1))) "Extended pretty printer for Emacs Lisp" tar ((:commit . "d5d854c3006dfd268e62c7f91c2aad6f86a505b5") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "tools") (:url . "https://github.com/conao3/ppp.el"))]) - (pr-review . [(20230723 220) ((emacs (27 1)) (magit-section (3 2)) (magit (3 2)) (markdown-mode (2 5)) (ghub (3 5))) "Review github PR" tar ((:commit . "1296c81681509044865643ed92474a7d31ead9f3") (:authors ("Yikai Zhao" . "yikai@z1k.dev")) (:maintainers ("Yikai Zhao" . "yikai@z1k.dev")) (:maintainer "Yikai Zhao" . "yikai@z1k.dev") (:keywords "tools") (:url . "https://github.com/blahgeek/emacs-pr-review"))]) + (pr-review . [(20240206 414) ((emacs (27 1)) (magit-section (3 2)) (magit (3 2)) (markdown-mode (2 5)) (ghub (3 5))) "Review github PR" tar ((:commit . "5294434883aa61f24ca6d2768a83ca924645a186") (:authors ("Yikai Zhao" . "yikai@z1k.dev")) (:maintainers ("Yikai Zhao" . "yikai@z1k.dev")) (:maintainer "Yikai Zhao" . "yikai@z1k.dev") (:keywords "tools") (:url . "https://github.com/blahgeek/emacs-pr-review"))]) (prassee-theme . [(20180709 1004) ((emacs (24))) "A high contrast color theme for Emacs." tar ((:commit . "81126f69cdbaab836c00ae7a49aaf89d4229fde1") (:authors ("Prassee " . "prassee.sathian@gmail.com")) (:maintainers ("Prassee " . "prassee.sathian@gmail.com")) (:maintainer "Prassee " . "prassee.sathian@gmail.com") (:keywords "dark" "high-contrast" "faces") (:url . "https://github.com/prassee/prassee-emacs-theme"))]) (prefab . [(20220828 2015) ((emacs (27 1)) (f (0 2 0)) (transient (0 3 7))) "Integration for project generation tools like cookiecutter" tar ((:commit . "328c763d67cd53875d729af0bcb89d412455cf60") (:authors ("Laurence Warne")) (:maintainers ("Laurence Warne")) (:maintainer "Laurence Warne") (:url . "https://github.com/laurencewarne/prefab.el"))]) (preproc-font-lock . [(20151107 2018) nil "Highlight C-style preprocessor directives." tar ((:commit . "565fda9f5fdeb0598986174a07e9fb09f7604397") (:authors ("Anders Lindgren")) (:maintainers ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "c" "languages" "faces") (:url . "https://github.com/Lindydancer/preproc-font-lock"))]) - (prescient . [(20230725 2332) ((emacs (25 1))) "Better sorting and filtering" tar ((:commit . "e0cca29d99f704b512c8ba426200482bd5e2889f") (:authors ("Radian LLC" . "contact+prescient@radian.codes")) (:maintainers ("Radian LLC" . "contact+prescient@radian.codes")) (:maintainer "Radian LLC" . "contact+prescient@radian.codes") (:keywords "extensions") (:url . "https://github.com/raxod502/prescient.el"))]) + (prescient . [(20240226 204) ((emacs (25 1))) "Better sorting and filtering" tar ((:commit . "c39bf07c56b427bf41aafd7d20eaef5cf3c312b5") (:authors ("Radian LLC" . "contact+prescient@radian.codes")) (:maintainers ("Radian LLC" . "contact+prescient@radian.codes")) (:maintainer "Radian LLC" . "contact+prescient@radian.codes") (:keywords "extensions") (:url . "https://github.com/raxod502/prescient.el"))]) (preseed-generic-mode . [(20180210 500) nil "Debian preseed file major mode" tar ((:commit . "3aa8806c4a659064baa01751400c53fbaf847f66") (:authors ("Tong Sun" . "suntong@users.sourceforge.net")) (:maintainers ("Tong Sun" . "suntong@users.sourceforge.net")) (:maintainer "Tong Sun" . "suntong@users.sourceforge.net") (:url . "https://github.com/suntong/preseed-generic-mode"))]) (presentation . [(20180427 224) ((emacs (24 4)) (cl-lib (0 5))) "Display large character for presentation" tar ((:commit . "b1948e6d8b37b6df9290d77d181e1b1d58dd33c0") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "environment" "faces" "frames") (:url . "https://github.com/zonuexe/emacs-presentation-mode"))]) - (prettier . [(20230515 2017) ((emacs (26 1)) (iter2 (0 9)) (nvm (0 2)) (editorconfig (0 8))) "Code formatting with Prettier" tar ((:commit . "1d9d789d91651a8773c7a3a688ec0cf3635fa94e") (:authors ("Julian Scheid" . "julians37@gmail.com")) (:maintainers ("Julian Scheid" . "julians37@gmail.com")) (:maintainer "Julian Scheid" . "julians37@gmail.com") (:keywords "convenience" "languages" "files") (:url . "https://github.com/jscheid/prettier.el"))]) + (prettier . [(20231002 1153) ((emacs (26 1)) (iter2 (0 9)) (nvm (0 2)) (editorconfig (0 8))) "Code formatting with Prettier" tar ((:commit . "d6d7a6ac9e8a08ab497d2cf4d7e2317f6b93dfbf") (:authors ("Julian Scheid" . "julians37@gmail.com")) (:maintainers ("Julian Scheid" . "julians37@gmail.com")) (:maintainer "Julian Scheid" . "julians37@gmail.com") (:keywords "convenience" "languages" "files") (:url . "https://github.com/jscheid/prettier.el"))]) (prettier-js . [(20180109 726) nil "Minor mode to format JS code on file save" tar ((:commit . "0e8b95c4e5898a03e85dbc555c37b4f968292aec") (:authors ("James Long and contributors")) (:maintainers ("James Long and contributors")) (:maintainer "James Long and contributors") (:keywords "convenience" "wp" "edit" "js") (:url . "https://github.com/prettier/prettier-emacs"))]) (prettier-rc . [(20220330 145) ((emacs (24 3)) (prettier-js (0 1 0))) "Use local rc rules with prettier" tar ((:commit . "99e40a9783299e41911f6b37156626d53e43809e") (:authors ("Joel Bryan Juliano ")) (:maintainers ("Joel Bryan Juliano ")) (:maintainer "Joel Bryan Juliano ") (:keywords "convenience" "edit" "js" "ts" "rc" "prettierrc" "prettier-rc" "prettier" "prettier-js") (:url . "https://github.com/jjuliano/prettier-rc-emacs"))]) (prettify-greek . [(20160603 908) nil "Greek letters for prettify-symbols" tar ((:commit . "698d07a6ffe85f6fb53f3bfec4f49380c25cfd90") (:keywords "faces") (:url . "https://gitlab.com/fommil/emacs-prettify-greek"))]) - (prettify-math . [(20220101 549) ((emacs (27 1)) (dash (2 19 0)) (s (1 12 0)) (jsonrpc (1 0 9))) "Prettify math formula" tar ((:commit . "5bdb9a8af7593d3a38492a618aedc545278fe8a1") (:authors ("Shaq Xu" . "shaqxu@163.com")) (:maintainers ("Shaq Xu" . "shaqxu@163.com")) (:maintainer "Shaq Xu" . "shaqxu@163.com") (:keywords "math" "asciimath" "tex" "latex" "prettify" "mathjax") (:url . "https://github.com/shaqxu/prettify-math"))]) - (pretty-hydra . [(20230516 2122) ((hydra (0 15 0)) (s (1 12 0)) (dash (2 18 0)) (emacs (24))) "A macro for creating nice-looking hydras" tar ((:commit . "72bdce649245df276a3f49fb57f890c10fbf0a31") (:authors ("Jerry Peng" . "pr2jerry@gmail.com")) (:maintainers ("Jerry Peng" . "pr2jerry@gmail.com")) (:maintainer "Jerry Peng" . "pr2jerry@gmail.com") (:url . "https://github.com/jerrypnz/major-mode-hydra.el"))]) + (prettify-math . [(20231215 204) ((emacs (27 1)) (dash (2 19 0)) (s (1 12 0)) (jsonrpc (1 0 9))) "Prettify math formula" tar ((:commit . "3e659cc446379fb78926db33ac74d296c818b22a") (:authors ("Shaq Tsui" . "shaqtsui@outlook.com")) (:maintainers ("Shaq Tsui" . "shaqtsui@outlook.com")) (:maintainer "Shaq Tsui" . "shaqtsui@outlook.com") (:keywords "math" "asciimath" "tex" "latex" "prettify" "mathjax") (:url . "https://github.com/shaqxu/prettify-math"))]) + (pretty-hydra . [(20231003 2046) ((hydra (0 15 0)) (s (1 12 0)) (dash (2 18 0)) (emacs (24)) (compat (29 1 4 1))) "A macro for creating nice-looking hydras" tar ((:commit . "5181a31631589ffd870f70293aeee00b7b773b58") (:authors ("Jerry Peng" . "pr2jerry@gmail.com")) (:maintainers ("Jerry Peng" . "pr2jerry@gmail.com")) (:maintainer "Jerry Peng" . "pr2jerry@gmail.com") (:url . "https://github.com/jerrypnz/major-mode-hydra.el"))]) (pretty-mode . [(20190615 2045) nil "Redisplay parts of the buffer as pretty Unicode symbols." tar ((:commit . "5154355e90fdd70d3647257280a89eeb725ef084") (:authors ("Arthur Danskin" . "arthurdanskin@gmail.com")) (:maintainers ("Grant Rettke" . "grant@wisdomandwonder.com")) (:maintainer "Grant Rettke" . "grant@wisdomandwonder.com") (:keywords "pretty" "unicode" "symbols") (:url . "https://github.com/akatov/pretty-mode"))]) (pretty-sha-path . [(20141105 1826) nil "Prettify Guix/Nix store paths" tar ((:commit . "beea38bdf34ed27059d6484e1e2a337a27e1f7ce") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainers ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:keywords "faces" "convenience") (:url . "https://gitorious.org/alezost-emacs/pretty-sha-path"))]) (pretty-speedbar . [(20220303 1726) ((emacs (27 1))) "Make speedbar pretty" tar ((:commit . "56dc9f114fcc55843e182cde1fc9d7a14c261c6a") (:authors ("Kristle Chester" . "kcyarn7@gmail.com")) (:maintainers ("Kristle Chester" . "kcyarn7@gmail.com")) (:maintainer "Kristle Chester" . "kcyarn7@gmail.com") (:keywords "file" "tags" "tools") (:url . "https://github.com/kcyarn/pretty-speedbar"))]) (pretty-symbols . [(20140814 959) nil "Draw tokens as Unicode glyphs." tar ((:commit . "ab82b3fba129fae14e4031eb7fd648c1a92d0e71") (:authors ("David Röthlisberger" . "david@rothlis.net")) (:maintainers ("David Röthlisberger" . "david@rothlis.net")) (:maintainer "David Röthlisberger" . "david@rothlis.net") (:keywords "faces") (:url . "http://github.com/drothlis/pretty-symbols"))]) (preview-dvisvgm . [(20211225 635) ((emacs (27 1)) (auctex (13 0 12))) "SVG output for LaTeX preview" tar ((:commit . "630e2f008c4a6c67a01824b7ad6b844977b28f87") (:authors ("Tobias Zawada" . "i@tn-home.de")) (:maintainers ("Tobias Zawada" . "i@tn-home.de")) (:maintainer "Tobias Zawada" . "i@tn-home.de") (:keywords "tex") (:url . "https://github.com/TobiasZawada/preview-dvisvgm"))]) (prism . [(20230524 1130) ((emacs (26 1)) (dash (2 14 1))) "Customizable, depth-based syntax coloring" tar ((:commit . "169b49afa91e69d35b8756df49ed3ca06f418d35") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "faces" "lisp") (:url . "https://github.com/alphapapa/prism.el"))]) + (prisma-ts-mode . [(20231022 1802) ((emacs (29 1))) "Major mode for prisma using tree-sitter" tar ((:commit . "a7029980140ae60612ef876efa17ab81bf4b3add") (:authors ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainers ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainer "Noah Peart" . "noah.v.peart@gmail.com") (:keywords "prisma" "languages" "tree-sitter") (:url . "https://github.com/nverno/prisma-ts-mode"))]) (private . [(20150122 157) ((aes (0 6))) "take care of your private configuration files." tar ((:commit . "f57f1c2f6bfe900bd40b252688df4c6ed6a5f44b") (:authors ("Cheung Mou Wai" . "yeannylam@gmail.com")) (:maintainers ("Cheung Mou Wai" . "yeannylam@gmail.com")) (:maintainer "Cheung Mou Wai" . "yeannylam@gmail.com") (:keywords "private" "configuration" "backup" "recover") (:url . "https://github.com/cheunghy/private"))]) (private-comments-mode . [(20220929 1807) ((emacs (27 1))) "Minor mode for masukomi/private_comments" tar ((:commit . "b32b862e42e1f5cf26b6ca4cebea69b3f4e1aeab") (:keywords "tools") (:url . "https://github.com/masukomi/private-comments-mode"))]) (private-diary . [(20151216 1657) ((emacs (24 0))) "maintain a private diary in Emacs" tar ((:commit . "5b1aeb22f22447fd35e1c107b6db44a7b27b8a42") (:authors ("James P. Ascher" . "jpa4q@virginia.edu")) (:maintainers ("James P. Ascher" . "jpa4q@virginia.edu")) (:maintainer "James P. Ascher" . "jpa4q@virginia.edu") (:keywords "diary" "encryption") (:url . "https://github.com/cacology/private-diary"))]) @@ -4178,23 +4284,23 @@ (proced-narrow . [(20190911 1818) ((seq (2 20)) (emacs (24))) "Live-narrowing of search results for proced." tar ((:commit . "0e2a4dfb072eb0369d0020b429e820ae620d325e") (:authors ("Travis Jeffery" . "tj@travisjeffery.com")) (:maintainers ("Travis Jeffery" . "tj@travisjeffery.com")) (:maintainer "Travis Jeffery" . "tj@travisjeffery.com") (:keywords "processes" "proced") (:url . "https://github.com/travisjeffery/proced-narrow"))]) (processing-mode . [(20171022 2302) nil "Major mode for Processing 2.0" tar ((:commit . "448aba82970c98322629eaf2746e73be6c30c98e") (:authors ("Peter Vasil" . "mail@petervasil.net")) (:maintainers ("Peter Vasil" . "mail@petervasil.net")) (:maintainer "Peter Vasil" . "mail@petervasil.net") (:keywords "languages" "snippets") (:url . "https://github.com/ptrv/processing2-emacs"))]) (processing-snippets . [(20140426 1428) ((yasnippet (0 8 0))) "Snippets for processing-mode" tar ((:commit . "6175b8eef76369c4b1b8608b8df9a37f14b1be5c") (:authors ("Peter Vasil" . "mail@petervasil.net")) (:maintainer "Peter Vasil" . "mail@petervasil.net") (:keywords "snippets") (:url . "https://github.com/ptrv/processing2-emacs"))]) - (prodigy . [(20220523 1728) ((s (1 8 0)) (dash (2 4 0)) (f (0 14 0)) (emacs (27 1))) "Manage external services" tar ((:commit . "a3be00d3b90a77118c2d7d9f5a2f26151091fa07") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainers ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:url . "http://github.com/rejeep/prodigy.el"))]) + (prodigy . [(20230925 1820) ((s (1 8 0)) (dash (2 4 0)) (f (0 14 0)) (emacs (27 1))) "Manage external services" tar ((:commit . "cc68fa9d604a0739a63247237a801b03a184aca6") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainers ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:url . "http://github.com/rejeep/prodigy.el"))]) (professional-theme . [(20150315 1100) nil "Emacs port of Vim's professional theme" tar ((:commit . "0927d1474049a193f9f366bde5eb1887b9ba20ed") (:authors ("Juanjo Alvarez" . "juanjo@juanjoalvarez.net")) (:maintainers ("Juanjo Alvarez" . "juanjo@juanjoalvarez.net")) (:maintainer "Juanjo Alvarez" . "juanjo@juanjoalvarez.net") (:keywords "theme" "light" "professional") (:url . "https://github.com/juanjux/emacs-professional-theme"))]) (prog-face-refine . [(20230710 113) ((emacs (28 0))) "Refine faces for programming modes" tar ((:commit . "c99853ad732784e27300bdb70d4f1aa59c1f6476") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.org/ideasman42/emacs-prog-face-refine"))]) (prog-fill . [(20180607 132) ((emacs (25 1)) (cl-lib (0 6 1))) "Smartly format lines to use vertical space." tar ((:commit . "3fbf7da6dd826e95c9077d659566ee29814a31d8") (:authors ("Matthew Carter" . "m@ahungry.com")) (:maintainers ("Matthew Carter" . "m@ahungry.com")) (:maintainer "Matthew Carter" . "m@ahungry.com") (:keywords "ahungry" "convenience" "c" "formatting" "editing") (:url . "https://github.com/ahungry/prog-fill"))]) (prognth . [(20130920 1759) nil "Extend prog1 to arbitrary index" tar ((:commit . "2f1ca4d34b1fd581163e1df122c85418137e8e62") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com") (:keywords "lisp"))]) (programmer-dvorak . [(20150427 137) nil "Input method for Programmer Dvorak." tar ((:commit . "c35d5e3b8b53c1e9341957b5d5db40387ba0c8ee") (:authors ("Chenyun Yang" . "yangchenyun@gmail.com")) (:maintainers ("Chenyun Yang" . "yangchenyun@gmail.com")) (:maintainer "Chenyun Yang" . "yangchenyun@gmail.com") (:keywords "dvorak" "programmer-dvorak" "input-method") (:url . "https://github.com/yangchenyun/programmer-dvorak"))]) - (project-abbrev . [(20220704 658) ((emacs (25 1))) "Customize abbreviation expansion in the project" tar ((:commit . "3eb8000e7a07f16e6c8323c1b7e7b45777dbb5cd") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "abbrev" "abbreviation" "customizable" "shortcut") (:url . "https://github.com/jcs-elpa/project-abbrev"))]) + (project-abbrev . [(20240101 932) ((emacs (25 1))) "Customize abbreviation expansion in the project" tar ((:commit . "71bceb21c9d9df3ee00c9fbd420fd0c2733941a1") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "abbrev" "abbreviation" "customizable" "shortcut") (:url . "https://github.com/jcs-elpa/project-abbrev"))]) (project-explorer . [(20150504 14) ((cl-lib (0 3)) (es-lib (0 3)) (es-windows (0 1)) (emacs (24))) "A project explorer sidebar" tar ((:commit . "589a09008706f5f4ef91393dc4306eede0d15ca9") (:authors ("sabof")) (:maintainers ("sabof")) (:maintainer "sabof") (:url . "https://github.com/sabof/project-explorer"))]) - (project-mode-line-tag . [(20220720 2110) ((emacs (25 1))) "Display a buffer's project in its mode line" tar ((:commit . "509ac9a01cd344ee9bfa1bfebed6565dd4cfedd7") (:authors ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainers ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainer "Fritz Grabo" . "hello@fritzgrabo.com") (:keywords "convenience") (:url . "https://github.com/fritzgrabo/project-mode-line-tag"))]) + (project-mode-line-tag . [(20231215 807) ((emacs (25 1))) "Display a buffer's project in its mode line" tar ((:commit . "c63f254e006ddf6ad12c7dc15eed0484d57a8cb5") (:authors ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainers ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainer "Fritz Grabo" . "hello@fritzgrabo.com") (:keywords "convenience") (:url . "https://github.com/fritzgrabo/project-mode-line-tag"))]) (project-persist . [(20180906 1302) nil "A minor mode to allow loading and saving of project settings." tar ((:commit . "26d9435bef44da2a1b0892eba822f9f487b98eec") (:authors ("Robert Dallas Gray")) (:maintainer "Robert Dallas Gray") (:keywords "project" "persistence") (:url . "https://github.com/rdallasgray/project-persist"))]) (project-persist-drawer . [(20151108 1222) ((project-persist (0 3))) "Use a project drawer with project-persist." tar ((:commit . "35bbe132a4fab6a0fec15ce6c0fd2fe6a4aa9626") (:authors ("Robert Dallas Gray" . "mail@robertdallasgray.com")) (:maintainer "Robert Dallas Gray" . "mail@robertdallasgray.com") (:keywords "defaults") (:url . "https://github.com/rdallasgray/project-persist-drawer.git"))]) (project-rootfile . [(20220708 1403) ((emacs (27 1))) "Extension of project.el to detect project with root file" tar ((:commit . "9259708307c9da6b06f04f5b34ccd28f1fba5eaa") (:authors ("Taiki Sugawara" . "buzz.taiki@gmail.com")) (:maintainers ("Taiki Sugawara" . "buzz.taiki@gmail.com")) (:maintainer "Taiki Sugawara" . "buzz.taiki@gmail.com") (:url . "https://github.com/buzztaiki/project-rootfile.el"))]) - (project-shells . [(20210625 647) ((emacs (24 3)) (seq (2 19))) "Manage the shell buffers of each project" tar ((:commit . "900369828f1a213c60a2207a71d46bc43fd5405c") (:authors ("\"Huang, Ying\"" . "huang.ying.caritas@gmail.com")) (:maintainers ("\"Huang, Ying\"" . "huang.ying.caritas@gmail.com")) (:maintainer "\"Huang, Ying\"" . "huang.ying.caritas@gmail.com") (:keywords "processes" "terminals") (:url . "https://github.com/hying-caritas/project-shells"))]) - (project-tab-groups . [(20220720 2109) ((emacs (28 1))) "Support a \"one tab group per project\" workflow" tar ((:commit . "2d348279876f3073176048d903f9672f3c933ca5") (:authors ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainers ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainer "Fritz Grabo" . "hello@fritzgrabo.com") (:keywords "convenience") (:url . "https://github.com/fritzgrabo/project-tab-groups"))]) - (project-tasks . [(20230808 314) ((emacs (26 1))) "Efficient task management for your project" tar ((:commit . "36b7b9e3acb3399aec6c8ef89bf389a12fc87600") (:authors ("Giap Tran" . "txgvnn@gmail.com")) (:maintainers ("Giap Tran" . "txgvnn@gmail.com")) (:maintainer "Giap Tran" . "txgvnn@gmail.com") (:keywords "project" "workflow" "tools") (:url . "https://github.com/TxGVNN/project-tasks"))]) + (project-shells . [(20231005 641) ((emacs (24 3)) (seq (2 19))) "Manage the shell buffers of each project" tar ((:commit . "15f70d99b6d5f078f490ceb64b6f13c000b37e24") (:authors ("\"Huang, Ying\"" . "huang.ying.caritas@gmail.com")) (:maintainers ("\"Huang, Ying\"" . "huang.ying.caritas@gmail.com")) (:maintainer "\"Huang, Ying\"" . "huang.ying.caritas@gmail.com") (:keywords "processes" "terminals") (:url . "https://github.com/hying-caritas/project-shells"))]) + (project-tab-groups . [(20231215 755) ((emacs (28 1))) "Support a \"one tab group per project\" workflow" tar ((:commit . "2658405d5f3c539fbd9ccf95297a016a2c91816a") (:authors ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainers ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainer "Fritz Grabo" . "hello@fritzgrabo.com") (:keywords "convenience") (:url . "https://github.com/fritzgrabo/project-tab-groups"))]) + (project-tasks . [(20240310 1404) ((emacs (26 1)) (project (0 6 0))) "Efficient task management for your project" tar ((:commit . "eab59faafc47763a7b9c4116bf8c438406f62705") (:authors ("Giap Tran" . "txgvnn@gmail.com")) (:maintainers ("Giap Tran" . "txgvnn@gmail.com")) (:maintainer "Giap Tran" . "txgvnn@gmail.com") (:keywords "project" "workflow" "tools") (:url . "https://github.com/TxGVNN/project-tasks"))]) (project-treemacs . [(20230529 1207) ((emacs (28 1)) (treemacs (3 1))) "Simple treemacs backend for project.el" tar ((:commit . "36bec1109ba0498c2d1ef29756c841d2e23b063e") (:authors ("Christopher McCloud")) (:maintainers ("Christopher McCloud")) (:maintainer "Christopher McCloud") (:url . "https://github.com/cmccloud/project-treemacs"))]) - (projectile . [(20230713 1023) ((emacs (25 1))) "Manage and navigate projects in Emacs easily" tar ((:commit . "971cd5c4f25ff1f84ab7e8337ffc7f89f67a1b52") (:authors ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev") (:keywords "project" "convenience") (:url . "https://github.com/bbatsov/projectile"))]) + (projectile . [(20240212 1100) ((emacs (25 1))) "Manage and navigate projects in Emacs easily" tar ((:commit . "0163b335a18af0f077a474d4dc6b36e22b5e3274") (:authors ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev") (:keywords "project" "convenience") (:url . "https://github.com/bbatsov/projectile"))]) (projectile-codesearch . [(20180508 1522) ((codesearch (20171122 431)) (projectile (20150405 126))) "Integration of codesearch into projectile" tar ((:commit . "e40efc62e9333db0593bd81b5c78d08b19bfb193") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainers ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:keywords "tools" "development" "search") (:url . "https://github.com/abingham/emacs-codesearch"))]) (projectile-git-autofetch . [(20200820 2028) ((emacs (25 1)) (projectile (0 14 0))) "automatically fetch git repositories" tar ((:commit . "423ed5fa6508c4edc0a837bb585c7e77e99876be") (:authors ("Andreas Müller" . "code@0x7.ch")) (:maintainers ("Andreas Müller" . "code@0x7.ch")) (:maintainer "Andreas Müller" . "code@0x7.ch") (:keywords "tools" "vc") (:url . "https://github.com/andrmuel/projectile-git-autofetch"))]) (projectile-rails . [(20221231 1643) ((emacs (25 1)) (projectile (0 12 0)) (inflections (1 1)) (inf-ruby (2 2 6)) (f (0 13 0)) (rake (0 3 2)) (dash (2 18 1))) "Minor mode for Rails projects based on projectile-mode" tar ((:commit . "701784df7befe17b861f1b53fe9cbc59d0b94b9f") (:authors ("Adam Sokolnicki" . "adam.sokolnicki@gmail.com")) (:maintainers ("Adam Sokolnicki" . "adam.sokolnicki@gmail.com")) (:maintainer "Adam Sokolnicki" . "adam.sokolnicki@gmail.com") (:keywords "rails" "projectile") (:url . "https://github.com/asok/projectile-rails"))]) @@ -4202,9 +4308,10 @@ (projectile-sift . [(20160107 1015) ((sift (0 2 0)) (projectile (0 13 0))) "Run a sift with Projectile" tar ((:commit . "8c3f3d14a351a2394027d72ee0599aa73b9f0d13") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainers ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "sift" "projectile") (:url . "https://github.com/nlamirault/sift.el"))]) (projectile-speedbar . [(20190807 2010) ((projectile (0 11 0)) (sr-speedbar (0))) "projectile integration for speedbar" tar ((:commit . "93320e467ee78772065e599a5dba94889a77db22") (:authors ("Anshul Verma" . "anshul.verma86@gmail.com")) (:maintainers ("Anshul Verma" . "anshul.verma86@gmail.com")) (:maintainer "Anshul Verma" . "anshul.verma86@gmail.com") (:keywords "project" "convenience" "speedbar" "projectile") (:url . "https://github.com/anshulverma/projectile-speedbar"))]) (projectile-trailblazer . [(20170928 1624) ((emacs (24 4)) (projectile (0 12 0)) (inflections (1 1)) (inf-ruby (2 2 6)) (f (0 13 0)) (rake (0 3 2))) "Minor mode for Rails projects using trailblazer" tar ((:commit . "79299498d74876f2ac3fe8075716b39a5bdd04cd") (:authors ("Michael Dahl" . "michael.dahl84@gmail.com")) (:maintainers ("Michael Dahl" . "michael.dahl84@gmail.com")) (:maintainer "Michael Dahl" . "michael.dahl84@gmail.com") (:keywords "rails" "projectile" "trailblazer" "languages") (:url . "https://github.com/micdahl/projectile-trailblazer"))]) - (projectile-variable . [(20170208 1718) ((emacs (24)) (cl-lib (0 5))) "Store project local variables." tar ((:commit . "8d348ac70bdd6dc320c13a12941b32b38140e264") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "project" "convenience") (:url . "https://github.com/zonuexe/projectile-variable"))]) - (projection . [(20230826 1902) ((emacs (29)) (project (0 9 8)) (compat (29 1 4 1)) (f (0 20))) "Project type support for `project'" tar ((:commit . "363d3f79386735ae224c3692d333bc9d2a98f7f3") (:authors ("Mohsin Kaleem" . "mohkale@kisara.moe")) (:maintainers ("Mohsin Kaleem" . "mohkale@kisara.moe")) (:maintainer "Mohsin Kaleem" . "mohkale@kisara.moe") (:keywords "project" "convenience") (:url . "https://github.com/mohkale/projection"))]) - (projection-multi . [(20230826 1801) ((emacs (29)) (projection (0 1)) (compile-multi (0 5))) "Projection integration for `compile-multi'" tar ((:commit . "c7679c5cdb62a14d66195ed87b6466bd56c1e1c9") (:authors ("Mohsin Kaleem" . "mohkale@kisara.moe")) (:maintainers ("Mohsin Kaleem" . "mohkale@kisara.moe")) (:maintainer "Mohsin Kaleem" . "mohkale@kisara.moe") (:keywords "project" "convenience") (:url . "https://github.com/mohkale/projection"))]) + (projectile-variable . [(20230916 441) ((emacs (24)) (cl-lib (0 5))) "Store project local variables." tar ((:commit . "fa6bf595529156ee3b6d08f90ebea3b4ab7c5ef8") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "project" "convenience") (:url . "https://github.com/emacs-php/projectile-variable"))]) + (projection . [(20240317 1257) ((emacs (29 1)) (project (0 9 8)) (compat (29 1 4 1)) (f (0 20)) (s (1 13))) "Project type support for `project'" tar ((:commit . "20548689eead0a86fcc921491047f392fd6b120f") (:authors ("Mohsin Kaleem" . "mohkale@kisara.moe")) (:maintainers ("Mohsin Kaleem" . "mohkale@kisara.moe")) (:maintainer "Mohsin Kaleem" . "mohkale@kisara.moe") (:keywords "project" "convenience") (:url . "https://github.com/mohkale/projection"))]) + (projection-multi . [(20240316 2222) ((emacs (29 1)) (projection (0 1)) (compile-multi (0 5))) "Projection integration for `compile-multi'" tar ((:commit . "dc489480a6e4be82e570266202144730b3ddde5f") (:authors ("Mohsin Kaleem" . "mohkale@kisara.moe")) (:maintainers ("Mohsin Kaleem" . "mohkale@kisara.moe")) (:maintainer "Mohsin Kaleem" . "mohkale@kisara.moe") (:keywords "project" "convenience") (:url . "https://github.com/mohkale/projection"))]) + (projection-multi-embark . [(20231008 937) ((emacs (29 1)) (projection (0 1)) (compile-multi-embark (0 5))) "Integration for `projection-multi' and `embark'" tar ((:commit . "928602ddd3003913cfefe343b5f057bfa360c0fe") (:authors ("Mohsin Kaleem" . "mohkale@kisara.moe")) (:maintainers ("Mohsin Kaleem" . "mohkale@kisara.moe")) (:maintainer "Mohsin Kaleem" . "mohkale@kisara.moe") (:keywords "project" "convenience") (:url . "https://github.com/mohkale/projection"))]) (projector . [(20211112 1514) ((alert (1 1)) (cl-lib (0 5))) "Lightweight library for managing project-aware shell and command buffers" tar ((:commit . "1d0f2d307591ea50888d31dcae7e463e2ada1316") (:authors ("Justin Talbott" . "justin@waymondo.com")) (:maintainers ("Justin Talbott" . "justin@waymondo.com")) (:maintainer "Justin Talbott" . "justin@waymondo.com") (:url . "https://github.com/waymondo/projector.el"))]) (projekt . [(20150324 848) ((emacs (24))) "some kind of staging for CVS" tar ((:commit . "a65e554e5d8b0def08c5d06f3fe34fec40bebd83") (:authors ("Engelke Eschner" . "tekai@gmx.li")) (:maintainers ("Engelke Eschner" . "tekai@gmx.li")) (:maintainer "Engelke Eschner" . "tekai@gmx.li"))]) (projmake-mode . [(20161031 1715) ((dash (20150611 922)) (indicators (20130217 1405))) "Project oriented automatic builder and error highlighter, flymake for projects" tar ((:commit . "a897701f7e8f8cc11459ed44eb0e454db2a460c1"))]) @@ -4213,19 +4320,19 @@ (prompt-text . [(20190408 310) nil "Configure your minibuffer prompt" tar ((:commit . "b842bf13c53d0a2bd2bc7a00d37cc713d69fa9e9") (:authors ("10sr <8slashes+el [at] gmail [dot] com>")) (:maintainers ("10sr <8slashes+el [at] gmail [dot] com>")) (:maintainer "10sr <8slashes+el [at] gmail [dot] com>") (:keywords "utility" "minibuffer") (:url . "https://github.com/10sr/prompt-text-el"))]) (prompts . [(20160916 1041) ((dash (2 13 0))) "utilities for working with text prompts." tar ((:commit . "1cd5e732ff2a86b47836eb7252e5b59cd4b6ab26") (:authors ("Ben Moon" . "guiltydolphin@gmail.com")) (:maintainers ("Ben Moon" . "guiltydolphin@gmail.com")) (:maintainer "Ben Moon" . "guiltydolphin@gmail.com") (:keywords "input" "minibuffer") (:url . "https://github.com/guiltydolphin/prompts.el"))]) (pronto . [(20200218 1633) ((emacs (24))) "Compilation mode for pronto stylechecks" tar ((:commit . "c0cd13d8219879610b7fe284b182a9db4d3d40b3") (:authors ("Julian Rubisch" . "julian@julianrubisch.at")) (:maintainers ("Julian Rubisch" . "julian@julianrubisch.at")) (:maintainer "Julian Rubisch" . "julian@julianrubisch.at") (:keywords "processes" "tools") (:url . "https://github.com/julianrubisch/pronto.el"))]) - (proof-general . [(20230414 931) ((emacs (25 2))) "A generic Emacs interface for proof assistants" tar ((:commit . "dac9b5d32ec1404d35e3dd83070591806f8977b0") (:maintainers (nil . "proof-general-maintainers@groupes.renater.fr")) (:maintainer nil . "proof-general-maintainers@groupes.renater.fr") (:url . "https://proofgeneral.github.io/"))]) + (proof-general . [(20240306 2002) ((emacs (25 2))) "A generic Emacs interface for proof assistants" tar ((:commit . "a6f8243ed2860cc7c9cb051496f1543d981e9f7e") (:maintainers (nil . "proof-general-maintainers@groupes.renater.fr")) (:maintainer nil . "proof-general-maintainers@groupes.renater.fr") (:url . "https://proofgeneral.github.io/"))]) (prop-menu . [(20150728 1118) ((emacs (24 3)) (cl-lib (0 5))) "Create and display a context menu based on text and overlay properties" tar ((:commit . "50b102c1c0935fd3e0c465feed7f27d66b21cdf3") (:authors ("David Christiansen" . "david@davidchristiansen.dk")) (:maintainers ("David Christiansen" . "david@davidchristiansen.dk")) (:maintainer "David Christiansen" . "david@davidchristiansen.dk") (:keywords "convenience") (:url . "https://github.com/david-christiansen/prop-menu-el"))]) (propfont-mixed . [(20150113 2211) ((emacs (24)) (cl-lib (0 5))) "Use proportional fonts with space-based indentation." tar ((:commit . "0b461ef4754a469610dba71874a34b6da42176bf") (:authors ("Kirill Ignatiev ")) (:maintainers ("Kirill Ignatiev ")) (:maintainer "Kirill Ignatiev ") (:keywords "faces") (:url . "https://github.com/ikirill/propfont-mixed"))]) (proportional . [(20221205 1417) ((emacs (25 1))) "use a proportional font everywhere" tar ((:commit . "6b675694292a5dbebb52b6196e8ccee6e3a73042") (:authors ("Johannes Goslar")) (:maintainers ("Johannes Goslar")) (:maintainer "Johannes Goslar") (:keywords "faces") (:url . "https://github.com/ksjogo/proportional"))]) (prosjekt . [(20151127 1416) ((dash (2 8 0))) "a software project tool for emacs" tar ((:commit . "a864a8be5842223043702395f311e3350c28e9db") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainers ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:url . "https://github.com/abingham/prosjekt"))]) - (protobuf-mode . [(20230506 330) nil "major mode for editing protocol buffers." tar ((:commit . "0d3b0c61f4f44c3d8770b89edffe481aaf56f4f1") (:authors ("Alexandre Vassalotti" . "alexandre@peadrop.com")) (:maintainers ("Alexandre Vassalotti" . "alexandre@peadrop.com")) (:maintainer "Alexandre Vassalotti" . "alexandre@peadrop.com") (:keywords "google" "protobuf" "languages"))]) + (protobuf-mode . [(20240222 1652) nil "major mode for editing protocol buffers." tar ((:commit . "b9483e03c7cfa854c250ad6415b4d9e6f7a9709e") (:authors ("Alexandre Vassalotti" . "alexandre@peadrop.com")) (:maintainers ("Alexandre Vassalotti" . "alexandre@peadrop.com")) (:maintainer "Alexandre Vassalotti" . "alexandre@peadrop.com") (:keywords "google" "protobuf" "languages"))]) (protobuf-ts-mode . [(20230728 1747) ((emacs (29))) "Tree sitter support for Protocol Buffers (proto3 only)" tar ((:commit . "65152f5341ea4b3417390b3e60b195975161b8bc") (:authors ("ookami" . "mail@ookami.one")) (:maintainers ("ookami" . "mail@ookami.one")) (:maintainer "ookami" . "mail@ookami.one") (:keywords "protobuf" "languages" "tree-sitter") (:url . "https://git.ookami.one/cgit/protobuf-ts-mode"))]) (protocols . [(20170802 1132) ((cl-lib (0 5))) "Protocol database access functions." tar ((:commit . "d0f7c4acb05465f1a0d4be54363bbd2802647e77") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainers ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:keywords "convenience" "net" "protocols") (:url . "https://github.com/davep/protocols.el"))]) (proxy-mode . [(20230303 706) ((emacs (25))) "A minor mode to toggle proxy." tar ((:commit . "eca6f0b8a17fcf9eb961ed0426f57a5b7ca4e1f6") (:keywords "comm" "proxy") (:url . "https://repo.or.cz/proxy-mode.git"))]) - (psalm . [(20211002 1552) ((emacs (24 3)) (php-mode (1 22 3))) "Interface to Psalm" tar ((:commit . "06434b938485e2540fc97ce6cb017a8a001c1f13") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "tools" "php") (:url . "https://github.com/emacs-php/psalm.el"))]) - (psc-ide . [(20210219 2247) ((emacs (25)) (dash (2 18 0)) (company (0 8 7)) (s (1 10 0)) (flycheck (0 24)) (let-alist (1 0 4)) (seq (1 11))) "Minor mode for PureScript's IDE server." tar ((:commit . "ce97d719458ea099b40c02f05b6609601c727e66") (:authors ("Erik Post" . "erik@shinsetsu.nl") ("Dmitry Bushenko" . "d.bushenko@gmail.com") ("Christoph Hegemann" . "christoph.hegemann1337@gmail.com") ("Brian Sermons")) (:maintainers ("Erik Post" . "erik@shinsetsu.nl")) (:maintainer "Erik Post" . "erik@shinsetsu.nl") (:keywords "languages") (:url . "https://github.com/purescript-emacs/psc-ide-emacs"))]) - (psci . [(20230313 1333) ((emacs (24 4)) (purescript-mode (13 10)) (dash (2 9 0))) "Major mode for purescript repl psci" tar ((:commit . "9bb6a325325480be704130c9c69731631d2cf3a6") (:authors ("Antoine R. Dumont ")) (:maintainers ("Antoine R. Dumont ")) (:maintainer "Antoine R. Dumont ") (:keywords "languages" "purescript" "psci" "repl") (:url . "https://github.com/purescript-emacs/emacs-psci"))]) - (psession . [(20230105 503) ((emacs (24)) (cl-lib (0 5)) (async (1 9 3))) "Persistent save of elisp objects." tar ((:commit . "ca5bed69f803aab71851c46b0118b66f58455b8a") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainers ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://github.com/thierryvolpiatto/psession"))]) + (psalm . [(20230914 1925) ((emacs (27 1)) (php-mode (1 22 3))) "Interface to Psalm" tar ((:commit . "9449c09b8d570705aa74b5aef7651893b482cc66") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "tools" "php") (:url . "https://github.com/emacs-php/psalm.el"))]) + (psc-ide . [(20240113 1224) ((emacs (25)) (dash (2 18 0)) (company (0 8 7)) (s (1 10 0)) (flycheck (0 24)) (let-alist (1 0 4)) (seq (1 11)) (inheritenv (0 2))) "Minor mode for PureScript's IDE server." tar ((:commit . "4e614df553fb315d32ee9dac085109ee7786a3cf") (:authors ("Erik Post" . "erik@shinsetsu.nl") ("Dmitry Bushenko" . "d.bushenko@gmail.com") ("Christoph Hegemann" . "christoph.hegemann1337@gmail.com") ("Brian Sermons")) (:maintainers ("Erik Post" . "erik@shinsetsu.nl")) (:maintainer "Erik Post" . "erik@shinsetsu.nl") (:keywords "languages") (:url . "https://github.com/purescript-emacs/psc-ide-emacs"))]) + (psci . [(20231219 52) ((emacs (25 1)) (purescript-mode (13 10)) (dash (2 9 0)) (inheritenv (0 2))) "Major mode for purescript repl psci" tar ((:commit . "ef31045295f29485fc697892fba53390fe193595") (:authors ("Antoine R. Dumont ")) (:maintainers ("Antoine R. Dumont ")) (:maintainer "Antoine R. Dumont ") (:keywords "languages" "purescript" "psci" "repl") (:url . "https://github.com/purescript-emacs/emacs-psci"))]) + (psession . [(20231117 1648) ((emacs (24)) (cl-lib (0 5)) (async (1 9 3))) "Persistent save of elisp objects." tar ((:commit . "5fdca68ca4bf4fafaf3aa438401ec611bc430782") (:authors ("Thierry Volpiatto" . "thievol@posteo.net")) (:maintainers ("Thierry Volpiatto" . "thievol@posteo.net")) (:maintainer "Thierry Volpiatto" . "thievol@posteo.net") (:url . "https://github.com/thierryvolpiatto/psession"))]) (psysh . [(20230815 730) ((emacs (24 3)) (s (1 9 0)) (php-runtime (0 2))) "PsySH, PHP interactive shell (REPL)" tar ((:commit . "8bf82fa68ca90fc72528ea406f0e57718bcb1cbf") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "processes" "php") (:url . "https://github.com/emacs-php/psysh.el"))]) (pt . [(20161226 1959) nil "A front-end for pt, The Platinum Searcher." tar ((:commit . "6d99b2aaded3ece3db19a20f4b8f1d4abe382622") (:authors ("Bailey Ling")) (:maintainers ("Bailey Ling")) (:maintainer "Bailey Ling") (:keywords "pt" "ack" "ag" "grep" "search") (:url . "https://github.com/bling/pt.el"))]) (ptemplate . [(20210324 1446) ((emacs (25 1)) (yasnippet (0 13 0))) "Project templates" tar ((:commit . "b81cc7be8865745c3a60177a244d2a69729ab21b") (:authors ("Nikita Bloshchanevich" . "nikblos@outlook.com")) (:maintainers ("Nikita Bloshchanevich" . "nikblos@outlook.com")) (:maintainer "Nikita Bloshchanevich" . "nikblos@outlook.com") (:url . "https://github.com/nbfalcon/ptemplate"))]) @@ -4235,9 +4342,10 @@ (pueue . [(20230219 1558) ((emacs (28 1)) (with-editor (3 0 4))) "Interface for pueue" tar ((:commit . "386e43d46cbf68470d040b422061ac2ba1629749") (:authors ("Valeriy Litkovskyy" . "vlr.ltkvsk@protonmail.com")) (:maintainers ("Valeriy Litkovskyy" . "vlr.ltkvsk@protonmail.com")) (:maintainer "Valeriy Litkovskyy" . "vlr.ltkvsk@protonmail.com") (:keywords "processes") (:url . "https://github.com/xFA25E/pueue"))]) (pug-mode . [(20211114 1645) ((emacs (24 4)) (cl-lib (0 5))) "Major mode for jade/pug template files" tar ((:commit . "73f8c2f95eba695f701df20c8436f49abadebdc1") (:authors ("Nathan Weizenbaum")) (:maintainers ("Henrik Lissner" . "contact@henrik.io")) (:maintainer "Henrik Lissner" . "contact@henrik.io") (:keywords "markup" "language" "jade" "pug") (:url . "https://github.com/hlissner/emacs-pug-mode"))]) (pulseaudio-control . [(20230316 1819) nil "Use `pactl' to manage PulseAudio volumes." tar ((:commit . "e917e84661b0e2496b295f1bbfba6ad32a656527") (:authors ("Alexis , Ellington Santos , Sergey Trofimov , conses" . "contact@conses.eu")) (:maintainers ("Alexis" . "flexibeast@gmail.com")) (:maintainer "Alexis" . "flexibeast@gmail.com") (:keywords "multimedia" "hardware" "sound" "pulseaudio") (:url . "https://git.sr.ht/~flexibeast/pulseaudio-control"))]) + (pumpkin-spice-theme . [(20231011 1253) ((emacs (27 1)) (autothemer (0 2))) "Spice up your day with a delightful pumpkin colored theme" tar ((:commit . "8d38276f6b2d16325ca372dd3630653b21e6e7ed") (:authors ("Grant Shangreaux" . "shoshin@cicadas.surf")) (:maintainers ("Grant Shangreaux" . "shoshin@cicadas.surf")) (:maintainer "Grant Shangreaux" . "shoshin@cicadas.surf") (:keywords "faces" "theme" "halloween" "pumpkin") (:url . "https://cicadas.surf/cgit/pumpkin-spice-theme.git"))]) (punctuality-logger . [(20141120 2031) nil "Punctuality logger for Emacs" tar ((:commit . "d76c5d5589a4f8a94cc5537686d9a3b46ea7cc59") (:authors ("Philip Woods" . "elzairthesorcerer@gmail.com")) (:maintainers ("Philip Woods" . "elzairthesorcerer@gmail.com")) (:maintainer "Philip Woods" . "elzairthesorcerer@gmail.com") (:keywords "reminder" "calendar") (:url . "https://gitlab.com/elzair/punctuality-logger"))]) (pungi . [(20150222 1246) ((jedi (0 2 0 -3 2)) (pyvenv (1 5))) "Integrates jedi with virtualenv and buildout python environments" tar ((:commit . "41c9f8b7795e083bfd63ba0d06c789c250998723") (:authors ("Matthew Russell" . "matthew.russell@horizon5.org")) (:maintainers ("Matthew Russell" . "matthew.russell@horizon5.org")) (:maintainer "Matthew Russell" . "matthew.russell@horizon5.org") (:keywords "convenience"))]) - (puni . [(20230214 1156) ((emacs (26 1))) "Parentheses Universalistic" tar ((:commit . "a39a4ecac7279bed1a150a895bbc80baa7272888") (:authors ("Hao Wang" . "amaikinono@gmail.com")) (:maintainers ("Hao Wang" . "amaikinono@gmail.com")) (:maintainer "Hao Wang" . "amaikinono@gmail.com") (:keywords "convenience" "lisp" "tools") (:url . "https://github.com/AmaiKinono/puni"))]) + (puni . [(20231231 1415) ((emacs (26 1))) "Parentheses Universalistic" tar ((:commit . "72e091ef30e0c9299dbcd0bc4669ab9bb8fb6e47") (:authors ("Hao Wang" . "amaikinono@gmail.com")) (:maintainers ("Hao Wang" . "amaikinono@gmail.com")) (:maintainer "Hao Wang" . "amaikinono@gmail.com") (:keywords "convenience" "lisp" "tools") (:url . "https://github.com/AmaiKinono/puni"))]) (punpun-themes . [(20221121 1018) ((emacs (24 1))) "A set of bleak themes" tar ((:commit . "6a7e04de1ad9f7ba9074b7206bffc9241c33349c") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de") (:url . "https://depp.brause.cc/punpun-themes"))]) (puppet-mode . [(20210305 645) ((emacs (24 1)) (pkg-info (0 4))) "Major mode for Puppet manifests" tar ((:commit . "ab25cf379236f4e1bd4bc9c1d77a93c95800e9bf") (:authors ("Vox Pupuli" . "voxpupuli@groups.io") ("Bozhidar Batsov" . "bozhidar@batsov.com") ("Sebastian Wiesner" . "swiesner@lunaryorn.com") ("Russ Allbery" . "rra@stanford.edu")) (:maintainers ("Vox Pupuli" . "voxpupuli@groups.io")) (:maintainer "Vox Pupuli" . "voxpupuli@groups.io") (:keywords "languages") (:url . "https://github.com/voxpupuli/puppet-mode"))]) (purescript-mode . [(20230309 1301) ((emacs (25 1))) "A PureScript editing mode" tar ((:commit . "eacc61aaafe6055b5f278c9843558f220f18b153") (:authors ("1992 Simon Marlow") ("1997-1998 Graeme E Moss" . "gem@cs.york.ac.uk") ("Tommy Thorn" . "thorn@irisa.fr") ("2001-2002 Reuben Thomas (>=v1.4)") ("2003 Dave Love" . "fx@gnu.org") ("2014 Tim Dysinger" . "tim@dysinger.net")) (:maintainer "1992 Simon Marlow") (:keywords "faces" "files" "purescript") (:url . "https://github.com/purescript-emacs/purescript-mode"))]) @@ -4247,7 +4355,7 @@ (pushbullet . [(20140809 1232) ((grapnel (0 5 2)) (json (1 2))) "Emacs client for the PushBullet Android app" tar ((:commit . "73c59a0f1dc04875b3e5a2c8afbc26c32128e445") (:authors ("Abhishek L" . "abhishek.lekshmanan@gmail.com")) (:maintainers ("Abhishek L" . "abhishek.lekshmanan@gmail.com")) (:maintainer "Abhishek L" . "abhishek.lekshmanan@gmail.com") (:keywords "convenience") (:url . "http://www.github.com/theanalyst/revolver"))]) (pushover . [(20170818 2103) ((cl-lib (0 5))) "Pushover API Access" tar ((:commit . "bbe3ac8df3c532a72da4552615af960b8a577588") (:authors ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainers ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainer "Samuel W. Flint" . "swflint@flintfam.org") (:keywords "notifications") (:url . "http://github.com/swflint/pushover.el"))]) (px . [(20170317 2330) nil "preview inline latex in any mode" tar ((:commit . "0c52f7933eab3ca1642ab0df151db9950430c9e2") (:authors ("Aurélien Aptel" . "aurelien.aptel@gmail.com")) (:maintainers ("Aurélien Aptel" . "aurelien.aptel@gmail.com")) (:maintainer "Aurélien Aptel" . "aurelien.aptel@gmail.com") (:url . "http://github.com/aaptel/preview-latex"))]) - (py-autopep8 . [(20230115 633) ((emacs (26 1))) "Use autopep8 to beautify a Python buffer" tar ((:commit . "d0486c22c0a92ad7911714026021fe4ad276b7c9") (:authors ("Friedrich Paetzk" . "f.paetzke@gmail.com")) (:maintainers ("Friedrich Paetzk" . "f.paetzke@gmail.com")) (:maintainer "Friedrich Paetzk" . "f.paetzke@gmail.com") (:keywords "convenience") (:url . "https://codeberg.org/ideasman42/emacs-py-autopep8"))]) + (py-autopep8 . [(20231025 2256) ((emacs (26 1))) "Use autopep8 to beautify a Python buffer" tar ((:commit . "3e3f6c182455bf85284cda7f4ffe639444b84940") (:authors ("Friedrich Paetzk" . "f.paetzke@gmail.com")) (:maintainers ("Friedrich Paetzk" . "f.paetzke@gmail.com")) (:maintainer "Friedrich Paetzk" . "f.paetzke@gmail.com") (:keywords "convenience") (:url . "https://codeberg.org/ideasman42/emacs-py-autopep8"))]) (py-gnitset . [(20170821 1732) nil "Run your Python tests any way you'd like" tar ((:commit . "1e993cc29cbc31e06fe1e335dec198e21972fa55") (:authors ("Brandon W Maister" . "quodlibetor@gmail.com")) (:maintainers ("Brandon W Maister" . "quodlibetor@gmail.com")) (:maintainer "Brandon W Maister" . "quodlibetor@gmail.com") (:url . "https://www.github.com/quodlibetor/py-gnitset"))]) (py-import-check . [(20130802 1111) nil "Finds the unused python imports using importchecker" tar ((:commit . "38ad91e67047bd37231497d11d409d064d510f98") (:authors ("Sibi" . "sibi@psibi.in")) (:maintainers ("Sibi" . "sibi@psibi.in")) (:maintainer "Sibi" . "sibi@psibi.in") (:keywords "python" "import" "check") (:url . "https://github.com/psibi/emacs-py-import-check"))]) (py-isort . [(20160925 1018) nil "Use isort to sort the imports in a Python buffer" tar ((:commit . "e67306f459c47c53a65604e4eea88a3914596560") (:authors ("Friedrich Paetzke" . "paetzke@fastmail.fm")) (:maintainers ("Friedrich Paetzke" . "paetzke@fastmail.fm")) (:maintainer "Friedrich Paetzke" . "paetzke@fastmail.fm") (:url . "http://paetzke.me/project/py-isort.el"))]) @@ -4256,18 +4364,18 @@ (py-test . [(20230714 517) ((dash (2 9 0)) (f (0 17)) (emacs (24 4))) "A test runner for Python code." tar ((:commit . "72975bb547b6123dcc1213ff78fdcf80f7b29842") (:authors ("Bogdan Paul Popa" . "popa.bogdanp@gmail.com")) (:maintainers ("Bogdan Paul Popa" . "popa.bogdanp@gmail.com")) (:maintainer "Bogdan Paul Popa" . "popa.bogdanp@gmail.com") (:keywords "python" "testing" "py.test") (:url . "https://github.com/Bogdanp/py-test.el"))]) (py-yapf . [(20160925 1122) nil "Use yapf to beautify a Python buffer" tar ((:commit . "a878304202ad827a1f3de3dce1badd9ca8731146") (:authors ("Friedrich Paetzke" . "f.paetzke@gmail.com")) (:maintainers ("Friedrich Paetzke" . "f.paetzke@gmail.com")) (:maintainer "Friedrich Paetzke" . "f.paetzke@gmail.com") (:url . "https://github.com/paetzke/py-yapf.el"))]) (pycarddavel . [(20150831 1216) ((helm (1 7 0)) (emacs (24 0))) "Integrate pycarddav" tar ((:commit . "6ead921066fa0156f20155b7126e5875ce11c328") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:keywords "helm" "pyccarddav" "carddav" "message" "mu4e" "contacts"))]) - (pyconf . [(20230308 2000) ((pyvenv (1 21)) (emacs (28 1)) (transient (0 3 7)) (pyenv-mode (0 1 0))) "Set up python execution configurations like dap-mode ones" tar ((:commit . "e145e895e265474cb1ef5764d37eb47c6566e97f") (:authors ("Andrew Favia ")) (:maintainers ("Andrew Favia ")) (:maintainer "Andrew Favia ") (:keywords "processes" "python") (:url . "https://github.com/andcarnivorous/pyconf"))]) + (pyconf . [(20240207 2203) ((pyvenv (1 21)) (emacs (28 1)) (transient (0 3 7)) (pyenv-mode (0 1 0))) "Set up python execution configurations like dap-mode ones" tar ((:commit . "f1587f20463496193625526ba805c3cf084db966") (:authors ("Andrew Favia ")) (:maintainers ("Andrew Favia ")) (:maintainer "Andrew Favia ") (:keywords "processes" "python") (:url . "https://github.com/andcarnivorous/pyconf"))]) (pycoverage . [(20200513 2047) ((emacs (24 3))) "Support for coverage stats on Python 2.X and 3" tar ((:commit . "3c69ed312121368f1b24cc04d54a29ce4ed4f743") (:authors ("matt harrison")) (:maintainers ("matt harrison")) (:maintainer "matt harrison") (:keywords "project" "convenience") (:url . "https://github.com/mattharrison/pycoverage.el"))]) (pydoc . [(20221222 1426) nil "functional, syntax highlighted pydoc navigation" tar ((:commit . "c9d8b5249c1b3814da062ed9976e4137d6e8d869") (:authors ("John Kitchin" . "jkitchin@andrew.cmu.edu")) (:maintainers ("Brian J. Lopes" . "statmobile@gmail.com")) (:maintainer "Brian J. Lopes" . "statmobile@gmail.com") (:keywords "pydoc" "python") (:url . "https://github.com/statmobile/pydoc"))]) (pyenv-mode . [(20230821 1645) ((emacs (25 1)) (pythonic (0 1 0))) "Integrate pyenv with python-mode" tar ((:commit . "6820aa6673e6a51ace88611a58b423b5b1effb19") (:authors ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainers ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainer "Artem Malyshev" . "proofit404@gmail.com") (:url . "https://github.com/proofit404/pyenv-mode"))]) (pygen . [(20161121 506) ((elpy (1 12 0)) (python-mode (6 2 2)) (dash (2 13 0))) "Python code generation using Elpy and Python-mode." tar ((:commit . "3a5d1d1a0640865b15be05cd1eeb33bb4793b622") (:authors ("Jack Crawley ")) (:maintainers ("Jack Crawley ")) (:maintainer "Jack Crawley ") (:keywords "python" "code generation") (:url . "https://github.com/JackCrawley/pygen/"))]) (pygn-mode . [(20230606 42) ((emacs (26 1)) (tree-sitter (0 15 2)) (tree-sitter-langs (0 10 7)) (uci-mode (0 5 4)) (nav-flash (1 0 0)) (ivy (0 10 0))) "Major-mode for chess PGN files, powered by Python" tar ((:commit . "9957f3e70b48b6cde77e26253feddad2cd4ca0f0") (:authors ("Dodge Coates and Roland Walker")) (:maintainers ("Dodge Coates and Roland Walker")) (:maintainer "Dodge Coates and Roland Walker") (:keywords "data" "games" "chess") (:url . "https://github.com/dwcoates/pygn-mode"))]) - (pyim . [(20230412 134) ((emacs (27 1)) (async (1 6)) (xr (1 13))) "A Chinese input method support quanpin, shuangpin, wubi, cangjie and rime." tar ((:commit . "4c953701a368e1433bf91fd19766d76c9b496825") (:authors ("Ye Wenbin" . "wenbinye@163.com") ("Feng Shu" . "tumashu@163.com")) (:maintainers ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:keywords "convenience" "chinese" "pinyin" "input-method") (:url . "https://github.com/tumashu/pyim"))]) + (pyim . [(20230908 39) ((emacs (27 1)) (async (1 6)) (xr (1 13))) "A Chinese input method support quanpin, shuangpin, wubi, cangjie and rime." tar ((:commit . "64067b20ce0e964b1342b378180f24a1d4503797") (:authors ("Ye Wenbin" . "wenbinye@163.com") ("Feng Shu" . "tumashu@163.com")) (:maintainers ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:keywords "convenience" "chinese" "pinyin" "input-method") (:url . "https://github.com/tumashu/pyim"))]) (pyim-basedict . [(20220614 1108) nil "The default pinyin dict of pyim" tar ((:commit . "d61af27686f7a39e6c138b7261a686e7ea7a0ef7") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainers ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:keywords "convenience" "chinese" "pinyin" "input-method" "complete") (:url . "https://github.com/tumashu/pyim-basedict"))]) (pyim-cangjiedict . [(20210617 934) ((pyim (3 7))) "Some cangjie dicts for pyim" tar ((:commit . "d17e3d32a6480939b350a91a915ebe8e6efad819") (:authors ("Yuanchen Xie" . "yuanchen.gm@gmail.com")) (:maintainers ("Yuanchen Xie" . "yuanchen.gm@gmail.com")) (:maintainer "Yuanchen Xie" . "yuanchen.gm@gmail.com") (:keywords "convenience" "chinese" "pinyin" "input-method" "complete") (:url . "https://github.com/p1uxtar/pyim-cangjiedict"))]) (pyim-smzmdict . [(20210505 1445) ((pyim (3 7))) "Sanma(triple) Zhengma dict for pyim" tar ((:commit . "fcddbde17a04d174c7353548056524687f7be8d2") (:authors ("Yue Shi (Zhizhi)")) (:maintainers ("Yuanchen Xie")) (:maintainer "Yuanchen Xie") (:keywords "convenience" "i18n" "pyim" "chinese" "zhengma") (:url . "https://github.com/p1uxtar/pyim-smzmdict"))]) (pyim-wbdict . [(20220604 1340) ((pyim (3 7))) "Some wubi dicts for pyim" tar ((:commit . "e3b128cfcf218e4a0ca04189b0bd46909761227e") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainers ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:keywords "convenience" "chinese" "pinyin" "input-method" "complete") (:url . "https://github.com/tumashu/pyim-wbdict"))]) - (pyimport . [(20220908 1610) ((dash (2 8 0)) (s (1 9 0)) (shut-up (0 3 2))) "Manage Python imports!" tar ((:commit . "c006a5fd0e5c9e297aa2ad71b2f02f463286b5e3") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))]) + (pyimport . [(20240207 719) ((dash (2 8 0)) (s (1 9 0)) (shut-up (0 3 2))) "Manage Python imports!" tar ((:commit . "4398ce8dd64fa0f685f4bf8683a35087649346d3") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))]) (pyimpsort . [(20160130 453) ((emacs (24 3))) "Sort python imports." tar ((:commit . "d5c61d70896b642646dfd3c809c06174ae086c1a") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainers ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:keywords "convenience") (:url . "https://github.com/emacs-pe/pyimpsort.el"))]) (pyinspect . [(20230216 1121) ((emacs (27 1))) "Python object inspector" tar ((:commit . "4437dc589d0c1eb0ca80bf0d005ee27d15cf69fc") (:authors ("Maor Kadosh" . "git@avocadosh.xyz")) (:maintainers ("Maor Kadosh" . "git@avocadosh.xyz")) (:maintainer "Maor Kadosh" . "git@avocadosh.xyz") (:keywords "tools") (:url . "https://github.com/it-is-wednesday/pyinspect.el"))]) (pylint . [(20221117 1303) nil "minor mode for running `pylint'" tar ((:commit . "bddb91610b6b6aa1e7fee96b6be3be69dfe3695e") (:authors ("Ian Eure" . "ian.eure@gmail.com")) (:maintainers ("Ian Eure" . "ian.eure@gmail.com")) (:maintainer "Ian Eure" . "ian.eure@gmail.com") (:keywords "languages" "python"))]) @@ -4276,16 +4384,16 @@ (pytest . [(20230810 1218) ((s (1 9 0))) "Easy Python test running in Emacs" tar ((:commit . "8692f965bf4ddf3d755cf1fbf77a7a768e22460e") (:keywords "pytest" "python" "testing") (:url . "https://github.com/ionrock/pytest-el"))]) (pytest-pdb-break . [(20200804 848) ((emacs (25))) "A pytest PDB launcher" tar ((:commit . "05d227493b7b96f3556cba22f215cb85f9282020") (:authors ("Jane Soko" . "poppyschmo@protonmail.com")) (:maintainers ("Jane Soko" . "poppyschmo@protonmail.com")) (:maintainer "Jane Soko" . "poppyschmo@protonmail.com") (:keywords "languages" "tools") (:url . "https://github.com/poppyschmo/pytest-pdb-break"))]) (python-black . [(20230313 1037) ((emacs (25)) (dash (2 16 0)) (reformatter (0 3))) "Reformat Python using python-black" tar ((:commit . "0714b0007c0b620f88ed9cc91035caea43f3d75f") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainers ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee") (:keywords "languages") (:url . "https://github.com/wbolster/emacs-python-black"))]) - (python-cell . [(20230426 1602) ((emacs (25 1))) "Support for MATLAB-like cells in python mode" tar ((:commit . "0428186af2fac1252ec62e9be4f7bf3664682e83") (:authors ("Thomas Hisch" . "t.hisch@gmail.com")) (:maintainers ("Thomas Hisch" . "t.hisch@gmail.com")) (:maintainer "Thomas Hisch" . "t.hisch@gmail.com") (:keywords "extensions" "python" "matlab" "cell") (:url . "https://github.com/thisch/python-cell.el"))]) + (python-cell . [(20240126 841) ((emacs (25 1))) "Support for MATLAB-like cells in python mode" tar ((:commit . "ea469071adc72f371698934c3709ee370ac6be6f") (:authors ("Thomas Hisch" . "t.hisch@gmail.com")) (:maintainers ("Thomas Hisch" . "t.hisch@gmail.com")) (:maintainer "Thomas Hisch" . "t.hisch@gmail.com") (:keywords "extensions" "python" "matlab" "cell") (:url . "https://github.com/thisch/python-cell.el"))]) (python-coverage . [(20211224 1420) ((emacs (25 1)) (dash (2 18 0)) (s (1 12 0)) (xml+ (1))) "Show Python coverage via overlays or Flycheck" tar ((:commit . "a341615af03dbe3ce0ac9b63cf43dc01c1ae5ebe") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainers ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee") (:keywords "languages" "processes" "tools") (:url . "https://github.com/wbolster/emacs-python-coverage"))]) (python-django . [(20150822 404) nil "A Jazzy package for managing Django projects" tar ((:commit . "fc54ad74f0309670359b939f64d0f1fff68aeac4") (:authors ("Fabián E. Gallina" . "fabian@anue.biz")) (:maintainers ("FSF")) (:maintainer "FSF") (:keywords "languages") (:url . "https://github.com/fgallina/python-django.el"))]) - (python-docstring . [(20230326 1929) nil "Smart Python docstring formatting" tar ((:commit . "40f0ca57831a71a9e6437088149784f37704ef6c"))]) + (python-docstring . [(20231203 2036) nil "Smart Python docstring formatting" tar ((:commit . "48e6489ec2db8b4959a9f591910941c2a5f132a3"))]) (python-environment . [(20150310 853) ((deferred (0 3 1))) "virtualenv API for Emacs Lisp" tar ((:commit . "401006584e32864a10c69d29f14414828909362e") (:authors ("Takafumi Arakaki ")) (:maintainers ("Takafumi Arakaki ")) (:maintainer "Takafumi Arakaki ") (:keywords "applications" "tools"))]) (python-insert-docstring . [(20211127 1232) ((emacs (25 1))) "Python Google docstring inserter" tar ((:commit . "cd6419b74c99c06d5c48c1b289572acce1fd193b") (:authors ("Marco Vocialta" . "macurovc@tutanota.com")) (:maintainers ("Marco Vocialta" . "macurovc@tutanota.com")) (:maintainer "Marco Vocialta" . "macurovc@tutanota.com") (:url . "https://github.com/macurovc/insert-docstring"))]) (python-isort . [(20210603 2153) ((emacs (26)) (reformatter (0 6))) "Reformat python-mode buffer with isort" tar ((:commit . "339814df22b87eebca02137e581f65d6283fce97") (:authors ("Jimmy Yuen Ho Wong" . "wyuenho@gmail.com")) (:maintainers ("Jimmy Yuen Ho Wong" . "wyuenho@gmail.com")) (:maintainer "Jimmy Yuen Ho Wong" . "wyuenho@gmail.com") (:keywords "languages") (:url . "https://github.com/wyuenho/emacs-python-isort"))]) - (python-mls . [(20230811 1519) ((emacs (27 1)) (compat (29 1))) "Multi-line shell for (i)Python" tar ((:commit . "2b7ef51d5dee57dfeb30bc8ebe10a7e4d12e7700") (:authors ("J.D. Smith")) (:maintainers ("J.D. Smith")) (:maintainer "J.D. Smith") (:keywords "languages" "processes") (:url . "https://github.com/jdtsmith/python-mls"))]) - (python-mode . [(20230702 625) nil "Python major mode" tar ((:commit . "c60a675aac83505f1f664410dce3b4e64eef37a8") (:authors ("2015-2023 https://gitlab.com/groups/python-mode-devs") ("2003-2014 https://launchpad.net/python-mode") ("1995-2002 Barry A. Warsaw") ("1992-1994 Tim Peters")) (:maintainer nil . "python-mode@python.org") (:keywords "python" "languages" "oop") (:url . "https://gitlab.com/groups/python-mode-devs"))]) - (python-pytest . [(20221021 1937) ((emacs (24 4)) (dash (2 18 0)) (transient (0 3 7)) (projectile (0 14 0)) (s (1 12 0))) "helpers to run pytest" tar ((:commit . "33c921adaa6c9c8f7cceba2342114c6b406e0d7c") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainers ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee") (:keywords "pytest" "test" "python" "languages" "processes" "tools") (:url . "https://github.com/wbolster/emacs-python-pytest"))]) + (python-mls . [(20230920 1915) ((emacs (27 1)) (compat (29 1))) "Multi-line shell for (i)Python" tar ((:commit . "821b93ff7c94a13090598c22fd92bd19b5ad951b") (:authors ("J.D. Smith")) (:maintainers ("J.D. Smith")) (:maintainer "J.D. Smith") (:keywords "languages" "processes") (:url . "https://github.com/jdtsmith/python-mls"))]) + (python-mode . [(20231218 645) nil "Python major mode" tar ((:commit . "9678f77d0d0ab3d672374c4457b5a02ce49cd206") (:authors ("2015-2023 https://gitlab.com/groups/python-mode-devs") ("2003-2014 https://launchpad.net/python-mode") ("1995-2002 Barry A. Warsaw") ("1992-1994 Tim Peters")) (:maintainer nil . "python-mode@python.org") (:keywords "python" "languages" "oop") (:url . "https://gitlab.com/groups/python-mode-devs"))]) + (python-pytest . [(20240314 1038) ((emacs (24 4)) (dash (2 18 0)) (transient (0 3 7)) (projectile (0 14 0)) (s (1 12 0))) "helpers to run pytest" tar ((:commit . "46fd006462258a3366723fafacdf2db6a6ae689d") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainers ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee") (:keywords "pytest" "test" "python" "languages" "processes" "tools") (:url . "https://github.com/wbolster/emacs-python-pytest"))]) (python-switch-quotes . [(20161228 809) ((emacs (24 3))) "cycle between ' and \" quotes in python strings" tar ((:commit . "93f1e9b40e061a6cea480139e8b1362b6404abd0") (:authors ("Vladimir Lagunov" . "lagunov.vladimir@gmail.com")) (:maintainers ("Vladimir Lagunov" . "lagunov.vladimir@gmail.com")) (:maintainer "Vladimir Lagunov" . "lagunov.vladimir@gmail.com") (:keywords "python" "tools" "convenience") (:url . "https://github.com/werehuman/python-switch-quotes"))]) (python-test . [(20181018 29) ((emacs (25 1))) "Python testing integration" tar ((:commit . "f899975b133539e19ba822e4b0bfd1a28572967e") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainers ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:keywords "convenience" "tools" "processes") (:url . "https://github.com/emacs-pe/python-test.el"))]) (python-view-data . [(20230508 543) ((emacs (28 1)) (python (0 2)) (csv-mode (1 12))) "View data in python" tar ((:commit . "1dd5f99679db9767530cfc20642a40a48bd479be") (:authors ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainers ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainer "Shuguang Sun" . "shuguang79@qq.com") (:keywords "tools") (:url . "https://github.com/ShuguangSun/python-view-data"))]) @@ -4295,7 +4403,7 @@ (pyvenv-auto . [(20230106 415) ((emacs (26 3)) (pyvenv (1 21))) "Automatically switch Python venvs" tar ((:commit . "b4365e60e3ba747a5fec8ca909f64fe8c73d8db2") (:url . "https://github.com/nryotaro/pyvenv-auto"))]) (q-mode . [(20230412 53) ((emacs (24))) "A q editing mode" tar ((:commit . "d89b359d5a26234336487ab4e42eb5878ad3c5a5") (:keywords "faces" "files" "q") (:url . "https://github.com/psaris/q-mode"))]) (qml-mode . [(20161016 31) nil "Major mode for editing QT Declarative (QML) code." tar ((:commit . "6c5f33ba88ae010bf201a80ee8095e20a724558c") (:authors ("Yen-Chin Lee" . "coldnew.tw@gmail.com")) (:maintainers ("Yen-Chin Lee" . "coldnew.tw@gmail.com")) (:maintainer "Yen-Chin Lee" . "coldnew.tw@gmail.com") (:keywords "qml" "qt" "qt declarative") (:url . "https://github.com/coldnew/qml-mode"))]) - (qrencode . [(20230324 2335) ((emacs (25 1))) "QRCode encoder" tar ((:commit . "d7896e9594d45d7b2622d4617ff9cb7037378167") (:authors ("Rüdiger Sonderfeld" . "ruediger@c-plusplus.net")) (:maintainers ("Rüdiger Sonderfeld" . "ruediger@c-plusplus.net")) (:maintainer "Rüdiger Sonderfeld" . "ruediger@c-plusplus.net") (:keywords "qrcode" "comm") (:url . "https://github.com/ruediger/qrencode-el"))]) + (qrencode . [(20231127 21) ((emacs (25 1))) "QRCode encoder" tar ((:commit . "0ab1819ee39d15994a864db4d2dfa32e7a527f82") (:authors ("Rüdiger Sonderfeld" . "ruediger@c-plusplus.net")) (:maintainers ("Rüdiger Sonderfeld" . "ruediger@c-plusplus.net")) (:maintainer "Rüdiger Sonderfeld" . "ruediger@c-plusplus.net") (:keywords "qrcode" "comm") (:url . "https://github.com/ruediger/qrencode-el"))]) (qt-pro-mode . [(20170604 1841) ((emacs (24))) "Qt Pro/Pri major mode" tar ((:commit . "1e0052fcfb89c15cb47714c1546d4e8ec6e01ae6") (:authors ("Todd Neal" . "tolchz@gmail.com")) (:maintainers ("Todd Neal" . "tolchz@gmail.com")) (:maintainer "Todd Neal" . "tolchz@gmail.com") (:keywords "extensions"))]) (qtcreator-theme . [(20201215 1523) ((emacs (24 3))) "A color theme that mimics Qt Creator IDE" tar ((:commit . "515532b05063898459157d2ba5c10ec0d5a4b1bd") (:authors ("Lesley Lai" . "lesley@lesleylai.info")) (:maintainers ("Lesley Lai" . "lesley@lesleylai.info")) (:maintainer "Lesley Lai" . "lesley@lesleylai.info") (:keywords "theme" "light" "faces") (:url . "https://github.com/LesleyLai/emacs-qtcreator-theme"))]) (quack . [(20181106 1301) nil "enhanced support for editing and running Scheme code" tar ((:commit . "2146805ce2b5a9b155d73929986f11e713787e26"))]) @@ -4303,20 +4411,20 @@ (quarto-mode . [(20221005 1632) ((emacs (25 1)) (polymode (0 2 2)) (poly-markdown (0 2 2)) (markdown-mode (2 3)) (request (0 3 2))) "A (poly)mode for https://quarto.org" tar ((:commit . "b7dcba7050b2e1e65acdd5656d08a186bca2c922") (:authors ("Carlos Scheidegger")) (:maintainers ("Carlos Scheidegger")) (:maintainer "Carlos Scheidegger") (:keywords "languages" "multi-modes") (:url . "https://github.com/quarto-dev/quarto-emacs"))]) (quasi-monochrome-theme . [(20200415 705) nil "Quasi Monochrome theme" tar ((:commit . "b38d71860fdea945e10e8a766ac9dfa1410ade67") (:authors ("Lorenzo Bolla" . "lbolla@gmail.com")) (:maintainer "Lorenzo Bolla" . "lbolla@gmail.com") (:keywords "color-theme" "monochrome" "high contrast") (:url . "https://github.com/lbolla/emacs-quasi-monochrome"))]) (quelpa . [(20230620 1343) ((emacs (25 1))) "Emacs Lisp packages built directly from source" tar ((:commit . "b6a73d4e9e06631d2adb7bfbd83bbe7ee4211809") (:authors ("steckerhalter")) (:maintainers ("steckerhalter")) (:maintainer "steckerhalter") (:keywords "tools" "package" "management" "build" "source" "elpa") (:url . "https://github.com/quelpa/quelpa"))]) - (quelpa-leaf . [(20221231 1618) ((emacs (25 1)) (quelpa (1 0)) (leaf (4 1 0))) "Quelpa handler for leaf" tar ((:commit . "296ef97c29d7540316441715b92f6d15430f3579") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "package" "managment" "elpa" "leaf") (:url . "https://github.com/quelpa/quelpa-leaf"))]) + (quelpa-leaf . [(20240101 835) ((emacs (25 1)) (quelpa (1 0)) (leaf (4 1 0))) "Quelpa handler for leaf" tar ((:commit . "162ae6bc91cfe26f0b013c1b6ce83c3fe3fb8463") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "package" "managment" "elpa" "leaf") (:url . "https://github.com/quelpa/quelpa-leaf"))]) (quelpa-use-package . [(20201022 746) ((emacs (25 1)) (quelpa (1 0)) (use-package (2))) "quelpa handler for use-package" tar ((:commit . "a97461008391d045aa2a506fc126280a12a060e4") (:authors ("steckerhalter")) (:maintainers ("steckerhalter")) (:maintainer "steckerhalter") (:keywords "package" "management" "elpa" "use-package") (:url . "https://github.com/quelpa/quelpa-use-package"))]) (quick-buffer-switch . [(20221220 1142) nil "Quick switch to file or dir buffers." tar ((:commit . "280f67f1a5e02533573b45d585c222c937f11f81") (:authors ("Sebastien Gross ")) (:maintainers ("Sebastien Gross ")) (:maintainer "Sebastien Gross ") (:keywords "emacs" "configuration"))]) (quick-peek . [(20200130 2059) ((emacs (24 3))) "Inline quick-peek windows" tar ((:commit . "03a276086795faad46a142454fc3e28cab058b70") (:authors ("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) (:maintainers ("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) (:maintainer "Clément Pit-Claudel" . "clement.pitclaudel@live.com") (:keywords "tools" "help" "doc" "convenience"))]) (quick-preview . [(20191017 1920) nil "quick preview using GNOME sushi, gloobus or quick look" tar ((:commit . "a312ab5539b9a362da9d305e4da814e17c5721c9") (:authors ("myuhe ")) (:maintainers ("myuhe")) (:maintainer "myuhe") (:keywords "files" "hypermedia") (:url . "https://github.com/myuhe/quick-preview.el"))]) - (quick-shell-keybind . [(20171023 613) ((emacs (24))) "Interactively bind a key to shell commands" tar ((:commit . "5f4541a5a5554d108bf16b5fd1713e962161ca1b") (:authors ("eyeinsky" . "eyeinsky9@gmail.com")) (:maintainers ("eyeinsky" . "eyeinsky9@gmail.com")) (:maintainer "eyeinsky" . "eyeinsky9@gmail.com") (:keywords "maint" "convenience" "processes") (:url . "https://github.com/eyeinsky/quick-shell-keybind"))]) + (quick-shell-keybind . [(20230927 1036) ((emacs (24))) "Interactively bind a key to shell commands" tar ((:commit . "be830a69cf7eec92d4ea269fd389ac39b0c162f1") (:authors ("eyeinsky" . "eyeinsky9@gmail.com")) (:maintainers ("eyeinsky" . "eyeinsky9@gmail.com")) (:maintainer "eyeinsky" . "eyeinsky9@gmail.com") (:keywords "maint" "convenience" "processes") (:url . "https://github.com/eyeinsky/quick-shell-keybind"))]) (quickref . [(20170817 1232) ((dash (1 0 3)) (s (1 0 0))) "Display relevant notes-to-self in the echo area" tar ((:commit . "f368c8b8219bb90498c5ab84e26f00eedaa234cf") (:authors ("Kyle Hargraves")) (:maintainers ("Kyle Hargraves")) (:maintainer "Kyle Hargraves") (:url . "https://github.com/pd/quickref.el"))]) - (quickrun . [(20221215 828) ((emacs (26 1)) (ht (2 0))) "Run commands quickly" tar ((:commit . "7a89313c07a21eae9cd69a1a98e2a134d559e04f") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Jen-Chieh Shen" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh Shen" . "jcs090218@gmail.com") (:keywords "tools") (:url . "https://github.com/emacsorphanage/quickrun"))]) + (quickrun . [(20240316 807) ((emacs (26 1)) (ht (2 0))) "Run commands quickly" tar ((:commit . "4604cbd7dff6996a0d35d4eb042a5623530763bb") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Jen-Chieh Shen" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh Shen" . "jcs090218@gmail.com") (:keywords "tools") (:url . "https://github.com/emacsorphanage/quickrun"))]) (quiet . [(20230530 859) nil "Disconnect from the online world for a while" tar ((:commit . "985b56606517971330c08686c49a8d06db763f3c") (:authors ("nik gaffney" . "nik@fo.am")) (:maintainers ("nik gaffney" . "nik@fo.am")) (:maintainer "nik gaffney" . "nik@fo.am") (:keywords "convenience" "quiet" "distraction" "network" "detachment" "offline") (:url . "https://github.com/zzkt/quiet"))]) (quilt . [(20190828 506) ((emacs (26 0))) "Minor mode for working with files in quilt" tar ((:commit . "b56a1f1acc46cdf8655710e4c8f24f5f31f22c6a") (:authors ("Matt Mackall" . "mpm@selenic.com")) (:maintainers ("Jan Stranik" . "jan@stranik.org")) (:maintainer "Jan Stranik" . "jan@stranik.org") (:keywords "extensions") (:url . "https://github.com/jstranik/emacs-quilt"))]) (quiz . [(20190525 1206) ((cl-lib (0 5)) (emacs (25))) "Multiple choice quiz game" tar ((:commit . "570bf53926d89282cdb9653bd5aa8fe968f92bbd") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainers ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:keywords "games" "trivia" "quiz") (:url . "https://github.com/davep/quiz.el"))]) (r-autoyas . [(20140101 1510) ((ess (0)) (yasnippet (0 8 0))) "Provides automatically created yasnippets for R function argument lists." tar ((:commit . "d321a7da0ef2e94668d53e0807277da7b70ea678") (:authors ("Sven Hartenstein & Matthew Fidler")) (:maintainers ("Matthew Fidler")) (:maintainer "Matthew Fidler") (:keywords "r" "yasnippet") (:url . "https://github.com/mlf176f2/r-autoyas.el"))]) (racer . [(20210307 243) ((emacs (25 1)) (rust-mode (0 2 0)) (dash (2 13 0)) (s (1 10 0)) (f (0 18 2)) (pos-tip (0 4 6))) "code completion, goto-definition and docs browsing for Rust via racer" tar ((:commit . "1e63e98626737ea9b662d4a9b1ffd6842b1c648c") (:authors ("Phil Dawes")) (:maintainers ("Phil Dawes")) (:maintainer "Phil Dawes") (:keywords "abbrev" "convenience" "matching" "rust" "tools") (:url . "https://github.com/racer-rust/emacs-racer"))]) - (racket-mode . [(20230508 1742) ((emacs (25 1))) "Racket editing, REPL, and more" tar ((:commit . "c6dbe023c688ad1845e1f8ee250f5fa2cf2b8b01") (:authors ("Greg Hendershott" . "racket-mode-author@greghendershott.com")) (:maintainers ("Greg Hendershott")) (:maintainer "Greg Hendershott") (:url . "https://www.racket-mode.com/"))]) + (racket-mode . [(20240319 2002) ((emacs (25 1))) "Racket editing, REPL, and more" tar ((:commit . "fd3e3ddf12aef6d7661b5a2c0f70afc7107b7fd9") (:authors ("Greg Hendershott" . "racket-mode-author@greghendershott.com")) (:maintainers ("Greg Hendershott")) (:maintainer "Greg Hendershott") (:url . "https://www.racket-mode.com/"))]) (rails-i18n . [(20220126 1643) ((emacs (27 2)) (yaml (0 1 0)) (dash (2 19 1))) "Seach and insert i18n on ruby code" tar ((:commit . "8e87e4e48e31902b8259ded28a208c2e7efea6e9") (:authors ("Otávio Schwanck dos Santos" . "otavioschwanck@gmail.com")) (:maintainers ("Otávio Schwanck dos Santos" . "otavioschwanck@gmail.com")) (:maintainer "Otávio Schwanck dos Santos" . "otavioschwanck@gmail.com") (:keywords "tools" "languages") (:url . "https://github.com/otavioschwanck/rails-i18n.el"))]) (rails-log-mode . [(20140408 425) nil "Major mode for viewing Rails log files" tar ((:commit . "ff440003ad7d47cb0ac3300f2a632f4cfd36a446") (:authors ("Anantha kumaran" . "ananthakumaran@gmail.com")) (:maintainers ("Anantha kumaran" . "ananthakumaran@gmail.com")) (:maintainer "Anantha kumaran" . "ananthakumaran@gmail.com") (:keywords "rails" "log"))]) (rails-routes . [(20220126 1631) ((emacs (27 2)) (inflections (1 1))) "Search for and insert rails routes" tar ((:commit . "eab995a9297ca5bd9bd4f4c2737f2fecfc36def0") (:authors ("Otávio Schwanck" . "otavioschwanck@gmail.com")) (:maintainers ("Otávio Schwanck" . "otavioschwanck@gmail.com")) (:maintainer "Otávio Schwanck" . "otavioschwanck@gmail.com") (:keywords "tools" "languages") (:url . "https://github.com/otavioschwanck/rails-routes"))]) @@ -4335,7 +4443,7 @@ (rase . [(20120928 2045) nil "Run At Sun Event daemon" tar ((:commit . "59b5f7e8102570b65040e8d55781c7ea28de7338") (:authors ("Andrey Kotlarski" . "m00naticus@gmail.com")) (:maintainers ("Andrey Kotlarski" . "m00naticus@gmail.com")) (:maintainer "Andrey Kotlarski" . "m00naticus@gmail.com") (:keywords "solar" "sunrise" "sunset" "midday" "midnight") (:url . "https://github.com/m00natic/rase/"))]) (rats . [(20170818 1013) ((s (1 10 0)) (go-mode (1 3 1)) (cl-lib (0 5))) "Rapid testing suite for Go" tar ((:commit . "a6d55aebcc54f669c6c6ffedf84364c4097903cc") (:authors ("Antoine Kalmbach" . "ane@iki.fi")) (:maintainers ("Antoine Kalmbach" . "ane@iki.fi")) (:maintainer "Antoine Kalmbach" . "ane@iki.fi") (:keywords "go"))]) (raycast-mode . [(20230607 2107) ((emacs (26 1))) "Develop Raycast Extensions" tar ((:commit . "f6401605cc9dfacdcaaf98d5844348b818cfc010") (:authors ("John Buckley" . "nhoj.buckley@gmail.com")) (:maintainers ("John Buckley" . "nhoj.buckley@gmail.com")) (:maintainer "John Buckley" . "nhoj.buckley@gmail.com") (:keywords "convenience" "languages" "tools") (:url . "https://github.com/nhojb/raycast-mode"))]) - (rbenv . [(20141120 749) nil "Emacs integration for rbenv" tar ((:commit . "2ea1a5bdc1266caef1dd77700f2c8f42429b03f1") (:authors ("Yves Senn" . "yves.senn@gmail.com")) (:maintainers ("Yves Senn" . "yves.senn@gmail.com")) (:maintainer "Yves Senn" . "yves.senn@gmail.com") (:keywords "ruby" "rbenv") (:url . "https://github.com/senny/rbenv.el"))]) + (rbenv . [(20240120 6) nil "Emacs integration for rbenv" tar ((:commit . "588b817d510737b9d6afd6d1ecddd517d96b78e5") (:authors ("Yves Senn" . "yves.senn@gmail.com")) (:maintainers ("Yves Senn" . "yves.senn@gmail.com")) (:maintainer "Yves Senn" . "yves.senn@gmail.com") (:keywords "ruby" "rbenv") (:url . "https://github.com/senny/rbenv.el"))]) (rbs-mode . [(20210430 135) ((emacs (24 5))) "A major mode for RBS" tar ((:commit . "ad36bb138cec7396f029821d0cf755a8bc663260") (:authors ("Masafumi Koba")) (:maintainers ("Masafumi Koba")) (:maintainer "Masafumi Koba") (:keywords "languages") (:url . "https://github.com/ybiquitous/rbs-mode"))]) (rbt . [(20170202 2302) ((popup (0 5 3)) (magit (20160128 1201))) "Integrate reviewboard with emacs." tar ((:commit . "32bfba9062a014e375451cf4203c29535b5efc1e") (:authors ("Joe Heyming" . "joeheyming@gmail.com")) (:maintainers ("Joe Heyming" . "joeheyming@gmail.com")) (:maintainer "Joe Heyming" . "joeheyming@gmail.com") (:keywords "reviewboard" "rbt"))]) (rbtagger . [(20211026 2318) ((emacs (25 1))) "Ruby tagging tools" tar ((:commit . "351c4006ddacc2f66e6ff8c79d981613e9a8bd22") (:authors ("Thiago Araújo" . "thiagoaraujos@gmail.com")) (:maintainers ("Thiago Araújo" . "thiagoaraujos@gmail.com")) (:maintainer "Thiago Araújo" . "thiagoaraujos@gmail.com") (:keywords "languages" "tools") (:url . "https://www.github.com/thiagoa/rbtagger"))]) @@ -4353,7 +4461,7 @@ (readable-numbers . [(20220711 911) ((emacs (24 1))) "Visually separate long integers" tar ((:commit . "a3ebdcdd91d32f044b68541a00e162396e4acb38") (:authors ("Oscar Najera ")) (:maintainers ("Oscar Najera" . "hi@oscarnajera.com")) (:maintainer "Oscar Najera" . "hi@oscarnajera.com") (:url . "https://github.com/Titan-C/cardano.el"))]) (readline-complete . [(20150708 1437) nil "offers completions in shell mode" tar ((:commit . "30c020c37b2741160cc37e656e13c85d826a0ebf") (:authors ("Christopher Monsanto" . "chris@monsan.to")) (:maintainers ("Christopher Monsanto" . "chris@monsan.to")) (:maintainer "Christopher Monsanto" . "chris@monsan.to"))]) (real-auto-save . [(20200505 1537) ((emacs (24 4))) "Automatically save your buffers/files at regular intervals" tar ((:commit . "8e51241e5ba7b07b91d8188c14cf193017640292") (:authors ("Chaoji Li ") ("Anand Reddy Pandikunta ")) (:maintainers ("Chaoji Li ")) (:maintainer "Chaoji Li ") (:url . "https://github.com/ChillarAnand/real-auto-save"))]) - (realgud . [(20230619 1158) ((load-relative (1 3 1)) (loc-changes (1 2)) (test-simple (1 3 0)) (emacs (25))) "A modular front-end for interacting with external debuggers" tar ((:commit . "2c77776a4797805d8633636fd68148dfb32fab65") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainers ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org") (:keywords "debugger" "gdb" "python" "perl" "go" "bash" "zsh" "bashdb" "zshdb" "remake" "trepan" "perldb" "pdb") (:url . "https://github.com/realgud/realgud/"))]) + (realgud . [(20231113 1910) ((load-relative (1 3 1)) (loc-changes (1 2)) (test-simple (1 3 0)) (emacs (25))) "A modular front-end for interacting with external debuggers" tar ((:commit . "365063ea8ce8ec6a852cb388088d84147421c3c2") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainers ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org") (:keywords "debugger" "gdb" "python" "perl" "go" "bash" "zsh" "bashdb" "zshdb" "remake" "trepan" "perldb" "pdb") (:url . "https://github.com/realgud/realgud/"))]) (realgud-byebug . [(20190520 1140) ((realgud (1 4 5)) (load-relative (1 2)) (cl-lib (0 5)) (emacs (24))) "Realgud front-end to the Ruby byebug debugger" tar ((:commit . "f8f20b92c6b13f75cc9797921c0e28d3def48b1c") (:authors ("Rocky Bernstein")) (:maintainers ("Rocky Bernstein")) (:maintainer "Rocky Bernstein") (:url . "http://github.com/rocky/realgud-byebug"))]) (realgud-ipdb . [(20200722 1116) ((realgud (1 5 0)) (load-relative (1 3 1)) (emacs (25))) "Realgud front-end to ipdb" tar ((:commit . "f18f907aa4ddd3e59dc19ca296d4ee2dc5e436b0") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainers ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org") (:url . "https://github.com/realgud/realgud-ipdb"))]) (realgud-jdb . [(20200722 1120) ((realgud (1 5 0)) (load-relative (1 3 1)) (emacs (25))) "Realgud front-end to Java's jdb debugger\"" tar ((:commit . "1c183b2f8aae0de60942ea01444b896bf182c66a") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainers ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org") (:url . "https://github.com/realgud/realgud-jdb"))]) @@ -4364,7 +4472,7 @@ (realgud-pry . [(20201011 1815) ((realgud (1 4 5)) (load-relative (1 2)) (cl-lib (0 5)) (emacs (25))) "Realgud front-end to the Ruby pry debugger" tar ((:commit . "264ca6811b0bef5de4decc54acfeacf0bce2f51f") (:authors ("Rocky Bernstein")) (:maintainers ("Rocky Bernstein")) (:maintainer "Rocky Bernstein") (:url . "http://github.com/rocky/realgud-pry"))]) (realgud-rdb2 . [(20190520 1146) ((realgud (1 4 5)) (load-relative (1 2)) (cl-lib (0 5)) (emacs (24))) "Realgud front-end for interacting with Ruby debugger2" tar ((:commit . "3594aa74f7afda3c3251bb2af7fe0e8ec6d621ae") (:authors ("Rocky Bernstein")) (:maintainers ("Rocky Bernstein")) (:maintainer "Rocky Bernstein") (:url . "http://github.com/rocky/realgud-ruby-debugger2"))]) (realgud-trepan-ni . [(20210513 2237) ((load-relative (1 2)) (realgud (1 5 0)) (emacs (25))) "Realgud front-end to trepan-ni" tar ((:commit . "0ec088ea343835e24ae73da09bea96bfb02a3130") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainers ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org") (:url . "https://github.com/realgud/realgud-trepan-ni"))]) - (reaper . [(20220527 2122) ((emacs (26 2))) "Interact with Harvest time tracking app" tar ((:commit . "a8ec93656698c5c02a02279ee7d7976325cc74cd") (:authors ("Thomas Fini Hansen" . "xen@xen.dk")) (:maintainers ("Thomas Fini Hansen" . "xen@xen.dk")) (:maintainer "Thomas Fini Hansen" . "xen@xen.dk") (:keywords "tools") (:url . "https://github.com/xendk/reaper"))]) + (reaper . [(20231104 2100) ((emacs (26 2))) "Interact with Harvest time tracking app" tar ((:commit . "c78a06b0d10c08ec4090ba61b964022e54415aa5") (:authors ("Thomas Fini Hansen" . "xen@xen.dk")) (:maintainers ("Thomas Fini Hansen" . "xen@xen.dk")) (:maintainer "Thomas Fini Hansen" . "xen@xen.dk") (:keywords "tools") (:url . "https://github.com/xendk/reaper"))]) (reason-mode . [(20230405 517) ((emacs (24 3))) "A major mode for editing ReasonML" tar ((:commit . "d657ff75572a8ea7eda6fe22ada3a2ebf5bc6119") (:authors ("Mozilla")) (:maintainers ("Mozilla")) (:maintainer "Mozilla") (:keywords "languages" "ocaml") (:url . "https://github.com/reasonml-editor/reason-mode"))]) (reazon . [(20211229 1733) ((emacs (26))) "miniKanren for Emacs" tar ((:commit . "da3c4a8acf236eddb73348056e08bea330e868c0") (:authors ("Nick Drozd" . "nicholasdrozd@gmail.com")) (:maintainers ("Nick Drozd" . "nicholasdrozd@gmail.com")) (:maintainer "Nick Drozd" . "nicholasdrozd@gmail.com") (:keywords "languages" "extensions" "lisp") (:url . "https://github.com/nickdrozd/reazon"))]) (rebecca-theme . [(20180324 821) ((emacs (24))) "Rebecca Purple Theme" tar ((:commit . "1fe3662d1b02caea96e9a780252b2c45f7a49b1d") (:authors ("vic" . "vborja@apache.org")) (:maintainers ("vic" . "vborja@apache.org")) (:maintainer "vic" . "vborja@apache.org") (:keywords "theme" "dark") (:url . "https://github.com/vic/rebecca-theme"))]) @@ -4373,34 +4481,34 @@ (recentf-remove-sudo-tramp-prefix . [(20220621 749) ((emacs (24 4))) "Normalise recentf history" tar ((:commit . "95ff600058371dd08f615095a55850d2910021bb") (:authors ("ncaq" . "ncaq@ncaq.net")) (:maintainers ("ncaq" . "ncaq@ncaq.net")) (:maintainer "ncaq" . "ncaq@ncaq.net") (:url . "https://github.com/ncaq/recentf-remove-sudo-tramp-prefix"))]) (recently . [(20210930 207) ((cl-lib (0 5)) (emacs (24))) "Track recently opened files to visit them again" tar ((:commit . "94b31f6bf1dab6af942948fec975e37424938a62") (:authors ("10sr <8.slashes [at] gmail [dot] com>")) (:maintainers ("10sr <8.slashes [at] gmail [dot] com>")) (:maintainer "10sr <8.slashes [at] gmail [dot] com>") (:keywords "utility" "files") (:url . "https://github.com/10sr/recently-el"))]) (recompile-on-save . [(20151126 1446) ((dash (1 1 0)) (cl-lib (0 5))) "Trigger recompilation on file save." tar ((:commit . "92e11446869d878803d4f3dec5d2101380c12bb2") (:authors ("Marian Schubert" . "marian.schubert@gmail.com")) (:maintainers ("Marian Schubert" . "marian.schubert@gmail.com")) (:maintainer "Marian Schubert" . "marian.schubert@gmail.com") (:keywords "convenience" "files" "processes" "tools") (:url . "https://github.com/maio/recompile-on-save.el"))]) - (recomplete . [(20230808 1342) ((emacs (26 1))) "Immediately (re)complete actions" tar ((:commit . "0369b805d36462103eed6f87d9db870bdf0dbcd7") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.org/ideasman42/emacs-recomplete"))]) + (recomplete . [(20230910 1154) ((emacs (26 1))) "Immediately (re)complete actions" tar ((:commit . "4c9002938fa0480c68e22b86c20d20cea6396ce6") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.org/ideasman42/emacs-recomplete"))]) (recover-buffers . [(20171009 437) nil "revisit all buffers from an auto-save file" tar ((:commit . "81a5cb53099955ebc2a411a44cba5a394ee3f2d1") (:authors ("era eriksson ")) (:maintainers ("era eriksson ")) (:maintainer "era eriksson "))]) (rect+ . [(20150621 44) nil "Extensions to rect.el" tar ((:commit . "299b742faa0bc4448e0d5fe9cb98ab1eb93b8dcc") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "extensions" "data" "tools") (:url . "https://github.com/mhayashi1120/Emacs-rectplus"))]) (rectangle-utils . [(20190411 1757) ((emacs (24)) (cl-lib (0 5))) "Some useful rectangle functions." tar ((:commit . "46f7e73340fee40c1ab9a4e766a08ae3fce83ebe") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainers ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://github.com/thierryvolpiatto/rectangle-utils"))]) (recur . [(20230121 1836) ((emacs (24 3))) "Tail call optimization" tar ((:commit . "043b3267125cb9fa273d0f0afee0dda1fc60c507") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainers ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com") (:keywords "lisp") (:url . "https://github.com/ROCKTAKEY/recur"))]) - (recursion-indicator . [(20230410 1753) ((emacs (27 1)) (compat (29 1 3 4))) "Recursion indicator" tar ((:commit . "95eb885d8719e5e31a42fc99a6a76812fd38df8d") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainers ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:keywords "convenience") (:url . "https://github.com/minad/recursion-indicator"))]) + (recursion-indicator . [(20240122 2254) ((emacs (27 1)) (compat (29 1 4 4))) "Recursion indicator" tar ((:commit . "548838df2ef15fdd8e9d904d0a74182297e3383f") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainers ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:keywords "convenience") (:url . "https://github.com/minad/recursion-indicator"))]) (recursive-narrow . [(20190306 1521) nil "narrow-to-region that operates recursively" tar ((:commit . "5e3e2067d5a148d7e64e64e0355d3b6860e4c259") (:authors ("Nathaniel Flath" . "flat0103@gmail.com")) (:maintainers ("Nathaniel Flath" . "flat0103@gmail.com")) (:maintainer "Nathaniel Flath" . "flat0103@gmail.com") (:url . "http://github.com/nflath/recursive-narrow"))]) (redacted . [(20220108 1037) ((emacs (25 1))) "Obscure text in buffer" tar ((:commit . "b3f44ccf51d9d5274f7837fc825db0a378055744") (:authors ("Benjamin Kästner" . "benjamin.kaestner@gmail.com")) (:maintainers ("Benjamin Kästner" . "benjamin.kaestner@gmail.com")) (:maintainer "Benjamin Kästner" . "benjamin.kaestner@gmail.com") (:keywords "games") (:url . "https://github.com/bkaestner/redacted.el"))]) - (reddigg . [(20230810 2059) ((emacs (26 3)) (promise (1 1)) (ht (2 3)) (request (0 3 0)) (org (9 2))) "A reader for redditt" tar ((:commit . "37f048ec03d02acaf6f5c73802677f10b2dfe031") (:authors ("Thanh Vuong" . "thanhvg@gmail.com")) (:maintainers ("Thanh Vuong" . "thanhvg@gmail.com")) (:maintainer "Thanh Vuong" . "thanhvg@gmail.com") (:url . "https://github.com/thanhvg/emacs-reddigg"))]) - (redis . [(20220429 1758) ((emacs (24)) (cl-lib (0 5))) "Redis integration" tar ((:commit . "a6ad30d6a43b7be083c13f8725b45571d623001a") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainers ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:keywords "convenience") (:url . "https://github.com/emacs-pe/redis.el"))]) + (reddigg . [(20240107 235) ((emacs (26 3)) (promise (1 1)) (ht (2 3)) (request (0 3 0)) (org (9 2))) "A reader for redditt" tar ((:commit . "633c628d4544616cd023ca540819b784a6986426") (:authors ("Thanh Vuong" . "thanhvg@gmail.com")) (:maintainers ("Thanh Vuong" . "thanhvg@gmail.com")) (:maintainer "Thanh Vuong" . "thanhvg@gmail.com") (:url . "https://github.com/thanhvg/emacs-reddigg"))]) + (redis . [(20231111 1733) ((emacs (24)) (cl-lib (0 5))) "Redis integration" tar ((:commit . "84382456beae70677aed2f9558a0b446f8ccc17a") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainers ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:keywords "convenience") (:url . "https://github.com/emacs-pe/redis.el"))]) (redpen-paragraph . [(20160625 1050) ((emacs (24)) (cl-lib (0 5)) (json (1 4))) "RedPen interface." tar ((:commit . "770ffb34b04bfa0ea8484fa1506e96c530168e13") (:authors ("karronoli")) (:maintainers ("karronoli")) (:maintainer "karronoli") (:keywords "document" "proofreading" "help") (:url . "https://github.com/karronoli/redpen-paragraph.el"))]) (redprl . [(20180418 1434) ((emacs (24 3))) "Major mode for editing RedPRL proofs and interacting with RedPRL" tar ((:commit . "4abdbdeda4604ff30ce19c0df3f43e34faf60bd7") (:authors ("Jonathan Sterling" . "jon@jonmsterling.com")) (:maintainers ("Jonathan Sterling" . "jon@jonmsterling.com")) (:maintainer "Jonathan Sterling" . "jon@jonmsterling.com") (:keywords "languages"))]) (redshank . [(20180730 407) ((paredit (21))) "Common Lisp Editing Extensions" tar ((:commit . "d059c5841044aa163664f8bf87c1d981bf0a04fe") (:authors ("Michael Weber" . "michaelw@foldr.org")) (:maintainers ("Michael Weber" . "michaelw@foldr.org")) (:maintainer "Michael Weber" . "michaelw@foldr.org") (:keywords "languages" "lisp"))]) (redtick . [(20180424 2136) ((emacs (24 4))) "Smallest pomodoro timer (1 char)" tar ((:commit . "0faa6b7b479fae39f5d4632f0cbbef0f2917780e") (:authors ("F. Febles")) (:maintainers ("F. Febles")) (:maintainer "F. Febles") (:keywords "calendar") (:url . "http://github.com/ferfebles/redtick"))]) (redtt . [(20181121 21) ((emacs (25 3))) "Major mode for editing redtt proofs" tar ((:commit . "c95d1a0787fb92eb011df690b4bdc1029a611c0b") (:authors ("Jonathan Sterling" . "jon@jonmsterling.com")) (:maintainers ("Jonathan Sterling" . "jon@jonmsterling.com")) (:maintainer "Jonathan Sterling" . "jon@jonmsterling.com") (:keywords "languages") (:url . "http://github.com/RedPRL/redtt"))]) (refine . [(20200507 731) ((emacs (24 3)) (s (1 11 0)) (dash (2 12 0)) (list-utils (0 4 4)) (loop (1 2))) "interactive value editing" tar ((:commit . "d72fa50910b86217a35bb1b7e56adea206052021") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:keywords "convenience"))]) - (reformatter . [(20230804 648) ((emacs (24 3))) "Define commands which run reformatters on the current buffer" tar ((:commit . "bfe3f1c6ece952d39921db16f601123bdd1748ab") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "convenience" "tools") (:url . "https://github.com/purcell/emacs-reformatter"))]) + (reformatter . [(20231122 838) ((emacs (24 3))) "Define commands which run reformatters on the current buffer" tar ((:commit . "ebea79504b40fecb150caf8c39621146164f997e") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "convenience" "tools") (:url . "https://github.com/purcell/emacs-reformatter"))]) (regex-dsl . [(20220125 506) nil "lisp syntax for regexps" tar ((:commit . "8802555ecdab8b50bb64181798497c10cdb5034b") (:authors ("Aliaksey Kandratsenka" . "alk@tut.by")) (:maintainers ("Aliaksey Kandratsenka" . "alk@tut.by")) (:maintainer "Aliaksey Kandratsenka" . "alk@tut.by"))]) (regex-tool . [(20170104 1918) nil "A regular expression evaluation tool for programmers" tar ((:commit . "0b4a0111143c88ef94bec56624cb2e00c1a054e6") (:authors ("John Wiegley" . "johnw@newartisans.com")) (:maintainers ("John Wiegley" . "johnw@newartisans.com")) (:maintainer "John Wiegley" . "johnw@newartisans.com") (:keywords "regex" "languages" "programming" "development") (:url . "http://www.newartisans.com/"))]) (region-bindings-mode . [(20140407 2214) nil "Enable custom bindings when mark is active." tar ((:commit . "3fa5dbdbd7c000bebff6d9d14a4be326ec24b6fc") (:authors ("Fabián E. Gallina" . "fabian@anue.biz")) (:maintainers ("Fabián E. Gallina" . "fabian@anue.biz")) (:maintainer "Fabián E. Gallina" . "fabian@anue.biz") (:keywords "convenience") (:url . "https://github.com/fgallina/region-bindings-mode"))]) (region-convert . [(20210519 1655) ((emacs (24 3))) "Convert string in region by Lisp function" tar ((:commit . "cb3ab0417d7b74e5edd34bf23a70737fc7bf1d3a") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "region" "convenience") (:url . "https://github.com/zonuexe/right-click-context"))]) - (region-occurrences-highlighter . [(20230408 1404) ((emacs (24))) "Mark occurrences of current region (selection)." tar ((:commit . "3fbac20154035d75238facbc3b881ab3b47ab711") (:authors ("Álvaro González Sotillo" . "alvarogonzalezsotillo@gmail.com")) (:maintainers ("Álvaro González Sotillo" . "alvarogonzalezsotillo@gmail.com")) (:maintainer "Álvaro González Sotillo" . "alvarogonzalezsotillo@gmail.com") (:keywords "convenience") (:url . "https://github.com/alvarogonzalezsotillo/region-occurrences-highlighter"))]) + (region-occurrences-highlighter . [(20231122 1110) ((emacs (24))) "Mark occurrences of current region (selection)." tar ((:commit . "f9ad995553be1e6dd70540d7ab1ca0be3077438e") (:authors ("Álvaro González Sotillo" . "alvarogonzalezsotillo@gmail.com")) (:maintainers ("Álvaro González Sotillo" . "alvarogonzalezsotillo@gmail.com")) (:maintainer "Álvaro González Sotillo" . "alvarogonzalezsotillo@gmail.com") (:keywords "convenience") (:url . "https://github.com/alvarogonzalezsotillo/region-occurrences-highlighter"))]) (region-state . [(20181205 1746) nil "Show the number of chars/lines or rows/columns in the region" tar ((:commit . "f9e3926036a7c261b20bad9bf46f68ead8c15024") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainers ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me") (:keywords "convenience") (:url . "https://github.com/xuchunyang/region-state.el"))]) (register-channel . [(20210120 1618) nil "Jump around fast using registers" tar ((:commit . "ed7f563e92170b758dc878fcb5df88d46d5d44cc") (:authors ("Yang Zhao" . "YangZhao11@users.noreply.github.com")) (:maintainers ("Yang Zhao" . "YangZhao11@users.noreply.github.com")) (:maintainer "Yang Zhao" . "YangZhao11@users.noreply.github.com") (:keywords "convenience"))]) (register-quicknav . [(20200524 2006) ((emacs (25 3))) "Quickly jump to next/previous register" tar ((:commit . "c15ea92b0946c28b3f14986d42b15b0b534aa6a2") (:authors ("tastytea" . "tastytea@tastytea.de")) (:maintainers ("tastytea" . "tastytea@tastytea.de")) (:maintainer "tastytea" . "tastytea@tastytea.de") (:keywords "convenience") (:url . "https://schlomp.space/tastytea/register-quicknav"))]) (rego-mode . [(20201102 1420) ((emacs (24 4)) (reformatter (0 3))) "A major mode for rego language" tar ((:commit . "be110e6cef5d34eef0529a8739c68e619cf15310") (:authors ("Sibi Prabakaran" . "sibi@psibi.in")) (:maintainers ("Sibi Prabakaran" . "sibi@psibi.in")) (:maintainer "Sibi Prabakaran" . "sibi@psibi.in") (:keywords "languages") (:url . "https://github.com/psibi/rego-mode"))]) (related . [(20190327 1024) ((cl-lib (0 5))) "Switch back and forth between similarly named buffers." tar ((:commit . "546c7e811b290470288b617f2c27106bd83ccd33") (:authors ("Julien Montmartin")) (:maintainers ("Julien Montmartin")) (:maintainer "Julien Montmartin") (:keywords "file" "buffer" "switch" "selection" "matching" "convenience") (:url . "https://github.com/julien-montmartin/related"))]) - (related-files . [(20230324 934) ((emacs (28 2))) "Easily find files related to the current one" tar ((:commit . "f3f841f625a51b964b88cfe08378311124cc5240") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:keywords "tools") (:url . "https://www.gnu.org/software/emacs/"))]) + (related-files . [(20230903 851) ((emacs (28 2))) "Easily find files related to the current one" tar ((:commit . "8020f375013d5e83c9b8117d118d2402c63e66bb") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:keywords "tools") (:url . "https://www.gnu.org/software/emacs/"))]) (remark-mode . [(20221123 2127) ((emacs (25 1)) (markdown-mode (2 0))) "Major mode for the remark slideshow tool" tar ((:commit . "5a2a702d2af8fd007ae02237d5824356d0c1acc6") (:authors ("@torgeir")) (:maintainers ("@torgeir")) (:maintainer "@torgeir") (:keywords "remark" "slideshow" "markdown" "hot reload"))]) (remember-last-theme . [(20170619 2133) ((emacs (24 4))) "Remember the last used theme between sessions." tar ((:commit . "57e8e2a475ea89316dbb5c4d2ea047f56a2cbcdf") (:authors ("Anler Hernández Peral" . "inbox+emacs@anler.me")) (:maintainers ("Anler Hernández Peral" . "inbox+emacs@anler.me")) (:maintainer "Anler Hernández Peral" . "inbox+emacs@anler.me") (:keywords "convenience" "faces") (:url . "https://github.com/anler/remember-last-theme"))]) (remind-bindings . [(20200820 1723) ((emacs (25 1)) (omni-quotes (0 5)) (popwin (1 0)) (map (2 0))) "Reminders for your init bindings" tar ((:commit . "c9a327bfd3c68a0c41b5b64df491bdee4c73ca39") (:authors ("Mehmet Tekman")) (:maintainers ("Mehmet Tekman")) (:maintainer "Mehmet Tekman") (:keywords "outlines") (:url . "https://github.com/mtekman/remind-bindings.el"))]) @@ -4408,46 +4516,47 @@ (repeat-help . [(20230118 24) ((emacs (28 1))) "Display keybindings for repeat-mode" tar ((:commit . "41dea6fba2edd6ac748d0ca7a6da4058290feede") (:authors ("Karthik Chikmagalur" . "karthikchikmagalur@gmail.com")) (:maintainers ("Karthik Chikmagalur" . "karthikchikmagalur@gmail.com")) (:maintainer "Karthik Chikmagalur" . "karthikchikmagalur@gmail.com") (:keywords "convenience") (:url . "https://github.com/karthink/repeat-help"))]) (repeatable-motion . [(20170620 1848) ((emacs (24))) "Make repeatable versions of motions" tar ((:commit . "77aa35b27c8a76dc8deef87c9f71ef7e6fd289ee") (:authors ("William Hatch" . "willghatch@gmail.com")) (:maintainers ("William Hatch" . "willghatch@gmail.com")) (:maintainer "William Hatch" . "willghatch@gmail.com") (:keywords "motion" "repeatable") (:url . "https://github.com/willghatch/emacs-repeatable-motion"))]) (repeater . [(20180418 1212) ((emacs (24 4))) "Repeat recent repeated commands" tar ((:commit . "854b874542b186b2408cbc58ad0591fe8eb70b6c") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainers ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:keywords "convenience") (:url . "https://github.com/xuchunyang/repeater"))]) - (repl-driven-development . [(20230508 40) ((s (1 12 0)) (dash (2 16 0)) (eros (0 1 0)) (bind-key (2 4 1)) (emacs (27 1)) (org (9 1))) "Send arbitrary code to a REPL in the background" tar ((:commit . "581fa6ac02d77a7a4293965049d801411402098e") (:authors ("Musa Al-hassy" . "alhassy@gmail.com")) (:maintainers ("Musa Al-hassy" . "alhassy@gmail.com")) (:maintainer "Musa Al-hassy" . "alhassy@gmail.com") (:keywords "repl-driven-development" "rdd" "repl" "lisp" "java" "python" "ruby" "programming" "convenience") (:url . "https://alhassy.github.io/repl-driven-development/"))]) + (repl-driven-development . [(20231123 1917) ((s (1 12 0)) (f (0 20 0)) (lf (1 0)) (dash (2 16 0)) (eros (0 1 0)) (bind-key (2 4 1)) (emacs (29)) (f (0 20 0)) (devdocs (0 5)) (pulsar (1 0 1)) (peg (1 0 1)) (hierarchy (0 6 0)) (json-navigator (0 1 1))) "Send arbitrary code to a REPL in the background" tar ((:commit . "05bd1cee8f298173010ed17a98ba2b94cb08d830") (:authors ("Musa Al-hassy" . "alhassy@gmail.com")) (:maintainers ("Musa Al-hassy" . "alhassy@gmail.com")) (:maintainer "Musa Al-hassy" . "alhassy@gmail.com") (:keywords "repl-driven-development" "rdd" "repl" "lisp" "eval" "java" "python" "ruby" "programming" "convenience") (:url . "http://alhassy.com/repl-driven-development"))]) (repl-toggle . [(20220920 752) ((fullframe (0 0 5))) "Switch to/from repl buffer for current major-mode" tar ((:commit . "e05996b4a2b988f93ccce67f933cfad00064360f") (:authors ("Tom Regner" . "tom@goochesa.de")) (:maintainers ("Tom Regner" . "tom@goochesa.de")) (:maintainer "Tom Regner" . "tom@goochesa.de") (:keywords "repl" "buffers" "toggle"))]) - (replace-from-region . [(20170227 2316) nil "Replace commands whose query is from region" tar ((:commit . "dc9318b9b2822da7b00ecc34d1dc965c8f96c9bb") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "replace" "search" "region") (:url . "http://www.emacswiki.org/emacs/download/replace-from-region.el"))]) + (replace-from-region . [(20240224 52) nil "Replace commands whose query is from region" tar ((:commit . "7b5b5ce5488ad5314acaa301d6482bf781db4ebd") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "replace" "search" "region") (:url . "http://www.emacswiki.org/emacs/download/replace-from-region.el"))]) (replace-pairs . [(20160207 1251) ((emacs (24 4))) "Query-replace pairs of things" tar ((:commit . "ef6f2719aab7714f6cb209fd3dd6d2e720681b3c") (:authors ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainers ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainer "David Shepherd" . "davidshepherd7@gmail.com") (:url . "https://github.com/davidshepherd7/replace-pairs"))]) (replace-symbol . [(20160518 12) nil "Rename symbols in expressions or buffers" tar ((:commit . "baf949e528aee1881f455f9c84e67718bedcb3f6") (:authors ("Brian Mastenbrook" . "brian@mastenbrook.net")) (:maintainers ("Brian Mastenbrook" . "brian@mastenbrook.net")) (:maintainer "Brian Mastenbrook" . "brian@mastenbrook.net") (:url . "https://github.com/bmastenbrook/replace-symbol-el"))]) - (replace-with-inflections . [(20180831 635) ((cl-lib (0 5)) (string-inflection (1 0 10)) (inflections (1 1))) "Inflection aware `query-replace'" tar ((:commit . "d9201e047856492f282da65459b28aba25998dbb") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainers ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:keywords "matching") (:url . "https://github.com/knu/replace-with-inflections.el"))]) - (repo . [(20230821 1032) ((emacs (24 3))) "Running repo from Emacs" tar ((:commit . "529623db7c38917709e84d89d518873231139c10") (:authors ("Damien Merenne")) (:maintainers ("Damien Merenne")) (:maintainer "Damien Merenne") (:keywords "convenience") (:url . "https://github.com/canatella/repo-el"))]) + (replace-with-inflections . [(20240122 927) ((cl-lib (0 5)) (string-inflection (1 0 10)) (inflections (1 1))) "Inflection aware `query-replace'" tar ((:commit . "c57cfb06752bb17389465890ff0ef58a7dd465d2") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainers ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:keywords "matching") (:url . "https://github.com/knu/replace-with-inflections.el"))]) + (repo . [(20240119 859) ((emacs (24 3))) "Running repo from Emacs" tar ((:commit . "a257b3f8f47fbb4fc7d5dea967dc543e01c58fee") (:authors ("Damien Merenne")) (:maintainers ("Damien Merenne")) (:maintainer "Damien Merenne") (:keywords "convenience") (:url . "https://github.com/canatella/repo-el"))]) (req-package . [(20180605 1141) ((use-package (1 0)) (dash (2 7 0)) (log4e (0 2 0)) (ht (0))) "A use-package wrapper for package runtime dependencies management" tar ((:commit . "a77da72931914ac5f3f64dc61fe9dc3522b2817e") (:authors ("Edward Knyshov" . "edvorg@gmail.com")) (:maintainers ("Edward Knyshov" . "edvorg@gmail.com")) (:maintainer "Edward Knyshov" . "edvorg@gmail.com") (:keywords "dotemacs" "startup" "speed" "config" "package") (:url . "https://github.com/edvorg/req-package"))]) (request . [(20230127 417) ((emacs (24 4))) "Compatible layer for URL request" tar ((:commit . "01e338c335c07e4407239619e57361944a82cb8a") (:authors ("Takafumi Arakaki ")) (:maintainers ("Takafumi Arakaki ")) (:maintainer "Takafumi Arakaki ") (:url . "https://github.com/tkf/emacs-request"))]) (request-deferred . [(20220614 1604) ((emacs (24 1)) (deferred (0 3 1)) (request (0 3))) "Wrap request.el by deferred" tar ((:commit . "38ed1d2e64138eb16a9d8ed2987cff2e01b4a93b") (:authors ("Takafumi Arakaki ")) (:maintainers ("Takafumi Arakaki ")) (:maintainer "Takafumi Arakaki ") (:url . "https://github.com/tkf/emacs-request"))]) (requirejs . [(20151204 719) ((js2-mode (20150713)) (popup (0 5 3)) (s (1 9 0)) (cl-lib (0 5)) (yasnippet (20151011 1823))) "Requirejs import manipulation and source traversal." tar ((:commit . "4ea2a5fcbc76e4cbb6a7461e6f05f019b75865b1") (:authors ("Joe Heyming" . "joeheyming@gmail.com")) (:maintainers ("Joe Heyming" . "joeheyming@gmail.com")) (:maintainer "Joe Heyming" . "joeheyming@gmail.com") (:keywords "javascript" "requirejs") (:url . "https://github.com/joeheyming/requirejs-emacs"))]) (requirejs-mode . [(20130215 2104) nil "Improved AMD module management" tar ((:commit . "011849043098b6c4f27571625ae19071b53b8824") (:authors ("Marc-Olivier Ricard" . "marco.ricard@gmail.com")) (:maintainers ("Marc-Olivier Ricard" . "marco.ricard@gmail.com")) (:maintainer "Marc-Olivier Ricard" . "marco.ricard@gmail.com") (:keywords "javascript" "amd" "requirejs"))]) - (rescript-mode . [(20230321 1917) ((emacs (26 1))) "A major mode for editing ReScript" tar ((:commit . "a0a21d1c037c78ba4c05108a5e7afd5f75fe7bd7") (:authors ("Karl Landstrom" . "karl.landstrom@brgeight.se") ("Daniel Colascione" . "dancol@dancol.org") ("John Lee" . "jjl@pobox.com")) (:maintainers ("John Lee" . "jjl@pobox.com")) (:maintainer "John Lee" . "jjl@pobox.com") (:keywords "languages" "rescript") (:url . "https://github.com/jjlee/rescript-mode"))]) + (rescript-mode . [(20240312 1235) ((emacs (26 1))) "A major mode for editing ReScript" tar ((:commit . "e97487a8786dd329593c3a786443a6d987d719e9") (:authors ("Karl Landstrom" . "karl.landstrom@brgeight.se") ("Daniel Colascione" . "dancol@dancol.org") ("John Lee" . "jjl@pobox.com")) (:maintainers ("John Lee" . "jjl@pobox.com")) (:maintainer "John Lee" . "jjl@pobox.com") (:keywords "languages" "rescript") (:url . "https://github.com/jjlee/rescript-mode"))]) (resize-window . [(20180918 538) ((emacs (24)) (cl-lib (0 5))) "easily resize windows" tar ((:commit . "09dc5968f1c988c51fcd6ea5d68bb38b7541eb66") (:authors ("Dan Sutton " . "danielsutton01@gmail.com")) (:maintainers ("Dan Sutton " . "danielsutton01@gmail.com")) (:maintainer "Dan Sutton " . "danielsutton01@gmail.com") (:keywords "window" "resize") (:url . "https://github.com/dpsutton/resize-mode"))]) (restart-emacs . [(20201127 1425) nil "Restart emacs from within emacs" tar ((:commit . "d0fca7fba014b2d0d4dedcb9744a1e73cd9a6409") (:authors ("Iqbal Ansari" . "iqbalansari02@yahoo.com")) (:maintainers ("Iqbal Ansari" . "iqbalansari02@yahoo.com")) (:maintainer "Iqbal Ansari" . "iqbalansari02@yahoo.com") (:keywords "convenience") (:url . "https://github.com/iqbalansari/restart-emacs"))]) - (restclient . [(20221203 1808) nil "An interactive HTTP client for Emacs" tar ((:commit . "0ba72816f92f3d5906cdf76f418fd0a3ee72809b") (:authors ("Pavel Kurnosov" . "pashky@gmail.com")) (:maintainers ("Pavel Kurnosov" . "pashky@gmail.com")) (:maintainer "Pavel Kurnosov" . "pashky@gmail.com") (:keywords "http"))]) + (restclient . [(20231010 1327) nil "An interactive HTTP client for Emacs" tar ((:commit . "e2a2b13482d72634f8e49864cd9e5c907a5fe137") (:authors ("Pavel Kurnosov" . "pashky@gmail.com")) (:maintainers ("Pavel Kurnosov" . "pashky@gmail.com")) (:maintainer "Pavel Kurnosov" . "pashky@gmail.com") (:keywords "http"))]) (restclient-helm . [(20170314 1554) ((restclient (0)) (helm (1 9 4))) "helm interface for restclient.el" tar ((:commit . "af7420085dd67ed08d199a2402e8ff3e996c3029") (:authors ("Pavel Kurnosov" . "pashky@gmail.com")) (:maintainers ("Pavel Kurnosov" . "pashky@gmail.com")) (:maintainer "Pavel Kurnosov" . "pashky@gmail.com") (:keywords "http" "helm"))]) (restclient-jq . [(20220426 1734) ((restclient (20200502 831)) (jq-mode (0 4 1)) (emacs (24 4))) "Support for setting restclient vars from jq expressions" tar ((:commit . "ae79e7dd283890072da69b8f48aeec1afd0d9442") (:authors ("Cameron Dorrat" . "cdorrat@gmail.com")) (:maintainers ("Cameron Dorrat" . "cdorrat@gmail.com")) (:maintainer "Cameron Dorrat" . "cdorrat@gmail.com") (:keywords "tools" "comm" "http" "jq") (:url . "https://github.com/pashky/restclient.el"))]) - (restclient-test . [(20210422 1815) ((emacs (26 1)) (restclient (0))) "Run tests with restclient.el" tar ((:commit . "3c6661d087526510a04ea9de421c5869a1a1d061") (:authors ("Simen Heggestøyl" . "simenheg@runbox.com")) (:maintainers ("Simen Heggestøyl" . "simenheg@runbox.com")) (:maintainer "Simen Heggestøyl" . "simenheg@runbox.com") (:url . "https://github.com/simenheg/restclient-test.el"))]) + (restclient-test . [(20240207 1415) ((emacs (26 1)) (restclient (0))) "Run tests with restclient.el" tar ((:commit . "5a364b93779eb3b4566dd6d843d7637983fcc949") (:authors ("Simen Heggestøyl" . "simenheg@runbox.com")) (:maintainers ("Simen Heggestøyl" . "simenheg@runbox.com")) (:maintainer "Simen Heggestøyl" . "simenheg@runbox.com") (:url . "https://github.com/simenheg/restclient-test.el"))]) (retrie . [(20200519 551) ((emacs (24 5))) "Refactoring Haskell code with retrie" tar ((:commit . "976d6f01a3e214917f16b82e750d825cb9bfcc59") (:authors ("Junyoung Clare Jang" . "jjc9310@gmail.com")) (:maintainers ("Junyoung Clare Jang" . "jjc9310@gmail.com")) (:maintainer "Junyoung Clare Jang" . "jjc9310@gmail.com") (:keywords "files" "languages" "tools") (:url . "https://github.com/Ailrun/emacs-retrie"))]) (revbufs . [(20200907 2223) nil "Reverts all out-of-date buffers safely" tar ((:commit . "df3c02d3063951582c693ae12547993cec8256e2") (:authors ("Neil Van Dyke" . "neil@neilvandyke.org")) (:maintainers ("Sam Kleinman" . "sam@tychoish.com")) (:maintainer "Sam Kleinman" . "sam@tychoish.com") (:keywords "convenience" "buffers") (:url . "http://www.neilvandyke.org/revbufs/"))]) - (reveal-in-folder . [(20220704 659) ((emacs (24 3)) (f (0 20 0)) (s (1 12 0))) "Reveal current file in folder" tar ((:commit . "7b2b02356b75e224a0414995af95d45786ee6f7d") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "folder" "finder" "reveal" "file" "explorer") (:url . "https://github.com/jcs-elpa/reveal-in-folder"))]) + (reveal-in-folder . [(20240226 37) ((emacs (24 3)) (f (0 20 0)) (s (1 12 0))) "Reveal current file/directory in folder" tar ((:commit . "ef1b86f745ff2e1d13dc57f6f9fe7e0c53fe26bd") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "folder" "finder" "reveal" "file" "explorer") (:url . "https://github.com/jcs-elpa/reveal-in-folder"))]) (reveal-in-osx-finder . [(20150802 1657) nil "Reveal file associated with buffer in OS X Finder" tar ((:commit . "5710e5936e47139a610ec9a06899f72e77ddc7bc") (:authors ("Kazuki YOSHIDA")) (:maintainers ("Kazuki YOSHIDA")) (:maintainer "Kazuki YOSHIDA") (:keywords "os x" "finder") (:url . "https://github.com/kaz-yos/reveal-in-osx-finder"))]) - (reverse-im . [(20230125 1846) ((emacs (25 1)) (seq (2 23))) "Reverse mapping for non-default system layouts" tar ((:commit . "83c639756357c6b154842997b86e63c583ff8ff4") (:keywords "i18n") (:url . "https://github.com/a13/reverse-im.el"))]) + (reverse-im . [(20240315 1320) ((emacs (25 1)) (seq (2 23))) "Reverse mapping for non-default system layouts" tar ((:commit . "bcd70b49b16abab53165cb464d0a9a5f95bf946b") (:authors ("Juri Linkov" . "juri@jurta.org")) (:maintainers ("DK" . "a13@users.noreply.github.com")) (:maintainer "DK" . "a13@users.noreply.github.com") (:keywords "i18n") (:url . "https://github.com/a13/reverse-im.el"))]) (reverse-theme . [(20141205 145) nil "Reverse theme for Emacs" tar ((:commit . "3105c950bcb51c662c79b59ca102ef662c2b0be0") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-reverse-theme"))]) + (reverso . [(20240113 2128) ((emacs (27 1)) (transient (0 3 7)) (request (0 3 2))) "Translation, grammar checking, context search" tar ((:commit . "7ae99550cd6076009560c4c7a3e4cdf101826041") (:authors ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainers ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainer "Korytov Pavel" . "thexcloud@gmail.com") (:url . "https://github.com/SqrtMinusOne/reverso.el"))]) (revert-buffer-all . [(20230109 536) ((emacs (24 3))) "Revert all open buffers" tar ((:commit . "08e90d2d75f5d5900ca2a0d2670592bcf2b2d68f") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.org/ideasman42/emacs-buffer-revert-all"))]) (review-mode . [(20220817 1010) nil "major mode for ReVIEW" tar ((:commit . "2b24db8d85a1c40dbd67be195caa79c9df1e0f4b") (:authors ("Kenshi Muto" . "kmuto@kmuto.jp")) (:maintainers ("Kenshi Muto" . "kmuto@kmuto.jp")) (:maintainer "Kenshi Muto" . "kmuto@kmuto.jp") (:url . "https://github.com/kmuto/review-el"))]) (rewriting-pcase . [(20230419 23) ((emacs (27 1))) "Support for rewriting sexps in source code" tar ((:commit . "3a2efb79bfc68629bd20a8bc1770c8f6d24575fa") (:authors ("Onnie Winebarger")) (:maintainers ("Onnie Winebarger")) (:maintainer "Onnie Winebarger") (:keywords "extensions" "lisp") (:url . "https://github.com/owinebar/emacs-rewriting-pcase"))]) (reykjavik-theme . [(20201219 947) ((emacs (24))) "Theme with a dark background." tar ((:commit . "f6d8e83946633603234cd1dac725e17447f40bce") (:authors ("martin haesler")) (:maintainers ("martin haesler")) (:maintainer "martin haesler"))]) - (rfc-mode . [(20230307 937) ((emacs (25 1))) "RFC document browser and viewer" tar ((:commit . "c938c8134e7434b623ebfd92ad22586205cb1c92") (:authors ("Nicolas Martyanoff" . "nicolas@n16f.net")) (:maintainers ("Nicolas Martyanoff" . "nicolas@n16f.net")) (:maintainer "Nicolas Martyanoff" . "nicolas@n16f.net") (:url . "https://github.com/galdor/rfc-mode"))]) - (rg . [(20230430 721) ((emacs (26 1)) (transient (0 3 0)) (wgrep (2 1 10))) "A search tool based on ripgrep" tar ((:commit . "e9dc4ed342e0212d08fb82554dfd3c57fdfa5b1a") (:authors ("David Landell" . "david.landell@sunnyhill.email") ("Roland McGrath" . "roland@gnu.org")) (:maintainers ("David Landell" . "david.landell@sunnyhill.email")) (:maintainer "David Landell" . "david.landell@sunnyhill.email") (:keywords "matching" "tools") (:url . "https://github.com/dajva/rg.el"))]) + (rfc-mode . [(20231013 1353) ((emacs (25 1))) "RFC document browser and viewer" tar ((:commit . "ab09db78d9d1baa4da4f926930833598e1e978ce") (:authors ("Nicolas Martyanoff" . "nicolas@n16f.net")) (:maintainers ("Nicolas Martyanoff" . "nicolas@n16f.net")) (:maintainer "Nicolas Martyanoff" . "nicolas@n16f.net") (:url . "https://github.com/galdor/rfc-mode"))]) + (rg . [(20231202 1023) ((emacs (26 1)) (transient (0 3 0)) (wgrep (2 1 10))) "A search tool based on ripgrep" tar ((:commit . "4885473a6d248a6ee508b7b7ef3705762af631d9") (:authors ("David Landell" . "david.landell@sunnyhill.email") ("Roland McGrath" . "roland@gnu.org")) (:maintainers ("David Landell" . "david.landell@sunnyhill.email")) (:maintainer "David Landell" . "david.landell@sunnyhill.email") (:keywords "matching" "tools") (:url . "https://github.com/dajva/rg.el"))]) (rgb . [(20220717 1940) ((emacs (24 3))) "RGB control via OpenRGB" tar ((:commit . "4aab5a5be16b69b47ef5e67d02782df5e41dbd7b") (:url . "https://gitlab.com/cwpitts/rgb.el"))]) (rhq . [(20230731 1544) ((emacs (24 4))) "Client for rhq" tar ((:commit . "9f571787bf0781c78c277db82394fb9a692ec21e") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainers ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com") (:keywords "tools" "extensions") (:url . "https://github.com/ROCKTAKEY/rhq"))]) (rhtml-mode . [(20130422 1311) nil "major mode for editing RHTML files" tar ((:commit . "a6d71b38a3db867ccf82999c99805db1a3a33c33"))]) (rib-mode . [(20170726 1448) ((emacs (24))) "RenderMan® Interface Bytestream (RIB) Major Mode" tar ((:commit . "97470158784c3c212e22e2c20b8471ee65ba59af") (:authors ("Remik Ziemlinski and Daniel Blezek" . "daniel.blezek@gmail.com")) (:maintainers ("Remik Ziemlinski and Daniel Blezek" . "daniel.blezek@gmail.com")) (:maintainer "Remik Ziemlinski and Daniel Blezek" . "daniel.blezek@gmail.com") (:url . "https://github.com/blezek/rib-mode"))]) (rich-minority . [(20190419 1136) ((cl-lib (0 5))) "Clean-up and Beautify the list of minor-modes." tar ((:commit . "a03e693f6f9232cf75363aaaf1cb041f21675c19") (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainers ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") (:keywords "mode-line" "faces") (:url . "https://github.com/Malabarba/rich-minority"))]) (right-click-context . [(20210519 1713) ((emacs (24 3)) (popup (0 5)) (ordinal (0 0 1))) "Right Click Context menu" tar ((:commit . "c3c9d36ffbc9fb2bc7c2c4b75291dbcdb1c5f531") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "mouse" "menu" "rightclick") (:url . "https://github.com/zonuexe/right-click-context"))]) - (rigid-tabs . [(20220416 2123) ((emacs (24 3))) "Fix TAB alignment in diff buffers" tar ((:commit . "872a10c8751574c9610cba1800f541a6eda24997") (:authors ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainers ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainer "Yuri D'Elia" . "wavexx@thregr.org") (:keywords "diff" "whitespace" "version control" "magit") (:url . "https://gitlab.com/wavexx/rigid-tabs.el"))]) + (rigid-tabs . [(20230905 940) ((emacs (24 3))) "Fix TAB alignment in diff buffers" tar ((:commit . "9553118e76fcbc1d8f0bcb960de13c7e3f07b9df") (:authors ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainers ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainer "Yuri D'Elia" . "wavexx@thregr.org") (:keywords "diff" "whitespace" "version control" "magit") (:url . "https://gitlab.com/wavexx/rigid-tabs.el"))]) (rii . [(20210317 1330) ((emacs (24 3))) "Reversible input interface for multiple input" tar ((:commit . "9df603a5c63ae38ec776e27dc93d3618e2b0fabe") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainers ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com") (:keywords "extensions" "tools") (:url . "https://github.com/ROCKTAKEY/rii"))]) - (rime . [(20230212 1425) ((emacs (26 3)) (dash (2 17 0)) (cl-lib (0 6 1)) (popup (0 5 3)) (posframe (0 1 0))) "Rime input method" tar ((:commit . "6438abacace7d94f05fabc45b82d619677fc5fca") (:authors ("Shi Tianshu")) (:maintainers ("Shi Tianshu")) (:maintainer "Shi Tianshu") (:keywords "convenience" "input-method") (:url . "https://www.github.com/DogLooksGood/emacs-rime"))]) + (rime . [(20240130 1427) ((emacs (26 3)) (dash (2 17 0)) (cl-lib (0 6 1)) (popup (0 5 3)) (posframe (0 1 0))) "Rime input method" tar ((:commit . "d8c0a99b0282d3e0aca53146789f6864181228e7") (:authors ("Shi Tianshu")) (:maintainers ("Shi Tianshu")) (:maintainer "Shi Tianshu") (:keywords "convenience" "input-method") (:url . "https://www.github.com/DogLooksGood/emacs-rime"))]) (rimero-theme . [(20180901 1348) ((emacs (24))) "Theme with a dark background suitable for UI and terminal usage." tar ((:commit . "a2e706c2b34f749019979a133f08a2d94a1104b3") (:authors ("Yves Zoundi" . "yveszoundi@users.sf.net")) (:maintainers ("Yves Zoundi" . "yveszoundi@users.sf.net")) (:maintainer "Yves Zoundi" . "yveszoundi@users.sf.net") (:keywords "faces" "theme" "dark" "light colors") (:url . "https://github.com/yveszoundi/emacs-rimero-theme"))]) (rinari . [(20150709 640) ((ruby-mode (1 0)) (inf-ruby (2 2 5)) (ruby-compilation (0 16)) (jump (2 0))) "Rinari Is Not A Rails IDE" tar ((:commit . "be07b0f42aefa24c5d36c441d1f3f72e64fffaa4") (:authors ("Phil Hagelberg, Eric Schulte, Steve Purcell")) (:maintainers ("Phil Hagelberg, Eric Schulte, Steve Purcell")) (:maintainer "Phil Hagelberg, Eric Schulte, Steve Purcell") (:keywords "ruby" "rails" "project" "convenience" "web") (:url . "https://github.com/eschulte/rinari"))]) (ring-mode . [(20221226 1159) ((emacs (24 3))) "A major mode for the Ring programming language" tar ((:commit . "4e38dd5ca374d7d40fd1eeed1e83ef935efd387a") (:authors ("XXIV")) (:maintainers ("XXIV")) (:maintainer "XXIV") (:keywords "files" "ring") (:url . "https://github.com/thechampagne/ring-mode"))]) @@ -4456,16 +4565,17 @@ (riscv-mode . [(20220916 206) ((emacs (24 4))) "Major-mode for RISC V assembly" tar ((:commit . "8e335b9c93de93ed8dd063d702b0f5ad48eef6d7") (:authors ("Adam Niederer ")) (:maintainers ("Adam Niederer")) (:maintainer "Adam Niederer") (:keywords "riscv" "assembly") (:url . "https://github.com/AdamNiederer/riscv-mode"))]) (rivet-mode . [(20201013 1905) ((emacs (24)) (web-mode (16))) "A minor mode for editing Apache Rivet files" tar ((:commit . "6cf58cf04fee933113857af07414b3f27c24b505") (:authors ("Jade Michael Thornton")) (:maintainers ("Jade Michael Thornton")) (:maintainer "Jade Michael Thornton") (:url . "https://gitlab.com/thornjad/rivet-mode"))]) (rjsx-mode . [(20200224 2149) ((emacs (24 4)) (js2-mode (20170504))) "Real support for JSX" tar ((:commit . "0061587a06cdc2579a8d0e90863498d96bf982d8") (:authors ("Felipe Ochoa" . "felipe@fov.space")) (:maintainers ("Felipe Ochoa" . "felipe@fov.space")) (:maintainer "Felipe Ochoa" . "felipe@fov.space") (:keywords "languages") (:url . "https://github.com/felipeochoa/rjsx-mode/"))]) - (rmsbolt . [(20230829 241) ((emacs (25 1))) "A compiler output viewer" tar ((:commit . "9a53f0775765b5d77fa5fc65afeef0433e64a729") (:authors ("Jay Kamat" . "jaygkamat@gmail.com")) (:maintainers ("Jay Kamat" . "jaygkamat@gmail.com")) (:maintainer "Jay Kamat" . "jaygkamat@gmail.com") (:keywords "compilation" "tools") (:url . "http://gitlab.com/jgkamat/rmsbolt"))]) - (robe . [(20230327 113) ((inf-ruby (2 5 1)) (emacs (25 1))) "Code navigation, documentation lookup and completion for Ruby" tar ((:commit . "a8d2c3293f0760194fd138f346bcc8876cbd8640") (:authors ("Dmitry Gutov")) (:maintainers ("Dmitry Gutov")) (:maintainer "Dmitry Gutov") (:keywords "ruby" "convenience" "rails") (:url . "https://github.com/dgutov/robe"))]) + (rmsbolt . [(20240301 1749) ((emacs (25 1))) "A compiler output viewer" tar ((:commit . "1aeeadf7114316b9949e3c212a883ca95c3ddab0") (:authors ("Jay Kamat" . "jaygkamat@gmail.com")) (:maintainers ("Jay Kamat" . "jaygkamat@gmail.com")) (:maintainer "Jay Kamat" . "jaygkamat@gmail.com") (:keywords "compilation" "tools") (:url . "http://gitlab.com/jgkamat/rmsbolt"))]) + (robe . [(20240319 254) ((inf-ruby (2 5 1)) (emacs (25 1))) "Code navigation, documentation lookup and completion for Ruby" tar ((:commit . "863dcfc41e15200e476995586c2aa7bc9cabc5c8") (:authors ("Dmitry Gutov")) (:maintainers ("Dmitry Gutov")) (:maintainer "Dmitry Gutov") (:keywords "ruby" "convenience" "rails") (:url . "https://github.com/dgutov/robe"))]) (robot-log . [(20220719 1301) ((emacs (28 1))) "Major mode for viewing RobotFramework debug log files" tar ((:commit . "26da47597aa97be9649cb60f4da6d94d47d0c0ac") (:keywords "convenience" "files") (:url . "https://git.sr.ht/~apteryx/emacs-robot-log"))]) - (robot-mode . [(20221109 1630) ((emacs (26 1))) "Major-mode for Robot Framework files" tar ((:commit . "fb9be47a1d4e57a80ae2c0d4dff3eba2fe29ebdc") (:authors ("Kalle Kankare" . "kalle.kankare@iki.fi")) (:maintainers ("Kalle Kankare" . "kalle.kankare@iki.fi")) (:maintainer "Kalle Kankare" . "kalle.kankare@iki.fi") (:keywords "languages" "files") (:url . "https://github.com/kopoli/robot-mode"))]) + (robot-mode . [(20231118 826) ((emacs (26 1))) "Major-mode for Robot Framework files" tar ((:commit . "cb12e5adcba3379a67483e268229c152e0a8405f") (:authors ("Kalle Kankare" . "kalle.kankare@iki.fi")) (:maintainers ("Kalle Kankare" . "kalle.kankare@iki.fi")) (:maintainer "Kalle Kankare" . "kalle.kankare@iki.fi") (:keywords "languages" "files") (:url . "https://github.com/kopoli/robot-mode"))]) (robots-txt-mode . [(20190812 1858) nil "Major mode for editing robots.txt" tar ((:commit . "8bf67285a25a6756607354d184e36583f2847e7d") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "languages" "comm" "web") (:url . "https://github.com/emacs-php/robots-txt-mode"))]) (roguel-ike . [(20160120 302) ((popup (0 5 0))) "A coffee-break roguelike" tar ((:commit . "706dcb0687e8016d7d776f9d9e5ace9fdbbca43c") (:authors ("Steven Rémot")) (:maintainer "Steven Rémot"))]) + (rom-party . [(20240218 2044) ((emacs (28)) (dash (2 17 0)) (f (0 2 0)) (s (1 12 0)) (ht (2 3)) (extmap (1 3)) (compat (29 1 4 4)) (async (1 9 7))) "Rendition of jklm.fun's \"Bomb Party\" game" tar ((:commit . "0af8c03de584c91ea1a43c4c94fa4e7bb8c98fa4") (:authors ("Laurence Warne")) (:maintainers ("Laurence Warne")) (:maintainer "Laurence Warne") (:url . "https://github.com/LaurenceWarne/rom-party.el"))]) (ron-mode . [(20200830 1554) ((emacs (24 5 1))) "Rusty Object Notation mode" tar ((:commit . "c5e0454b9916d6b73adc15dab8abbb0b0a68ea22") (:authors ("Daniel Hutzley" . "endergeryt@gmail.com")) (:maintainers ("Daniel Hutzley" . "endergeryt@gmail.com")) (:maintainer "Daniel Hutzley" . "endergeryt@gmail.com") (:keywords "languages") (:url . "https://chiselapp.com/user/Hutzdog/repository/ron-mode/home"))]) (rope-read-mode . [(20211228 1126) ((emacs (24))) "Rearrange lines to read text smoothly" tar ((:commit . "6aad44e006a2999980c138f608d28c8ecab92b35") (:authors ("Marco Wahl" . "marcowahlsoft@gmail.com")) (:maintainers ("Marco Wahl" . "marcowahlsoft@gmail.com")) (:maintainer "Marco Wahl" . "marcowahlsoft@gmail.com") (:keywords "reading" "convenience" "chill") (:url . "https://gitlab.com/marcowahl/rope-read-mode"))]) (ropgadget . [(20230107 1225) ((emacs (24 4)) (transient (0 3 6))) "Display and filter ROP gadgets of a binary" tar ((:commit . "10e9d6f66de1ee805d871c59f4acc078b66747a3") (:keywords "tools" "ctf" "pwn" "rop") (:url . "https://github.com/Dragoncraft89/ropgadget-el"))]) - (ros . [(20230618 1116) ((emacs (27 1)) (s (0)) (with-shell-interpreter (0)) (kv (0)) (cl-lib (0)) (transient (0)) (hydra (0)) (grep (0)) (string-inflection (0)) (docker-tramp (0))) "Package to write code for ROS systems" tar ((:commit . "2776746295d7b0c12c18d4b95e0b8705287666a0") (:authors ("Max Beutelspacher ")) (:maintainers ("Max Beutelspacher" . "max@beutelspacher.eu")) (:maintainer "Max Beutelspacher" . "max@beutelspacher.eu") (:keywords "convenience" "tools") (:url . "https://github.com/DerBeutlin/ros.el"))]) + (ros . [(20231212 729) ((emacs (27 1)) (s (0)) (with-shell-interpreter (0)) (kv (0)) (cl-lib (0)) (transient (0)) (hydra (0)) (grep (0)) (string-inflection (0)) (docker-tramp (0))) "Package to write code for ROS systems" tar ((:commit . "66e0cc154dc7d8ae105f2c95ed9f6a16445945d0") (:authors ("Max Beutelspacher ")) (:maintainers ("Max Beutelspacher" . "max@beutelspacher.eu")) (:maintainer "Max Beutelspacher" . "max@beutelspacher.eu") (:keywords "convenience" "tools") (:url . "https://github.com/DerBeutlin/ros.el"))]) (rotate . [(20210126 637) nil "Rotate the layout of emacs" tar ((:commit . "4e9ac3ff800880bd9b705794ef0f7c99d72900a6") (:authors ("daichi.hirata ")) (:maintainers ("daichi.hirata ")) (:maintainer "daichi.hirata ") (:keywords "window" "layout") (:url . "https://github.com/daichirata/emacs-rotate"))]) (roy-mode . [(20121208 1158) nil "Roy major mode" tar ((:commit . "e1a4fb5ec0f46e82f569865ca47042ba5934e425") (:authors ("Georgii Leontiev")) (:maintainers ("Georgii Leontiev")) (:maintainer "Georgii Leontiev") (:keywords "extensions") (:url . "https://github.com/folone/roy-mode"))]) (rpm-spec-mode . [(20160710 1136) nil "RPM spec file editing commands for Emacs/XEmacs" tar ((:commit . "c1c38050c48ea330c7cea632b8785d66daeefb2b") (:authors ("Stig Bjørlykke," . "stig@bjorlykke.org")) (:maintainers ("Stig Bjørlykke," . "stig@bjorlykke.org")) (:maintainer "Stig Bjørlykke," . "stig@bjorlykke.org") (:keywords "unix" "languages"))]) @@ -4489,18 +4599,19 @@ (ruby-refactor . [(20160214 1650) ((ruby-mode (1 2))) "A minor mode which presents various Ruby refactoring helpers." tar ((:commit . "e6b7125878a08518bffec6942df0c606f748e9ee") (:keywords "refactor" "ruby") (:url . "https://github.com/ajvargo/ruby-refactor"))]) (ruby-test-mode . [(20210205 1107) ((ruby-mode (1 0)) (pcre2el (1 8))) "Minor mode for Behaviour and Test Driven" tar ((:commit . "d66db4aca6e6a246f65f7195ecfbc7581d35fb7a") (:authors ("Roman Scherer" . "roman.scherer@gmx.de") ("Caspar Florian Ebeling" . "florian.ebeling@gmail.com")) (:maintainers ("Roman Scherer" . "roman.scherer@burningswell.com")) (:maintainer "Roman Scherer" . "roman.scherer@burningswell.com") (:keywords "ruby" "unit" "test" "rspec" "tools") (:url . "https://github.com/ruby-test-mode/ruby-test-mode"))]) (ruby-tools . [(20151209 1615) nil "Collection of handy functions for ruby-mode." tar ((:commit . "6b97066b58a4f82eb2ecea6434a0a7e981aa4c18") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:keywords "speed" "convenience" "ruby") (:url . "http://github.com/rejeep/ruby-tools"))]) + (ruff-format . [(20231117 2220) ((emacs (24)) (reformatter (0 3))) "Ruff format Python source" tar ((:commit . "af6bd49b48cd1583b05268b7d2efc1c7e1c6a113") (:authors ("Ville Skyttä" . "ville.skytta@iki.fi")) (:maintainers ("Ville Skyttä" . "ville.skytta@iki.fi")) (:maintainer "Ville Skyttä" . "ville.skytta@iki.fi") (:url . "https://github.com/scop/emacs-ruff-format"))]) (rufo . [(20170718 1416) ((emacs (24 3))) "use rufo to automatically format ruby files" tar ((:commit . "85a6d80fb05fef396a8029b8f944c92a53faf8fe") (:authors ("Daniel Ma" . "danielhgma@gmail.com")) (:maintainers ("Daniel Ma" . "danielhgma@gmail.com")) (:maintainer "Daniel Ma" . "danielhgma@gmail.com") (:url . "https://github.com/danielma/rufo.el"))]) (ruled-switch-buffer . [(20211205 636) ((emacs (24 3))) "Rule based buffer switching" tar ((:commit . "99b53f7679e3eb868e4b4585085bbed102e5fce7") (:authors ("Kazuki Nishikawa" . "kzkn@hey.com")) (:maintainers ("Kazuki Nishikawa" . "kzkn@hey.com")) (:maintainer "Kazuki Nishikawa" . "kzkn@hey.com") (:keywords "convenience") (:url . "https://github.com/kzkn/ruled-switch-buffer"))]) (rum-mode . [(20180127 22) ((emacs (24))) "Major mode for Rum programming language" tar ((:commit . "161471e6476d232d479f9767535918920811d7bf") (:keywords "rum" "languages" "lisp") (:url . "https://github.com/rumlang/rum-mode"))]) (run-command . [(20230317 2004) ((emacs (27 1))) "Run an external command from a context-dependent list" tar ((:commit . "477c42acce9e36ec59d18deaa73992f94faf7b99") (:authors ("Massimiliano Mirra" . "hyperstruct@gmail.com")) (:maintainers ("Massimiliano Mirra" . "hyperstruct@gmail.com")) (:maintainer "Massimiliano Mirra" . "hyperstruct@gmail.com") (:keywords "processes") (:url . "https://github.com/bard/emacs-run-command"))]) - (run-command-recipes . [(20230823 1307) ((emacs (25 1)) (dash (2 18 0)) (f (0 20 0)) (run-command (0 1 0))) "This is collection of recipes to `run-command'" tar ((:commit . "ccc4022431ed82dbfcfe4e8b6aa1e9f2d0f76eab") (:authors ("semenInRussia" . "hrams205@gmail.com")) (:maintainers ("semenInRussia" . "hrams205@gmail.com")) (:maintainer "semenInRussia" . "hrams205@gmail.com") (:keywords "extensions" "run-command") (:url . "https://github.com/semenInRussia/emacs-run-command-recipes"))]) + (run-command-recipes . [(20231219 1331) ((emacs (25 1)) (dash (2 18 0)) (f (0 20 0)) (run-command (0 1 0))) "This is collection of recipes to `run-command'" tar ((:commit . "63405333f23b33ecda08e716eca8588c8950952d") (:authors ("semenInRussia" . "hrams205@gmail.com")) (:maintainers ("semenInRussia" . "hrams205@gmail.com")) (:maintainer "semenInRussia" . "hrams205@gmail.com") (:keywords "extensions" "run-command") (:url . "https://github.com/semenInRussia/emacs-run-command-recipes"))]) (run-stuff . [(20230601 19) ((emacs (25 1))) "Context based command execution" tar ((:commit . "65afd896896a68e6262187745f5e3ac5145ba1ed") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:keywords "files" "lisp" "files" "convenience" "hypermedia") (:url . "https://codeberg.org/ideasman42/emacs-run-stuff"))]) (runner . [(20160524 1048) nil "Improved \"open with\" suggestions for dired" tar ((:commit . "a211d57ddc600410d07a8b534920ba905b093d87") (:authors ("Thamer Mahmoud" . "thamer.mahmoud@gmail.com")) (:maintainers ("Thamer Mahmoud" . "thamer.mahmoud@gmail.com")) (:maintainer "Thamer Mahmoud" . "thamer.mahmoud@gmail.com") (:keywords "shell command" "dired" "file extension" "open with") (:url . "https://github.com/thamer/runner"))]) (runtests . [(20150807 831) nil "Run unit tests from Emacs" tar ((:commit . "ed90249f24cc48290018df48b9b9b7172440be3e") (:authors ("Sune Simonsen" . "sune@we-knowhow.dk")) (:maintainers ("Sune Simonsen" . "sune@we-knowhow.dk")) (:maintainer "Sune Simonsen" . "sune@we-knowhow.dk") (:keywords "test") (:url . "https://github.com/sunesimonsen/emacs-runtests"))]) (russian-holidays . [(20170109 2140) nil "Russian holidays for the calendar" tar ((:commit . "b285a30f29d85c48e3ea4eb93972d34a090c167b") (:authors ("Alexander I.Grafov" . "siberian@laika.name")) (:maintainers ("Alexander I.Grafov" . "siberian@laika.name")) (:maintainer "Alexander I.Grafov" . "siberian@laika.name") (:url . "https://github.com/grafov/russian-holidays"))]) (russian-techwriter . [(20221229 822) nil "Input methods for Russian technical writers" tar ((:commit . "1d86134d04ecf2305969c7546ead7ad425cd7243") (:authors ("Maxim Dunaevskii" . "dunmaksim@yandex.ru")) (:maintainers ("Maxim Dunaevskii")) (:maintainer "Maxim Dunaevskii") (:keywords "multilingual" "input method" "cyrillic" "i18n") (:url . "https://github.com/dunmaksim/emacs-russian-techwriter-input-method"))]) (rust-auto-use . [(20200608 1359) nil "Utility to automatically insert Rust use statements" tar ((:commit . "d5205f7b9b9eae0f7d0893f87d3391464719f9c0") (:authors ("Rotem Yaari" . "rotemy@MBP.local")) (:maintainers ("Rotem Yaari" . "rotemy@MBP.local")) (:maintainer "Rotem Yaari" . "rotemy@MBP.local") (:keywords "languages"))]) - (rust-mode . [(20230805 1558) ((emacs (25 1))) "A major-mode for editing Rust source code" tar ((:commit . "fac7d284d24080d0886c47d20bbddbf60ec51511") (:authors ("Mozilla")) (:maintainers ("Mozilla")) (:maintainer "Mozilla") (:keywords "languages") (:url . "https://github.com/rust-lang/rust-mode"))]) + (rust-mode . [(20240313 157) ((emacs (25 1))) "A major-mode for editing Rust source code" tar ((:commit . "87bf4ea711456c858445ec4c22b3552fd796708d") (:authors ("Mozilla" . "rust-mode@noreply.github.com")) (:maintainers ("Mozilla" . "rust-mode@noreply.github.com")) (:maintainer "Mozilla" . "rust-mode@noreply.github.com") (:keywords "languages") (:url . "https://github.com/rust-lang/rust-mode"))]) (rust-playground . [(20200116 1043) ((emacs (24 3))) "Local Rust playground for short code snippets." tar ((:commit . "5a117781dcb66065bea7830dd73618008fc34949") (:authors ("Alexander I.Grafov" . "grafov@gmail.com")) (:maintainers ("Alexander I.Grafov" . "grafov@gmail.com")) (:maintainer "Alexander I.Grafov" . "grafov@gmail.com") (:keywords "tools" "rust") (:url . "https://github.com/grafov/rust-playground"))]) (rustic . [(20230130 912) ((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 . "a5fc66c8167a827a57c4426e4b8dbe717b3be43c") (:authors ("Mozilla")) (:maintainers ("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")) (:maintainers ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainer "Shuguang Sun" . "shuguang79@qq.com") (:keywords "convenience") (:url . "https://github.com/ShuguangSun/rutils.el"))]) @@ -4511,7 +4622,7 @@ (s12cpuv2-mode . [(20171013 2051) ((emacs (24 3))) "Major-mode for S12CPUV2 assembly" tar ((:commit . "b17d4cf848dec1e20e66458e5c7ff77a2c051a8c") (:authors ("Adam Niederer" . "adam.niederer@gmail.com")) (:maintainers ("Adam Niederer" . "adam.niederer@gmail.com")) (:maintainer "Adam Niederer" . "adam.niederer@gmail.com") (:keywords "s12cpuv2" "assembly" "languages") (:url . "https://github.com/AdamNiederer/s12cpuv2-mode"))]) (s3ed . [(20200929 1317) ((emacs (25 1)) (dash (2 17 0)) (s (1 12 0))) "Tramp-like access to s3" tar ((:commit . "2234444ead6c4c6fc3fea548958b36d2c29a9938") (:authors ("Matt Usifer" . "mattusifer@gmail.com")) (:maintainers ("Matt Usifer" . "mattusifer@gmail.com")) (:maintainer "Matt Usifer" . "mattusifer@gmail.com") (:keywords "s3" "tools") (:url . "https://github.com/mattusifer/s3ed"))]) (sackspace . [(20130719 956) nil "A better backspace" tar ((:commit . "fd0480eaaf6d3d11fd30ac5feb2da2f4f7572708") (:authors ("Michael Markert" . "markert.michael@googlemail.com")) (:maintainers ("Michael Markert" . "markert.michael@googlemail.com")) (:maintainer "Michael Markert" . "markert.michael@googlemail.com") (:keywords "delete" "convenience") (:url . "http://github.com/cofi/sackspace.el"))]) - (sage-shell-mode . [(20230710 913) ((cl-lib (0 6 1)) (emacs (24 4)) (let-alist (1 0 5)) (deferred (0 5 1))) "A front-end for Sage Math" tar ((:commit . "70296a6d7775a6cd7630796207b69920e829b6b1") (:authors ("Sho Takemori" . "stakemorii@gmail.com")) (:maintainers ("Sho Takemori" . "stakemorii@gmail.com")) (:maintainer "Sho Takemori" . "stakemorii@gmail.com") (:keywords "sage" "math") (:url . "https://github.com/sagemath/sage-shell-mode"))]) + (sage-shell-mode . [(20231013 1408) ((cl-lib (0 6 1)) (emacs (24 4)) (let-alist (1 0 5)) (deferred (0 5 1))) "A front-end for Sage Math" tar ((:commit . "2f069323cb722c608405a3621d8185f4b7130fc3") (:authors ("Sho Takemori" . "stakemorii@gmail.com")) (:maintainers ("Sho Takemori" . "stakemorii@gmail.com")) (:maintainer "Sho Takemori" . "stakemorii@gmail.com") (:keywords "sage" "math") (:url . "https://github.com/sagemath/sage-shell-mode"))]) (sailfish-scratchbox . [(20171202 1332) nil "Sailfish OS scratchbox inside the emacs." tar ((:commit . "bb5ed0f0b0cd72f2eb1af065b7587ec81866b089") (:authors ("V. V. Polevoy" . "fx@thefx.co")) (:maintainers ("V. V. Polevoy" . "fx@thefx.co")) (:maintainer "V. V. Polevoy" . "fx@thefx.co") (:keywords "sb2" "mb2" "building" "scratchbox" "sailfish") (:url . "https://github.com/vityafx/sailfish-scratchbox.el"))]) (sakura-theme . [(20220822 254) nil "Filled with cherry blossoms" tar ((:commit . "d78648632a94dd5354d2fed0f94fcb7aece29132") (:url . "http://github.com/emacsfodder/emacs-theme-sakura"))]) (salesforce-utils . [(20160814 154) ((cl-lib (0 5))) "simple utilities for Salesforce" tar ((:commit . "73328baf0fb94ac0d0de645a8f6d42e5ae27f773") (:authors ("Sean McAfee")) (:maintainers ("Sean McAfee")) (:maintainer "Sean McAfee") (:url . "https://github.com/grimnebulin/emacs-salesforce"))]) @@ -4523,13 +4634,14 @@ (save-load-path . [(20140206 1214) nil "save load-path and reuse it to test" tar ((:commit . "6cb763a37e2b8af505bff2bcd11fd49c9ea04d66") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "lisp") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/save-load-path.el"))]) (save-visited-files . [(20200212 414) nil "save opened files across sessions" tar ((:commit . "8203a05a322324ec17b14437c8dfb38efdb53241") (:authors ("Nathaniel Flath" . "nflath@gmail.com")) (:maintainers ("Nathaniel Flath" . "nflath@gmail.com")) (:maintainer "Nathaniel Flath" . "nflath@gmail.com") (:url . "http://github.com/nflath/save-visited-files"))]) (savekill . [(20140418 229) nil "Save kill ring to disk" tar ((:commit . "67fc94e3d8fe8ce3ca16f90518f6a46479b63e34") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "tools") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/savekill.el"))]) - (saveplace-pdf-view . [(20230805 1359) ((emacs (24 1))) "Save place in pdf-view buffers" tar ((:commit . "abfb5e1f463cffc18218a0f7f2fa141a271b1813") (:authors ("Nicolai Singh ")) (:maintainers ("Nicolai Singh ")) (:maintainer "Nicolai Singh ") (:keywords "files" "convenience") (:url . "https://github.com/nicolaisingh/saveplace-pdf-view"))]) + (saveplace-pdf-view . [(20240209 505) ((emacs (24 1))) "Save place in pdf-view buffers" tar ((:commit . "ee95460cd934080338f03a16f95b549577425216") (:authors ("Nicolai Singh ")) (:maintainers ("Nicolai Singh ")) (:maintainer "Nicolai Singh ") (:keywords "files" "convenience") (:url . "https://github.com/nicolaisingh/saveplace-pdf-view"))]) (say-what-im-doing . [(20160706 1931) nil "dictate what you're doing with text to speech" tar ((:commit . "5b2ce6783b02805bcac1107a149bfba3852cd9d5") (:authors ("Benaiah Mischenko")) (:maintainers ("Benaiah Mischenko")) (:maintainer "Benaiah Mischenko") (:keywords "text to speech" "dumb" "funny") (:url . "http://github.com/benaiah/say-what-im-doing"))]) (sayid . [(20220101 1357) ((cider (0 21 0))) "sayid nREPL middleware client" tar ((:commit . "879aff586336a0ec4d46c0ed4720fb1de22082bd") (:authors ("Bill Piel" . "bill@billpiel.com")) (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev") (:keywords "clojure" "cider" "debugger") (:url . "https://github.com/clojure-emacs/sayid"))]) - (sbt-mode . [(20211203 1148) ((emacs (24 4))) "Interactive support for sbt projects" tar ((:commit . "9fe1e8807c22cc1dc56a6233e000969518907f4d") (:keywords "languages") (:url . "https://github.com/hvesalai/emacs-sbt-mode"))]) - (scad-mode . [(20230315 1950) ((emacs (27 1)) (compat (29 1 4 0))) "A major mode for editing OpenSCAD code" tar ((:commit . "e1af74735ad6113448c99b3ab128a665e6adaaca") (:authors ("Len Trigg, Łukasz Stelmach, zk_phi, Daniel Mendler")) (:maintainers ("Len Trigg , Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Len Trigg , Daniel Mendler" . "mail@daniel-mendler.de") (:keywords "languages") (:url . "https://github.com/openscad/emacs-scad-mode"))]) + (sbt-mode . [(20240208 626) ((emacs (24 4))) "Interactive support for sbt projects" tar ((:commit . "bcf8d6040021013430b39d6f6766ce1aab0b691a") (:keywords "languages") (:url . "https://github.com/hvesalai/emacs-sbt-mode"))]) + (scad-mode . [(20240224 1251) ((emacs (27 1)) (compat (29 1 4 4))) "A major mode for editing OpenSCAD code" tar ((:commit . "1bae3dab16adf1f0d47befcc6d2b63a50af87231") (:authors ("Len Trigg, Łukasz Stelmach, zk_phi, Daniel Mendler")) (:maintainers ("Len Trigg , Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Len Trigg , Daniel Mendler" . "mail@daniel-mendler.de") (:keywords "languages") (:url . "https://github.com/openscad/emacs-scad-mode"))]) (scad-preview . [(20211212 1128) ((scad-mode (91 0)) (emacs (24 4))) "Preview SCAD models in real-time within Emacs" tar ((:commit . "c5449b26c63f3e0a695905a7e4e84f8d844f761b") (:authors ("zk_phi")) (:maintainers ("zk_phi")) (:maintainer "zk_phi") (:url . "https://zk-phi.github.io/"))]) - (scala-mode . [(20221025 1502) nil "Major mode for editing Scala" tar ((:commit . "5d7cf21c37e345c49f921fe5111a49fd54efd1e0") (:keywords "languages") (:url . "https://github.com/hvesalai/emacs-scala-mode"))]) + (scala-mode . [(20240113 1743) nil "Major mode for editing Scala" tar ((:commit . "4c6d636b86e3bb1d95de819dc48dda92abdfbcf4") (:keywords "languages") (:url . "https://github.com/hvesalai/emacs-scala-mode"))]) + (scala-ts-mode . [(20240309 1136) ((emacs (29 1))) "Scala Tree-Sitter Mode" tar ((:commit . "0a34b23b3b71be1e0ce307df873434c08408fc57") (:authors ("Karan Ahlawat" . "ahlawatkaran12@gmail.com")) (:maintainers ("Karan Ahlawat" . "ahlawatkaran12@gmail.com")) (:maintainer "Karan Ahlawat" . "ahlawatkaran12@gmail.com") (:keywords "scala" "languages" "tree-sitter") (:url . "https://github.com/KaranAhlawat/scala-ts-mode"))]) (scf-mode . [(20151122 248) nil "shorten file-names in compilation type buffers" tar ((:commit . "dbfcdcd89034f208d65e181af58e0d73ad09f8b2") (:authors ("Le Wang")) (:maintainers ("Le Wang")) (:maintainer "Le Wang") (:keywords "compilation") (:url . "https://github.com/lewang/scf-mode"))]) (scheme-complete . [(20201112 442) nil "Smart auto completion for Scheme in Emacs" tar ((:commit . "b9a1448c4696f117d9ea4e59b6162dc31112e71a") (:authors ("Alex Shinn")) (:maintainers ("Alex Shinn")) (:maintainer "Alex Shinn"))]) (scholar-import . [(20230412 1413) ((emacs (26 1)) (org (9 0)) (request (0 3 0)) (s (1 10 0)) (parsebib (4 2))) "Import Bibtex & PDF from Google Scholar" tar ((:commit . "2456367578caa7fd768e30238ce080687faa0a25") (:authors ("Anh T Nguyen ")) (:maintainers ("Anh T Nguyen ")) (:maintainer "Anh T Nguyen ") (:url . "https://github.com/teeann/scholar-import"))]) @@ -4537,7 +4649,7 @@ (scihub . [(20220913 618) ((emacs (27 1))) "Sci-Hub integration" tar ((:commit . "56aa7205b5f2a6c9821557f9f1b9ff76dc1bb882") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainers ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:keywords "convenience") (:url . "https://github.com/emacs-pe/scihub.el"))]) (sclang-extensions . [(20160509 338) ((auto-complete (1 4 0)) (s (1 3 1)) (dash (1 2 0)) (emacs (24 1))) "Extensions for the SuperCollider Emacs mode." tar ((:commit . "e9cc79732f16fdb582129303110c163dcc0d6da0") (:authors ("Chris Barrett" . "chris.d.barrett@me.com")) (:maintainers ("Chris Barrett" . "chris.d.barrett@me.com")) (:maintainer "Chris Barrett" . "chris.d.barrett@me.com") (:keywords "sclang" "supercollider" "languages" "tools"))]) (sclang-snippets . [(20130513 751) ((yasnippet (0 8 0))) "Snippets for the SuperCollider Emacs mode" tar ((:commit . "c840a416b96f83bdd70491e3d1fbe2f1ae8b3f58") (:authors ("ptrv" . "mail@petervasil.net")) (:maintainers ("ptrv" . "mail@petervasil.net")) (:maintainer "ptrv" . "mail@petervasil.net") (:keywords "snippets"))]) - (scopeline . [(20230622 829) ((emacs (26 1))) "Show scope info of blocks in buffer at end of scope" tar ((:commit . "254d300aee0a22349b07fbe542fbec81547bae75") (:keywords "scope" "context" "tree-sitter" "convenience") (:url . "https://github.com/meain/scopeline.el"))]) + (scopeline . [(20231027 1524) ((emacs (26 1))) "Show scope info of blocks in buffer at end of scope" tar ((:commit . "58d6ef20b6cf398c48571239311d812a2f926ecb") (:keywords "scope" "context" "tree-sitter" "convenience") (:url . "https://github.com/meain/scopeline.el"))]) (scpaste . [(20230627 1800) ((htmlize (1 39))) "Paste to the web via scp." tar ((:commit . "4723c551951c5e86ceaf078846f4f46db38739fe") (:authors ("Phil Hagelberg")) (:maintainers ("Phil Hagelberg")) (:maintainer "Phil Hagelberg") (:keywords "convenience" "hypermedia") (:url . "https://git.sr.ht/~technomancy/scpaste"))]) (scratch . [(20220319 1705) ((emacs (25 1))) "Mode-specific scratch buffers" tar ((:commit . "f000648c9663833a76a8de9b1e78c99a9d698e48") (:authors ("Ian Eure" . "ian.eure@gmail.com")) (:maintainers ("Ian Eure" . "ian.eure@gmail.com")) (:maintainer "Ian Eure" . "ian.eure@gmail.com") (:keywords "convenience" "tools" "files") (:url . "https://github.com/ieure/scratch-el"))]) (scratch-comment . [(20200812 1025) ((emacs (26 1))) "Insert Elisp result as comment in scratch buffer" tar ((:commit . "cf3e967b4def1308b6ef1cfeedd2cf15ee6e226c") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "convenience") (:url . "https://github.com/conao3/scratch-comment.el"))]) @@ -4549,16 +4661,16 @@ (scratches . [(20151006 416) ((dash (2 11 0)) (f (0 17 0))) "Multiple scratches in any language" tar ((:commit . "9441afe6396ca38f08029123fab5d87429cbf315") (:authors ("Zhang Kai Yu" . "yeannylam@gmail.com")) (:maintainers ("Zhang Kai Yu" . "yeannylam@gmail.com")) (:maintainer "Zhang Kai Yu" . "yeannylam@gmail.com") (:keywords "scratch"))]) (scribble-mode . [(20190912 200) ((emacs (24))) "Major mode for editing Scribble documents" tar ((:commit . "5c3ea3cc9bbad585476eee41ea76dc056c2012bb") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainers ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:keywords "convenience") (:url . "https://github.com/emacs-pe/scribble-mode"))]) (scroll-on-drag . [(20230313 546) ((emacs (26 2))) "Interactive scrolling" tar ((:commit . "179c2acecc48d3ceca4b449b2a225d684002bb32") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.org/ideasman42/emacs-scroll-on-drag"))]) - (scroll-on-jump . [(20230201 141) ((emacs (26 2))) "Scroll when jumping to a new point" tar ((:commit . "220e4a8f21cc0b430c693a3ecac08156da2602c1") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.com/ideasman42/emacs-scroll-on-jump"))]) + (scroll-on-jump . [(20240204 1217) ((emacs (26 2))) "Scroll when jumping to a new point" tar ((:commit . "c079d9321646bf4fd65b684fcd130cc4833c2e43") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.org/ideasman42/emacs-scroll-on-jump"))]) (scrollable-quick-peek . [(20201224 329) ((quick-peek (1 0)) (emacs (24 4))) "Display scrollable overlays" tar ((:commit . "3e3492145a61831661d6e97fdcb47b5b66c73287") (:authors ("Pablo Barrantes" . "xjpablobrx@gmail.com")) (:maintainers ("Pablo Barrantes" . "xjpablobrx@gmail.com")) (:maintainer "Pablo Barrantes" . "xjpablobrx@gmail.com") (:keywords "convenience" "extensions" "help" "tools") (:url . "https://github.com/jpablobr/scrollable-quick-peek"))]) (scrollkeeper . [(20190109 629) ((emacs (25 1))) "Custom scrolling commands with visual guidelines" tar ((:commit . "3c4ac6b6b44686d31c260ee0b19daaee59bdccd6") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "convenience") (:url . "https://github.com/alphapapa/scrollkeeper.el"))]) (scrooge . [(20180630 1022) ((emacs (24)) (cl-lib (0 5)) (dash (2 13 0)) (thrift (0 9 3))) "Major mode for Twitter Scrooge files" tar ((:commit . "0a8c58e9e6708abe4ef7e415bc1e0472318bb1b0") (:authors ("Daniel McClanahan" . "danieldmcclanahan@gmail.com")) (:maintainers ("Daniel McClanahan" . "danieldmcclanahan@gmail.com")) (:maintainer "Daniel McClanahan" . "danieldmcclanahan@gmail.com") (:keywords "scrooge" "thrift"))]) (scss-mode . [(20180123 1708) nil "Major mode for editing SCSS files" tar ((:commit . "cf58dbec5394280503eb5502938f3b5445d1b53d") (:authors ("Anton Johansson" . "anton.johansson@gmail.com")) (:maintainers ("Anton Johansson" . "anton.johansson@gmail.com")) (:maintainer "Anton Johansson" . "anton.johansson@gmail.com") (:keywords "scss" "css" "mode") (:url . "https://github.com/antonj/scss-mode"))]) - (sculpture-themes . [(20230728 1045) ((emacs (26 1))) "Themes with vivid colors" tar ((:commit . "b6267c23afc1c40d7ba477f4c8db319c5dfa51a8") (:authors ("t-e-r-m" . "newenewen@tutanota.com")) (:maintainers ("t-e-r-m" . "newenewen@tutanota.com")) (:maintainer "t-e-r-m" . "newenewen@tutanota.com") (:url . "https://github.com/t-e-r-m/sculpture-theme"))]) + (sculpture-themes . [(20230905 439) ((emacs (26 1))) "Themes with vivid colors" tar ((:commit . "7165c7655873ca3c3dc9ff878ddf8a9bdabcf4d4") (:authors ("t-e-r-m" . "newenewen@tutanota.com")) (:maintainers ("t-e-r-m" . "newenewen@tutanota.com")) (:maintainer "t-e-r-m" . "newenewen@tutanota.com") (:url . "https://github.com/t-e-r-m/sculpture-theme"))]) (sdcv . [(20220210 1412) ((emacs (24 3)) (popup (0 5 3)) (showtip (0 1)) (pos-tip (0 4 6)) (cl-lib (0 3))) "Interface for sdcv (StartDict console version)." tar ((:commit . "98e239c7380c63282845d5bc55ea6d605f5a33b8") (:authors ("Andy Stewart" . "lazycat.manatee@gmail.com")) (:maintainers ("Andy Stewart" . "lazycat.manatee@gmail.com")) (:maintainer "Andy Stewart" . "lazycat.manatee@gmail.com") (:keywords "startdict" "sdcv") (:url . "https://repo.or.cz/sdcv.el.git"))]) (sdlang-mode . [(20161201 711) ((emacs (24 3))) "Major mode for Simple Declarative Language files." tar ((:commit . "d42a6eedefeb44919fbacf58d302b6df18f05bbc") (:authors ("Vladimir Panteleev")) (:maintainers ("Vladimir Panteleev")) (:maintainer "Vladimir Panteleev") (:keywords "languages") (:url . "https://github.com/CyberShadow/sdlang-mode"))]) (search-web . [(20150312 1103) nil "Post web search queries using `browse-url'." tar ((:commit . "c4ae86ac1acfc572b81f3d78764bd9a54034c331") (:authors ("Tomoya Otake" . "tomoya.ton@gmail.com")) (:maintainers ("Tomoya Otake" . "tomoya.ton@gmail.com")) (:maintainer "Tomoya Otake" . "tomoya.ton@gmail.com"))]) - (searcher . [(20220704 758) ((emacs (25 1)) (dash (2 10)) (f (0 20 0))) "Searcher in pure elisp" tar ((:commit . "6debf99431a5cb4d1db55e5379453c6a181a133f") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "search" "searcher" "string") (:url . "https://github.com/jcs-elpa/searcher"))]) + (searcher . [(20240101 938) ((emacs (25 1)) (dash (2 10)) (f (0 20 0))) "Searcher in pure elisp" tar ((:commit . "b2b62cb49312725b05d133c2e155b00d885dc8f5") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "search" "searcher" "string") (:url . "https://github.com/jcs-elpa/searcher"))]) (searchq . [(20150829 1211) ((emacs (24 3))) "Framework of queued search tasks using GREP, ACK, AG and more." tar ((:commit . "dd510d55ad66a82c6ef022cfe7c4a73ad5365f82") (:authors ("boyw165")) (:maintainers ("boyw165")) (:maintainer "boyw165"))]) (secretaria . [(20191128 250) ((emacs (24 4)) (alert (1 2)) (s (1 12)) (f (0 20 0)) (org (9))) "A personal assistant based on org-mode" tar ((:commit . "03986130a2ada1fa952d45e83536729f20230fcf") (:authors ("Jorge Araya Navarro" . "jorge@esavara.cr")) (:maintainers ("Jorge Araya Navarro" . "jorge@esavara.cr")) (:maintainer "Jorge Araya Navarro" . "jorge@esavara.cr") (:keywords "org" "convenience") (:url . "https://gitlab.com/shackra/secretaria"))]) (see-mode . [(20180511 41) ((emacs (24 4)) (language-detection (0 1 0))) "Edit string in a separate buffer" tar ((:commit . "db9e4324f9dcc14d5125cb6a79d6c9fad5b14626") (:authors ("Marcelo Muñoz" . "ma.munoz.araya@gmail.com")) (:maintainers ("Marcelo Muñoz" . "ma.munoz.araya@gmail.com")) (:maintainer "Marcelo Muñoz" . "ma.munoz.araya@gmail.com") (:keywords "convenience") (:url . "https://github.com/marcelino-m/see-mode"))]) @@ -4568,13 +4680,14 @@ (selcand . [(20230628 733) ((emacs (25 1))) "Select a candidate from a tree of hint characters" tar ((:commit . "b6fc231a784df570df0f817d34f926f141a65126") (:authors ("Ernesto Alfonso")) (:maintainers (nil . "(concat \"erjoalgo\" \"@\" \"gmail\" \".com\")")) (:maintainer nil . "(concat \"erjoalgo\" \"@\" \"gmail\" \".com\")") (:keywords "lisp" "completing-read" "prompt" "combinations" "vimium") (:url . "https://github.com/erjoalgo/selcand"))]) (select-themes . [(20160221 106) nil "Color theme selection with completing-read" tar ((:commit . "236f54287519a3ea6dd7b3992d053e4f4ff5d0fe") (:authors ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainers ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com") (:url . "https://github.com/jasonm23/emacs-select-themes"))]) (selected . [(20230219 1328) nil "Keymap for when region is active" tar ((:commit . "1ca6e12f456caa1dc97c3d68597598662eb5de9a") (:authors ("Erik Sjöstrand")) (:maintainers ("Erik Sjöstrand")) (:maintainer "Erik Sjöstrand") (:keywords "convenience") (:url . "http://github.com/Kungsgeten/selected.el"))]) + (selected-window-accent-mode . [(20240209 1230) ((emacs (25 1)) (visual-fill-column (0 0))) "Accent Selected Window" tar ((:commit . "e83efa67c4a9d1935c657a15b4487102cb6655de") (:authors ("James Dyer" . "captainflasmr@gmail.com")) (:maintainers ("James Dyer" . "captainflasmr@gmail.com")) (:maintainer "James Dyer" . "captainflasmr@gmail.com") (:keywords "convenience") (:url . "https://github.com/captainflasmr/selected-window-accent-mode"))]) (selectric-mode . [(20200209 2107) nil "IBM Selectric mode for Emacs" tar ((:commit . "bb9e66678f34e9bc23624ff6292cf5e7857e8e5f") (:authors ("Ricardo Bánffy" . "rbanffy@gmail.com")) (:maintainers ("Ricardo Banffy" . "rbanffy@gmail.com")) (:maintainer "Ricardo Banffy" . "rbanffy@gmail.com") (:keywords "multimedia" "convenience" "typewriter" "selectric") (:url . "https://github.com/rbanffy/selectric-mode"))]) (selectrum . [(20220513 2106) ((emacs (26 1))) "Easily select item from list" tar ((:commit . "810ea697bdd559d97b86b795e01769cddfa3daf2") (:authors ("Radian LLC" . "contact+selectrum@radian.codes")) (:maintainers ("Radian LLC" . "contact+selectrum@radian.codes")) (:maintainer "Radian LLC" . "contact+selectrum@radian.codes") (:keywords "extensions") (:url . "https://github.com/radian-software/selectrum"))]) - (selectrum-prescient . [(20221216 112) ((emacs (25 1)) (prescient (6 1 0)) (selectrum (3 1))) "prescient.el + Selectrum" tar ((:commit . "72b023f5fc1ae2bbf2f51f1786cc012d40671bf4") (:authors ("Radian LLC" . "contact+prescient@radian.codes")) (:maintainers ("Radian LLC" . "contact+prescient@radian.codes")) (:maintainer "Radian LLC" . "contact+prescient@radian.codes") (:keywords "extensions") (:url . "https://github.com/raxod502/prescient.el"))]) + (selectrum-prescient . [(20240226 204) ((emacs (25 1)) (prescient (6 1 0)) (selectrum (3 1))) "prescient.el + Selectrum" tar ((:commit . "c39bf07c56b427bf41aafd7d20eaef5cf3c312b5") (:authors ("Radian LLC" . "contact+prescient@radian.codes")) (:maintainers ("Radian LLC" . "contact+prescient@radian.codes")) (:maintainer "Radian LLC" . "contact+prescient@radian.codes") (:keywords "extensions") (:url . "https://github.com/raxod502/prescient.el"))]) (semantic-thrift . [(20230711 958) ((thrift (0 0 1)) (emacs (25 1))) "Thrift LALR parser" tar ((:commit . "87029282bd59cbba6ae815c0b1a207f02813f5dc") (:authors (nil . "Guanghui Xu gh_xu@qq.com")) (:maintainers (nil . "Guanghui Xu gh_xu@qq.com")) (:maintainer nil . "Guanghui Xu gh_xu@qq.com") (:keywords "extensions" "thrift" "semantic") (:url . "https://github.com/jerryxgh/semantic-thrift"))]) (semaphore . [(20190607 1949) ((emacs (26))) "Semaphore based on condition variables" tar ((:commit . "ec4c485c8e4cff63805ecc25523a031a6c2ad7cd") (:authors ("Herwig Hochleitner" . "herwig@bendlas.net")) (:maintainers ("Herwig Hochleitner" . "herwig@bendlas.net")) (:maintainer "Herwig Hochleitner" . "herwig@bendlas.net") (:keywords "processes" "unix") (:url . "http://github.com/webnf/semaphore.el"))]) (semaphore-promise . [(20190607 2115) ((emacs (26)) (semaphore (1)) (promise (1))) "semaphore integration with promise" tar ((:commit . "9cdfef91cc0293371af549ad41027aa5b73f30a4") (:authors ("Herwig Hochleitner" . "herwig@bendlas.net")) (:maintainers ("Herwig Hochleitner" . "herwig@bendlas.net")) (:maintainer "Herwig Hochleitner" . "herwig@bendlas.net") (:keywords "processes" "unix") (:url . "http://github.com/webnf/semaphore.el"))]) - (semi . [(20230814 844) ((emacs (24 5)) (apel (10 8)) (flim (1 14 9))) "A library to provide MIME features." tar ((:commit . "d15603b8eb791f2057b48071c262996ad7767505"))]) + (semi . [(20231102 1035) ((emacs (24 5)) (apel (10 8)) (flim (1 14 9))) "A library to provide MIME features." tar ((:commit . "9063a4485b148a767ea924f0e7cc78d3524ba256"))]) (seml-mode . [(20230702 1446) ((emacs (25 1)) (impatient-mode (1 1)) (htmlize (1 5)) (web-mode (16 0))) "Major-mode for SEML, S-Expression Markup Language, file" tar ((:commit . "23d684ac590fad6aa3c5ce3962c4683c1eb8fdb5") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "lisp" "html") (:url . "https://github.com/conao3/seml-mode.el"))]) (sendto . [(20160425 1250) ((emacs (24 4))) "send the region content to a function" tar ((:commit . "076b81d7a53f75b0a59b0ef3448f35570567054c") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "convenience" "region") (:url . "https://github.com/lujun9972/sendto.el"))]) (sensei . [(20220530 1226) ((emacs (27 1)) (projectile (2 5 0)) (request (0 3 2))) "A client for sensei" tar ((:commit . "3538990de9ab57154e3da08d10fbd2c6228d87b8") (:authors ("Arnaud Bailly" . "arnaud@pankzsoft.com")) (:maintainers ("Arnaud Bailly" . "arnaud@pankzsoft.com")) (:maintainer "Arnaud Bailly" . "arnaud@pankzsoft.com") (:keywords "hypermedia") (:url . "https://abailly.github.io/sensei"))]) @@ -4582,16 +4695,17 @@ (sentence-navigation . [(20220522 1137) ((ample-regexps (0 1)) (cl-lib (0 5)) (emacs (24 4))) "Commands to navigate one-spaced sentences." tar ((:commit . "ea6e94a5518643acda5b6e98e4e7f47dfc107d29") (:authors ("Fox Kiester" . "noct@openmailbox.org")) (:maintainers ("Fox Kiester" . "noct@openmailbox.org")) (:maintainer "Fox Kiester" . "noct@openmailbox.org") (:keywords "sentence" "evil") (:url . "https://github.com/noctuid/emacs-sentence-navigation"))]) (sentex . [(20230411 1650) ((emacs (27 1))) "Regex-based sentence navigation rules" tar ((:commit . "ab96ee0e9856222aaad6b085cf4ca0c5dda73789") (:authors ("Marty Hiatt ")) (:maintainers ("Marty Hiatt ")) (:maintainer "Marty Hiatt ") (:keywords "languages" "convenience" "translation" "sentences" "text" "wp") (:url . "https://codeberg.org/martianh/sentex"))]) (seoul256-theme . [(20180505 757) ((emacs (24 3))) "Low-contrast color scheme based on Seoul Colors." tar ((:commit . "8e76d0207489964ef780420723d49e409f68f7d1") (:authors ("Anand Iyer" . "anand.ucb@gmail.com")) (:maintainers ("Anand Iyer" . "anand.ucb@gmail.com")) (:maintainer "Anand Iyer" . "anand.ucb@gmail.com") (:keywords "theme") (:url . "http://github.com/anandpiyer/seoul256-emacs"))]) - (separedit . [(20230513 306) ((emacs (25 1)) (dash (2 18)) (edit-indirect (0 1 5))) "Edit comment/string/docstring/code block in separate buffer" tar ((:commit . "9f5027a9a9c2e67562bc39839415d7c7f318e9a8") (:authors ("Gong Qijian" . "gongqijian@gmail.com")) (:maintainers ("Gong Qijian" . "gongqijian@gmail.com")) (:maintainer "Gong Qijian" . "gongqijian@gmail.com") (:keywords "tools" "languages" "docs") (:url . "https://github.com/twlz0ne/separedit.el"))]) + (separedit . [(20240119 633) ((emacs (25 1)) (dash (2 18)) (edit-indirect (0 1 11))) "Edit comment/string/docstring/code block in separate buffer" tar ((:commit . "bfd0902d771f9f0160e4f16a7b6e8c29ce3447fe") (:authors ("Gong Qijian" . "gongqijian@gmail.com")) (:maintainers ("Gong Qijian" . "gongqijian@gmail.com")) (:maintainer "Gong Qijian" . "gongqijian@gmail.com") (:keywords "tools" "languages" "docs") (:url . "https://github.com/twlz0ne/separedit.el"))]) (sequed . [(20220115 743) ((emacs (25 2))) "Major mode for FASTA format DNA alignments" tar ((:commit . "c886981c46d199e1522f18c3fc15198ab8c9a02f") (:authors ("Bruce Rannala" . "brannala@ucdavis.edu")) (:maintainers ("Bruce Rannala" . "brannala@ucdavis.edu")) (:maintainer "Bruce Rannala" . "brannala@ucdavis.edu") (:url . "https://github.com/brannala/sequed"))]) (sequences . [(20170818 1252) ((emacs (24))) "Ports of some Clojure sequence functions." tar ((:commit . "564ebbd93b0beea4e75acfbf824350e90b5d5738") (:authors ("Tim Visher" . "tim.visher@gmail.com")) (:maintainers ("Tim Visher" . "tim.visher@gmail.com")) (:maintainer "Tim Visher" . "tim.visher@gmail.com") (:keywords "convenience"))]) (sequential-command . [(20170926 40) nil "Many commands into one command" tar ((:commit . "a48cbcbe273b33edd3ae56e68f44b4100fa3a48a") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "convenience" "lisp") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/sequential-command.el"))]) + (sequential-yank . [(20231126 1530) ((emacs (24 4))) "Minor mode to copy and paste strings sequentially" tar ((:commit . "3c7f98a842c391b59379566cbf03f143004b26da") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainers ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:keywords "killing" "convenience") (:url . "https://github.com/knu/sequential-yank.el"))]) (seriestracker . [(20230821 1858) ((dash (2 12 1)) (transient (0 3 2)) (emacs (27 1))) "Series tracker" tar ((:commit . "49b1e7a822c973c48007dc6461577ee68124ddc8") (:authors ("Maxime Wack ")) (:maintainers ("Maxime Wack ")) (:maintainer "Maxime Wack ") (:keywords "multimedia") (:url . "https://www.github.com/MaximeWack/seriesTracker"))]) (servant . [(20140216 1219) ((s (1 8 0)) (dash (2 2 0)) (f (0 11 0)) (ansi (0 3 0)) (commander (0 5 0)) (epl (0 2)) (shut-up (0 2 1)) (web-server (0 0 1))) "ELPA server written in Emacs Lisp" tar ((:commit . "4d2aa8250b54b28e6e7ee4cd5ebd98a33db2c134") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com") ("Sebastian Wiesner" . "lunaryorn@gmail.com")) (:maintainers ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:keywords "elpa" "server") (:url . "http://github.com/rejeep/servant.el"))]) (services . [(20170802 1130) ((cl-lib (0 5))) "Services database access functions." tar ((:commit . "04c7986041a33dfa0b0ae57c7d6fbd600548c596") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainers ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:keywords "convenience" "net" "services") (:url . "https://github.com/davep/services.el"))]) - (sesman . [(20210901 1134) ((emacs (25))) "Generic Session Manager" tar ((:commit . "e0f555f963c9f02f8e4a50e06fc353eb4c15ee77") (:authors ("Vitalie Spinu")) (:maintainers ("Vitalie Spinu")) (:maintainer "Vitalie Spinu") (:keywords "process") (:url . "https://github.com/vspinu/sesman"))]) + (sesman . [(20240115 2143) ((emacs (25))) "Generic Session Manager" tar ((:commit . "ec7390c0d0fb8b278aa06848634f922bc893de31") (:authors ("Vitalie Spinu")) (:maintainers ("Vitalie Spinu")) (:maintainer "Vitalie Spinu") (:keywords "process") (:url . "https://github.com/vspinu/sesman"))]) (session . [(20210422 53) nil "use variables, registers and buffer places across sessions" tar ((:commit . "3be207c50dfe964de3cbf5cd8fa9b07fc7d2e609") (:authors ("Christoph Wedler" . "wedler@users.sourceforge.net")) (:maintainers ("Christoph Wedler" . "wedler@users.sourceforge.net")) (:maintainer "Christoph Wedler" . "wedler@users.sourceforge.net") (:keywords "session" "session management" "desktop" "data" "tools") (:url . "http://emacs-session.sourceforge.net/"))]) - (session-async . [(20230223 313) ((emacs (27 1)) (jsonrpc (1 0 9))) "Asynchronous processing in a forked process session" tar ((:commit . "e06835ea181b3a15099280527c9a4590d2fa61d1") (:authors ("Felipe Lema" . "felipelema@mortemale.org")) (:maintainers ("Felipe Lema" . "felipelema@mortemale.org")) (:maintainer "Felipe Lema" . "felipelema@mortemale.org") (:keywords "async" "comm" "data" "files" "internal" "maint" "processes" "tools") (:url . "https://codeberg.org/FelipeLema/session-async.el"))]) + (session-async . [(20231125 2106) ((emacs (27 1)) (jsonrpc (1 0 9))) "Asynchronous processing in a forked process session" tar ((:commit . "6e361073256740ce546f4fa104045f2b3818ef94") (:authors ("Felipe Lema" . "felipelema@mortemale.org")) (:maintainers ("Felipe Lema" . "felipelema@mortemale.org")) (:maintainer "Felipe Lema" . "felipelema@mortemale.org") (:keywords "async" "comm" "data" "files" "internal" "maint" "processes" "tools") (:url . "https://codeberg.org/FelipeLema/session-async.el"))]) (seti-theme . [(20190201 1848) nil "A dark colored theme, inspired by Seti Atom Theme" tar ((:commit . "9d76db0b91d4f574dd96ac80fad41da35bffa109") (:authors ("Vlad Piersec" . "vlad.piersec@gmail.com")) (:maintainers ("Vlad Piersec" . "vlad.piersec@gmail.com")) (:maintainer "Vlad Piersec" . "vlad.piersec@gmail.com") (:keywords "themes") (:url . "https://github.com/caisah/seti-theme"))]) (sexp-diff . [(20200314 2018) ((emacs (25))) "Diff sexps based on Levenshtein-like edit distance" tar ((:commit . "4fea80f7b04c64b160a95bdc9d6de68c71096706") (:authors ("Xu Chunyang")) (:maintainers ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:keywords "lisp") (:url . "https://github.com/xuchunyang/sexp-diff.el"))]) (sexp-move . [(20150915 1730) nil "Improved S-Expression Movement" tar ((:commit . "117f7a91ab7c25e438413753e916570122011ce7") (:authors ("Philip Woods" . "elzairthesorcerer@gmail.com")) (:maintainers ("Philip Woods" . "elzairthesorcerer@gmail.com")) (:maintainer "Philip Woods" . "elzairthesorcerer@gmail.com") (:keywords "sexp") (:url . "https://gitlab.com/elzair/sexp-move"))]) @@ -4607,12 +4721,12 @@ (shanty-themes . [(20230123 2111) ((emacs (24 5 1))) "The themes for digital workers" tar ((:commit . "3f678d953771c4a109bd16f6d7def6bd9bbc811d") (:authors ("Philip Gaber" . "phga@posteo.de")) (:maintainers ("Philip Gaber" . "phga@posteo.de")) (:maintainer "Philip Gaber" . "phga@posteo.de") (:keywords "faces" "theme" "blue" "yellow" "gold" "dark" "light") (:url . "https://github.com/qhga/shanty-themes"))]) (share2computer . [(20200316 31) ((emacs (25 1))) "Elisp helper of android ShareToComputer" tar ((:commit . "15da47625a800e3310b8dc714bd4e41e32966d6a") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainers ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:keywords "convenience" "comm") (:url . "https://github.com/tumashu/share2computer"))]) (sharper . [(20230129 1827) ((emacs (27 1)) (transient (0 2 0))) "A dotnet CLI wrapper, using Transient" tar ((:commit . "496e90e337cb09329d85a6d171c0953a85e918fe") (:authors ("Sebastian Monia" . "smonia@outlook.com")) (:maintainers ("Sebastian Monia" . "smonia@outlook.com")) (:maintainer "Sebastian Monia" . "smonia@outlook.com") (:keywords "maint" "tool") (:url . "https://github.com/sebasmonia/sharper"))]) - (shell-command-x . [(20230702 1852) ((emacs (28 1))) "Extensions for shell commands" tar ((:commit . "416dad677314e3eec704d5b02594b5f8a7e7fd65") (:authors ("Eliza Velasquez")) (:maintainers ("Eliza Velasquez")) (:maintainer "Eliza Velasquez") (:keywords "convenience" "processes" "unix") (:url . "https://github.com/elizagamedev/shell-command-x.el"))]) + (shell-command-x . [(20231214 1) ((emacs (28 1))) "Extensions for shell commands" tar ((:commit . "d2fe4d08be306d6570f3c316ea06b0e6931ea5d5") (:authors ("Eliza Velasquez")) (:maintainers ("Eliza Velasquez")) (:maintainer "Eliza Velasquez") (:keywords "convenience" "processes" "unix") (:url . "https://github.com/elizagamedev/shell-command-x.el"))]) (shell-current-directory . [(20140101 2354) nil "create new shell based on buffer directory" tar ((:commit . "bf843771bf9a4aa05e054ade799eb8862f3be89a") (:authors ("Daniel Polani")) (:maintainers ("Daniel Polani")) (:maintainer "Daniel Polani") (:keywords "shell" "comint"))]) (shell-here . [(20220102 1703) nil "Open a shell relative to the working directory" tar ((:commit . "eeb437ff26d62a5009046b1b3b4503b768e3131a") (:authors ("Ian Eure" . "ian.eure@gmail.com")) (:maintainers ("Ian Eure" . "ian.eure@gmail.com")) (:maintainer "Ian Eure" . "ian.eure@gmail.com") (:keywords "unix" "tools" "processes"))]) (shell-history . [(20100505 839) nil "integration with shell history" tar ((:commit . "ee371a81f2d2bf5a308344078329ca1e9b5ed38c") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "processes" "convenience") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/shell-history.el"))]) - (shell-maker . [(20230709 2036) ((emacs (27 1))) "Interaction mode for making comint shells" tar ((:commit . "1ec51235295f4685f6cc1a7601255fdcabffc1b3") (:authors ("Alvaro Ramirez https://xenodium.com")) (:maintainers ("Alvaro Ramirez https://xenodium.com")) (:maintainer "Alvaro Ramirez https://xenodium.com") (:url . "https://github.com/xenodium/chatgpt-shell"))]) - (shell-pop . [(20200315 1139) ((emacs (24)) (cl-lib (0 5))) "helps you to use shell easily on Emacs. Only one key action to work." tar ((:commit . "4b4394037940a890a313d715d203d9ead2d156a6") (:authors ("Kazuo YAGI" . "kazuo.yagi@gmail.com")) (:maintainers ("Kazuo YAGI" . "kazuo.yagi@gmail.com")) (:maintainer "Kazuo YAGI" . "kazuo.yagi@gmail.com") (:keywords "shell" "terminal" "tools") (:url . "http://github.com/kyagi/shell-pop-el"))]) + (shell-maker . [(20240227 2310) ((emacs (27 1))) "Interaction mode for making comint shells" tar ((:commit . "03afa7339930e5715c217455f3070c88a7fac55c") (:authors ("Alvaro Ramirez https://xenodium.com")) (:maintainers ("Alvaro Ramirez https://xenodium.com")) (:maintainer "Alvaro Ramirez https://xenodium.com") (:url . "https://github.com/xenodium/chatgpt-shell"))]) + (shell-pop . [(20231228 612) ((emacs (24 1)) (cl-lib (0 5))) "helps you to use shell easily on Emacs. Only one key action to work." tar ((:commit . "ff3dc705ee1c7bc566b35c17e4635c57061fe3ae") (:authors ("Kazuo YAGI" . "kazuo.yagi@gmail.com")) (:maintainers ("Kazuo YAGI" . "kazuo.yagi@gmail.com")) (:maintainer "Kazuo YAGI" . "kazuo.yagi@gmail.com") (:keywords "shell" "terminal" "tools") (:url . "http://github.com/kyagi/shell-pop-el"))]) (shell-split-string . [(20151224 1008) nil "Split strings using shell-like syntax" tar ((:commit . "19f6f999c33cc66a4c91bacdcc3697c25d97bf5a") (:authors ("10sr <8.slashes+el [at] gmail [dot] com>")) (:maintainers ("10sr <8.slashes+el [at] gmail [dot] com>")) (:maintainer "10sr <8.slashes+el [at] gmail [dot] com>") (:keywords "utility" "library" "shell" "string") (:url . "https://github.com/10sr/shell-split-string-el"))]) (shell-switcher . [(20210509 1045) ((emacs (24))) "Provide fast switching between shell buffers." tar ((:commit . "ed74b20fa12935be0068765f5bc8de97b92a8020") (:authors ("Damien Cassou" . "damien.cassou@gmail.com")) (:maintainer "Damien Cassou" . "damien.cassou@gmail.com") (:keywords "emacs" "package" "elisp" "shell" "eshell" "term" "switcher") (:url . "https://github.com/DamienCassou/shell-switcher"))]) (shell-toggle . [(20150226 1411) nil "Toggle to and from the shell buffer" tar ((:commit . "0d01bd9a780fdb7fe6609c552523f4498649a3b9") (:authors ("Mikael Sjödin" . "mic@docs.uu.se") ("Matthieu Moy") ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainers ("Mikael Sjödin" . "mic@docs.uu.se")) (:maintainer "Mikael Sjödin" . "mic@docs.uu.se") (:keywords "processes") (:url . "https://github.com/knu/shell-toggle.el"))]) @@ -4622,14 +4736,14 @@ (shelltest-mode . [(20180501 141) nil "Major mode for shelltestrunner" tar ((:commit . "5fea8c9394380e822971a171905b6b5ab9be812d") (:authors ("Dustin Fechner" . "dfe@rtrn.io")) (:maintainers ("Dustin Fechner" . "dfe@rtrn.io")) (:maintainer "Dustin Fechner" . "dfe@rtrn.io") (:keywords "languages") (:url . "https://github.com/rtrn/shelltest-mode"))]) (shen-elisp . [(20221211 1313) ((emacs (24 4))) "Shen implementation in Elisp" tar ((:commit . "957ab44654fc7a7cc1b78181d244fa25166f9b09") (:authors ("Aditya Siram" . "aditya.siram@gmail.com")) (:maintainer "Aditya Siram" . "aditya.siram@gmail.com") (:url . "https://github.com/deech/shen-elisp"))]) (shenshou . [(20230226 320) ((emacs (27 1))) "Download&Extract subtitles from opensubtitles.org" tar ((:commit . "0a00b9f5a86a54324f88c7d27b603f136ee2fb0b") (:authors ("Chen Bin ")) (:maintainers ("Chen Bin ")) (:maintainer "Chen Bin ") (:keywords "convenience" "tools") (:url . "http://github.com/redguardtoo/shenshou"))]) - (shfmt . [(20220602 1535) ((emacs (24)) (reformatter (0 3))) "Reformat shell scripts using shfmt" tar ((:commit . "279a51defa3e0d97dc40b8a26e078699d4e22e90") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "languages") (:url . "https://github.com/purcell/emacs-shfmt"))]) + (shfmt . [(20240104 1218) ((emacs (24)) (reformatter (0 3))) "Reformat shell scripts using shfmt" tar ((:commit . "1a747c53eab1c0cd4d2708e5ffb953f9761ca7fb") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "languages") (:url . "https://github.com/purcell/emacs-shfmt"))]) (shift-number . [(20170301 1459) nil "Increase/decrease the number at point" tar ((:commit . "94c3713cc11283a831f66d5205d112762edc186b") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainers ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:keywords "convenience") (:url . "https://github.com/alezost/shift-number.el"))]) (shift-text . [(20130831 1655) ((cl-lib (1 0)) (es-lib (0 3))) "Move the region in 4 directions, in a way similar to Eclipse's" tar ((:commit . "1be9cbf994000022172ceb746fe1d597f57ea8ba") (:authors ("sabof")) (:maintainers ("sabof")) (:maintainer "sabof") (:url . "https://github.com/sabof/shift-text"))]) - (shimbun . [(20230630 124) nil "interfacing with web newspapers" tar ((:commit . "ea60411ff2170872f6fb1fe858ffad41580009e6") (:authors ("TSUCHIYA Masatoshi" . "tsuchiya@namazu.org") ("Akihiro Arisawa " . "ari@mbf.sphere.ne.jp") ("Yuuichi Teranishi " . "teranisi@gohome.org") ("Katsumi Yamaoka " . "yamaoka@jpl.org")) (:maintainers ("TSUCHIYA Masatoshi" . "tsuchiya@namazu.org")) (:maintainer "TSUCHIYA Masatoshi" . "tsuchiya@namazu.org") (:keywords "news"))]) + (shimbun . [(20240208 217) nil "interfacing with web newspapers" tar ((:commit . "dc5136d20a546cbf741e0e5835a441859fdab384") (:authors ("TSUCHIYA Masatoshi" . "tsuchiya@namazu.org") ("Akihiro Arisawa " . "ari@mbf.sphere.ne.jp") ("Yuuichi Teranishi " . "teranisi@gohome.org") ("Katsumi Yamaoka " . "yamaoka@jpl.org")) (:maintainers ("TSUCHIYA Masatoshi" . "tsuchiya@namazu.org")) (:maintainer "TSUCHIYA Masatoshi" . "tsuchiya@namazu.org") (:keywords "news"))]) (shm . [(20180327 57) nil "Structured Haskell Mode" tar ((:commit . "7f9df73f45d107017c18ce4835bbc190dfe6782e") (:authors ("Chris Done" . "chrisdone@gmail.com")) (:maintainers ("Chris Done" . "chrisdone@gmail.com")) (:maintainer "Chris Done" . "chrisdone@gmail.com") (:keywords "development" "haskell" "structured"))]) (shoulda . [(20140616 1833) ((cl-lib (0 5))) "Shoulda test support for ruby" tar ((:commit . "24dc6b6138a06edde9c8d13a6aaa1654d1d7de54") (:authors ("Marcwebbie" . "marcwebbie@gmail.com")) (:maintainers ("Marcwebbie" . "marcwebbie@gmail.com")) (:maintainer "Marcwebbie" . "marcwebbie@gmail.com") (:keywords "ruby" "tests" "shoulda"))]) (show-css . [(20160210 1408) ((doom (1 3)) (s (1 10 0))) "Show the css of the html attribute the cursor is on" tar ((:commit . "771daeddd4df7a7c10f66419a837145649bab63b") (:authors ("Sheldon McGrandle" . "developer@rednemesis.com")) (:maintainers ("Sheldon McGrandle" . "developer@rednemesis.com")) (:maintainer "Sheldon McGrandle" . "developer@rednemesis.com") (:keywords "hypermedia") (:url . "https://github.com/smmcg/showcss-mode"))]) - (show-eol . [(20220919 631) ((emacs (24 4))) "Show end of line symbol in buffer" tar ((:commit . "ad3aa8f4fa0d1b20f8526536f0ac35386f521372") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "end" "eol" "line") (:url . "https://github.com/jcs-elpa/show-eol"))]) + (show-eol . [(20240101 931) ((emacs (24 4))) "Show end of line symbol in buffer" tar ((:commit . "febc1df7ac1c7006b3f0993a3436575e8e0dc71d") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "end" "eol" "line") (:url . "https://github.com/jcs-elpa/show-eol"))]) (show-font-mode . [(20201225 2217) ((emacs (25 1))) "Show font at point on mode line" tar ((:commit . "c7328b85655688d257b769192d26b9f5c9bbe26d") (:authors ("Melissa Boiko" . "melissa@namakajiri.net")) (:maintainers ("Melissa Boiko" . "melissa@namakajiri.net")) (:maintainer "Melissa Boiko" . "melissa@namakajiri.net") (:keywords "faces" "i18n" "unicode" "fonts" "fontsets") (:url . "https://github.com/melissaboiko/show-font-mode"))]) (showtip . [(20090830 1040) nil "Show tip at cursor" tar ((:commit . "930da302809a4257e8d69425455b29e1cc91949b") (:authors ("Ye Wenbin" . "wenbinye@gmail.com")) (:maintainers ("Ye Wenbin" . "wenbinye@gmail.com")) (:maintainer "Ye Wenbin" . "wenbinye@gmail.com") (:keywords "help"))]) (shpec-mode . [(20150530 922) nil "Minor mode for shpec specification" tar ((:commit . "76bccd63e3b70233a6c9ca0798dd03550952cc76") (:authors ("AdrieanKhisbe" . "adriean.khisbe@live.fr")) (:maintainers ("AdrieanKhisbe" . "adriean.khisbe@live.fr")) (:maintainer "AdrieanKhisbe" . "adriean.khisbe@live.fr") (:keywords "languages" "tools") (:url . "http://github.com/shpec/shpec-mode"))]) @@ -4644,12 +4758,12 @@ (sicp . [(20200512 1137) nil "Structure and Interpretation of Computer Programs in info format" tar ((:commit . "4002d83083d520c6b5ede2df36cc2cee885d450a") (:authors ("Hal Abelson") ("Jerry Sussman") ("Julie Sussman")) (:maintainers ("Hal Abelson")) (:maintainer "Hal Abelson") (:url . "https://mitpress.mit.edu/sicp"))]) (side-hustle . [(20230814 1047) ((emacs (24 4)) (seq (2 20))) "Hustle through Imenu in a side window" tar ((:commit . "602557d74229b377ee0e7d43ec70a6f9f84c81e0") (:authors ("Paul W. Rankin" . "hello@paulwrankin.com")) (:maintainers ("Paul W. Rankin" . "hello@paulwrankin.com")) (:maintainer "Paul W. Rankin" . "hello@paulwrankin.com") (:keywords "convenience") (:url . "https://github.com/rnkn/side-hustle"))]) (side-notes . [(20230814 302) ((emacs (24 4))) "Easy access to a directory notes file" tar ((:commit . "fbe409066df83a7e64a6a9ddf6d99ce7177fcdbb") (:authors ("Paul W. Rankin" . "hello@paulwrankin.com")) (:maintainers ("Paul W. Rankin" . "hello@paulwrankin.com")) (:maintainer "Paul W. Rankin" . "hello@paulwrankin.com") (:keywords "convenience") (:url . "https://github.com/rnkn/side-notes"))]) - (sidecar-locals . [(20230518 1422) ((emacs (27 1))) "A flexible alternative to built-in dir-locals" tar ((:commit . "b6b66b6d5a8963256d87d87d02f94ae36b39e6f6") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:keywords "convenience") (:url . "https://codeberg.org/ideasman42/emacs-sidecar-locals"))]) - (sideline . [(20230808 2230) ((emacs (27 1))) "Show information on the side" tar ((:commit . "e4e97c1ca9fecec104c24f707c3d910af53fb976") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience") (:url . "https://github.com/emacs-sideline/sideline"))]) - (sideline-blame . [(20230406 2312) ((emacs (27 1)) (sideline (0 1 0)) (vc-msg (1 1 1))) "Show blame messages with sideline" tar ((:commit . "4d3343795bc95662adb65c85bcbb41947862699f") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "blame") (:url . "https://github.com/emacs-sideline/sideline-blame"))]) - (sideline-flycheck . [(20230402 1816) ((emacs (27 1)) (sideline (0 1 1)) (flycheck (0 14)) (ht (2 4))) "Show flycheck errors with sideline" tar ((:commit . "3d74a008835eff71899b9455cd00f989378fe70e") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "flycheck") (:url . "https://github.com/emacs-sideline/sideline-flycheck"))]) - (sideline-flymake . [(20230402 1816) ((emacs (27 1)) (sideline (0 1 0))) "Show flymake errors with sideline" tar ((:commit . "316325cb050d13f33e83e7d7823e3730a70ecf4e") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "flymake") (:url . "https://github.com/emacs-sideline/sideline-flymake"))]) - (sideline-lsp . [(20221231 1636) ((emacs (27 1)) (sideline (0 1 0)) (lsp-mode (6 0)) (dash (2 18 0)) (ht (2 4)) (s (1 12 0))) "Show lsp information with sideline" tar ((:commit . "38ba700db1769de216989fb9217795934147d160") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "lsp") (:url . "https://github.com/emacs-sideline/sideline-lsp"))]) + (sidecar-locals . [(20240227 151) ((emacs (27 1))) "A flexible alternative to built-in dir-locals" tar ((:commit . "2b2b765387f2cbae9935c3ee6e2a32aa8d68f1b8") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:keywords "convenience") (:url . "https://codeberg.org/ideasman42/emacs-sidecar-locals"))]) + (sideline . [(20240319 315) ((emacs (27 1)) (ht (2 4))) "Show information on the side" tar ((:commit . "04a525f624e1a42c47a2755fbc63be32104f44cb") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience") (:url . "https://github.com/emacs-sideline/sideline"))]) + (sideline-blame . [(20240101 918) ((emacs (27 1)) (sideline (0 1 0)) (vc-msg (1 1 1))) "Show blame messages with sideline" tar ((:commit . "b597c047d2a8ef7dd155e85e43fd65530ecf0a61") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "blame") (:url . "https://github.com/emacs-sideline/sideline-blame"))]) + (sideline-flycheck . [(20240313 2304) ((emacs (27 1)) (sideline (0 1 1)) (flycheck (0 14)) (ht (2 4))) "Show flycheck errors with sideline" tar ((:commit . "1b3fc4d41b93ab3fa3754d188545d9e8cc0150f1") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "flycheck") (:url . "https://github.com/emacs-sideline/sideline-flycheck"))]) + (sideline-flymake . [(20240309 1112) ((emacs (27 1)) (sideline (0 1 0))) "Show flymake errors with sideline" tar ((:commit . "e6a9ae69fc048f8eaacbf653e7136678dbef4597") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "flymake") (:url . "https://github.com/emacs-sideline/sideline-flymake"))]) + (sideline-lsp . [(20240101 918) ((emacs (27 1)) (sideline (0 1 0)) (lsp-mode (6 0)) (dash (2 18 0)) (ht (2 4)) (s (1 12 0))) "Show lsp information with sideline" tar ((:commit . "0a085a29b943eede42824981b5d0cd9fb951e9d8") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "lsp") (:url . "https://github.com/emacs-sideline/sideline-lsp"))]) (sift . [(20200421 1423) nil "Front-end for sift, a fast and powerful grep alternative" tar ((:commit . "cdddba2d183146c340915003f1b5d09d13712c22") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainers ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "sift" "ack" "pt" "ag" "grep" "search") (:url . "https://github.com/nlamirault/sift.el"))]) (signal . [(20160816 1438) ((emacs (24)) (cl-lib (0 5))) "Advanced hook" tar ((:commit . "aa58327e2297df921d72a0370468b48663efd438") (:authors ("Mola-T" . "Mola@molamola.xyz")) (:maintainers ("Mola-T" . "Mola@molamola.xyz")) (:maintainer "Mola-T" . "Mola@molamola.xyz") (:keywords "internal" "lisp" "processes" "tools") (:url . "https://github.com/mola-T/signal"))]) (silkworm-theme . [(20210215 1120) ((emacs (24))) "Light theme with pleasant, low contrast colors." tar ((:commit . "ff80e9294da0fb093e15097ac62153ef4a64a889") (:authors ("Martin Haesler")) (:maintainers ("Martin Haesler")) (:maintainer "Martin Haesler"))]) @@ -4662,7 +4776,7 @@ (simple-mpc . [(20220216 102) ((s (1 10 0))) "provides a simple interface to mpc" tar ((:commit . "57ee14ada8aec477ddde5e4f632c8d3d99a66535") (:authors ("Joren Van Onder" . "joren@jvo.sh")) (:maintainers ("Joren Van Onder" . "joren@jvo.sh")) (:maintainer "Joren Van Onder" . "joren@jvo.sh") (:keywords "multimedia" "mpd" "mpc") (:url . "https://github.com/jorenvo/simple-mpc"))]) (simple-paren . [(20230810 729) ((emacs (24)) (cl-lib (0 5))) "Non-electrical insert paired delimiter, wrap" tar ((:commit . "206d8f3f82123f61e7133a14f66c83a9632bd99e") (:authors ("Andreas Röhler, Steve Purcell")) (:maintainers ("Andreas Röhler, Steve Purcell")) (:maintainer "Andreas Röhler, Steve Purcell") (:keywords "convenience") (:url . "https://github.com/andreas-roehler/simple-paren"))]) (simple-rtm . [(20160222 1534) ((rtm (0 1)) (dash (2 0 0))) "Interactive Emacs mode for Remember The Milk" tar ((:commit . "37c5feffea7c9b571279b6f549d06cf9c0720273") (:authors ("Moritz Bunkus" . "morit@bunkus.org")) (:maintainers ("Moritz Bunkus" . "morit@bunkus.org")) (:maintainer "Moritz Bunkus" . "morit@bunkus.org") (:keywords "remember" "the" "milk" "productivity" "todo"))]) - (simple-screen . [(20200926 109) nil "Simple screen configuration manager" tar ((:commit . "3ce535755986f7c25890d11e42fa621a3a069a4f") (:authors ("Tadashi Watanabe" . "wac@umiushi.org")) (:maintainers ("Tadashi Watanabe" . "wac@umiushi.org")) (:maintainer "Tadashi Watanabe" . "wac@umiushi.org") (:keywords "tools") (:url . "https://github.com/wachikun/simple-screen"))]) + (simple-screen . [(20240127 214) nil "Simple screen configuration manager" tar ((:commit . "1c5d025dd267ec7b0c8f210a27b2b8f8e11fc07b") (:authors ("Tadashi Watanabe" . "wac@umiushi.org")) (:maintainers ("Tadashi Watanabe" . "wac@umiushi.org")) (:maintainer "Tadashi Watanabe" . "wac@umiushi.org") (:keywords "tools") (:url . "https://github.com/wachikun/simple-screen"))]) (simpleclip . [(20220518 1251) nil "Simplified access to the system clipboard" tar ((:commit . "023f239275115169c3a3637ad95fae4a036c005e") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "convenience") (:url . "http://github.com/rolandwalker/simpleclip"))]) (simplecov . [(20221206 350) ((dash (2 19)) (emacs (28))) "Colorize untested ruby code" tar ((:commit . "215f2bdc5d2ef9b4439779ba4d3129210c9f34ab") (:authors ("Ryan Davis" . "ryand-ruby@zenspider.com")) (:maintainers ("Ryan Davis" . "ryand-ruby@zenspider.com")) (:maintainer "Ryan Davis" . "ryand-ruby@zenspider.com") (:keywords "tools" "languages") (:url . "https://github.org/zenspider/elisp"))]) (simplenote . [(20141118 1440) nil "Interact with simple-note.appspot.com" tar ((:commit . "734603e877b2d642162ca45f799d2f7b956d2ea0") (:authors ("Konstantinos Efstathiou" . "konstantinos@efstathiou.gr")) (:maintainers ("Konstantinos Efstathiou" . "konstantinos@efstathiou.gr")) (:maintainer "Konstantinos Efstathiou" . "konstantinos@efstathiou.gr") (:keywords "simplenote"))]) @@ -4670,8 +4784,8 @@ (simplezen . [(20130421 1000) ((s (1 4 0)) (dash (1 1 0))) "A simple subset of zencoding-mode for Emacs." tar ((:commit . "9f91554a3f7f4e9b2b5ec009effafbf12b091973") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainers ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))]) (simplicity-theme . [(20221016 1444) ((emacs (24 1))) "A minimalist dark theme" tar ((:commit . "f4aab6aa07b536688eb62355b83dde5fcd16e049") (:authors ("Matthieu Petiteau" . "mpetiteau.pro@gmail.com")) (:maintainers ("Matthieu Petiteau" . "mpetiteau.pro@gmail.com")) (:maintainer "Matthieu Petiteau" . "mpetiteau.pro@gmail.com") (:keywords "faces" "theme" "minimal") (:url . "http://github.com/smallwat3r/emacs-simplicity-theme"))]) (siri-shortcuts . [(20211229 1833) ((emacs (25 2))) "Interact with Siri Shortcuts" tar ((:commit . "190f242f71e071adfd89fa1f2f6ea22b62afd133") (:authors ("Daniils Petrovs" . "thedanpetrov@gmail.com")) (:maintainers ("Daniils Petrovs" . "thedanpetrov@gmail.com")) (:maintainer "Daniils Petrovs" . "thedanpetrov@gmail.com") (:keywords "convenience" "multimedia") (:url . "https://github.com/DaniruKun/siri-shortcuts.el"))]) - (sis . [(20230305 1006) ((emacs (25 1)) (terminal-focus-reporting (0 0))) "Less manual switch for native or OS input source (input method)." tar ((:commit . "e4142baa470e5f33dd508bce0264359dc5204b6f") (:keywords "convenience") (:url . "https://github.com/laishulu/emacs-smart-input-source"))]) - (sisyphus . [(20230813 1454) ((emacs (27 1)) (compat (29 1 4 2)) (elx (1 6 0)) (llama (0 3 0)) (magit (3 4 0))) "Create releases of Emacs packages" tar ((:commit . "84d6d6fcd99fbe6630da0bcb1e61904954cb3a72") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "git" "tools" "vc") (:url . "https://github.com/magit/sisyphus"))]) + (sis . [(20231211 1602) ((emacs (27 1))) "Less manual switch for native or OS input source (input method)." tar ((:commit . "23f3fe8b95e0570b65aa21b9db57c906aa9f35fd") (:keywords "convenience") (:url . "https://github.com/laishulu/emacs-smart-input-source"))]) + (sisyphus . [(20240106 1315) ((emacs (27 1)) (compat (29 1 4 2)) (elx (1 6 0)) (llama (0 3 0)) (magit (3 4 0))) "Create releases of Emacs packages" tar ((:commit . "85f73d86b9a058461e77ed4db372aafcf6666a13") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "git" "tools" "vc") (:url . "https://github.com/magit/sisyphus"))]) (sixcolors-mode . [(20230406 1031) ((emacs (27 1))) "A customizable horizontal scrollbar" tar ((:commit . "4124a8cf664b04a4bf4c39f7c3b7da3e480b99c8") (:authors ("Davide Mastromatteo" . "mastro35@gmail.com")) (:maintainers ("Davide Mastromatteo" . "mastro35@gmail.com")) (:maintainer "Davide Mastromatteo" . "mastro35@gmail.com") (:keywords "convenience" "colors") (:url . "https://github.com/mastro35/sixcolors-mode"))]) (skeletor . [(20210129 239) ((s (1 7 0)) (f (0 14 0)) (dash (2 2 0)) (cl-lib (0 3)) (let-alist (1 0 3)) (emacs (24 1))) "Provides project skeletons for Emacs" tar ((:commit . "f6e560a0bfe459e0b8a268047920ce1148f2ebf6") (:authors ("Chris Barrett" . "chris.d.barrett@me.com")) (:maintainers ("Chris Barrett" . "chris.d.barrett@me.com")) (:maintainer "Chris Barrett" . "chris.d.barrett@me.com"))]) (skerrick . [(20220306 2139) ((emacs (27 1)) (request (0 3 2))) "REPL-driven development for NodeJS" tar ((:commit . "015de8369b8b6be0d4d1e21c24239a037350e87e") (:authors ("Rafael Nicdao ")) (:maintainers ("Rafael Nicdao" . "nicdaoraf@gmail.com")) (:maintainer "Rafael Nicdao" . "nicdaoraf@gmail.com") (:keywords "languages" "javascript" "js" "repl" "repl-driven") (:url . "https://github.com/anonimitoraf/skerrick"))]) @@ -4684,29 +4798,31 @@ (slack . [(20211129 310) ((websocket (1 8)) (request (0 2 0)) (oauth2 (0 10)) (circe (2 2)) (alert (1 2)) (emojify (0 2))) "Slack client for Emacs" tar ((:commit . "ff46d88726482211e3ac3d0b9c95dd4fdffe11c2") (:authors ("yuya.minami" . "yuya.minami@yuyaminami-no-MacBook-Pro.local")) (:maintainer "yuya.minami" . "yuya.minami@yuyaminami-no-MacBook-Pro.local") (:keywords "tools") (:url . "https://github.com/yuya373/emacs-slack"))]) (slideview . [(20150324 2240) ((cl-lib (0 3))) "File slideshow" tar ((:commit . "b6d170bda139aedf81b47dc55cbd1a3af512fb4c") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "files") (:url . "https://github.com/mhayashi1120/Emacs-slideview"))]) (slim-mode . [(20170728 1348) nil "Major mode for editing Slim files" tar ((:commit . "3636d18ab1c8b316eea71c4732eb44743e2ded87") (:authors ("Nathan Weizenbaum")) (:maintainers ("Nathan Weizenbaum")) (:maintainer "Nathan Weizenbaum") (:keywords "markup" "language") (:url . "http://github.com/slim-template/emacs-slim"))]) - (slime . [(20230730 1734) ((cl-lib (0 5)) (macrostep (0 9))) "Superior Lisp Interaction Mode for Emacs" tar ((:commit . "1e4b7417a1ade842ba4938f66445af68a93176b9") (:keywords "languages" "lisp" "slime") (:url . "https://github.com/slime/slime"))]) + (slime . [(20240316 2330) ((emacs (24 3)) (macrostep (0 9))) "Superior Lisp Interaction Mode for Emacs" tar ((:commit . "f62f6315abedbab173830c9fa2690388f5f77c29") (:keywords "languages" "lisp" "slime") (:url . "https://github.com/slime/slime"))]) (slime-company . [(20210124 1627) ((emacs (24 4)) (slime (2 13)) (company (0 9 0))) "slime completion backend for company mode" tar ((:commit . "f20ecc4104d4c35052696e7e760109fb02060e72") (:authors ("Ole Arndt" . "anwyn@sugarshark.com")) (:maintainers ("Ole Arndt" . "anwyn@sugarshark.com")) (:maintainer "Ole Arndt" . "anwyn@sugarshark.com") (:keywords "convenience" "lisp" "abbrev"))]) (slime-docker . [(20210426 1422) ((emacs (24 4)) (slime (2 16)) (docker-tramp (0 1))) "Integration of SLIME with Docker containers" tar ((:commit . "c7d073720f2bd8e9f72a20309fff2afa4c4e798d") (:keywords "docker" "lisp" "slime") (:url . "https://gitlab.common-lisp.net/cl-docker-images/slime-docker"))]) (slime-repl-ansi-color . [(20230214 1453) ((emacs (24)) (slime (2 3 1))) "Turn on ANSI colors in REPL output;" tar ((:commit . "9e8af90490332217e45d7568f1690df3f4e25d4b") (:authors ("Max Mikhanosha" . "max@openchat.com")) (:maintainers ("Augustin Fabre" . "augustin@augfab.fr")) (:maintainer "Augustin Fabre" . "augustin@augfab.fr") (:keywords "lisp") (:url . "https://gitlab.com/augfab/slime-repl-ansi-color"))]) (slime-theme . [(20170808 1322) ((emacs (24 0))) "an Emacs 24 theme based on Slime (tmTheme)" tar ((:commit . "8e5880ac69e0b6a079103001cc3a90bdb688998f") (:authors ("Jason Milkins")) (:maintainers ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/tmtheme-to-deftheme"))]) (slime-volleyball . [(20190701 1624) nil "An SVG Slime Volleyball Game" tar ((:commit . "6c135ad18897c3566d4dadfe847061532600ba2e") (:authors ("Thomas Fitzsimmons" . "fitzsim@fitzsim.org")) (:maintainers ("Thomas Fitzsimmons" . "fitzsim@fitzsim.org")) (:maintainer "Thomas Fitzsimmons" . "fitzsim@fitzsim.org") (:keywords "games"))]) + (slint-mode . [(20230922 1143) ((emacs (24 4)) (lsp-mode (6 0))) "Major-mode for the Slint UI language" tar ((:commit . "1ef68ca9cf0cffd2c863c3135f96202a19cf8182") (:authors ("Niklas Cathor" . "niklas.cathor@gmx.de")) (:maintainers ("Niklas Cathor" . "niklas.cathor@gmx.de")) (:maintainer "Niklas Cathor" . "niklas.cathor@gmx.de") (:keywords "languages") (:url . "https://github.com/nilclass/slint-mode"))]) (slirm . [(20160201 1425) ((emacs (24 4))) "Systematic Literature Review Mode for Emacs." tar ((:commit . "9adfbe1fc67580e7d0d90f7e927a25d63a797464") (:authors ("Florian Biermann" . "fbie@itu.dk")) (:maintainers ("Florian Biermann" . "fbie@itu.dk")) (:maintainer "Florian Biermann" . "fbie@itu.dk") (:url . "http://github.com/fbie/slirm"))]) (slovak-holidays . [(20211018 1754) nil "Adds a list of slovak holidays to Emacs calendar" tar ((:commit . "bedd26dd45ca497c0028a11e94a905560fcdb2f1") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "calendar"))]) (slow-keys . [(20220807 1425) ((emacs (24 1))) "Slow keys mode to avoid RSI" tar ((:commit . "b951ae4bdcea56ced03f227b82b28c3d91d15e61") (:authors ("Manuel Uberti" . "manuel.uberti@inventati.org")) (:maintainers ("Manuel Uberti" . "manuel.uberti@inventati.org")) (:maintainer "Manuel Uberti" . "manuel.uberti@inventati.org") (:keywords "convenience") (:url . "https://github.com/manuel-uberti/slow-keys"))]) (slstats . [(20170823 849) ((cl-lib (0 5)) (emacs (24))) "Acquire and display stats about Second Life" tar ((:commit . "e9696066abf3f2b7b818a57c062530dfd9377033") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainers ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:keywords "games") (:url . "https://github.com/davep/slstats.el"))]) (slurm-mode . [(20210519 1109) nil "Interaction with the SLURM job scheduling system" tar ((:commit . "4e6ac09245313cf4018b8e5784b2fca8604269d7") (:url . "https://github.com/ffevotte/slurm.el"))]) - (sly . [(20230624 1930) ((emacs (24 3))) "Sylvester the Cat's Common Lisp IDE" tar ((:commit . "df62abae73bd511885c9c7ec0ea7ea1469a00923") (:keywords "languages" "lisp" "sly") (:url . "https://github.com/joaotavora/sly"))]) + (sly . [(20231213 1030) ((emacs (24 3))) "Sylvester the Cat's Common Lisp IDE" tar ((:commit . "ed17d2c2bd7aead0fbb09c3d22861c80a522a097") (:keywords "languages" "lisp" "sly") (:url . "https://github.com/joaotavora/sly"))]) (sly-asdf . [(20221119 2235) ((emacs (24 3)) (sly (1 0 0 -2 2)) (popup (0 5 3))) "ASDF system support for SLY" tar ((:commit . "6f9d751469bb82530db1673c22e7437ca6c95f45") (:maintainers ("Matt George" . "mmge93@gmail.com")) (:maintainer "Matt George" . "mmge93@gmail.com") (:keywords "languages" "lisp" "sly" "asdf") (:url . "https://github.com/mmgeorge/sly-asdf"))]) (sly-hello-world . [(20200225 1755) ((sly (1 0 0 -2 2))) "A template SLY contrib" tar ((:commit . "be257e9ad354db690c7378e89899335597348a0d") (:authors ("João Távora" . "joaotavora@gmail.com")) (:maintainers ("João Távora" . "joaotavora@gmail.com")) (:maintainer "João Távora" . "joaotavora@gmail.com") (:keywords "languages" "lisp" "sly") (:url . "https://github.com/capitaomorte/sly-hello-world"))]) (sly-macrostep . [(20191211 1630) ((sly (1 0 0 -2 2)) (macrostep (0 9))) "fancy macro-expansion via macrostep.el" tar ((:commit . "5113e4e926cd752b1d0bcc1508b3ebad5def5fad") (:keywords "languages" "lisp" "sly") (:url . "https://github.com/capitaomorte/sly-macrostep"))]) (sly-named-readtables . [(20191013 2138) ((sly (1 0 0 -2 2))) "Support named readtables in Common Lisp files" tar ((:commit . "a5a42674ccffa97ccd5e4e9742beaf3ea719931f") (:authors ("João Távora" . "joaotavora@gmail.com")) (:maintainers ("João Távora" . "joaotavora@gmail.com")) (:maintainer "João Távora" . "joaotavora@gmail.com") (:keywords "languages" "lisp" "sly") (:url . "https://github.com/capitaomorte/sly-named-readtables"))]) + (sly-overlay . [(20240107 2206) ((emacs (24 4)) (sly (1 0))) "Overlay Common Lisp evaluation results" tar ((:commit . "078c2db5390ef19d1336da067fe85b9586b261e4") (:authors ("Colin Woodbury" . "colin@fosskers.ca")) (:maintainers ("Colin Woodbury" . "colin@fosskers.ca")) (:maintainer "Colin Woodbury" . "colin@fosskers.ca") (:keywords "lisp") (:url . "https://git.sr.ht/~fosskers/sly-overlay"))]) (sly-quicklisp . [(20211206 948) ((sly (1 0 0 -2 2))) "Quicklisp support for SLY" tar ((:commit . "34c73d43dd9066262387c626c17a9b486db07b2d") (:authors ("João Távora" . "joaotavora@gmail.com")) (:maintainers ("João Távora" . "joaotavora@gmail.com")) (:maintainer "João Távora" . "joaotavora@gmail.com") (:keywords "languages" "lisp" "sly") (:url . "https://github.com/capitaomorte/sly-quicklisp"))]) (sly-repl-ansi-color . [(20171020 1516) ((sly (0)) (cl-lib (0 5))) "Add ANSI colors support to the sly mrepl." tar ((:commit . "b9cd52d1cf927bf7e08582d46ab0bcf1d4fb5048") (:authors ("Javier \"PuercoPop\" Olaechea" . "pirata@gmail.com") ("Max Mikhanosha")) (:maintainers ("Javier \"PuercoPop\" Olaechea" . "pirata@gmail.com")) (:maintainer "Javier \"PuercoPop\" Olaechea" . "pirata@gmail.com") (:keywords "sly") (:url . "https://github.com/PuercoPop/sly-repl-ansi-color"))]) (smart-backspace . [(20171014 526) nil "intellj like backspace" tar ((:commit . "acb390628a181a993aa0d137624f2e5283efa6d9") (:authors ("Takeshi Tsukamoto" . "t.t.itm.0403@gmail.com")) (:maintainers ("Takeshi Tsukamoto" . "t.t.itm.0403@gmail.com")) (:maintainer "Takeshi Tsukamoto" . "t.t.itm.0403@gmail.com") (:url . "https://github.com/itome/smart-backspace"))]) (smart-comment . [(20160322 1839) nil "smarter commenting" tar ((:commit . "ad4e0de29115dc010733b9060d3dab02836b15e1") (:authors ("Simon Friis Vindum" . "simon@vindum.io")) (:maintainers ("Simon Friis Vindum" . "simon@vindum.io")) (:maintainer "Simon Friis Vindum" . "simon@vindum.io") (:keywords "lisp"))]) - (smart-compile . [(20230822 1208) nil "an interface to `compile'" tar ((:commit . "8dcf2d1639f662c355c3fe2f533995042dce0ca8") (:authors ("Seiji Zenitani" . "zenitani@gmail.com")) (:maintainers ("Seiji Zenitani" . "zenitani@gmail.com")) (:maintainer "Seiji Zenitani" . "zenitani@gmail.com") (:keywords "tools" "unix"))]) + (smart-compile . [(20240102 1350) nil "an interface to `compile'" tar ((:commit . "09f31e1adf2bd900138b0b8e6d2060c336eb07ad") (:authors ("Seiji Zenitani" . "zenitani@gmail.com")) (:maintainers ("Seiji Zenitani" . "zenitani@gmail.com")) (:maintainer "Seiji Zenitani" . "zenitani@gmail.com") (:keywords "tools" "unix"))]) (smart-cursor-color . [(20201207 2228) nil "Change cursor color dynamically" tar ((:commit . "d532f0b27e37cbd3bfc0be09d0b54aa38f1648f1") (:authors ("7696122")) (:maintainers ("7696122")) (:maintainer "7696122") (:keywords "cursor" "color" "face") (:url . "https://github.com/7696122/smart-cursor-color/"))]) - (smart-dash . [(20220704 1645) nil "Smart-Dash minor mode" tar ((:commit . "2c31849b09d504010c800584b6ab39d61c647bd6") (:authors ("Dennis Lambe Jr." . "malsyned@malsyned.net")) (:maintainers ("Dennis Lambe Jr." . "malsyned@malsyned.net")) (:maintainer "Dennis Lambe Jr." . "malsyned@malsyned.net"))]) + (smart-dash . [(20240129 1813) nil "Smart-Dash minor mode" tar ((:commit . "04481dd62671a557fa8812c336d23108e2bca2fa") (:authors ("Dennis Lambe Jr." . "malsyned@malsyned.net")) (:maintainers ("Dennis Lambe Jr." . "malsyned@malsyned.net")) (:maintainer "Dennis Lambe Jr." . "malsyned@malsyned.net"))]) (smart-delete . [(20230802 1113) ((emacs (24 1))) "IntelliJ-like backspace/delete" tar ((:commit . "b1f90b9510caf21d87ba26e30d56dfbaec92d4e9") (:authors ("Leonardo Schripsema")) (:maintainers ("Leonardo Schripsema")) (:maintainer "Leonardo Schripsema") (:keywords "emulations" "wp") (:url . "https://github.com/leodag/smart-delete"))]) (smart-forward . [(20140430 713) ((expand-region (0 8 0))) "Semantic navigation" tar ((:commit . "7b6dbfdbd4b646376a567c70e1a161545431b72b") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainers ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:keywords "navigation"))]) (smart-hungry-delete . [(20220516 1538) ((emacs (24 3))) "smart hungry deletion of whitespace" tar ((:commit . "e06525cc1841805ebe470c876d6b966de90bc275") (:authors ("Hauke Rehfeld" . "emacs@haukerehfeld.de")) (:maintainers ("Hauke Rehfeld" . "emacs@haukerehfeld.de")) (:maintainer "Hauke Rehfeld" . "emacs@haukerehfeld.de") (:keywords "convenience") (:url . "https://github.com/hrehfeld/emacs-smart-hungry-delete"))]) @@ -4714,7 +4830,7 @@ (smart-jump . [(20210304 844) ((emacs (25 1))) "Smart go to definition." tar ((:commit . "3392eb35e3cde37e6f5f2a48dc0db15ca535143c") (:authors ("James Nguyen" . "james@jojojames.com")) (:maintainers ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com") (:keywords "tools") (:url . "https://github.com/jojojames/smart-jump"))]) (smart-mark . [(20150912 210) nil "Restore point after C-g when mark" tar ((:commit . "d179cdc3f53001a5ce99d5095f493cdf3a792567") (:authors ("Kai Yu" . "yeannylam@gmail.com")) (:maintainers ("Kai Yu" . "yeannylam@gmail.com")) (:maintainer "Kai Yu" . "yeannylam@gmail.com") (:keywords "mark" "restore"))]) (smart-mode-line . [(20211005 233) ((emacs (24 3)) (rich-minority (0 1 1))) "A color coded smart mode-line." tar ((:commit . "abcb0ab6f7110a03d6c7428bae67cf8731496433") (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainers ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") (:keywords "mode-line" "faces" "themes") (:url . "http://github.com/Malabarba/smart-mode-line"))]) - (smart-mode-line-atom-one-dark-theme . [(20230107 1731) ((emacs (24 3)) (smart-mode-line (2 10))) "Atom-one-dark theme for smart-mode-line" tar ((:commit . "5f2056d7c24e9c8964f700ab6ec6f00ba4315eb8") (:authors ("Davide Restivo" . "davide.restivo@yahoo.it")) (:maintainers ("Davide Restivo" . "davide.restivo@yahoo.it")) (:maintainer "Davide Restivo" . "davide.restivo@yahoo.it") (:keywords "mode-line" "themes" "faces") (:url . "https://github.com/daviderestivo/smart-mode-line-atom-one-dark-theme"))]) + (smart-mode-line-atom-one-dark-theme . [(20240103 927) ((emacs (24 3)) (smart-mode-line (2 10))) "Atom-one-dark theme for smart-mode-line" tar ((:commit . "f422b79e7b6e2796b1d5f4143913497383840960") (:authors ("Davide Restivo" . "davide.restivo@yahoo.it")) (:maintainers ("Davide Restivo" . "davide.restivo@yahoo.it")) (:maintainer "Davide Restivo" . "davide.restivo@yahoo.it") (:keywords "mode-line" "themes" "faces") (:url . "https://github.com/daviderestivo/smart-mode-line-atom-one-dark-theme"))]) (smart-mode-line-powerline-theme . [(20211005 233) ((emacs (24 3)) (powerline (2 2)) (smart-mode-line (2 5))) "smart-mode-line theme that mimics the powerline appearance." tar ((:commit . "abcb0ab6f7110a03d6c7428bae67cf8731496433") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainers ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com") (:keywords "mode-line" "faces" "themes") (:url . "http://github.com/Bruce-Connor/smart-mode-line"))]) (smart-newline . [(20131208 340) nil "Provide smart newline for one keybind." tar ((:commit . "c50ab035839b307c66d439083b6761cb7db5e972") (:authors ("Satoshi Namai")) (:maintainers ("Satoshi Namai")) (:maintainer "Satoshi Namai"))]) (smart-region . [(20150903 1403) ((emacs (24 4)) (expand-region (0 10 0)) (multiple-cursors (1 3 0)) (cl-lib (0 5))) "Smartly select region, rectangle, multi cursors" tar ((:commit . "5a8017fd8e8dc3483865951c4942cab3f96f69f6") (:authors ("Yuuki Arisawa" . "yuuki.ari@gmail.com")) (:maintainers ("Yuuki Arisawa" . "yuuki.ari@gmail.com")) (:maintainer "Yuuki Arisawa" . "yuuki.ari@gmail.com") (:keywords "marking" "region") (:url . "https://github.com/uk-ar/smart-region"))]) @@ -4723,7 +4839,7 @@ (smart-tab . [(20210530 1743) ((emacs (24 3))) "Intelligent tab completion and indentation" tar ((:commit . "2f1b4073904805c8454ebc9bc967b23836a2d577") (:authors ("John SJ Anderson" . "john@genehack.org") ("Sebastien Rocca Serra" . "sroccaserra@gmail.com") ("Daniel Hackney" . "dan@haxney.org")) (:maintainers ("John SJ Anderson" . "john@genehack.org")) (:maintainer "John SJ Anderson" . "john@genehack.org") (:keywords "extensions") (:url . "https://git.genehack.net/genehack/smart-tab"))]) (smart-tabs-mode . [(20200907 2025) nil "Intelligently indent with tabs, align with spaces!" tar ((:commit . "1044c17e42479de943e69cdeb85e4d05ad9cca8c") (:authors ("John Croisant" . "jacius@gmail.com") ("Alan Pearce" . "alan@alanpearce.co.uk") ("Daniel Dehennin" . "daniel.dehennin@baby-gnu.org") ("Matt Renaud" . "mrenaud92@gmail.com")) (:maintainers ("Joel C. Salomon" . "joelcsalomon@gmail.com")) (:maintainer "Joel C. Salomon" . "joelcsalomon@gmail.com") (:keywords "languages") (:url . "http://www.emacswiki.org/emacs/SmartTabs"))]) (smart-window . [(20160717 130) ((cl-lib (0 5))) "vim-like window controlling plugin" tar ((:commit . "5996461b7cbc5ab4509ac48537916eb29a8e4c16") (:authors ("Felix Chern" . "idryman@gmail.com")) (:maintainers ("Felix Chern" . "idryman@gmail.com")) (:maintainer "Felix Chern" . "idryman@gmail.com") (:keywords "window") (:url . "https://github.com/dryman/smart-window.el"))]) - (smartparens . [(20230529 1017) ((dash (2 13 0)) (cl-lib (0 3))) "Automatic insertion, wrapping and paredit-like navigation with user defined pairs." tar ((:commit . "79a338db115f441cd47bb91e6f75816c5e78a772") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com") (:keywords "abbrev" "convenience" "editing") (:url . "https://github.com/Fuco1/smartparens"))]) + (smartparens . [(20240317 2220) ((dash (2 13 0)) (cl-lib (0 3))) "Automatic insertion, wrapping and paredit-like navigation with user defined pairs." tar ((:commit . "ce1b3b9ff83e7eef0da3d2e0e08c8b9e43a08d9a") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com") (:keywords "abbrev" "convenience" "editing") (:url . "https://github.com/Fuco1/smartparens"))]) (smartrep . [(20150509 230) nil "Support sequential operation which omitted prefix keys." tar ((:commit . "f0ff5a6d7b8603603598ae3045c98b011e58d86e") (:authors ("myuhe ")) (:maintainers ("myuhe")) (:maintainer "myuhe") (:keywords "convenience") (:url . "https://github.com/myuhe/smartrep.el"))]) (smartscan . [(20170211 2033) nil "Jumps between other symbols found at point" tar ((:commit . "234e077145710a174c20742de792b97ed2f965f6") (:authors ("Mickey Petersen" . "mickey@masteringemacs.org")) (:maintainers ("Mickey Petersen" . "mickey@masteringemacs.org")) (:maintainer "Mickey Petersen" . "mickey@masteringemacs.org") (:keywords "extensions"))]) (smarty-mode . [(20100703 1158) nil "major mode for editing smarty templates" tar ((:commit . "3dfdfe1571f5e9ef55a29c51e5a80046d4cb7568") (:maintainers ("Benj Carson")) (:maintainer "Benj Carson") (:keywords "smarty" "php" "languages" "templates") (:url . "none yet"))]) @@ -4737,31 +4853,32 @@ (smithy-mode . [(20220619 1304) ((emacs (26 1))) "Major mode for editing Smithy IDL files" tar ((:commit . "7dff0e7a497a055577226c7ae7ecdeaf7078b4c1") (:authors ("Matt Nemitz" . "matt.nemitz@gmail.com")) (:maintainers ("Matt Nemitz" . "matt.nemitz@gmail.com")) (:maintainer "Matt Nemitz" . "matt.nemitz@gmail.com") (:keywords "tools" "languages" "smithy" "idl" "amazon") (:url . "http://github.com/mnemitz/smithy-mode"))]) (sml-basis . [(20210518 2040) ((emacs (24 5))) "Standard ML Basis Library lookup" tar ((:commit . "c048d575e30a20ec825fd0c5eb9c8a4428a43298") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "languages" "util") (:url . "https://github.com/lassik/emacs-sml-basis"))]) (sml-modeline . [(20170614 2111) nil "Show position in a scrollbar like way in mode-line" tar ((:commit . "d2f9f70174c4cf68c67eb3bb8088235735e34d9a") (:authors ("Lennart Borgman (lennart O borgman A gmail O com)")) (:maintainers ("Lennart Borgman (lennart O borgman A gmail O com)")) (:maintainer "Lennart Borgman (lennart O borgman A gmail O com)") (:url . "http://bazaar.launchpad.net/~nxhtml/nxhtml/main/annotate/head%3A/util/sml-modeline.el"))]) + (smlfmt . [(20231102 853) ((emacs (24)) (reformatter (0 4))) "Format SML source code using the \"smlfmt\" program" tar ((:commit . "7a70cce029a7c37c5e976ab6b426f62561e4e352") (:authors ("Troels Henriksen" . "athas@sigkill")) (:maintainers ("Troels Henriksen" . "athas@sigkill")) (:maintainer "Troels Henriksen" . "athas@sigkill") (:keywords "files" "tools") (:url . "https://github.com/diku-dk/smlfmt.el"))]) (smmry . [(20161024 901) nil "SMMRY client" tar ((:commit . "b7ee765337fa627a6c59eb4f2a91df5d280ac6df") (:authors ("james sangho nah" . "microamp@protonmail.com")) (:maintainers ("james sangho nah" . "microamp@protonmail.com")) (:maintainer "james sangho nah" . "microamp@protonmail.com") (:keywords "api" "smmry") (:url . "https://github.com/microamp/smmry.el"))]) (smog . [(20230530 843) ((emacs (24 1)) (org (8 1))) "Analyse the writing style, word use and readability of prose" tar ((:commit . "2fc5fef0f5000027b3550495259a65966c68ec52") (:authors ("nik gaffney" . "nik@fo.am")) (:maintainers ("nik gaffney" . "nik@fo.am")) (:maintainer "nik gaffney" . "nik@fo.am") (:keywords "tools" "style" "readability" "prose") (:url . "https://github.com/zzkt/smog"))]) (smooth-scroll . [(20130322 414) nil "Minor mode for smooth scrolling and in-place scrolling." tar ((:commit . "02320f28abb5cae28b3a18f6b9ce93129bdbfc45") (:authors ("K-talo Miyazaki ")) (:maintainers ("K-talo Miyazaki ")) (:maintainer "K-talo Miyazaki ") (:keywords "convenience" "emulations" "frames") (:url . "http://www.emacswiki.org/emacs/download/smooth-scroll.el"))]) (smooth-scrolling . [(20161002 1949) nil "Make emacs scroll smoothly" tar ((:commit . "2462c13640aa4c75ab3ddad443fedc29acf68f84") (:authors ("Adam Spiers" . "emacs-ss@adamspiers.org") ("Jeremy Bondeson" . "jbondeson@gmail.com") ("Ryan C. Thompson" . "rct+github@thompsonclan.org")) (:maintainers ("Adam Spiers" . "emacs-ss@adamspiers.org")) (:maintainer "Adam Spiers" . "emacs-ss@adamspiers.org") (:keywords "convenience") (:url . "http://github.com/aspiers/smooth-scrolling/"))]) (smotitah . [(20150218 1030) nil "Modular emacs configuration framework" tar ((:commit . "f9ab562128a5460549d016913533778e8c94bcf3") (:authors ("Alessandro Piras" . "laynor@gmail.com")) (:maintainer "Alessandro Piras" . "laynor@gmail.com") (:keywords "configuration"))]) (smtpmail-multi . [(20160218 2349) nil "Use different smtp servers for sending mail" tar ((:commit . "81eabfe56f620ee044ff9dd52fa8b6148d0a9f30") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainers ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com") (:keywords "comm") (:url . "https://github.com/vapniks/smtpmail-multi"))]) - (smudge . [(20210326 2222) ((emacs (27 1)) (simple-httpd (1 5)) (request (0 3)) (oauth2 (0 16))) "Control the Spotify app" tar ((:commit . "808f0ef172a80cf4a8ae6d58dfe385d28ecde28e") (:keywords "multimedia" "music" "spotify" "smudge") (:url . "https://github.com/danielfm/smudge"))]) + (smudge . [(20231217 1531) ((emacs (27 1)) (simple-httpd (20230821 1458)) (request (0 3)) (oauth2 (0 16))) "Control the Spotify app" tar ((:commit . "a847e344887863e9c8aa37c909c64350defd1b73") (:keywords "multimedia" "music" "spotify" "smudge") (:url . "https://github.com/danielfm/smudge"))]) (smyx-theme . [(20141127 828) nil "smyx Color Theme" tar ((:commit . "6263f6b401bbabaed388c8efcfc0be2e58c51401") (:authors ("Uriel G Maldonado" . "uriel781@gmail.com")) (:maintainers ("Uriel G Maldonado" . "uriel781@gmail.com")) (:maintainer "Uriel G Maldonado" . "uriel781@gmail.com") (:keywords "color" "theme" "smyx"))]) - (snakemake-mode . [(20230418 147) ((emacs (26 1)) (transient (0 3 0))) "Major mode for editing Snakemake files" tar ((:commit . "0c4c5b6a25735ac025ce124ace9f0259eb5198e9") (:authors ("Kyle Meyer" . "kyle@kyleam.com")) (:maintainers ("Kyle Meyer" . "kyle@kyleam.com")) (:maintainer "Kyle Meyer" . "kyle@kyleam.com") (:keywords "tools") (:url . "https://git.kyleam.com/snakemake-mode/about"))]) + (snakemake-mode . [(20231210 2008) ((emacs (26 1)) (transient (0 3 0))) "Major mode for editing Snakemake files" tar ((:commit . "5c47042e088d69375b6407a7eded166403d6fd81") (:authors ("Kyle Meyer" . "kyle@kyleam.com")) (:maintainers ("Kyle Meyer" . "kyle@kyleam.com")) (:maintainer "Kyle Meyer" . "kyle@kyleam.com") (:keywords "tools") (:url . "https://git.kyleam.com/snakemake-mode/about"))]) (snap-indent . [(20230704 1833) ((emacs (24 1))) "Simple automatic indentation" tar ((:commit . "c4e49295aa1a2678c0e9232c12448fd944aced8e") (:authors ("Jeff Valk" . "jv@jeffvalk.com")) (:maintainers ("Jeff Valk" . "jv@jeffvalk.com")) (:maintainer "Jeff Valk" . "jv@jeffvalk.com") (:keywords "indent" "tools" "convenience") (:url . "https://github.com/jeffvalk/snap-indent"))]) (snapshot-timemachine . [(20161221 929) ((emacs (24 4))) "Step through (Btrfs, ZFS, ...) snapshots of files" tar ((:commit . "99efcebab309b11ed512a8dc62555d3834df5efb") (:authors ("Thomas Winant" . "dewinant@gmail.com")) (:maintainers ("Thomas Winant" . "dewinant@gmail.com")) (:maintainer "Thomas Winant" . "dewinant@gmail.com") (:url . "https://github.com/mrBliss/snapshot-timemachine"))]) (snapshot-timemachine-rsnapshot . [(20170324 1213) ((snapshot-timemachine (20160222 132)) (seq (2 19))) "rsnapshot backend for snapshot-timemachine" tar ((:commit . "72b0b700d80f1a0442e62bbbb6a0c8c59182f97f") (:authors ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainers ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr"))]) (snazzy-theme . [(20170828 757) ((emacs (24)) (base16-theme (2 1))) "An elegant syntax theme with bright colors" tar ((:commit . "578d7ebc4ed91c0a630b652c4b6fdd54d9ae16cd") (:keywords "faces" "theme" "color" "snazzy") (:url . "https://github.com/weijiangan/emacs-snazzy/"))]) - (sniem . [(20230822 358) ((emacs (27 1)) (s (2 12 0)) (dash (1 12 0))) "Hands-eased united editing method" tar ((:commit . "cb5468ab6792654d18c50d80a2ec0f4b603e21b7") (:authors ("SpringHan")) (:maintainers ("SpringHan")) (:maintainer "SpringHan") (:keywords "convenience" "united-editing-method") (:url . "https://github.com/SpringHan/sniem.git"))]) + (sniem . [(20240228 1320) ((emacs (27 1)) (s (2 12 0)) (dash (1 12 0))) "Hands-eased united editing method" tar ((:commit . "50ead3321c448261d974ca05cd811fcd2232aeda") (:authors ("SpringHan")) (:maintainers ("SpringHan")) (:maintainer "SpringHan") (:keywords "convenience" "united-editing-method") (:url . "https://github.com/SpringHan/sniem.git"))]) (snitch . [(20210202 1730) ((emacs (27 1))) "An Emacs firewall" tar ((:commit . "3b3e7f1bf612c4624764d1ec4b1a96e4d2850b05") (:authors ("Trevor Bentley" . "snitch.el@x.mrmekon.com")) (:maintainers ("Trevor Bentley" . "snitch.el@x.mrmekon.com")) (:maintainer "Trevor Bentley" . "snitch.el@x.mrmekon.com") (:keywords "processes" "comm") (:url . "https://github.com/mrmekon/snitch-el"))]) (snoopy . [(20171008 2004) ((emacs (24)) (cl-lib (0 6))) "minor mode for number row unshifted character insertion" tar ((:commit . "ec4123bdebfe0bb7bf4feaac2dc02b59caffe386") (:authors ("António Nuno Monteiro" . "anmonteiro@gmail.com")) (:maintainers ("António Nuno Monteiro" . "anmonteiro@gmail.com")) (:maintainer "António Nuno Monteiro" . "anmonteiro@gmail.com") (:keywords "lisp"))]) (snow . [(20221226 2238) ((emacs (26 3))) "Let it snow in Emacs!" tar ((:commit . "be17977677fa29709a726715a1a1cba1bd299f68") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "games") (:url . "https://github.com/alphapapa/snow.el"))]) (soar-mode . [(20190503 1843) nil "A major mode for the Soar language" tar ((:commit . "ebb79789cd35530aea2c6d0eb4f4b280e97107d4") (:keywords "languages" "soar") (:url . "https://github.com/adeschamps/soar-mode"))]) - (soccer . [(20230718 910) ((emacs (26 1)) (dash (2 19 1))) "Fixtures, results, table etc for soccer" tar ((:commit . "5d8ff098eb91367e54a454d3f382940b8f5af81b") (:authors ("Md Arif Shaikh" . "arifshaikh.astro@gmail.com")) (:maintainers ("Md Arif Shaikh" . "arifshaikh.astro@gmail.com")) (:maintainer "Md Arif Shaikh" . "arifshaikh.astro@gmail.com") (:keywords "games" "soccer" "football") (:url . "https://github.com/md-arif-shaikh/soccer"))]) + (soccer . [(20231108 1633) ((emacs (26 1)) (dash (2 19 1))) "Fixtures, results, table etc for soccer" tar ((:commit . "96dd98a34238c8019d48507071df5d2b199360cd") (:authors ("Md Arif Shaikh" . "arifshaikh.astro@gmail.com")) (:maintainers ("Md Arif Shaikh" . "arifshaikh.astro@gmail.com")) (:maintainer "Md Arif Shaikh" . "arifshaikh.astro@gmail.com") (:keywords "games" "soccer" "football") (:url . "https://github.com/md-arif-shaikh/soccer"))]) (socyl . [(20170212 642) ((s (1 11 0)) (dash (2 12 0)) (pkg-info (0 5 0)) (cl-lib (0 5))) "Frontend for several search tools" tar ((:commit . "1ef2da42f66f3ab31a34131e51648f352416f0ba") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainers ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "ripgrep" "sift" "ack" "pt" "ag" "grep" "search") (:url . "https://github.com/nlamirault/socyl"))]) (soft-charcoal-theme . [(20140420 1643) nil "Dark charcoal theme with soft colors" tar ((:commit . "5607ab977fae6638e78b1495e02da8955c9ba19f") (:authors ("Martin Haesler")) (:maintainers ("Martin Haesler")) (:maintainer "Martin Haesler") (:url . "http://github.com/mswift42/soft-charcoal-theme"))]) (soft-morning-theme . [(20150918 2041) nil "Emacs24 theme with a light background." tar ((:commit . "c0f9c70c97ef2be2a093cf839c4bfe27740a111c") (:authors ("Martin Haesler")) (:maintainers ("Martin Haesler")) (:maintainer "Martin Haesler") (:url . "http://github.com/mswift42/soft-morning-theme"))]) (soft-stone-theme . [(20140614 835) ((emacs (24))) "Emacs 24 theme with a light background." tar ((:commit . "fb475514cfb02cf30ce358a61c48e46614344d48") (:authors ("Martin Haesler")) (:maintainers ("Martin Haesler")) (:maintainer "Martin Haesler") (:url . "http://github.com/mswift42/soft-stone-theme"))]) (solaire-mode . [(20211213 102) ((emacs (25 1)) (cl-lib (0 5))) "make certain buffers grossly incandescent" tar ((:commit . "8af65fbdc50b25ed3214da949b8a484527c7cc14") (:authors ("Henrik Lissner ")) (:maintainers ("Henrik Lissner" . "contact@henrik.io")) (:maintainer "Henrik Lissner" . "contact@henrik.io") (:keywords "dim" "bright" "window" "buffer" "faces") (:url . "https://github.com/hlissner/emacs-solaire-mode"))]) - (solarized-theme . [(20230816 1732) ((emacs (24 1))) "The Solarized color theme" tar ((:commit . "07a681fff27ff22d268b726b05576ef93fc4e615") (:authors ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev") (:keywords "convenience" "themes" "solarized") (:url . "http://github.com/bbatsov/solarized-emacs"))]) + (solarized-theme . [(20231204 713) ((emacs (24 1))) "The Solarized color theme" tar ((:commit . "922b5956a9e2e474f1595bad7b2b35f148b4df3f") (:authors ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev") (:keywords "convenience" "themes" "solarized") (:url . "http://github.com/bbatsov/solarized-emacs"))]) (solidity-flycheck . [(20221024 220) ((flycheck (32 -4)) (solidity-mode (0 1 9)) (dash (2 17 0))) "Flycheck integration for solidity emacs mode" tar ((:commit . "8cb8ac6d1311f5bc893cd72ee96e3e335ee8b2a1") (:authors ("Lefteris Karapetsas " . "lefteris@refu.co")) (:maintainers ("Lefteris Karapetsas " . "lefteris@refu.co")) (:maintainer "Lefteris Karapetsas " . "lefteris@refu.co") (:keywords "languages" "solidity" "flycheck"))]) (solidity-mode . [(20230628 1637) nil "Major mode for ethereum's solidity language" tar ((:commit . "8ba549e429e86778a0e079648f3bc3463fcb15f6") (:authors ("Lefteris Karapetsas " . "lefteris@refu.co")) (:maintainers ("Lefteris Karapetsas " . "lefteris@refu.co")) (:maintainer "Lefteris Karapetsas " . "lefteris@refu.co") (:keywords "languages" "solidity"))]) (solo-jazz-theme . [(20220117 2009) ((emacs (24 1))) "The Solo-Jazz color theme" tar ((:commit . "51d63d8a2c855f4ea79eef9fc9c8a5c9702642c4") (:authors ("Carl Steib")) (:maintainers ("Carl Steib")) (:maintainer "Carl Steib") (:url . "https://github.com/cstby/solo-jazz-emacs-theme"))]) @@ -4769,12 +4886,13 @@ (sonic-pi . [(20211214 1242) ((cl-lib (0 5)) (osc (0 1)) (dash (2 2 0)) (emacs (24)) (highlight (0))) "A Emacs client for SonicPi" tar ((:commit . "9ae16d0fd4cba77ae0bedac83f2cb46569be6ade") (:authors ("Joseph Wilk" . "joe@josephwilk.net")) (:maintainers ("Joseph Wilk" . "joe@josephwilk.net")) (:maintainer "Joseph Wilk" . "joe@josephwilk.net") (:keywords "sonicpi" "ruby") (:url . "http://www.github.com/repl-electric/sonic-pi.el"))]) (soong-mode . [(20221217 1243) ((emacs (27 1))) "Major mode for editing Soong build files" tar ((:commit . "bf3dc1070b368b413958f54fbe9bcc2aaf77b56f") (:authors ("Sergey Bobrenok" . "bobrofon@gmail.com")) (:maintainers ("Sergey Bobrenok" . "bobrofon@gmail.com")) (:maintainer "Sergey Bobrenok" . "bobrofon@gmail.com") (:keywords "languages") (:url . "https://github.com/bobrofon/soong-mode"))]) (soothe-theme . [(20220922 349) ((emacs (24 3)) (autothemer (0 2))) "A dark colorful theme" tar ((:commit . "d8aee0fca549d535ebb7b5fd1a8017f12925d16b") (:authors ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainers ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com") (:url . "https://github.com/emacsfodder/emacs-soothe-theme"))]) + (sops . [(20240315 2226) ((emacs (28 1)) (s (1 13 0))) "SOPS encrypt and decrypt without leaving the editor" tar ((:commit . "9ed9f02ff83ab6e0cb0173f0578be1a5b71e3b66") (:authors ("Jonathan Carroll Otsuka" . "pitas.axioms0c@icloud.com")) (:maintainers ("Jonathan Carroll Otsuka" . "pitas.axioms0c@icloud.com")) (:maintainer "Jonathan Carroll Otsuka" . "pitas.axioms0c@icloud.com") (:keywords "convenience" "programming") (:url . "http://github.com/djgoku/sops"))]) (sorcery-theme . [(20210101 1352) ((autothemer (0 2))) "A D&D (Dark and Dusty) Theme" tar ((:commit . "5a1c4445b9e6e09589a299a9962a6973272a0c2f") (:authors ("Maxime Tréca" . "maxime@gmail.com")) (:maintainers ("Maxime Tréca" . "maxime@gmail.com")) (:maintainer "Maxime Tréca" . "maxime@gmail.com") (:url . "http://github.com/vxid/emacs-theme-sorcery"))]) (soria-theme . [(20230227 1454) ((emacs (25 1))) "A xoria256 theme with some colors from openSUSE" tar ((:commit . "c5275d02fcc9f6af2cfebd69bcf69f8cdccbe3ab") (:authors ("Miquel Sabaté Solà" . "mikisabate@gmail.com")) (:maintainers ("Miquel Sabaté Solà" . "mikisabate@gmail.com")) (:maintainer "Miquel Sabaté Solà" . "mikisabate@gmail.com") (:keywords "faces") (:url . "https://github.com/mssola/soria"))]) (sort-words . [(20160929 1335) nil "Sort words in a selected region" tar ((:commit . "7b6e108f80237363faf7ec28b2c58dec270b8601") (:authors ("\"Aleksandar Simic\"" . "asimic@gmail.com")) (:maintainers ("\"Aleksandar Simic\"" . "asimic@gmail.com")) (:maintainer "\"Aleksandar Simic\"" . "asimic@gmail.com") (:keywords "tools") (:url . "http://github.org/dotemacs/sort-words.el"))]) (sotclojure . [(20170922 8) ((emacs (24 1)) (clojure-mode (4 0 0)) (cider (0 8)) (sotlisp (1 3))) "Write clojure at the speed of thought." tar ((:commit . "ceac82aa691e8d98946471be6aaff9c9a4603c32") (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainers ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") (:keywords "convenience" "clojure") (:url . "https://github.com/Malabarba/speed-of-thought-clojure"))]) (sotlisp . [(20220909 803) ((emacs (24 1))) "Write lisp at the speed of thought." tar ((:commit . "04186129f2dccf48e288639b78adeb9c0e94be54") (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainers ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") (:keywords "convenience" "lisp") (:url . "https://github.com/Malabarba/speed-of-thought-lisp"))]) - (sound-wav . [(20200323 728) ((deferred (0 3 1)) (cl-lib (0 5))) "Play wav file" tar ((:commit . "8a18f8a62f4fdde80dfa069986aa959091a42472") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-sound-wav"))]) + (sound-wav . [(20230929 721) ((deferred (0 3 1)) (cl-lib (0 5))) "Play wav file" tar ((:commit . "b522e7fa0ef24ec669d0b02935287c2a6cc8c314") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-sound-wav"))]) (soundcloud . [(20150502 326) ((emms (20131016)) (json (1 2)) (deferred (0 3 1)) (string-utils (0 3 2)) (request (20140316 417)) (request-deferred (20130526 1015))) "a SoundCloud client for Emacs" tar ((:commit . "f998d4276ea90258909c698f6a5a51fccb667c08") (:authors ("Travis Thieman" . "travis.thieman@gmail.com")) (:maintainers ("Travis Thieman" . "travis.thieman@gmail.com")) (:maintainer "Travis Thieman" . "travis.thieman@gmail.com") (:keywords "soundcloud" "music" "audio"))]) (soundklaus . [(20191220 2112) ((dash (2 12 1)) (emacs (24)) (emms (4 0)) (s (1 11 0)) (pkg-info (0 4)) (cl-lib (0 5)) (request (0 2 0))) "Play music on SoundCloud with Emacs via EMMS" tar ((:commit . "15ce6e7f24a45e4f202d83cca9fa3bfdd94ca592") (:authors ("r0man" . "roman@burningswell.com")) (:maintainers ("r0man" . "roman@burningswell.com")) (:maintainer "r0man" . "roman@burningswell.com") (:keywords "soundcloud" "music" "emms") (:url . "https://github.com/r0man/soundklaus.el"))]) (sourcekit . [(20210430 2155) ((emacs (24 3)) (dash (2 18 0)) (request (0 2 0))) "Library to interact with sourcekittendaemon" tar ((:commit . "a1860ad4dd3a542acd2fa0dfac2a388cbdf4af0c") (:authors ("Nathan Kot" . "nk@nathankot.com")) (:maintainers ("Nathan Kot" . "nk@nathankot.com")) (:maintainer "Nathan Kot" . "nk@nathankot.com") (:keywords "tools" "processes") (:url . "https://github.com/nathankot/company-sourcekit"))]) @@ -4785,19 +4903,19 @@ (space-theming . [(20200502 1032) ((emacs (24))) "Easilly override theme faces" tar ((:commit . "31dca6954df643255175f7df68a86892aa3c71a7") (:keywords "faces") (:url . "https://github.com/p3r7/space-theming"))]) (spacebar . [(20190719 334) ((eyebrowse (0 7 7)) (emacs (25 4 0))) "Workspaces Bar" tar ((:commit . "2b2cd0e786877273103f048e62a06b0027deca2d") (:authors ("Matthias Margush" . "matthias.margush@gmail.com")) (:maintainers ("Matthias Margush" . "matthias.margush@gmail.com")) (:maintainer "Matthias Margush" . "matthias.margush@gmail.com") (:keywords "convenience") (:url . "https://github.com/matthias-margush/spacebar"))]) (spacegray-theme . [(20150719 1931) ((emacs (24 1))) "A Hyperminimal UI Theme" tar ((:commit . "7f70ee36297e5ccf9bc90b1f81472024f5a7a749") (:authors ("Bruce Williams" . "brwcodes@gmail.com")) (:maintainers ("Bruce Williams" . "brwcodes@gmail.com")) (:maintainer "Bruce Williams" . "brwcodes@gmail.com") (:keywords "themes") (:url . "http://github.com/bruce/emacs-spacegray-theme"))]) - (spaceline . [(20230821 1443) ((emacs (24 4)) (cl-lib (0 5)) (powerline (2 3)) (dash (2 11 0)) (s (1 10 0))) "Modeline configuration library for powerline" tar ((:commit . "3b1ae4d429f12bac65b0f3764f84eace2903a417") (:authors ("Eivind Fonn" . "evfonn@gmail.com")) (:maintainers ("Eivind Fonn" . "evfonn@gmail.com")) (:maintainer "Eivind Fonn" . "evfonn@gmail.com") (:keywords "mode-line" "powerline" "spacemacs") (:url . "https://github.com/TheBB/spaceline"))]) + (spaceline . [(20230922 1127) ((emacs (24 4)) (cl-lib (0 5)) (powerline (2 3)) (dash (2 11 0)) (s (1 10 0))) "Modeline configuration library for powerline" tar ((:commit . "086420d16e526c79b67fc1edec4c2ae1e699f372") (:authors ("Eivind Fonn" . "evfonn@gmail.com")) (:maintainers ("Eivind Fonn" . "evfonn@gmail.com")) (:maintainer "Eivind Fonn" . "evfonn@gmail.com") (:keywords "mode-line" "powerline" "spacemacs") (:url . "https://github.com/TheBB/spaceline"))]) (spaceline-all-the-icons . [(20190325 1602) ((emacs (24 4)) (all-the-icons (2 6 0)) (spaceline (2 0 0)) (memoize (1 0 1))) "A Spaceline theme using All The Icons" tar ((:commit . "5afd48c10f1bd42d9b9648c5e64596b72f3e9042") (:authors ("Dominic Charlesworth" . "dgc336@gmail.com")) (:maintainers ("Dominic Charlesworth" . "dgc336@gmail.com")) (:maintainer "Dominic Charlesworth" . "dgc336@gmail.com") (:keywords "convenience" "lisp" "tools") (:url . "https://github.com/domtronn/spaceline-all-the-icons.el"))]) (spacemacs-theme . [(20230530 1751) nil "Color theme with a dark and light versions" tar ((:commit . "319ad1cd6aa05dcb43e4edca50eca339892e0865") (:authors ("Nasser Alshammari")) (:maintainer "Nasser Alshammari") (:keywords "color" "theme") (:url . "https://github.com/nashamri/spacemacs-theme"))]) (spaces . [(20170809 2208) nil "Create and switch between named window configurations." tar ((:commit . "6bdb51e9a346907d60a9625f6180bddd06be6674") (:authors ("Steven Thomas")) (:maintainers ("Steven Thomas")) (:maintainer "Steven Thomas") (:keywords "frames" "convenience") (:url . "https://github.com/chumpage/chumpy-windows"))]) - (spanish-holidays . [(20230626 805) nil "Spain holidays for calendar" tar ((:commit . "26d552ae71f670dc966a3b7b7614d1622bce9f38") (:authors ("Carlos Pajuelo" . "carlospajuelo_@hotmail.com")) (:maintainers ("Carlos Pajuelo" . "carlospajuelo_@hotmail.com")) (:maintainer "Carlos Pajuelo" . "carlospajuelo_@hotmail.com") (:keywords "calendar") (:url . "https://gitlab.com/gnuhack/spanish-holidays"))]) + (spanish-holidays . [(20240302 1542) nil "Spain holidays for calendar" tar ((:commit . "81ef3733da0ab807570c7fad1bab613bf7f30acb") (:authors ("Carlos Pajuelo" . "carlospajuelo_@hotmail.com")) (:maintainers ("Carlos Pajuelo" . "carlospajuelo_@hotmail.com")) (:maintainer "Carlos Pajuelo" . "carlospajuelo_@hotmail.com") (:keywords "calendar") (:url . "https://gitlab.com/gnuhack/spanish-holidays"))]) (spark . [(20230406 2307) ((emacs (24 3))) "sparkline generation" tar ((:commit . "0e58e5122cbb46fb6d850e3b72487431a3696861") (:authors ("Alvin Francis Dumalus")) (:maintainers ("Alvin Francis Dumalus")) (:maintainer "Alvin Francis Dumalus") (:keywords "lisp" "data") (:url . "https://github.com/alvinfrancis/spark"))]) (sparkline . [(20150101 1319) ((cl-lib (0 3))) "Make sparkline images from a list of numbers" tar ((:commit . "a2b5d817d272d6363b67ed8f8cc75499a19fa8d2") (:authors ("Willem Rein Oudshoorn" . "woudshoo@xs4all.nl")) (:maintainers ("Willem Rein Oudshoorn" . "woudshoo@xs4all.nl")) (:maintainer "Willem Rein Oudshoorn" . "woudshoo@xs4all.nl") (:keywords "extensions"))]) (sparql-mode . [(20230104 1113) ((cl-lib (0 5)) (emacs (24 3))) "Edit and interactively evaluate SPARQL queries." tar ((:commit . "1f6196094ec6626722c6e03a13f6844c68f62703") (:authors ("Craig Andera ")) (:maintainers ("Bjarte Johansen ")) (:maintainer "Bjarte Johansen ") (:url . "https://github.com/ljos/sparql-mode"))]) (spatial-navigate . [(20230115 633) ((emacs (26 2))) "Directional navigation between white-space blocks" tar ((:commit . "11f281ae16b541ede9b4fadf96200e1728eb6ed0") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.org/ideasman42/emacs-spatial-navigate"))]) - (spdx . [(20230830 58) ((emacs (24 4))) "Insert SPDX license and copyright headers" tar ((:commit . "baacf7ebf490db42f4387e4973f11cfdbde7e895") (:authors ("Zhiwei Chen" . "condy0919@gmail.com")) (:maintainers ("Zhiwei Chen" . "condy0919@gmail.com")) (:maintainer "Zhiwei Chen" . "condy0919@gmail.com") (:keywords "license" "tools") (:url . "https://github.com/condy0919/spdx.el"))]) + (spdx . [(20240316 58) ((emacs (24 4))) "Insert SPDX license and copyright headers" tar ((:commit . "d1b325c8e7e2ac079de1314f91b980b354117248") (:authors ("Zhiwei Chen" . "condy0919@gmail.com")) (:maintainers ("Zhiwei Chen" . "condy0919@gmail.com")) (:maintainer "Zhiwei Chen" . "condy0919@gmail.com") (:keywords "license" "tools") (:url . "https://github.com/condy0919/spdx.el"))]) (speech-tagger . [(20170728 1829) ((cl-lib (0 5))) "tag parts of speech using coreNLP" tar ((:commit . "61955b40d4e8b09e66a3e8033e82893f81657c06") (:authors ("Danny McClanahan" . "danieldmcclanahan@gmail.com")) (:maintainers ("Danny McClanahan" . "danieldmcclanahan@gmail.com")) (:maintainer "Danny McClanahan" . "danieldmcclanahan@gmail.com") (:keywords "speech" "tag" "nlp" "language" "corenlp" "parsing" "natural") (:url . "https://github.com/cosmicexplorer/speech-tagger"))]) (speechd-el . [(20220608 1422) nil "Client to speech synthesizers and Braille displays." tar ((:commit . "7e30c439729d5635ddd341ad5ab16f832a4619ea") (:authors ("Milan Zamazal" . "pdm@zamazal.org")) (:maintainer "Milan Zamazal" . "pdm@zamazal.org"))]) - (speed-type . [(20230206 1330) ((emacs (26 1)) (compat (29 1 3))) "Practice touch and speed typing" tar ((:commit . "4f8553632d71e827b4da6e091143779d2ad970a8") (:authors ("Gunther Hagleitner")) (:maintainers ("Daniel Kraus" . "daniel@kraus.my")) (:maintainer "Daniel Kraus" . "daniel@kraus.my") (:keywords "games") (:url . "https://github.com/dakra/speed-type"))]) + (speed-type . [(20230926 838) ((emacs (26 1)) (compat (29 1 3))) "Practice touch and speed typing" tar ((:commit . "28b8e8c1cc24511758168f30bcac18d8fb93706d") (:authors ("Gunther Hagleitner")) (:maintainers ("Daniel Kraus" . "daniel@kraus.my")) (:maintainer "Daniel Kraus" . "daniel@kraus.my") (:keywords "games") (:url . "https://github.com/dakra/speed-type"))]) (speedbar-git-respect . [(20200901 246) ((f (0 8 0)) (emacs (25 1))) "Particular respect git repo in speedbar" tar ((:commit . "dd8f0849fc1dd21b42380e1a8c28a9a29acd9511") (:authors ("Muromi Ukari" . "chendianbuji@gmail.com")) (:maintainers ("Muromi Ukari" . "chendianbuji@gmail.com")) (:maintainer "Muromi Ukari" . "chendianbuji@gmail.com") (:url . "https://github.com/ukari/speedbar-git-respect"))]) (speeddating . [(20180319 723) ((emacs (25))) "Increase date and time at point" tar ((:commit . "eeaf90cd10e376bff5a295590a3d5f7fd1402523") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainers ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:keywords "date" "time") (:url . "https://github.com/xuchunyang/emacs-speeddating"))]) (spell-fu . [(20230808 1342) ((emacs (26 2))) "Fast & light spelling highlighter" tar ((:commit . "540141a5764ceb403e78e22f6714e2dab3597bc7") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:keywords "convenience") (:url . "https://codeberg.org/ideasman42/emacs-spell-fu"))]) @@ -4819,17 +4937,18 @@ (sql-clickhouse . [(20191209 1443) ((emacs (24))) "support ClickHouse as SQL interpreter" tar ((:commit . "8403a4a5d332dbb6459b7fbce6ea95c36d390a5b") (:authors ("Robert Schwarz" . "mail@rschwarz.net")) (:maintainers ("Robert Schwarz" . "mail@rschwarz.net")) (:maintainer "Robert Schwarz" . "mail@rschwarz.net") (:url . "https://github.com/leethargo/sql-clickhouse"))]) (sql-impala . [(20181218 410) nil "comint support for Cloudera Impala" tar ((:commit . "466e7c0c789ec3e5e8a276c8f6754f91bb584c3e") (:authors ("Jason Terk" . "jason@goterkyourself.com")) (:maintainers ("Jason Terk" . "jason@goterkyourself.com")) (:maintainer "Jason Terk" . "jason@goterkyourself.com") (:keywords "sql" "impala") (:url . "https://github.com/jterk/sql-impala"))]) (sql-presto . [(20190113 1742) ((emacs (24 4))) "No description available." tar ((:commit . "bcda455e300a1af75c7bb805882329bc844703b2") (:authors ("Katherine Cox-Buday" . "cox.katherine.e@gmail.com")) (:maintainers ("Katherine Cox-Buday" . "cox.katherine.e@gmail.com")) (:maintainer "Katherine Cox-Buday" . "cox.katherine.e@gmail.com") (:keywords "sql" "presto" "database"))]) - (sql-sqlline . [(20201102 1508) ((emacs (24 4))) "Adds SQLLine support to SQLi mode" tar ((:commit . "189c55261ecf0d7990edf7d1bb89776225e9092b") (:authors ("Matteo Redaelli" . "matteo.redaelli@gmail.com")) (:maintainers ("Matteo Redaelli" . "matteo.redaelli@gmail.com")) (:maintainer "Matteo Redaelli" . "matteo.redaelli@gmail.com") (:keywords "languages") (:url . "https://gitlab.com/matteoredaelli/sql-sqlline"))]) + (sql-sqlline . [(20231109 2111) ((emacs (24 4))) "Adds SQLLine support to SQLi mode" tar ((:commit . "3d540a8cc9c6f816b241913042008f09323455af") (:authors ("Matteo Redaelli" . "matteo.redaelli@gmail.com")) (:maintainers ("Matteo Redaelli" . "matteo.redaelli@gmail.com")) (:maintainer "Matteo Redaelli" . "matteo.redaelli@gmail.com") (:keywords "languages") (:url . "https://gitlab.com/matteoredaelli/sql-sqlline"))]) (sql-trino . [(20220826 632) ((emacs (24 4))) "Adds Trino support to SQLi mode" tar ((:commit . "624a879ec0d03cae8a92f26d21d88c831e15eb41") (:authors ("Filipe Regadas" . "oss@regadas.email")) (:maintainers ("Filipe Regadas" . "oss@regadas.email")) (:maintainer "Filipe Regadas" . "oss@regadas.email") (:keywords "tools") (:url . "https://github.com/regadas/sql-trino"))]) (sqlformat . [(20230808 543) ((emacs (24 3)) (reformatter (0 3))) "Reformat SQL using sqlformat or pgformatter" tar ((:commit . "c28c5f85828b25f7f36320b585056ea4b7181a9f") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "languages") (:url . "https://github.com/purcell/sqlformat"))]) (sqlite . [(20201227 1822) ((emacs (24 5))) "Use sqlite via ELisp" tar ((:commit . "f3da716302c929b9df4ba0c281968f72a9d1d188") (:authors ("cnngimenez")) (:maintainers ("cnngimenez")) (:maintainer "cnngimenez") (:keywords "extensions" "lisp" "sqlite") (:url . "https://gitlab.com/cnngimenez/sqlite.el"))]) - (sqlite3 . [(20230315 1221) ((emacs (25 1))) "Direct access to the core SQLite3 API" tar ((:commit . "b513b71012f61895f771fc6948d6511ea8ded0a6") (:authors ("Y. N. Lo" . "elisp@fastmail.com")) (:maintainers ("Y. N. Lo" . "elisp@fastmail.com")) (:maintainer "Y. N. Lo" . "elisp@fastmail.com") (:keywords "comm" "data" "sql") (:url . "https://github.com/pekingduck/emacs-sqlite3-api"))]) + (sqlite-mode-extras . [(20240319 1312) ((emacs (29 1))) "Extensions for sqlite-mode" tar ((:commit . "376aabe26607d40fbd572290296edaaafdf61bd3") (:authors ("Alvaro Ramirez https://xenodium.com")) (:maintainers ("Alvaro Ramirez https://xenodium.com")) (:maintainer "Alvaro Ramirez https://xenodium.com") (:url . "https://github.com/xenodium/sqlite-mode-extras"))]) + (sqlite3 . [(20231124 1326) ((emacs (25 1))) "Direct access to the core SQLite3 API" tar ((:commit . "a601c9965e4d0178705a64b7d4f88709ca9aea66") (:authors ("Y. N. Lo" . "elisp@fastmail.com")) (:maintainers ("Y. N. Lo" . "elisp@fastmail.com")) (:maintainer "Y. N. Lo" . "elisp@fastmail.com") (:keywords "comm" "data" "sql") (:url . "https://github.com/pekingduck/emacs-sqlite3-api"))]) (sqlup-mode . [(20170610 1537) nil "Upcase SQL words for you" tar ((:commit . "04970977b4abb4d44301651618bbf1cdb0b263dd") (:authors ("Aldric Giacomoni" . "trevoke@gmail.com")) (:maintainers ("Aldric Giacomoni" . "trevoke@gmail.com")) (:maintainer "Aldric Giacomoni" . "trevoke@gmail.com") (:keywords "sql" "tools" "redis" "upcase") (:url . "https://github.com/trevoke/sqlup-mode.el"))]) (squirrel-mode . [(20221227 232) ((emacs (24 3))) "A major mode for the Squirrel programming language" tar ((:commit . "1af79dfe70c4c8e6f0f144bfd2eb65c077aca785") (:authors ("XXIV")) (:maintainers ("XXIV")) (:maintainer "XXIV") (:keywords "files" "squirrel") (:url . "https://github.com/thechampagne/squirrel-mode"))]) (sr-speedbar . [(20161025 831) nil "Same frame speedbar" tar ((:commit . "77a83fb50f763a465c021eca7343243f465b4a47") (:authors ("Sebastian Rose" . "sebastian_rose@gmx.de")) (:maintainers ("Sebastian Rose" . "sebastian_rose@gmx.de")) (:maintainer "Sebastian Rose" . "sebastian_rose@gmx.de") (:keywords "speedbar" "sr-speedbar.el") (:url . "http://www.emacswiki.org/emacs/download/sr-speedbar.el"))]) - (srcery-theme . [(20230829 737) ((emacs (24))) "Dark color theme" tar ((:commit . "4ee4e51d2c0317d3bc41a131a8bc76cfa2db98ed") (:authors ("Daniel Berg")) (:maintainers ("Daniel Berg")) (:maintainer "Daniel Berg") (:keywords "faces") (:url . "https://github.com/srcery-colors/srcery-emacs"))]) + (srcery-theme . [(20240220 805) ((emacs (24))) "Dark color theme" tar ((:commit . "60028633c5722e6b8ea12844618be0e9b31be55a") (:authors ("Daniel Berg")) (:maintainers ("Daniel Berg")) (:maintainer "Daniel Berg") (:keywords "faces") (:url . "https://github.com/srcery-colors/srcery-emacs"))]) (srefactor . [(20230504 617) ((emacs (24 4))) "A refactoring tool based on Semantic parser framework" tar ((:commit . "95c70a94b5aad4c85b35569e2f2325047791153a") (:authors ("Tu, Do Hoang" . "tuhdo1710@gmail.com")) (:maintainers ("Tu, Do Hoang")) (:maintainer "Tu, Do Hoang") (:keywords "c" "languages" "tools") (:url . "https://github.com/tuhdo/semantic-refactor"))]) - (srfi . [(20230503 34) ((emacs (25 1))) "Scheme Requests for Implementation browser" tar ((:commit . "d340e344cbc57b63952ba73c750986f8e13e616e") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "languages" "util") (:url . "https://github.com/srfi-explorations/emacs-srfi"))]) + (srfi . [(20240113 2244) ((emacs (25 1))) "Scheme Requests for Implementation browser" tar ((:commit . "78a31cc9714c80d41f19e33ce5b4cf09a14bfca9") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "languages" "util") (:url . "https://github.com/srfi-explorations/emacs-srfi"))]) (srv . [(20180715 1959) ((emacs (24 3))) "perform SRV DNS requests" tar ((:commit . "714387d5a5cf34d8d8cd96bdb1f9cb8ded823ff7") (:authors ("Magnus Henoch" . "magnus.henoch@gmail.com")) (:maintainers ("Magnus Henoch" . "magnus.henoch@gmail.com")) (:maintainer "Magnus Henoch" . "magnus.henoch@gmail.com") (:keywords "comm") (:url . "https://github.com/legoscia/srv.el"))]) (ssass-mode . [(20200211 132) ((emacs (24 3))) "Edit Sass without a Turing Machine" tar ((:commit . "96f557887ad97a0066a60c54f92b7234b8407016") (:authors ("Adam Niederer" . "adam.niederer@gmail.com")) (:maintainers ("Adam Niederer" . "adam.niederer@gmail.com")) (:maintainer "Adam Niederer" . "adam.niederer@gmail.com") (:keywords "languages" "sass") (:url . "http://github.com/AdamNiederer/ssass-mode"))]) (ssh . [(20120904 2042) nil "Support for remote logins using ssh." tar ((:commit . "c17cf5b43df8ac4662a0580f85898e1f078df0d1") (:authors ("Noah Friedman" . "friedman@splode.com")) (:maintainers ("Ian Eure" . "ian.eure@gmail.com")) (:maintainer "Ian Eure" . "ian.eure@gmail.com") (:keywords "unix" "comm"))]) @@ -4841,8 +4960,8 @@ (stan-snippets . [(20211129 2051) ((emacs (24 3)) (stan-mode (10 3 0)) (yasnippet (0 8 0))) "Yasnippets for Stan" tar ((:commit . "150bbbe5fd3ad2b5a3dbfba9d291e66eeea1a581") (:authors ("Jeffrey Arnold" . "jeffrey.arnold@gmail.com") ("Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu")) (:maintainers ("Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu")) (:maintainer "Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu") (:keywords "languages" "tools") (:url . "https://github.com/stan-dev/stan-mode/tree/master/stan-snippets"))]) (standard-dirs . [(20200621 1603) ((emacs (26 1)) (f (0 20 0)) (s (1 7 0))) "Platform-specific paths for config, cache, and other data" tar ((:commit . "e37b7e1c714c7798cd8e3a6569e4d71b96718a60") (:authors ("Joseph M LaFreniere" . "joseph@lafreniere.xyz")) (:maintainers ("Joseph M LaFreniere" . "joseph@lafreniere.xyz")) (:maintainer "Joseph M LaFreniere" . "joseph@lafreniere.xyz") (:keywords "files") (:url . "https://github.com/lafrenierejm/standard-dirs.el"))]) (standoff-mode . [(20210810 1814) nil "Create stand-off markup, also called external markup." tar ((:commit . "5e603092410d9c393d19050bcbed3014a379f0e6") (:authors ("Christian Lück" . "christian.lueck@ruhr-uni-bochum.de")) (:maintainer "Christian Lück" . "christian.lueck@ruhr-uni-bochum.de") (:keywords "text" "annotations" "ner" "humanities") (:url . "https://github.com/lueck/standoff-mode"))]) - (starhugger . [(20230829 1913) ((emacs (28 2)) (compat (29 1 4 0)) (dash (2 18 0)) (s (1 13 1)) (spinner (1 7 4))) "Hugging Face/AI-powered text & code completion client" tar ((:commit . "5a7164db2387ff82078e447c2ddf44ddd4a3415c") (:keywords "completion" "convenience" "languages") (:url . "https://gitlab.com/daanturo/starhugger.el"))]) - (starlit-theme . [(20230324 1636) ((emacs (25 1))) "Deep blue dark theme with bright colors from the starlit sky" tar ((:commit . "d6f327fb09497be7bee64d5d204d27f655cc5b04") (:authors ("Jonas Jelten" . "jj@sft.lol")) (:maintainers ("Jonas Jelten" . "jj@sft.lol")) (:maintainer "Jonas Jelten" . "jj@sft.lol") (:keywords "faces") (:url . "https://github.com/SFTtech/starlit-emacs"))]) + (starhugger . [(20231202 235) ((emacs (28 2)) (compat (29 1 4 0)) (dash (2 18 0)) (s (1 13 1)) (spinner (1 7 4))) "Hugging Face/AI-powered text & code completion client" tar ((:commit . "1bb3464c3a198a4f5f2155817d6505c4bab7dc79") (:keywords "completion" "convenience" "languages") (:url . "https://gitlab.com/daanturo/starhugger.el"))]) + (starlit-theme . [(20240223 1728) ((emacs (25 1))) "Deep blue dark theme with bright colors from the starlit sky" tar ((:commit . "136bbc4fc4961c5b2cd0824eb0762e672322fbd1") (:authors ("Jonas Jelten" . "jj@sft.lol")) (:maintainers ("Jonas Jelten" . "jj@sft.lol")) (:maintainer "Jonas Jelten" . "jj@sft.lol") (:keywords "faces") (:url . "https://github.com/SFTtech/starlit-emacs"))]) (start-menu . [(20160426 1225) ((cl-lib (0 5)) (config-parser (0 1))) "start-menu for executing external program like in windows" tar ((:commit . "f7d33fed7ad2dc61156f1c1cff9e1805366fbd69") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "convenience" "menu") (:url . "https://github.com/lujun9972/el-start-menu"))]) (stash . [(20151117 1427) nil "lightweight persistent caching" tar ((:commit . "c2e494d20c752b80ebbdffbf66687b3cdfc425ad") (:authors ("Sean Allred" . "code@seanallred.com")) (:maintainers ("Sean Allred" . "code@seanallred.com")) (:maintainer "Sean Allred" . "code@seanallred.com") (:keywords "extensions" "data" "internal" "lisp") (:url . "https://www.github.com/vermiculus/stash.el/"))]) (state . [(20200727 1227) ((emacs (24))) "Quick navigation between workspaces" tar ((:commit . "8cd9210f17c1b134274a7352b996839aed9a7d8c") (:authors ("Sylvain Rousseau ")) (:maintainers ("Sylvain Rousseau ")) (:maintainer "Sylvain Rousseau ") (:keywords "convenience" "workspaces") (:url . "https://github.com/thisirs/state.git"))]) @@ -4851,15 +4970,15 @@ (stem . [(20131102 1109) nil "Routines for stemming" tar ((:commit . "dd704c3447bd5d3f5ac0a4840f8987d4f855d87e") (:authors ("Tsuchiya Masatoshi" . "tsuchiya@pine.kuee.kyoto-u.ac.jp")) (:maintainers ("Tsuchiya Masatoshi" . "tsuchiya@pine.kuee.kyoto-u.ac.jp")) (:maintainer "Tsuchiya Masatoshi" . "tsuchiya@pine.kuee.kyoto-u.ac.jp") (:keywords "stemming") (:url . "https://github.com/yuutayamada/stem"))]) (stem-english . [(20180109 358) ((emacs (24 3))) "- routines for stemming English word" tar ((:commit . "c9fc4c6ed6bf82382e479dae80912f4ae17d31f4") (:authors ("Tsuchiya Masatoshi" . "tsuchiya@pine.kuee.kyoto-u.ac.jp")) (:maintainers ("KAWABATA, Taichi ")) (:maintainer "KAWABATA, Taichi ") (:keywords "text") (:url . "http://github.com/kawabata/stem-english"))]) (stem-reading-mode . [(20220522 1053) ((emacs (25 1))) "Highlight word stems for speed-reading" tar ((:commit . "6efc9962e3a19a452c7ab9636cf1e2566a51bd38") (:authors ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainers ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainer "Yuri D'Elia" . "wavexx@thregr.org") (:keywords "convenience" "wp") (:url . "https://gitlab.com/wavexx/stem-reading-mode.el"))]) - (stgit . [(20230819 2343) nil "major mode for StGit interaction" tar ((:commit . "505ddcd2f01b563187da5f901da1fc9825e797b3") (:authors ("David Kågedal" . "davidk@lysator.liu.se")) (:maintainers ("David Kågedal" . "davidk@lysator.liu.se")) (:maintainer "David Kågedal" . "davidk@lysator.liu.se") (:url . "http://stacked-git.github.io"))]) + (stgit . [(20240218 2150) nil "major mode for StGit interaction" tar ((:commit . "38ff3c3b2adc6d2c0f2e8fe5cb59f67d701741b3") (:authors ("David Kågedal" . "davidk@lysator.liu.se")) (:maintainers ("David Kågedal" . "davidk@lysator.liu.se")) (:maintainer "David Kågedal" . "davidk@lysator.liu.se") (:url . "http://stacked-git.github.io"))]) (sticky . [(20170926 36) nil "Sticky key for capital letters" tar ((:commit . "fec4e1af38f17f5cd80eca361d8e8ef8772db366") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "convenience") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/sticky.el"))]) (sticky-shell . [(20230207 1454) ((emacs (25 1))) "Minor mode to keep track of previous prompt in your shell" tar ((:commit . "030535451b7c12eea3a94dfc1a439b8baa96944b") (:authors ("Andrew De Angelis" . "bobodeangelis@gmail.com")) (:maintainers ("Andrew De Angelis" . "bobodeangelis@gmail.com")) (:maintainer "Andrew De Angelis" . "bobodeangelis@gmail.com") (:keywords "processes" "terminals" "tools") (:url . "https://github.com/andyjda/sticky-shell"))]) (stickyfunc-enhance . [(20150429 1814) ((emacs (24 3))) "An enhancement to stock `semantic-stickyfunc-mode'" tar ((:commit . "13bdba51fcd83ccbc3267959d23afc94d458dcb0") (:authors ("Tu, Do Hoang" . "tuhdo1710@gmail.com")) (:maintainers ("Tu, Do Hoang")) (:maintainer "Tu, Do Hoang") (:keywords "c" "languages" "tools") (:url . "https://github.com/tuhdo/semantic-stickyfunc-enhance"))]) - (stimmung-themes . [(20230830 952) ((emacs (25))) "Themes tuned to inner harmonies" tar ((:commit . "6185778f9c89d11c27bea1a10c56e067d684f68f") (:authors ("Love Lagerkvist")) (:maintainers ("Love Lagerkvist")) (:maintainer "Love Lagerkvist") (:keywords "faces") (:url . "https://github.com/motform/stimmung-themes"))]) + (stimmung-themes . [(20240117 1324) ((emacs (25))) "Themes tuned to inner harmonies" tar ((:commit . "1a574973041cd5c318f39b95f6377b60337f2d6d") (:authors ("Love Lagerkvist")) (:maintainers ("Love Lagerkvist")) (:maintainer "Love Lagerkvist") (:keywords "faces") (:url . "https://github.com/motform/stimmung-themes"))]) (stock-ticker . [(20150204 1052) ((s (1 9 0)) (request (0 2 0))) "Show stock prices in mode line" tar ((:commit . "74251cc810604af75f48333d51133326c053dd16") (:authors ("Gunther Hagleitner")) (:maintainers ("Gunther Hagleitner")) (:maintainer "Gunther Hagleitner") (:keywords "comms") (:url . "https://github.com/hagleitn/stock-ticker"))]) (stock-tracker . [(20230625 524) ((emacs (27 1)) (dash (2 16 0)) (async (1 9 5))) "Track stock price" tar ((:commit . "cdffcaa6bb75c450a511a31d0c69e30a4edd562d") (:authors ("Huming Chen" . "chenhuming@gmail.com")) (:maintainers ("Huming Chen" . "chenhuming@gmail.com")) (:maintainer "Huming Chen" . "chenhuming@gmail.com") (:keywords "convenience" "stock" "finance") (:url . "https://github.com/beacoder/stock-tracker"))]) (strace-mode . [(20171116 2039) nil "strace output syntax highlighting" tar ((:commit . "2901baa968d5180ab985ac40ca22cc20914d01f5") (:authors ("Preston Moore" . "prestonkmoore@gmail.com")) (:maintainers ("Preston Moore" . "prestonkmoore@gmail.com")) (:maintainer "Preston Moore" . "prestonkmoore@gmail.com") (:keywords "languages"))]) - (streak . [(20220311 1929) ((emacs (27 1))) "Track a daily streak in your Mode Line" tar ((:commit . "b2206de2fe43f97e754bbcb0abe9b078a419e787") (:authors ("Colin Woodbury ")) (:maintainers ("Colin Woodbury" . "colin@fosskers.ca")) (:maintainer "Colin Woodbury" . "colin@fosskers.ca") (:keywords "calendar") (:url . "https://github.com/fosskers/streak"))]) + (streak . [(20240106 2145) ((emacs (27 1))) "Track a daily streak in your Mode Line" tar ((:commit . "2d56788cbbf6114e61c85dd57b05133f8f351ac6") (:authors ("Colin Woodbury ")) (:maintainers ("Colin Woodbury" . "colin@fosskers.ca")) (:maintainer "Colin Woodbury" . "colin@fosskers.ca") (:keywords "calendar") (:url . "https://github.com/fosskers/streak"))]) (streamlink . [(20210811 1429) ((s (1 12 0))) "A major mode for streamlink output" tar ((:commit . "13dff15121ac0276f693696db9b04ae5820058d5") (:keywords "multimedia" "streamlink") (:url . "https://github.com/BenediktBroich/streamlink"))]) (strie . [(20160211 2222) ((cl-lib (0 5))) "A simple trie data structure implementation" tar ((:commit . "eb7efb0cccc127c414f6a64db11454869d9c10a8") (:authors ("James Atwood" . "jatwood@cs.umass.edu")) (:maintainers ("James Atwood" . "jatwood@cs.umass.edu")) (:maintainer "James Atwood" . "jatwood@cs.umass.edu"))]) (string-edit-at-point . [(20230118 1933) ((dash (1 2 0))) "Avoid escape nightmares by editing string in separate buffer" tar ((:commit . "87936d816ae24184dd83688136531b6b6f1943fe") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainers ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))]) @@ -4882,54 +5001,57 @@ (sudo-ext . [(20170126 1214) nil "sudo support" tar ((:commit . "9d4580f304121ce7b8104bd4bd3b64e4dfa3c9b3") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "unix") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/sudo-ext.el"))]) (sudo-utils . [(20210119 1930) ((emacs (25 1))) "Sudo utilities" tar ((:commit . "089f7833fa256f293284a6286bf9cb2b78eff40d") (:authors ("Alpha Catharsis" . "alpha.catharsis@gmail.com")) (:maintainers ("Alpha Catharsis" . "alpha.catharsis@gmail.com")) (:maintainer "Alpha Catharsis" . "alpha.catharsis@gmail.com") (:keywords "processes" "unix") (:url . "https://github.com/alpha-catharsis/sudo-utils"))]) (sudoku . [(20191015 1315) ((emacs (24 4))) "Simple sudoku game, can download puzzles" tar ((:commit . "b1924fd244a5fa284de9d67b66fbd69164b37318") (:authors ("Zajcev Evgeny" . "zevlg@yandex.ru")) (:maintainers ("Zajcev Evgeny" . "zevlg@yandex.ru")) (:maintainer "Zajcev Evgeny" . "zevlg@yandex.ru") (:keywords "games"))]) - (suggest . [(20190807 851) ((emacs (24 4)) (loop (1 3)) (dash (2 13 0)) (s (1 11 0)) (f (0 18 2)) (spinner (1 7 3))) "suggest elisp functions that give the output requested" tar ((:commit . "41782f0d36c346670011f927d8fcd93ec75ed783") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:keywords "convenience") (:url . "https://github.com/Wilfred/suggest.el"))]) + (suggest . [(20231003 404) ((emacs (24 4)) (loop (1 3)) (dash (2 13 0)) (s (1 11 0)) (f (0 18 2)) (spinner (1 7 3))) "suggest elisp functions that give the output requested" tar ((:commit . "eca8f6f03b0a77ab649c791f21cb01f4ecae3e73") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:keywords "convenience") (:url . "https://github.com/Wilfred/suggest.el"))]) (suggestion-box . [(20170830 807) ((emacs (25 1)) (popup (0 5 3))) "show tooltip on the cursor" tar ((:commit . "50af0776c8caf3c79c4d37fd51cbf304ea34b68e") (:authors ("Yuta Yamada ")) (:maintainers ("Yuta Yamada ")) (:maintainer "Yuta Yamada ") (:keywords "convenience"))]) - (sumibi . [(20230727 1249) ((emacs (28 1)) (popup (0 5 9)) (unicode-escape (1 1)) (deferred (0 5 1))) "Japanese input method powered by ChatGPT API" tar ((:commit . "d934aee4d6a2493e40db3d848d459d97c8e2e229") (:authors ("Kiyoka Nishiyama" . "kiyoka@sumibi.org")) (:maintainers ("Kiyoka Nishiyama" . "kiyoka@sumibi.org")) (:maintainer "Kiyoka Nishiyama" . "kiyoka@sumibi.org") (:keywords "lisp" "ime" "japanese") (:url . "https://github.com/kiyoka/Sumibi"))]) + (sumibi . [(20231019 1246) ((emacs (28 1)) (popup (0 5 9)) (unicode-escape (1 1)) (deferred (0 5 1))) "Japanese input method powered by ChatGPT API" tar ((:commit . "d6bbc65b71f0c59a471fffe13797d1ab6cac80f8") (:authors ("Kiyoka Nishiyama" . "kiyoka@sumibi.org")) (:maintainers ("Kiyoka Nishiyama" . "kiyoka@sumibi.org")) (:maintainer "Kiyoka Nishiyama" . "kiyoka@sumibi.org") (:keywords "lisp" "ime" "japanese") (:url . "https://github.com/kiyoka/Sumibi"))]) (sunburn-theme . [(20201216 1539) ((emacs (24))) "A low contrast color theme" tar ((:commit . "6b5c14c76dcdfdb099102ef7a388b2f0c6f1951d") (:authors ("Martín Varela" . "martin@varela.fi")) (:maintainers ("Martín Varela" . "martin@varela.fi")) (:maintainer "Martín Varela" . "martin@varela.fi") (:url . "http://github.com/mvarela/Sunburn-Theme"))]) (sunny-day-theme . [(20140413 2125) nil "Emacs24 theme with a light background." tar ((:commit . "420e0a6eb33fcc9b75c2c9e88ab60a975d782a00") (:authors ("Martin Haesler")) (:maintainers ("Martin Haesler")) (:maintainer "Martin Haesler") (:url . "http://github.com/mswift42/sunny-day-theme"))]) (sunshine . [(20200306 1711) ((cl-lib (0 5))) "Provide weather and forecast information." tar ((:commit . "88256223539edcfe57017778a997a474c9c022f6") (:authors ("Aaron Bieber" . "aaron@aaronbieber.com")) (:maintainers ("Aaron Bieber" . "aaron@aaronbieber.com")) (:maintainer "Aaron Bieber" . "aaron@aaronbieber.com") (:keywords "tools" "weather") (:url . "https://github.com/aaronbieber/sunshine.el"))]) (suomalainen-kalenteri . [(20230102 904) nil "Finnish national and Christian holidays for calendar" tar ((:commit . "95d8b7f9b404c749831d7b4e0e396c76bd822015") (:authors ("Teemu Likonen" . "tlikonen@iki.fi")) (:maintainer "Teemu Likonen" . "tlikonen@iki.fi") (:keywords "calendar" "holidays" "finnish") (:url . "https://github.com/tlikonen/suomalainen-kalenteri"))]) - (super-save . [(20220531 1745) ((emacs (24 4))) "Auto-save buffers, based on your activity." tar ((:commit . "6f6512bc44b09f7187e58772892fa330f4518c12") (:authors ("Bozhidar Batsov" . "bozhidar@batsov.com")) (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.com")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.com") (:keywords "convenience") (:url . "https://github.com/bbatsov/super-save"))]) + (super-save . [(20231209 1044) ((emacs (25 1))) "Auto-save buffers, based on your activity." tar ((:commit . "0298076ea20e5239d485f0029846fc85664ce47f") (:authors ("Bozhidar Batsov" . "bozhidar@batsov.com")) (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.com")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.com") (:keywords "convenience") (:url . "https://github.com/bbatsov/super-save"))]) (supergenpass . [(20130329 548) nil "SuperGenPass for Emacs" tar ((:commit . "549072ef7b5b82913cadd4758e8a0a9926f0a04a") (:authors ("Jaime Fournier" . "jaimef@linbsd.org")) (:maintainers ("Jaime Fournier" . "jaimef@linbsd.org")) (:maintainer "Jaime Fournier" . "jaimef@linbsd.org") (:keywords "supergenpass"))]) + (surround . [(20231211 1514) ((emacs (24 3))) "Easily add/delete/change parens, quotes, and more" tar ((:commit . "5c6e4ba9a4540fbcebfe6d21363179a15bc4ee9e") (:authors ("Michael Kleehammer" . "michael@kleehammer.com")) (:maintainers ("Michael Kleehammer" . "michael@kleehammer.com")) (:maintainer "Michael Kleehammer" . "michael@kleehammer.com") (:url . "https://github.com/mkleehammer/surround"))]) (suscolors-theme . [(20190713 1009) nil "Colorful theme, inspired by Gruvbox." tar ((:commit . "b4a979ee23e26e255b9a63525b0a28e810fab9ae") (:url . "https://github.com/TheSuspiciousWombat/SusColors-emacs"))]) (sv-kalender-namnsdagar . [(20190421 1521) nil "Swedish celebrated name of the day" tar ((:commit . "fff970f49c77abfc69e37817f25a939818420971") (:authors ("Mats Lidell" . "mats.lidell@lidells.se")) (:maintainers ("Mats Lidell" . "mats.lidell@lidells.se")) (:maintainer "Mats Lidell" . "mats.lidell@lidells.se") (:keywords "calendar" "swedish" "localization") (:url . "https://github.com/matsl/sv-kalender-namnsdagar"))]) (svelte-mode . [(20211016 652) ((emacs (26 1))) "Emacs major mode for Svelte" tar ((:commit . "6a1d4274af7f4c0f271f77bd96678c3dd1fa68e1") (:authors ("Leaf" . "leafvocation@gmail.com")) (:maintainers ("Leaf" . "leafvocation@gmail.com")) (:maintainer "Leaf" . "leafvocation@gmail.com") (:keywords "wp" "languages") (:url . "https://github.com/leafOfTree/svelte-mode"))]) (svg-mode-line-themes . [(20150425 2006) ((xmlgen (0 4))) "SVG-based themes for mode-line" tar ((:commit . "80a0e01839cafbd66899202e7764c33231974259") (:authors ("sabof")) (:maintainers ("sabof")) (:maintainer "sabof") (:url . "https://github.com/sabof/svg-mode-line-themes"))]) - (svg-tag-mode . [(20230824 943) ((emacs (27 1)) (svg-lib (0 2))) "Replace keywords with SVG tags" tar ((:commit . "c914980f09a9c7e2ba4faf64874ef17505bdc861") (:authors ("Nicolas P. Rougier" . "Nicolas.Rougier@inria.fr")) (:maintainers ("Nicolas P. Rougier" . "Nicolas.Rougier@inria.fr")) (:maintainer "Nicolas P. Rougier" . "Nicolas.Rougier@inria.fr") (:keywords "convenience") (:url . "https://github.com/rougier/svg-tag-mode"))]) + (svg-tag-mode . [(20240122 1209) ((emacs (27 1)) (svg-lib (0 2))) "Replace keywords with SVG tags" tar ((:commit . "f01307dd7720ed952355db0a552ae555c13ced13") (:authors ("Nicolas P. Rougier" . "Nicolas.Rougier@inria.fr")) (:maintainers ("Nicolas P. Rougier" . "Nicolas.Rougier@inria.fr")) (:maintainer "Nicolas P. Rougier" . "Nicolas.Rougier@inria.fr") (:keywords "convenience") (:url . "https://github.com/rougier/svg-tag-mode"))]) (svgo . [(20220525 2059) ((emacs (26 2))) "SVG optimization with SVGO" tar ((:commit . "9b01cc9eb1fdf2731cd2b931a7dfe1f601b70786") (:authors ("Mathis Hofer" . "mathis@fsfe.org")) (:maintainers ("Mathis Hofer" . "mathis@fsfe.org")) (:maintainer "Mathis Hofer" . "mathis@fsfe.org") (:keywords "tools") (:url . "https://github.com/hupf/svgo.el/"))]) (svnwrapper . [(20180414 1843) ((e2ansi (0 1 1))) "Highlighting and paging for shell command `svn'" tar ((:commit . "de5069f5784e5d9e87a0af0159ba5f28a3716583") (:authors ("Anders Lindgren")) (:maintainers ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "faces") (:url . "https://github.com/Lindydancer/svnwrapper"))]) + (swagg . [(20231128 2038) ((emacs (27 1)) (compat (29 1 4 0)) (request (0 3 3)) (dash (2 19 1)) (yaml (0 5 1)) (s (1 13 1))) "Swagger UI" tar ((:commit . "097d1441a18eac7169b8a3fba9e253d7f489c6fb") (:authors ("Isa Mert Gurbuz" . "isamertgurbuz@gmail.com")) (:maintainers ("Isa Mert Gurbuz" . "isamertgurbuz@gmail.com")) (:maintainer "Isa Mert Gurbuz" . "isamertgurbuz@gmail.com") (:keywords "tools" "convenience") (:url . "https://github.com/isamert/swagg.el"))]) (swagger-to-org . [(20160611 56) ((emacs (24)) (cl-lib (0 5)) (json (1 4))) "Convert a swagger.json file into an org-mode file" tar ((:commit . "181357c71ea24bede263f5706d8781ad65e16877") (:authors ("Matthew Carter" . "m@ahungry.com")) (:maintainers ("Matthew Carter" . "m@ahungry.com")) (:maintainer "Matthew Carter" . "m@ahungry.com") (:keywords "ahungry" "emacs" "swagger" "openapi" "orgmode" "org" "export") (:url . "https://github.com/ahungry/swagger-to-org"))]) (swap-buffers . [(20150506 2139) nil "The quickest way to swap buffers between windows. Based on switch-window package." tar ((:commit . "46ab31359b70d935add6c6e9533443116dc51103") (:authors ("Evgeniy Kazakov" . "evgeniy.kazakov@gmail.com")) (:maintainers ("Evgeniy Kazakov" . "evgeniy.kazakov@gmail.com")) (:maintainer "Evgeniy Kazakov" . "evgeniy.kazakov@gmail.com") (:keywords "window" "swap" "buffer" "exchange") (:url . "https://github.com/ekazakov/swap-buffers"))]) (swap-regions . [(20180915 1346) ((emacs (24 3))) "Swap text in two regions" tar ((:commit . "f4fd9880cf690e003fcde88dcf2b46adbbbb03cd") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainers ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:keywords "convenience") (:url . "https://github.com/xuchunyang/swap-regions.el"))]) - (sway . [(20230812 1306) ((emacs (27 1))) "Communication with the Sway window manager" tar ((:commit . "fc1c09fe30cf33e8755c3b6c9749783923f2cb9b") (:authors ("Thibault Polge" . "thibault@thb.lt")) (:maintainers ("Thibault Polge" . "thibault@thb.lt")) (:maintainer "Thibault Polge" . "thibault@thb.lt") (:keywords "frames") (:url . "https://github.com/thblt/sway.el"))]) + (sway . [(20231219 1842) ((emacs (28 1))) "Communication with the Sway window manager" tar ((:commit . "84eae5e16a643eb00b0a422ded751cceb17cc8f0") (:authors ("Thibault Polge" . "thibault@thb.lt")) (:maintainers ("Thibault Polge" . "thibault@thb.lt")) (:maintainer "Thibault Polge" . "thibault@thb.lt") (:keywords "frames") (:url . "https://github.com/thblt/sway.el"))]) (sway-lang-mode . [(20230320 507) ((emacs (25 1)) (lsp-mode (6 0)) (rust-mode (1 0 5))) "Major mode for sway" tar ((:commit . "1d4615cc99d57280fb4b301d8339f408d987d317") (:authors ("Hamza Hamud")) (:maintainers ("Hamza Hamud")) (:maintainer "Hamza Hamud") (:keywords "languages") (:url . "https://github.com/hhamud/sway-mode"))]) (sweet-theme . [(20200708 1202) ((emacs (24 1))) "Sweet-looking theme" tar ((:commit . "ccbfdb6a17e25ab18a0b64101675bc1dfef44006") (:authors ("2bruh4me")) (:maintainers ("2bruh4me")) (:maintainer "2bruh4me") (:keywords "faces") (:url . "https://github.com/2bruh4me/sweet-theme"))]) (sweetgreen . [(20180605 335) ((dash (2 12 1)) (helm (1 5 6)) (request (0 2 0)) (cl-lib (0 5))) "Order Salads from sweetgreen.com" tar ((:commit . "e933fe466b5ef0e976967e203f88bd7a012469d1") (:authors ("Diego Berrocal" . "cestdiego@gmail.com")) (:maintainers ("Diego Berrocal" . "cestdiego@gmail.com")) (:maintainer "Diego Berrocal" . "cestdiego@gmail.com") (:keywords "salad" "food" "sweetgreen" "request") (:url . "https://www.github.com/CestDiego/sweetgreen.el"))]) (swift-helpful . [(20220707 846) ((emacs (25 1)) (dash (2 12 0)) (lsp-mode (6 0)) (swift-mode (8 0 0))) "Show documentation for Swift programs." tar ((:commit . "b46c580e4b8f55761431ec677866de3fc66592e9") (:authors ("Daniel Martín" . "mardani29@yahoo.es")) (:maintainers ("Daniel Martín" . "mardani29@yahoo.es")) (:maintainer "Daniel Martín" . "mardani29@yahoo.es") (:keywords "help" "swift") (:url . "https://github.com/danielmartin/swift-helpful"))]) - (swift-mode . [(20230819 333) ((emacs (24 4)) (seq (2 3))) "Major-mode for Apple's Swift programming language" tar ((:commit . "609471e9e242261de1d80231c58a469df7530be3") (:authors ("taku0" . "mxxouy6x3m_github@tatapa.org") ("Chris Barrett" . "chris.d.barrett@me.com") ("Bozhidar Batsov" . "bozhidar@batsov.com") ("Arthur Evstifeev" . "lod@pisem.net")) (:maintainers ("taku0" . "mxxouy6x3m_github@tatapa.org")) (:maintainer "taku0" . "mxxouy6x3m_github@tatapa.org") (:keywords "languages" "swift") (:url . "https://github.com/swift-emacs/swift-mode"))]) + (swift-mode . [(20240217 631) ((emacs (24 4)) (seq (2 3))) "Major-mode for Apple's Swift programming language" tar ((:commit . "25cf8237312bf5eddc2c90001feb8f73633ab523") (:authors ("taku0" . "mxxouy6x3m_github@tatapa.org") ("Chris Barrett" . "chris.d.barrett@me.com") ("Bozhidar Batsov" . "bozhidar@batsov.com") ("Arthur Evstifeev" . "lod@pisem.net")) (:maintainers ("taku0" . "mxxouy6x3m_github@tatapa.org")) (:maintainer "taku0" . "mxxouy6x3m_github@tatapa.org") (:keywords "languages" "swift") (:url . "https://github.com/swift-emacs/swift-mode"))]) (swift3-mode . [(20160918 1250) ((emacs (24 4))) "Major-mode for Apple's Swift programming language." tar ((:commit . "ea34d46bf9a4293e75ffdac9500d34989316d9e9") (:keywords "languages" "swift") (:url . "https://github.com/taku0/swift3-mode"))]) - (swiper . [(20230410 1815) ((emacs (24 5)) (ivy (0 14 0))) "Isearch with an overview. Oh, man!" tar ((:commit . "d28225e86f8dfb3825809ad287f759f95ee9e479") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "matching") (:url . "https://github.com/abo-abo/swiper"))]) + (swiper . [(20240214 2118) ((emacs (24 5)) (ivy (0 14 2))) "Isearch with an overview. Oh, man!" tar ((:commit . "749ac1235a7948011cb0caddd4c31037e3314614") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Basil L. Contovounesios" . "basil@contovou.net")) (:maintainer "Basil L. Contovounesios" . "basil@contovou.net") (:keywords "matching") (:url . "https://github.com/abo-abo/swiper"))]) (swiper-helm . [(20180131 1744) ((emacs (24 1)) (swiper (0 1 0)) (helm (1 5 3))) "Helm version of Swiper." tar ((:commit . "93fb6db87bc6a5967898b5fd3286954cc72a0008") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "matching") (:url . "https://github.com/abo-abo/swiper-helm"))]) (swiss-holidays . [(20200526 822) nil "Swiss holidays for the calendar" tar ((:commit . "0995c9685033a09466f5b2dceb7316362bde997a") (:authors ("Christian Egli" . "christian.egli@alumni.ethz.ch")) (:maintainers ("Christian Egli" . "christian.egli@alumni.ethz.ch")) (:maintainer "Christian Egli" . "christian.egli@alumni.ethz.ch") (:keywords "calendar") (:url . "https://github.com/egli/swiss-holidays"))]) (switch-buffer-functions . [(20200127 409) nil "Hook run when current buffer changed" tar ((:commit . "40cb0c9e2c84b30e1c5c7458a795cda1bd8ad8fa") (:authors ("10sr <8slashes+el [at] gmail [dot] com>")) (:maintainers ("10sr <8slashes+el [at] gmail [dot] com>")) (:maintainer "10sr <8slashes+el [at] gmail [dot] com>") (:keywords "hook" "utility") (:url . "https://github.com/10sr/switch-buffer-functions-el"))]) (switch-window . [(20220812 2137) ((emacs (24))) "A *visual* way to switch window" tar ((:commit . "71ef2f54c97f3fd2e7ff7964d82e6562eb6282f7") (:authors ("Dimitri Fontaine" . "dim@tapoueh.org") ("Feng Shu" . "tumashu@163.com")) (:maintainers ("Dimitri Fontaine" . "dim@tapoueh.org")) (:maintainer "Dimitri Fontaine" . "dim@tapoueh.org") (:keywords "convenience") (:url . "https://github.com/dimitri/switch-window"))]) (swoop . [(20200618 905) ((emacs (24 3)) (ht (2 0)) (pcre2el (1 5)) (async (1 1))) "Peculiar buffer navigation" tar ((:commit . "828ae0f17f3beaea50ee66d06c500f4847ccc7dd") (:authors ("Shingo Fukuyama - http://fukuyama.co")) (:maintainers ("Shingo Fukuyama - http://fukuyama.co")) (:maintainer "Shingo Fukuyama - http://fukuyama.co") (:keywords "tools" "swoop" "inner" "buffer" "search" "navigation") (:url . "https://github.com/ShingoFukuyama/emacs-swoop"))]) (sws-mode . [(20210908 2121) nil "(S)ignificant (W)hite(S)pace mode" tar ((:commit . "111460b056838854e470a6383041a99f843b93ee") (:authors ("Brian M. Carlson and other contributors")) (:maintainers ("Brian M. Carlson and other contributors")) (:maintainer "Brian M. Carlson and other contributors") (:keywords "languages") (:url . "https://github.com/brianc/jade-mode"))]) - (sx . [(20220804 1419) ((emacs (24 1)) (cl-lib (0 5)) (json (1 3)) (markdown-mode (2 0)) (let-alist (1 0 3))) "StackExchange client. Ask and answer questions on Stack Overflow, Super User, and the likes" tar ((:commit . "c58405f9ff27b9740997ea837a1f6fd173d1edc5") (:authors ("Sean Allred" . "code@seanallred.com")) (:maintainers ("Sean Allred" . "code@seanallred.com")) (:maintainer "Sean Allred" . "code@seanallred.com") (:keywords "help" "hypermedia" "tools") (:url . "https://github.com/vermiculus/sx.el/"))]) + (sx . [(20240126 2120) ((emacs (24 1)) (cl-lib (0 5)) (json (1 3)) (markdown-mode (2 0)) (let-alist (1 0 3))) "StackExchange client. Ask and answer questions on Stack Overflow, Super User, and the likes" tar ((:commit . "8c1c28f33d714fc8869e49f5642e1a585c8c85af") (:authors ("Sean Allred" . "code@seanallred.com")) (:maintainers ("Sean Allred" . "code@seanallred.com")) (:maintainer "Sean Allred" . "code@seanallred.com") (:keywords "help" "hypermedia" "tools") (:url . "https://github.com/vermiculus/sx.el/"))]) (sxiv . [(20220530 14) ((dash (2 16 0)) (emacs (25 1))) "Run the Simple X Image Viewer, with Dired integration" tar ((:commit . "47f5b2fbb94c569dc5e71cbe4de9c6eabbbc69e8") (:authors ("contrapunctus" . "xmpp:contrapunctus@jabber.fr")) (:maintainers ("contrapunctus" . "xmpp:contrapunctus@jabber.fr")) (:maintainer "contrapunctus" . "xmpp:contrapunctus@jabber.fr") (:keywords "multimedia") (:url . "https://tildegit.org/contrapunctus/sxiv"))]) (symbol-navigation-hydra . [(20211010 2353) ((auto-highlight-symbol (1 61)) (hydra (0 15 0)) (emacs (24 4)) (multiple-cursors (1 4 0))) "A symbol-aware, range-aware hydra" tar ((:commit . "b3b1257e676514d93cd2d71a10a485bf00b5375f") (:authors ("Brett Wines" . "bgwines@cs.stanford.edu")) (:maintainers ("Brett Wines" . "bgwines@cs.stanford.edu")) (:maintainer "Brett Wines" . "bgwines@cs.stanford.edu") (:keywords "highlight" "face" "match" "convenience" "hydra" "symbol") (:url . "https://github.com/bgwines/symbol-navigation-hydra"))]) - (symbol-overlay . [(20230729 807) ((emacs (24 3)) (seq (2 2))) "Highlight symbols with keymap-enabled overlays" tar ((:commit . "a783d7b5d8dee5ba9f5e7c00a834fbd6d645081b") (:authors ("wolray" . "wolray@foxmail.com")) (:maintainers ("wolray" . "wolray@foxmail.com")) (:maintainer "wolray" . "wolray@foxmail.com") (:keywords "faces" "matching") (:url . "https://github.com/wolray/symbol-overlay/"))]) + (symbol-overlay . [(20240311 1207) ((emacs (24 3)) (seq (2 2))) "Highlight symbols with keymap-enabled overlays" tar ((:commit . "de215fff392c916ffab01950fcb6daf6fd18be4f") (:authors ("wolray" . "wolray@foxmail.com")) (:maintainers ("wolray" . "wolray@foxmail.com")) (:maintainer "wolray" . "wolray@foxmail.com") (:keywords "faces" "matching") (:url . "https://github.com/wolray/symbol-overlay/"))]) (symbolist . [(20211107 1615) ((emacs (24 5))) "List and interactively unbind Emacs Lisp symbols" tar ((:commit . "92b712734941a45da7d47fd61b95e4013ff53481") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "lisp" "maint") (:url . "https://github.com/lassik/emacs-symbolist"))]) - (symbols-outline . [(20230824 857) ((emacs (27 1))) "Display symbols (functions, variables, etc) in outline view" tar ((:commit . "c5b077d79846bb7507ca5cb11795403a5eda71dd") (:authors ("Shihao Liu")) (:maintainers ("Shihao Liu")) (:maintainer "Shihao Liu") (:keywords "outlines") (:url . "https://github.com/liushihao456/symbols-outline.el"))]) + (symbols-outline . [(20231229 941) ((emacs (27 1))) "Display symbols (functions, variables, etc) in outline view" tar ((:commit . "af4cba0c409a38e25eb572687a3a6848953ef868") (:authors ("Shihao Liu")) (:maintainers ("Shihao Liu")) (:maintainer "Shihao Liu") (:keywords "outlines") (:url . "https://github.com/liushihao456/symbols-outline.el"))]) (symbolword-mode . [(20180401 1427) ((emacs (24)) (f (0 19 0))) "modify word split" tar ((:commit . "920e57f4c2b09b28c5a0c8fe9ebdba9961822163") (:authors ("ncaq" . "ncaq@ncaq.net")) (:maintainers ("ncaq" . "ncaq@ncaq.net")) (:maintainer "ncaq" . "ncaq@ncaq.net") (:url . "https://github.com/ncaq/symbolword-mode"))]) (symex . [(20230322 2003) ((emacs (25 1)) (tsc (0 15 2)) (tree-sitter (0 15 2)) (lispy (0 26 0)) (paredit (24)) (evil-cleverparens (20170718 413)) (evil (1 2 14)) (evil-surround (1 0 4)) (hydra (0 15 0)) (seq (2 22))) "An evil way to edit Lisp symbolic expressions as trees" tar ((:commit . "0b65804d08c9ff61ec6785b48ce9b3c3d4779cfe") (:authors ("Siddhartha Kasivajhula" . "sid@countvajhula.com")) (:maintainers ("Siddhartha Kasivajhula" . "sid@countvajhula.com")) (:maintainer "Siddhartha Kasivajhula" . "sid@countvajhula.com") (:keywords "lisp" "convenience" "languages") (:url . "https://github.com/countvajhula/symex.el"))]) (symon . [(20170224 833) nil "tiny graphical system monitor" tar ((:commit . "76461679dfe13a5dccd3c8735fb6f58b26b46733") (:authors ("zk_phi")) (:maintainers ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))]) (symon-lingr . [(20150719 1342) ((symon (1 1 2)) (cl-lib (0 5))) "A notification-based Lingr client powered by symon.el" tar ((:commit . "056d1a473e36992ff5881e5ce6fdc331cead975f") (:authors ("zk_phi")) (:maintainers ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))]) (sync-recentf . [(20160326 2001) nil "Synchronize the recent files list between Emacs instances" tar ((:commit . "0052561d5c5b5c2684faedc3eead776aec06c3ed") (:authors ("François Févotte" . "fevotte@gmail.com")) (:maintainers ("François Févotte" . "fevotte@gmail.com")) (:maintainer "François Févotte" . "fevotte@gmail.com") (:keywords "recentf") (:url . "https://github.com/ffevotte/sync-recentf"))]) + (syncthing . [(20240101 2334) ((emacs (27 1))) "Client for Syncthing" tar ((:commit . "9f44d45a55b460b7eaeb9fb15d17d94e790705e0") (:authors ("Peter Badida" . "keyweeusr@gmail.com")) (:maintainers ("Peter Badida" . "keyweeusr@gmail.com")) (:maintainer "Peter Badida" . "keyweeusr@gmail.com") (:keywords "convenience" "syncthing" "sync" "client" "view") (:url . "https://github.com/KeyWeeUsr/emacs-syncthing"))]) (synonymous . [(20180325 1817) ((emacs (24)) (cl-lib (0 5)) (request (0 2 0))) "A thesaurus at your fingertips" tar ((:commit . "2cb9a674d84fddf3f1b00c9d6b13a853576acb87") (:authors ("Katherine Whitlock" . "toroidalcode@gmail.com") ("Snippets adapted from FlySpell, authored by Manuel Serrano" . "Manuel.Serrano@inria.fr")) (:maintainers ("Katherine Whitlock" . "toroidalcode@gmail.com")) (:maintainer "Katherine Whitlock" . "toroidalcode@gmail.com") (:keywords "utility") (:url . "http://github.com/toroidal-code/synonymous.el"))]) (synosaurus . [(20191125 552) ((cl-lib (0 5))) "An extensible thesaurus supporting lookup and substitution." tar ((:commit . "14d34fc92a77c3a916b4d58400424c44ae99cd81") (:authors ("Hans-Peter Deifel" . "hpd@hpdeifel.de")) (:maintainer "Hans-Peter Deifel" . "hpd@hpdeifel.de") (:keywords "wp"))]) (synquid . [(20160930 1550) ((flycheck (27)) (emacs (24 3))) "Major mode for editing Synquid files" tar ((:commit . "28701ce1a15437202f53ab93a14bcba1de83fd2c") (:authors ("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) (:maintainers ("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) (:maintainer "Clément Pit-Claudel" . "clement.pitclaudel@live.com") (:keywords "languages") (:url . "https://github.com/cpitclaudel/synquid-mode"))]) - (syntactic-close . [(20230423 707) ((emacs (24)) (cl-lib (0 5))) "Insert closing delimiter" tar ((:commit . "c184ff7a3cbcd28439aba7c3531ffebf0cd30b3a") (:authors ("Emacs User Group Berlin" . "emacs-berlin@emacs-berlin.org")) (:maintainers ("Emacs User Group Berlin" . "emacs-berlin@emacs-berlin.org")) (:maintainer "Emacs User Group Berlin" . "emacs-berlin@emacs-berlin.org") (:keywords "languages" "convenience") (:url . "https://github.com/emacs-berlin/syntactic-close"))]) + (syntactic-close . [(20231218 1001) ((emacs (24)) (cl-lib (0 5))) "Insert closing delimiter" tar ((:commit . "022018c4de0d799c92301b76ea4f1775cfc9f510") (:authors ("Andreas Röhler" . "andreas.roehler@online.de") ("Emacs User Group Berlin" . "emacs-berlin@emacs-berlin.org")) (:maintainers ("Andreas Röhler" . "andreas.roehler@online.de")) (:maintainer "Andreas Röhler" . "andreas.roehler@online.de") (:keywords "languages" "convenience") (:url . "https://github.com/emacs-berlin/syntactic-close"))]) (syntactic-sugar . [(20140508 2041) nil "Effect-free forms such as if/then/else" tar ((:commit . "b6a49df4b6056e2619eea9ca554c105ae67e115f") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "extensions") (:url . "http://github.com/rolandwalker/syntactic-sugar"))]) (syntax-subword . [(20160205 2154) nil "make operations on words more fine-grained" tar ((:commit . "9aa9b3f846bfe2474370642458a693ac4760d9fe") (:authors ("Jonathan Kotta" . "jpkotta@gmail.com")) (:maintainers ("Jonathan Kotta" . "jpkotta@gmail.com")) (:maintainer "Jonathan Kotta" . "jpkotta@gmail.com"))]) (syntree . [(20230621 2048) ((emacs (27 1)) (org (9 2))) "Draw plain text constituency trees" tar ((:commit . "7bbbd4904b0ffe452ec39630042dbc85a7a0b233") (:authors ("Enrico Flor" . "enrico@eflor.net")) (:maintainers ("Enrico Flor" . "enrico@eflor.net")) (:maintainer "Enrico Flor" . "enrico@eflor.net") (:url . "https://github.com/enricoflor/syntree"))]) @@ -4940,46 +5062,49 @@ (systemd . [(20230201 302) ((emacs (24 4))) "Major mode for editing systemd units" tar ((:commit . "8742607120fbc440821acbc351fda1e8e68a8806") (:authors ("Mark Oteiza" . "mvoteiza@udel.edu")) (:maintainers ("Mark Oteiza" . "mvoteiza@udel.edu")) (:maintainer "Mark Oteiza" . "mvoteiza@udel.edu") (:keywords "tools" "unix"))]) (systemtap-mode . [(20151122 1940) nil "A mode for SystemTap" tar ((:commit . "8b5086d6b0050a12bb37e33c24c24d1f420afd3b") (:maintainers (nil . "ruediger@c-plusplus.de")) (:maintainer nil . "ruediger@c-plusplus.de") (:keywords "tools" "languages") (:url . "https://github.com/ruediger/systemtap-mode"))]) (ta . [(20160619 1645) ((emacs (24 3)) (cl-lib (0 5))) "A tool to deal with Chinese homophonic characters" tar ((:commit . "668ad41e71f374f8c32c8d0532f3d8485b355d35") (:authors ("kuanyui" . "azazabc123@gmail.com")) (:maintainers ("kuanyui" . "azazabc123@gmail.com")) (:maintainer "kuanyui" . "azazabc123@gmail.com") (:keywords "tools") (:url . "http://github.com/kuanyui/ta.el"))]) - (tab-bar-buffers . [(20220722 1937) ((emacs (28 1))) "Use tab-bar-mode as a buffer manager" tar ((:commit . "6d196d4b853c5355403da86607dfb31a038cc024") (:authors ("Andy Rosen" . "ajr@corp.mlfs.org")) (:maintainers ("Andy Rosen" . "ajr@corp.mlfs.org")) (:maintainer "Andy Rosen" . "ajr@corp.mlfs.org") (:keywords "convenience" "frames") (:url . "https://github.com/ajrosen/tab-bar-buffers"))]) + (tab-bar-buffers . [(20240227 2037) ((emacs (28 1))) "Use tab-bar-mode as a buffer manager" tar ((:commit . "08a3f39c0b1673e3cad34e1f0e83fb56c903586c") (:authors ("Andy Rosen" . "ajr@corp.mlfs.org")) (:maintainers ("Andy Rosen" . "ajr@corp.mlfs.org")) (:maintainer "Andy Rosen" . "ajr@corp.mlfs.org") (:keywords "convenience" "frames") (:url . "https://github.com/ajrosen/tab-bar-buffers"))]) (tab-bar-echo-area . [(20221115 1953) ((emacs (27 1))) "Display tab names of the tab bar in the echo area" tar ((:commit . "3ab62ca7db3c1d83f96b7971ea4b3b0101b51ae9") (:authors ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainers ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainer "Fritz Grabo" . "hello@fritzgrabo.com") (:keywords "convenience") (:url . "https://github.com/fritzgrabo/tab-bar-echo-area"))]) (tab-bar-groups . [(20211013 2012) ((emacs (27 1)) (s (1 12 0))) "Tab groups for the tab bar" tar ((:commit . "a0389d87d2e793055dd74ae85b4593aa1d2720fd") (:authors ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainers ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainer "Fritz Grabo" . "hello@fritzgrabo.com") (:keywords "convenience") (:url . "https://github.com/fritzgrabo/tab-bar-groups"))]) (tab-bar-lost-commands . [(20211013 1945) ((emacs (27 1))) "The \"lost commands\" of the tab bar" tar ((:commit . "989e03dc3d1057264b21b9a5d241fcba86cd297a") (:authors ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainers ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainer "Fritz Grabo" . "hello@fritzgrabo.com") (:keywords "convenience") (:url . "https://github.com/fritzgrabo/tab-bar-lost-commands"))]) + (tab-bar-notch . [(20231120 2029) ((emacs (27 1))) "Adjust tab-bar height for MacBook Pro notch" tar ((:commit . "6d1101d8156e336f45122c04889327a4c5be253c") (:authors ("Jim Myhrberg" . "contact@jimeh.me")) (:maintainers ("Jim Myhrberg" . "contact@jimeh.me")) (:maintainer "Jim Myhrberg" . "contact@jimeh.me") (:keywords "convenience" "hardware") (:url . "https://github.com/jimeh/tab-bar-notch"))]) (tab-group . [(20140306 1450) nil "Grouped tabs and their tabbar" tar ((:commit . "5a290ec2608e4100fb188fd60ecb77affcc3465b") (:authors ("INA Lintaro ")) (:maintainers ("INA Lintaro ")) (:maintainer "INA Lintaro ") (:keywords "convenience" "tabs") (:url . "http://github.com/tarao/tab-group-el"))]) - (tab-jump-out . [(20151006 130) ((dash (2 10)) (emacs (24 4))) "Use tab to jump out of delimiter pairs." tar ((:commit . "1c3fec1826d2891177ea78e4e7cce1dc67e83e51") (:authors ("Zhang Kai Yu" . "yeannylam@gmail.com")) (:maintainers ("Zhang Kai Yu" . "yeannylam@gmail.com")) (:maintainer "Zhang Kai Yu" . "yeannylam@gmail.com") (:keywords "tab" "editing"))]) + (tab-jump-out . [(20240210 418) ((emacs (24 4))) "Use tab to jump out of delimiter pairs" tar ((:commit . "ff4d9b679566e4cab9bebc59123f681fb35f6cbf") (:authors ("Zhang Kai Yu" . "yeannylam@gmail.com")) (:maintainers ("Michael Kleehammer" . "michael@kleehammer.com")) (:maintainer "Michael Kleehammer" . "michael@kleehammer.com") (:keywords "convenience") (:url . "https://github.com/mkleehammer/tab-jump-out"))]) (tabbar . [(20180726 1735) nil "Display a tab bar in the header line" tar ((:commit . "82bbda31cbe8ef367dd6501c3aa14b7f2c835910") (:authors ("David Ponce" . "david@dponce.com")) (:maintainers ("David Ponce" . "david@dponce.com")) (:maintainer "David Ponce" . "david@dponce.com") (:keywords "convenience"))]) (tabbar-ruler . [(20160802 307) ((tabbar (2 0 1)) (powerline (2 3)) (mode-icons (0 4 0)) (cl-lib (0 5))) "Pretty tabbar, autohide, use both tabbar/ruler" tar ((:commit . "535568189aa12a3eff7f977d2783e57b6a65ab6a") (:authors ("Matthew Fidler, Ta Quang Trung, Nathaniel Cunningham")) (:maintainers ("Matthew L. Fidler")) (:maintainer "Matthew L. Fidler") (:keywords "tabbar" "ruler mode" "menu" "tool bar.") (:url . "http://github.com/mlf176f2/tabbar-ruler.el"))]) - (tabgo . [(20230425 907) ((emacs (27 1))) "Jump to tabs, avy style" tar ((:commit . "1a2f6b2b75c1829eb7acd188086b14fb75d9c7d1") (:authors ("Isa Mert Gurbuz" . "isamertgurbuz@gmail.com")) (:maintainers ("Isa Mert Gurbuz" . "isamertgurbuz@gmail.com")) (:maintainer "Isa Mert Gurbuz" . "isamertgurbuz@gmail.com") (:url . "https://github.com/isamert/tabgo.el"))]) - (tablist . [(20230321 705) ((emacs (24 3))) "Extended tabulated-list-mode" tar ((:commit . "5f7b71a92bfb25418d7da86ad9c45f14b149496f") (:authors ("Andreas Politz" . "politza@fh-trier.de")) (:maintainers ("Andreas Politz" . "politza@fh-trier.de")) (:maintainer "Andreas Politz" . "politza@fh-trier.de") (:keywords "extensions" "lisp"))]) - (tabnine . [(20230801 219) ((emacs (28 1)) (dash (2 16 0)) (s (1 12 0)) (editorconfig (0 9 1)) (vterm (0 0 2)) (language-id (0 5 1)) (transient (0 4 0))) "An unofficial TabNine package with TabNine Chat supported" tar ((:commit . "ea7a6caea7061df61fbd03f9bc9ed4974cf4a1f9") (:authors ("Aaron Ji" . "shuxiao9058@gmail.com") ("Tommy Xiang" . "tommyx058@gmail.com") ("John Gong" . "gjtzone@hotmail.com")) (:maintainers ("Aaron Ji" . "shuxiao9058@gmail.com")) (:maintainer "Aaron Ji" . "shuxiao9058@gmail.com") (:keywords "convenience") (:url . "https://github.com/shuxiao9058/tabnine/"))]) - (tabspaces . [(20230612 1404) ((emacs (27 1)) (project (0 8 1))) "Leverage tab-bar and project for buffer-isolated workspaces" tar ((:commit . "9c0915e1b19a1bbc65a365be3f7910a15dba3ac4") (:authors ("Colin McLear" . "mclear@fastmail.com")) (:maintainers ("Colin McLear")) (:maintainer "Colin McLear") (:keywords "convenience" "frames") (:url . "https://github.com/mclear-tools/tabspaces"))]) + (tabby-mode . [(20240107 2124) ((emacs (25 1))) "Minor mode for the Tabby AI coding assistant" tar ((:commit . "b656727247c5fc78690827fecf232edc1945a331") (:authors ("Ragnar Dahlén" . "r.dahlen@gmail.com")) (:maintainers ("Ragnar Dahlén" . "r.dahlen@gmail.com")) (:maintainer "Ragnar Dahlén" . "r.dahlen@gmail.com") (:keywords "tools" "convenience") (:url . "https://github.com/ragnard/tabby-mode"))]) + (tabgo . [(20240204 1326) ((emacs (27 1))) "Jump to tabs, avy style" tar ((:commit . "83b7d3261e9a6aaffd8e97bc047b77a6131789ee") (:authors ("Isa Mert Gurbuz" . "isamertgurbuz@gmail.com")) (:maintainers ("Isa Mert Gurbuz" . "isamertgurbuz@gmail.com")) (:maintainer "Isa Mert Gurbuz" . "isamertgurbuz@gmail.com") (:url . "https://github.com/isamert/tabgo.el"))]) + (tablist . [(20231019 1126) ((emacs (24 3))) "Extended tabulated-list-mode" tar ((:commit . "fcd37147121fabdf003a70279cf86fbe08cfac6f") (:authors ("Andreas Politz" . "politza@fh-trier.de")) (:maintainers ("Andreas Politz" . "politza@fh-trier.de")) (:maintainer "Andreas Politz" . "politza@fh-trier.de") (:keywords "extensions" "lisp"))]) + (tabnine . [(20240227 1429) ((emacs (29 1)) (dash (2 16 0)) (s (1 12 0)) (editorconfig (0 9 1)) (vterm (0 0 2)) (language-id (0 5 1)) (transient (0 4 0))) "An unofficial TabNine package with TabNine Chat supported" tar ((:commit . "a46629994b485472a442517e4c287e7a493deb9e") (:authors ("Aaron Ji" . "shuxiao9058@gmail.com") ("Tommy Xiang" . "tommyx058@gmail.com") ("John Gong" . "gjtzone@hotmail.com")) (:maintainers ("Aaron Ji" . "shuxiao9058@gmail.com")) (:maintainer "Aaron Ji" . "shuxiao9058@gmail.com") (:keywords "convenience") (:url . "https://github.com/shuxiao9058/tabnine/"))]) + (tabspaces . [(20240306 1454) ((emacs (27 1)) (project (0 8 1))) "Leverage tab-bar and project for buffer-isolated workspaces" tar ((:commit . "73d9cecaeb671e14409c80b10a17be64acebc43c") (:authors ("Colin McLear" . "mclear@fastmail.com")) (:maintainers ("Colin McLear")) (:maintainer "Colin McLear") (:keywords "convenience" "frames") (:url . "https://github.com/mclear-tools/tabspaces"))]) (tabula-rasa . [(20141216 547) ((emacs (24 4))) "Distraction free writing mode" tar ((:commit . "e85fff9de18dc31bc6a7aca726e34a95cc5459f5") (:authors ("Ido Magal" . "misc@satans.church")) (:maintainers ("Ido Magal" . "misc@satans.church")) (:maintainer "Ido Magal" . "misc@satans.church") (:keywords "distraction free" "writing") (:url . "https://github.com/idomagal/Tabula-Rasa/blob/master/tabula-rasa.el"))]) (tagedit . [(20161121 855) ((s (1 3 1)) (dash (1 0 3))) "Some paredit-like features for html-mode" tar ((:commit . "b3a70101a0dcf85498c92b7fcfa7fdbac869746c") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainers ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:keywords "convenience"))]) (take-off . [(20140531 917) ((emacs (24 3)) (web-server (0 1 0))) "Emacs remote web access" tar ((:commit . "aa9ea45566fc74febbb6ee9c409ecc4b59246215") (:authors ("Thomas Burette" . "burettethomas@gmail.com")) (:maintainers ("Thomas Burette" . "burettethomas@gmail.com")) (:maintainer "Thomas Burette" . "burettethomas@gmail.com") (:url . "https://github.com/tburette/take-off"))]) - (talonscript-mode . [(20220204 1441) ((emacs (24 3))) "Major mode for Talon Voice's .talon files" tar ((:commit . "b6eb61f56349e0d47276270163ec611c2d5b188e") (:authors ("Jcaw" . "toastedjcaw@gmail.com")) (:maintainers ("Jcaw" . "toastedjcaw@gmail.com")) (:maintainer "Jcaw" . "toastedjcaw@gmail.com") (:keywords "languages") (:url . "https://github.com/jcaw/talonscript-mode"))]) + (talonscript-mode . [(20231015 2358) ((emacs (24 3))) "Major mode for Talon Voice's .talon files" tar ((:commit . "b5e78b7866c9dee5f8bc5ce3924e1916c46e2b9b") (:authors ("Jcaw" . "toastedjcaw@gmail.com")) (:maintainers ("Jcaw" . "toastedjcaw@gmail.com")) (:maintainer "Jcaw" . "toastedjcaw@gmail.com") (:keywords "languages") (:url . "https://github.com/jcaw/talonscript-mode"))]) (tango-2-theme . [(20120312 2025) nil "Tango 2 color theme for GNU Emacs 24" tar ((:commit . "64e44c98e41ebbe3b827d54280e3b9615787daaa") (:authors ("Nick Parker")) (:maintainers ("Nick Parker")) (:maintainer "Nick Parker"))]) (tango-plus-theme . [(20221011 1012) nil "A color theme based on the tango palette" tar ((:commit . "30495d1ab1df6213ecac008c599b91e6f9244c12") (:authors ("Titus von der Malsburg" . "malsburg@posteo.de")) (:maintainers ("Titus von der Malsburg" . "malsburg@posteo.de")) (:maintainer "Titus von der Malsburg" . "malsburg@posteo.de") (:url . "https://github.com/tmalsburg/tango-plus-theme"))]) (tangonov-theme . [(20230425 1456) ((emacs (25))) "A 256 color dark theme featuring bright pastels" tar ((:commit . "bfeafe22d38877d4064670adec55ba1e8d09d830") (:authors ("Trevor Richards" . "trev@trevdev.ca")) (:maintainers ("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." tar ((:commit . "9036c4978965149ae9837bc0ad691b2ba9269052") (:authors ("Julien Barnier" . "julien@nozav.org")) (:maintainers ("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 . [(20230529 234) nil "This package provides two parametrized uncoloured color themes for Emacs: tao-yin and tao-yang." tar ((:commit . "4443e91293a044869e836bfeb0b10e9b4d3b102b") (:authors ("Peter Kosov" . "11111000000@email.com")) (:maintainer "Peter Kosov" . "11111000000@email.com") (:url . "http://github.com/11111000000/tao-theme-emacs"))]) + (tao-theme . [(20231117 1840) nil "This package provides two parametrized uncoloured color themes for Emacs: tao-yin and tao-yang." tar ((:commit . "593494030bc7651efff0c79c62d5e21d3fd54f4f") (:authors ("Peter Kosov" . "11111000000@email.com")) (:maintainer "Peter Kosov" . "11111000000@email.com") (:url . "http://github.com/11111000000/tao-theme-emacs"))]) (tardis-theme . [(20230212 2152) ((emacs (25 1))) "Quantum Country Theme" tar ((:commit . "352b1579d13e99cff9367b08208c1e241d76c89e") (:authors ("Anton Hibl" . "antonhibl11@gmail.com")) (:maintainers ("Anton Hibl" . "antonhibl11@gmail.com")) (:maintainer "Anton Hibl" . "antonhibl11@gmail.com") (:keywords "convenience") (:url . "https://github.com/antonhibl/tardis-theme"))]) - (taskpaper-mode . [(20230718 1418) ((emacs (25 1))) "Major mode for working with TaskPaper files" tar ((:commit . "33a87374f4fd4d6c45c8ae433b9735e72d7a60c8") (:authors ("Dmitry Safronov" . "saf.dmitry@gmail.com")) (:maintainers ("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 . [(20240112 1656) ((emacs (25 1))) "Major mode for working with TaskPaper files" tar ((:commit . "70897b621ab541dc4b7874a55378aa5a75095e2e") (:authors ("Dmitry Safronov" . "saf.dmitry@gmail.com")) (:maintainers ("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 ")) (:maintainers ("Yavor Konstantinov ")) (:maintainer "Yavor Konstantinov ") (:keywords "build-system" "taskrunner" "build" "task-runner" "tasks" "convenience") (:url . "https://github.com/emacs-taskrunner/emacs-taskrunner"))]) - (tawny-mode . [(20210528 1710) ((cider (0 12)) (emacs (25))) "Ontology Editing with Tawny-OWL" tar ((:commit . "5da72b601cb9f052f35e88c41f1a18b326c03791") (:authors ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) (:maintainers ("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" tar ((:commit . "e280e11b35a2fdbcadf9ce901a2b62684ac7a7a3") (:authors ("Yuki Inoue ")) (:maintainers ("Yuki Inoue ")) (:maintainer "Yuki Inoue ") (:url . "https://github.com/Yuki-Inoue/tblui.el"))]) + (tawny-mode . [(20231117 1644) ((cider (0 12)) (emacs (25))) "Ontology Editing with Tawny-OWL" tar ((:commit . "b2708d693400a2010370df040d7571bc30fa4d75") (:authors ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) (:maintainers ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) (:maintainer "Phillip Lord" . "phillip.lord@newcastle.ac.uk"))]) + (tblui . [(20231201 1100) ((dash (2 12 1)) (magit-popup (2 6 0)) (tablist (0 70)) (cl-lib (0 5))) "Define tabulated list UI easily" tar ((:commit . "62ab5f62982c061a902fd3e54d94a68a4706572c") (:authors ("Yuki Inoue ")) (:maintainers ("Yuki Inoue ")) (:maintainer "Yuki Inoue ") (:url . "https://github.com/Yuki-Inoue/tblui.el"))]) (tbx2org . [(20140224 1559) ((dash (2 5 0)) (s (1 8 0)) (cl-lib (0 4))) "Tinderbox to org-mode conversion" tar ((:commit . "08e9816ba6066f56936050b58d07ceb2187ae6f7") (:authors ("istib")) (:maintainers ("istib")) (:maintainer "istib") (:keywords "org-mode") (:url . "https://github.com/istib/tbx2org"))]) - (tc . [(20220122 1443) nil "a Japanese input method with T-Code on Emacs" tar ((:commit . "a3a4738ede3e107a5149c9d55691f57736bf4f48") (:authors ("Kaoru Maeda" . "maeda@src.ricoh.co.jp") ("Yasushi Saito" . "yasushi@cs.washington.edu") ("KITAJIMA Akira" . "kitajima@isc.osakac.ac.jp")) (:maintainers ("KITAJIMA Akira")) (:maintainer "KITAJIMA Akira"))]) + (tc . [(20231123 1424) nil "a Japanese input method with T-Code on Emacs" tar ((:commit . "6d7d16ae0dd737efb8ba68eebf1cc4cfdc26b05f") (:authors ("Kaoru Maeda" . "maeda@src.ricoh.co.jp") ("Yasushi Saito" . "yasushi@cs.washington.edu") ("KITAJIMA Akira" . "kitajima@isc.osakac.ac.jp")) (:maintainers ("KITAJIMA Akira")) (:maintainer "KITAJIMA Akira"))]) (tco . [(20191129 2040) ((dash (1 2 0)) (emacs (24 3))) "Tail-call optimisation for Emacs lisp" tar ((:commit . "d82478d56568f60b3a82fd010b3ca0bab2ef5dc9") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:url . "https://github.com/Wilfred/tco.el"))]) (tea-time . [(20120331 820) nil "Simple timer package, useful to make perfect tea." tar ((:commit . "1f6cf0bdd27c5eb3508989c5095427781f858eca") (:authors ("konsty" . "antipin.konstantin@googlemail.com")) (:maintainers ("Gabriel Saldana" . "gsaldana@gmail.com")) (:maintainer "Gabriel Saldana" . "gsaldana@gmail.com") (:keywords "timer" "tea-time"))]) (teacode-expand . [(20181231 640) ((emacs (24 4))) "Expansion of text by TeaCode program." tar ((:commit . "7df6f9ec95da1fb47bbae489bb3f2c27ed3a9b3a") (:authors ("Richard Guay" . "raguay@customct.com")) (:maintainers ("Richard Guay" . "raguay@customct.com")) (:maintainer "Richard Guay" . "raguay@customct.com") (:keywords "lisp") (:url . "https://github.com/raguay/TeaCode-Expand"))]) (teco . [(20200707 2309) nil "Teco interpreter" tar ((:commit . "2529eb0f7f35c526c1b6fca5250399718ff5138a") (:authors ("Dale R. Worley" . "worley@alum.mit.edu")) (:maintainers ("Mark T. Kennedy" . "mtk@acm.org")) (:maintainer "Mark T. Kennedy" . "mtk@acm.org") (:keywords "convenience" "emulations" "files") (:url . "https://github.com/mtk/teco.git"))]) - (telega . [(20230823 1026) ((emacs (27 1)) (visual-fill-column (1 9)) (rainbow-identifiers (0 2 2))) "Telegram client (unofficial)" tar ((:commit . "cfc216ac8f8da5f313c1831c23b83cff2fa9301d") (:authors ("Zajcev Evgeny" . "zevlg@yandex.ru")) (:maintainers ("Zajcev Evgeny" . "zevlg@yandex.ru")) (:maintainer "Zajcev Evgeny" . "zevlg@yandex.ru") (:keywords "comm") (:url . "https://github.com/zevlg/telega.el"))]) + (telega . [(20240320 705) ((emacs (27 1)) (visual-fill-column (1 9)) (rainbow-identifiers (0 2 2)) (transient (0 3 0))) "Telegram client (unofficial)" tar ((:commit . "f5867aeb25c1b0e386cc4a46fca16852ef2c7a11") (:authors ("Zajcev Evgeny" . "zevlg@yandex.ru")) (:maintainers ("Zajcev Evgeny" . "zevlg@yandex.ru")) (:maintainer "Zajcev Evgeny" . "zevlg@yandex.ru") (:keywords "comm") (:url . "https://github.com/zevlg/telega.el"))]) (telepathy . [(20131209 1258) nil "Access Telepathy from Emacs" tar ((:commit . "211d785b02a29ddc254422fdcc3db45262582f8c") (:authors ("Nicolas Petton" . "petton.nicolas@gmail.com")) (:maintainers ("Nicolas Petton" . "petton.nicolas@gmail.com")) (:maintainer "Nicolas Petton" . "petton.nicolas@gmail.com") (:keywords "telepathy" "tools"))]) - (telephone-line . [(20230322 442) ((emacs (24 4)) (cl-lib (0 5)) (cl-generic (0 2)) (seq (1 8))) "Rewrite of Powerline" tar ((:commit . "202f9c94f7b86827ab7ebb6dbce8302b0447d6ff") (:authors ("Daniel Bordak" . "dbordak@fastmail.fm")) (:maintainers ("Daniel Bordak" . "dbordak@fastmail.fm")) (:maintainer "Daniel Bordak" . "dbordak@fastmail.fm") (:keywords "mode-line") (:url . "https://github.com/dbordak/telephone-line"))]) - (teleport . [(20230723 2009) ((emacs (27 1)) (dash (2 18 0))) "Integration for tsh (goteleport.com)" tar ((:commit . "c1414e906c16edfb98db5f5a60000bf9c7dfdfb6") (:authors ("Caramel Hooves" . "caramel.hooves@protonmail.com")) (:maintainers ("Caramel Hooves" . "caramel.hooves@protonmail.com")) (:maintainer "Caramel Hooves" . "caramel.hooves@protonmail.com") (:keywords "tools") (:url . "https://github.com/caramelhooves/teleport.el"))]) - (teletext . [(20211203 1111) ((emacs (24 3))) "Teletext broadcast viewer" tar ((:commit . "6b003e9dab9bd0c27d188a81f5fff740d66a2282") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "comm" "help" "hypermedia") (:url . "https://github.com/lassik/emacs-teletext"))]) - (teletext-yle . [(20210927 825) ((emacs (24 3)) (teletext (0 1))) "Teletext provider for Finnish national network YLE" tar ((:commit . "9c8f4b503923c4ec688e2dcc9dff62d71bc55933") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "comm" "help" "hypermedia") (:url . "https://github.com/lassik/emacs-teletext-yle"))]) - (tempel . [(20230810 2303) ((emacs (27 1)) (compat (29 1 4 0))) "Tempo templates/snippets with in-buffer field editing" tar ((:commit . "93deb89ac1b1b6d789779432cfae5c76d9939c44") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainers ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:keywords "abbrev" "languages" "tools" "wp") (:url . "https://github.com/minad/tempel"))]) - (tempel-collection . [(20230726 1409) ((tempel (0 5)) (emacs (27 1))) "Collection of templates for Tempel" tar ((:commit . "b6694d385c6eb04f4931af219de5c4b2b8541599") (:authors ("Vitalii Drevenchuk" . "cradlemann@gmail.com") ("Max Penet" . "mpenetr@s-exp.com") ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainers ("Vitalii Drevenchuk" . "cradlemann@gmail.com")) (:maintainer "Vitalii Drevenchuk" . "cradlemann@gmail.com") (:keywords "tools") (:url . "https://github.com/Crandel/tempel-collection"))]) + (telephone-line . [(20240109 2021) ((emacs (24 4)) (cl-lib (0 5)) (cl-generic (0 2)) (seq (1 8))) "Rewrite of Powerline" tar ((:commit . "6016418a5e1e8e006cc202eff50ff28b594eeca4") (:authors ("Daniel Bordak" . "dbordak@fastmail.fm")) (:maintainers ("Daniel Bordak" . "dbordak@fastmail.fm")) (:maintainer "Daniel Bordak" . "dbordak@fastmail.fm") (:keywords "mode-line") (:url . "https://github.com/dbordak/telephone-line"))]) + (teleport . [(20240101 1358) ((emacs (28 1)) (dash (2 18 0))) "Integration for tsh (goteleport.com)" tar ((:commit . "d8fa80e7f548287279c9620e26c354e68b1559af") (:authors ("Caramel Hooves" . "caramel.hooves@protonmail.com")) (:maintainers ("Caramel Hooves" . "caramel.hooves@protonmail.com")) (:maintainer "Caramel Hooves" . "caramel.hooves@protonmail.com") (:keywords "tools") (:url . "https://github.com/caramelhooves/teleport.el"))]) + (teletext . [(20231215 1524) ((emacs (24 3))) "Teletext broadcast viewer" tar ((:commit . "d59ae5f9b79007646815a38f31882a114ca8aee0") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "comm" "help" "hypermedia") (:url . "https://github.com/lassik/emacs-teletext"))]) + (teletext-yle . [(20231215 1609) ((emacs (24 3)) (teletext (0 1))) "Teletext provider for Finnish national network YLE" tar ((:commit . "59a287c26571db07e191ac86cdf0be312fec1964") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "comm" "help" "hypermedia") (:url . "https://github.com/lassik/emacs-teletext-yle"))]) + (tempel . [(20240216 1543) ((emacs (27 1)) (compat (29 1 4 4))) "Tempo templates/snippets with in-buffer field editing" tar ((:commit . "bcc3185202edce67c7f7fc74287cc2ecbeef10c6") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainers ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:keywords "abbrev" "languages" "tools" "text") (:url . "https://github.com/minad/tempel"))]) + (tempel-collection . [(20240216 1105) ((tempel (0 5)) (emacs (29 1))) "Collection of templates for Tempel" tar ((:commit . "6248e22b52fd7fb98bba977221eb8440c82e6c00") (:authors ("Vitalii Drevenchuk" . "cradlemann@gmail.com") ("Max Penet" . "mpenetr@s-exp.com") ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainers ("Vitalii Drevenchuk" . "cradlemann@gmail.com")) (:maintainer "Vitalii Drevenchuk" . "cradlemann@gmail.com") (:keywords "tools") (:url . "https://github.com/Crandel/tempel-collection"))]) + (templ-ts-mode . [(20240118 338) ((emacs (29 1))) "Major mode for editing Templ files" tar ((:commit . "e43dc22adada160906bd411b03cfa022d787486d") (:authors ("David Anderson" . "dave@natulte.net")) (:maintainers ("David Anderson" . "dave@natulte.net")) (:maintainer "David Anderson" . "dave@natulte.net") (:keywords "languages") (:url . "https://github.com/danderson/templ-ts-mode"))]) (template-overlays . [(20180706 1132) ((emacs (24 4)) (ov (1 0 6))) "Display template regions using overlays" tar ((:commit . "3cbc9a4882dcbbddf9b168883d119a6af0848784") (:authors ("Mariano Montone" . "marianomontone@gmail.com")) (:maintainers ("Mariano Montone" . "marianomontone@gmail.com")) (:maintainer "Mariano Montone" . "marianomontone@gmail.com") (:keywords "faces" "convenience" "templates" "overlays") (:url . "http://www.github.com/mmontone/template-overlays"))]) (templatel . [(20210902 228) ((emacs (25 1))) "Templating language;" tar ((:commit . "e1ccb88cdc4b482b078276960f810b82ba3b7847") (:authors ("Lincoln Clarete" . "lincoln@clarete.li")) (:maintainers ("Lincoln Clarete" . "lincoln@clarete.li")) (:maintainer "Lincoln Clarete" . "lincoln@clarete.li") (:url . "https://clarete.li/templatel"))]) (temporary-persistent . [(20230115 1425) ((emacs (24 3)) (names (20151201 0)) (dash (2 12 1)) (s (1 10 0))) "Keep temp notes buffers persistent" tar ((:commit . "edbde738769e79ac212ae84ae7898ffd5f19e0f1") (:authors ("Kostafey" . "kostafey@gmail.com")) (:maintainers ("Kostafey" . "kostafey@gmail.com")) (:maintainer "Kostafey" . "kostafey@gmail.com") (:keywords "temp" "buffers" "notes") (:url . "https://github.com/kostafey/temporary-persistent"))]) @@ -4995,58 +5120,61 @@ (term-run . [(20200128 702) nil "Run arbitrary command in terminal buffer" tar ((:commit . "0fd135d55fcf864598b1fb8dd880833a1a322910") (:authors ("10sr <8slashes+el [at] gmail [dot] com>")) (:maintainers ("10sr <8slashes+el [at] gmail [dot] com>")) (:maintainer "10sr <8slashes+el [at] gmail [dot] com>") (:keywords "utility" "shell" "command" "term-mode") (:url . "https://github.com/10sr/term-run-el"))]) (termbright-theme . [(20151031 235) ((emacs (24 1))) "a more usable theme for white-on-black terminals" tar ((:commit . "bec6ab14336c0611e85f45486276004f16d20607") (:authors ("Brian Mastenbrook" . "brian@mastenbrook.net")) (:maintainers ("Brian Mastenbrook" . "brian@mastenbrook.net")) (:maintainer "Brian Mastenbrook" . "brian@mastenbrook.net") (:keywords "themes") (:url . "https://github.com/bmastenbrook/termbright-theme-el"))]) (terminal-focus-reporting . [(20180830 719) ((emacs (24 4))) "Minor mode for terminal focus reporting." tar ((:commit . "8b84bf18f4c5f1b59a11692eb706f13c3598d9a5") (:authors ("Vitalii Elenhaupt")) (:maintainers ("Vitalii Elenhaupt")) (:maintainer "Vitalii Elenhaupt") (:keywords "convenience") (:url . "https://github.com/veelenga/terminal-focus-reporting.el"))]) - (terminal-here . [(20220827 819) ((emacs (25 1))) "Run an external terminal in current directory" tar ((:commit . "4bf2a77e450b260570033afda463e178fdf34617") (:authors ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainers ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainer "David Shepherd" . "davidshepherd7@gmail.com") (:keywords "tools" "frames") (:url . "https://github.com/davidshepherd7/terminal-here"))]) + (terminal-here . [(20240227 2236) ((emacs (25 1))) "Run an external terminal in current directory" tar ((:commit . "c996304c1e873e561108a509129b9e4358d354d5") (:authors ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainers ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainer "David Shepherd" . "davidshepherd7@gmail.com") (:keywords "tools" "frames") (:url . "https://github.com/davidshepherd7/terminal-here"))]) (terminal-toggle . [(20190226 1510) ((emacs (24)) (popwin (1 0 0))) "simple pop-up terminal" tar ((:commit . "f824d634aef3600cb7a8e2ddf9e8444c6607c160") (:authors ("Mehmet Tekman")) (:maintainers ("Mehmet Tekman")) (:maintainer "Mehmet Tekman") (:keywords "outlines") (:url . "https://github.com/mtekman/terminal-toggle.el"))]) (tern . [(20191227 950) ((json (1 2)) (cl-lib (0 5)) (emacs (24))) "Tern-powered JavaScript integration" tar ((:commit . "0d19800db70a6348c627a69f444b91d21ad89629") (:authors ("Marijn Haverbeke")) (:maintainers ("Marijn Haverbeke")) (:maintainer "Marijn Haverbeke") (:url . "http://ternjs.net/"))]) (tern-auto-complete . [(20191227 950) ((tern (0 0 1)) (auto-complete (1 4)) (cl-lib (0 5)) (emacs (24))) "Tern Completion by auto-complete.el" tar ((:commit . "0d19800db70a6348c627a69f444b91d21ad89629") (:authors ("")) (:maintainers ("")) (:maintainer ""))]) (tern-context-coloring . [(20170102 2253) ((emacs (24 3)) (context-coloring (8 1 0)) (tern (0 0 1))) "Use Tern for context coloring" tar ((:commit . "3a8e979d6cc83aabcb3dda3f5f31a6422532efba") (:authors ("Jackson Ray Hamilton" . "jackson@jacksonrayhamilton.com")) (:maintainers ("Jackson Ray Hamilton" . "jackson@jacksonrayhamilton.com")) (:maintainer "Jackson Ray Hamilton" . "jackson@jacksonrayhamilton.com") (:keywords "convenience" "faces" "tools") (:url . "https://github.com/jacksonrayhamilton/tern-context-coloring"))]) - (terraform-doc . [(20230521 849) ((emacs (24 4))) "Look up terraform documentation on the fly" tar ((:commit . "8a6ffd5ac133ced5afd07b9d963272e4208f8b1e") (:authors ("Giap Tran" . "txgvnn@gmail.com")) (:maintainers ("Giap Tran" . "txgvnn@gmail.com")) (:maintainer "Giap Tran" . "txgvnn@gmail.com") (:keywords "comm") (:url . "https://github.com/TxGVNN/terraform-doc"))]) - (terraform-mode . [(20230607 1923) ((emacs (24 3)) (hcl-mode (0 3)) (dash (2 17 0))) "Major mode for terraform configuration file" tar ((:commit . "25a22a66f81e35c75f2fdaaab89aad7f9940fe06") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-terraform-mode"))]) + (terraform-doc . [(20240119 1413) ((emacs (24 4))) "Look up terraform documentation on the fly" tar ((:commit . "1e6963662d50196efb78f906a4d3d8669454dbbb") (:authors ("Giap Tran" . "txgvnn@gmail.com")) (:maintainers ("Giap Tran" . "txgvnn@gmail.com")) (:maintainer "Giap Tran" . "txgvnn@gmail.com") (:keywords "comm") (:url . "https://github.com/TxGVNN/terraform-doc"))]) + (terraform-mode . [(20240318 737) ((emacs (24 3)) (hcl-mode (0 3)) (dash (2 17 0))) "Major mode for terraform configuration file" tar ((:commit . "f16a7ff3b9a1e455daaca4208272440b858d2e0a") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-terraform-mode"))]) (tesouro . [(20221003 1303) ((request (0 3 2)) (emacs (24 4))) "Brazilian Portuguese synonym search in dicio.com.br" tar ((:commit . "3dbfc49209237215163be1ea338dea099ddc0795") (:url . "https://github.com/rberaldo/tesouro.el"))]) (test-c . [(20180423 1720) ((emacs (24 3))) "quickly test c code" tar ((:commit . "761a576f62c7021ba941f178f153c51289df1553") (:authors ("Aurélien Aptel" . "aurelien.aptel@gmail.com")) (:maintainers ("Aurélien Aptel" . "aurelien.aptel@gmail.com")) (:maintainer "Aurélien Aptel" . "aurelien.aptel@gmail.com") (:url . "http://github.com/aaptel/test-c"))]) (test-case-mode . [(20130525 1434) ((fringe-helper (0 1 1))) "unit test front-end" tar ((:commit . "26e397c0f930b7eb0be413ef7dd257b1da052bec") (:authors ("Nikolaj Schumacher ")) (:maintainers ("Nikolaj Schumacher ")) (:maintainer "Nikolaj Schumacher ") (:keywords "tools") (:url . "http://nschum.de/src/emacs/test-case-mode/"))]) + (test-cockpit . [(20240220 2058) ((emacs (28 1)) (projectile (2 7)) (toml (20230411 1449))) "A command center to run tests of a software project" tar ((:commit . "11c23ddb9284b21a1072c37f168574096ee3bd2f") (:authors ("Johannes Mueller" . "github@johannes-mueller.org")) (:maintainers ("Johannes Mueller" . "github@johannes-mueller.org")) (:maintainer "Johannes Mueller" . "github@johannes-mueller.org") (:url . "https://github.com/johannes-mueller/test-cockpit.el"))]) (test-kitchen . [(20171129 2035) nil "Run test-kitchen inside of emacs" tar ((:commit . "0fc0ca4808425f03fbeb8125246043723e2a179a") (:authors ("JJ Asghar")) (:maintainers ("JJ Asghar")) (:maintainer "JJ Asghar") (:keywords "chef" "ruby" "test-kitchen") (:url . "http://github.com/jjasghar/test-kitchen-el"))]) - (test-simple . [(20200722 1121) ((cl-lib (0))) "Simple Unit Test Framework for Emacs Lisp" tar ((:commit . "29c2c1ca7c240c8dfdba93dba6201e542a5a3b43") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainers ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org") (:keywords "unit-test") (:url . "https://github.com/rocky/emacs-test-simple"))]) + (test-simple . [(20230916 1634) ((cl-lib (0))) "Simple Unit Test Framework for Emacs Lisp" tar ((:commit . "8b191842318bb05da74052025192d32ebebb033a") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainers ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org") (:keywords "unit-test") (:url . "https://github.com/rocky/emacs-test-simple"))]) (tex-smart-umlauts . [(20230416 2051) nil "Smart umlaut conversion for TeX." tar ((:commit . "b28bac71990e0442616157fdb64494179df5575e") (:authors ("Frank Fischer ")) (:maintainers ("Frank Fischer ")) (:maintainer "Frank Fischer ") (:keywords "tex" "wp") (:url . "http://hub.darcs.net/lyro/tex-smart-umlauts"))]) (texfrag . [(20230117 1746) ((emacs (25)) (auctex (11 90 2))) "preview LaTeX fragments in alien major modes" tar ((:commit . "6df9044c3d6bbb2a104f2c9b78ad10aa3cdf9506") (:authors ("Tobias Zawada" . "i@tn-home.de")) (:maintainers ("Tobias Zawada" . "i@tn-home.de")) (:maintainer "Tobias Zawada" . "i@tn-home.de") (:keywords "tex" "languages" "wp") (:url . "https://github.com/TobiasZawada/texfrag"))]) (text-categories . [(20230425 1154) ((emacs (26 2))) "Assign text categories to a buffer for mass deletion" tar ((:commit . "7ae616e45005c469273dd4285cd0808885860984") (:authors ("Dionisios Spiliopoulos" . "dennisspiliopoylos@gmail.com")) (:maintainers ("Dionisios Spiliopoulos" . "dennisspiliopoylos@gmail.com")) (:maintainer "Dionisios Spiliopoulos" . "dennisspiliopoylos@gmail.com") (:keywords "lisp") (:url . "https://github.com/Dspil/text-categories"))]) - (textile-mode . [(20230112 1030) nil "Textile markup editing major mode" tar ((:commit . "8f8c09ef097a95a713307fdb5c92b9778dfbc1fc") (:authors ("Julien Barnier" . "julien@nozav.org")) (:maintainers ("Julien Barnier" . "julien@nozav.org")) (:maintainer "Julien Barnier" . "julien@nozav.org") (:keywords "wp" "languages") (:url . "https://github.com/juba/textile-mode"))]) + (textile-mode . [(20240212 1755) nil "Textile markup editing major mode" tar ((:commit . "2ad90cb6ed2560ee147417a3ec65222cc2ad33f1") (:authors ("Julien Barnier" . "julien@nozav.org")) (:maintainers ("Julien Barnier" . "julien@nozav.org")) (:maintainer "Julien Barnier" . "julien@nozav.org") (:keywords "wp" "languages") (:url . "https://github.com/juba/textile-mode"))]) (textmate . [(20110816 2146) nil "TextMate minor mode for Emacs" tar ((:commit . "350918b070148f0ace6d9d3cd4ebcaf15c1a8781") (:authors ("Chris Wanstrath" . "chris@ozmm.org")) (:maintainers ("Chris Wanstrath" . "chris@ozmm.org")) (:maintainer "Chris Wanstrath" . "chris@ozmm.org") (:keywords "textmate" "osx" "mac"))]) (textmate-to-yas . [(20160409 1708) nil "Import Textmate macros into yasnippet syntax" tar ((:commit . "be3a768b7ac4c2e24b9d4aa6e9ac1d916cdc5a73") (:authors ("Matthew L. Fidler")) (:maintainers ("Matthew L. Fidler")) (:maintainer "Matthew L. Fidler") (:keywords "yasnippet" "textmate") (:url . "https://github.com/mlf176f2/textmate-to-yas.el/"))]) - (textsize . [(20220427 1445) ((emacs (26 1))) "Configure frame text size automatically" tar ((:commit . "df91392c3c928d7841631f5809716b9cf0f7309e") (:authors ("James Ferguson" . "james@faff.org")) (:maintainers ("James Ferguson" . "james@faff.org")) (:maintainer "James Ferguson" . "james@faff.org") (:keywords "convenience") (:url . "https://github.com/WJCFerguson/textsize"))]) + (textsize . [(20231005 1335) ((emacs (26 1))) "Configure frame text size automatically" tar ((:commit . "d61fd65d823b17ff71a61fba5590a9e9b60e0e92") (:authors ("James Ferguson" . "james@faff.org")) (:maintainers ("James Ferguson" . "james@faff.org")) (:maintainer "James Ferguson" . "james@faff.org") (:keywords "convenience") (:url . "https://github.com/WJCFerguson/textsize"))]) (textx-mode . [(20230324 2020) ((emacs (24 3))) "Major mode for editing TextX files" tar ((:commit . "ecf90abec508cfd82d5da68474e976be907d9a77") (:authors ("Novak Boškov" . "gnovak.boskov@gmail.com")) (:maintainers ("Novak Boškov" . "gnovak.boskov@gmail.com")) (:maintainer "Novak Boškov" . "gnovak.boskov@gmail.com") (:keywords "textx") (:url . "https://github.com/novakboskov/textx-mode"))]) (tf2-conf-mode . [(20161209 1620) nil "TF2 Configuration files syntax highlighting" tar ((:commit . "94c971da4a78d55da2848d1e76d513e5e0a8f7eb") (:authors ("Guillermo Robles" . "guillerobles1995@gmail.com")) (:maintainers ("Guillermo Robles" . "guillerobles1995@gmail.com")) (:maintainer "Guillermo Robles" . "guillerobles1995@gmail.com") (:keywords "languages") (:url . "https://github.com/wynro/emacs-tf2-conf-mode"))]) (tfsmacs . [(20180911 2114) ((emacs (25)) (tablist (0 70))) "MS TFS source control interaction." tar ((:commit . "13ee3f528ff616880611f563a68d921250692ef8") (:authors ("Dino Chiesa , Sebastian Monia" . "smonia@outlook.com")) (:maintainers ("Dino Chiesa , Sebastian Monia" . "smonia@outlook.com")) (:maintainer "Dino Chiesa , Sebastian Monia" . "smonia@outlook.com") (:keywords "tfs" "vc") (:url . "http://github.com/sebasmonia/tfsmacs/"))]) - (the-matrix-theme . [(20230402 1218) ((emacs (26 1))) "Green-on-black dark theme inspired by \"The Matrix\" movie" tar ((:commit . "b339285651e088bc51fa2fb51aa319fb70cab9a4") (:authors ("Dan Dee" . "monkeyjunglejuice@pm.me")) (:maintainers ("Dan Dee" . "monkeyjunglejuice@pm.me")) (:maintainer "Dan Dee" . "monkeyjunglejuice@pm.me") (:keywords "faces" "theme") (:url . "https://github.com/monkeyjunglejuice/matrix-emacs-theme"))]) - (theme-anchor . [(20220204 321) ((emacs (26))) "Apply theme in current buffer only" tar ((:commit . "c6f715d4ccd30e83922e39cab856578ce19224bb") (:authors ("Liāu, Kiong-Gē" . "gliao.tw@pm.me")) (:maintainers ("Liāu, Kiong-Gē" . "gliao.tw@pm.me")) (:maintainer "Liāu, Kiong-Gē" . "gliao.tw@pm.me") (:keywords "extensions" "lisp" "theme") (:url . "https://github.com/GongYiLiao/theme-anchor"))]) - (theme-changer . [(20230417 1502) ((cl-lib (0))) "Sunrise/Sunset Theme Changer for Emacs" tar ((:commit . "2ff40a1750323a3547ca7a71c319971c8e1147ca") (:authors ("Joshua B. Griffith" . "josh.griffith@gmail.com")) (:maintainers ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainer "Samuel W. Flint" . "swflint@flintfam.org") (:keywords "color-theme" "deftheme" "solar" "sunrise" "sunset") (:url . "https://github.com/hadronzoo/theme-changer"))]) + (the-matrix-theme . [(20240214 747) ((emacs (26 1))) "Green-on-black dark theme inspired by \"The Matrix\" movie" tar ((:commit . "1cfaa2b20d1dd9253b0654284eaff41e5a73d444") (:authors ("Dan Dee" . "monkeyjunglejuice@pm.me")) (:maintainers ("Dan Dee" . "monkeyjunglejuice@pm.me")) (:maintainer "Dan Dee" . "monkeyjunglejuice@pm.me") (:keywords "faces" "theme") (:url . "https://github.com/monkeyjunglejuice/matrix-emacs-theme"))]) + (theme-anchor . [(20230924 2041) ((emacs (26))) "Apply theme in current buffer only" tar ((:commit . "dd69fe04d901e771cafde3992042a212e4a62620") (:authors ("Liāu, Kiong-Gē" . "gliao.tw@pm.me")) (:maintainers ("Liāu, Kiong-Gē" . "gliao.tw@pm.me")) (:maintainer "Liāu, Kiong-Gē" . "gliao.tw@pm.me") (:keywords "extensions" "lisp" "theme") (:url . "https://github.com/GongYiLiao/theme-anchor"))]) + (theme-changer . [(20230904 1706) ((cl-lib (0))) "Sunrise/Sunset Theme Changer for Emacs" tar ((:commit . "7febd7632451bb99a5d92f24623432c4de035ff1") (:authors ("Joshua B. Griffith" . "josh.griffith@gmail.com")) (:maintainers ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainer "Samuel W. Flint" . "swflint@flintfam.org") (:keywords "color-theme" "deftheme" "solar" "sunrise" "sunset") (:url . "https://github.com/hadronzoo/theme-changer"))]) (theme-looper . [(20210827 424) ((emacs (24)) (cl-lib (0 5))) "A package for switching themes in Emacs interactively" tar ((:commit . "e6e8efd740df0b68db89805ba72492818dba61ab") (:authors ("Mohammed Ismail Ansari" . "team.terminal@gmail.com")) (:maintainers ("Mohammed Ismail Ansari" . "team.terminal@gmail.com")) (:maintainer "Mohammed Ismail Ansari" . "team.terminal@gmail.com") (:keywords "convenience" "color-themes") (:url . "http://ismail.teamfluxion.com"))]) (theme-magic . [(20190711 2034) ((emacs (25)) (seq (1 8))) "Apply your Emacs theme to the rest of Linux" tar ((:commit . "844c4311bd26ebafd4b6a1d72ddcc65d87f074e3") (:authors ("GitHub user \"jcaw\"" . "40725916+jcaw@users.noreply.github.com")) (:maintainers ("GitHub user \"jcaw\"" . "40725916+jcaw@users.noreply.github.com")) (:maintainer "GitHub user \"jcaw\"" . "40725916+jcaw@users.noreply.github.com") (:keywords "unix" "faces" "terminals" "extensions") (:url . "https://github.com/jcaw/theme-magic.el"))]) (therapy . [(20151113 1953) ((emacs (24))) "Hooks for managing multiple Python major versions" tar ((:commit . "775a92bb7b6b0fcc5b38c0b5198a9d0a1bef788a") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainers ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:url . "https://github.com/abingham/therapy"))]) (thingopt . [(20160520 2318) nil "Thing at Point optional utilities" tar ((:commit . "5679815852652479f3b3c9f3a98affc927384b2c") (:authors ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainers ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainer "Tomohiro Matsuyama" . "m2ym.pub@gmail.com") (:keywords "convenience"))]) (thinks . [(20170802 1128) ((cl-lib (0 5))) "Insert text in a think bubble." tar ((:commit . "15e0437f5b635bdcf738ca092e26aa6d8ecdba36") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainers ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:keywords "convenience" "quoting") (:url . "https://github.com/davep/thinks.el"))]) + (third-time . [(20240207 1621) ((emacs (27 1))) "Third Time: A Better Way to Work" tar ((:commit . "093b74be860fac389fb173caef5fabf61e417eef") (:authors ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainers ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainer "Samuel W. Flint" . "swflint@flintfam.org") (:url . "https://git.sr.ht/~swflint/third-time"))]) (thread-dump . [(20170816 1850) nil "Java thread dump viewer" tar ((:commit . "204c9600242756d4b514bb5ff6293e052bf4b49d") (:authors ("Dmitry Neverov")) (:maintainers ("Dmitry Neverov")) (:maintainer "Dmitry Neverov") (:url . "http://github.com/nd/thread-dump.el"))]) (threes . [(20160820 1242) ((emacs (24)) (seq (1 11))) "A clone of Threes (a tiny puzzle game)" tar ((:commit . "6981acb30b856c77cba6aba63fefbf102cbdfbb2") (:authors ("Chunyang Xu" . "xuchunyang.me@gmail.com")) (:maintainers ("Chunyang Xu" . "xuchunyang.me@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang.me@gmail.com") (:keywords "games") (:url . "https://github.com/xuchunyang/threes.el"))]) - (thrift . [(20230827 1926) ((emacs (24))) "major mode for fbthrift and Apache Thrift files" tar ((:commit . "5dd749a5c4a1443493c0a7edb4b45be88f0734d3") (:keywords "languages"))]) + (thrift . [(20240318 1244) ((emacs (24))) "major mode for fbthrift and Apache Thrift files" tar ((:commit . "9a64b4682510c27eab73440c56fca1eda9e05abd") (:keywords "languages"))]) (thumb-through . [(20120119 534) nil "Plain text reader of HTML documents" tar ((:commit . "08d8fb720f93c6172653e035191a8fa9c3305e63") (:keywords "html"))]) (tickscript-mode . [(20171219 203) ((emacs (24 1))) "A major mode for Tickscript files" tar ((:commit . "f0579f38ff14954df5002ce30ae6d4a2c978d461") (:authors ("Marc Sherry" . "msherry@gmail.com")) (:maintainers ("Marc Sherry" . "msherry@gmail.com")) (:maintainer "Marc Sherry" . "msherry@gmail.com") (:keywords "languages") (:url . "https://github.com/msherry/tickscript-mode"))]) - (tidal . [(20230616 734) ((haskell-mode (16)) (emacs (25 1))) "Interact with TidalCycles for live coding patterns" tar ((:commit . "8f7b9368c78f56a3adc30a02a7056970d2afaa3f") (:authors (nil . "alex@slab.org")) (:maintainers (nil . "alex@slab.org")) (:maintainer nil . "alex@slab.org") (:keywords "tools") (:url . "https://github.com/tidalcycles/Tidal"))]) + (tidal . [(20230312 1245) ((haskell-mode (16)) (emacs (25 1))) "Interact with TidalCycles for live coding patterns" tar ((:commit . "3ac320020d809ea626fc283839fecb10c9da4ce2") (:authors (nil . "alex@slab.org")) (:maintainers (nil . "alex@slab.org")) (:maintainer nil . "alex@slab.org") (:keywords "tools") (:url . "https://github.com/tidalcycles/Tidal"))]) (tide . [(20230620 1444) ((emacs (25 1)) (dash (2 10 0)) (s (1 11 0)) (flycheck (27)) (cl-lib (0 5))) "Typescript Interactive Development Environment" tar ((:commit . "b38dfc3f8fb754e64e48e76fc92d472cb3d1a3dc") (:authors ("Anantha kumaran" . "ananthakumaran@gmail.com")) (:maintainers ("Anantha kumaran" . "ananthakumaran@gmail.com")) (:maintainer "Anantha kumaran" . "ananthakumaran@gmail.com") (:keywords "typescript") (:url . "http://github.com/ananthakumaran/tide"))]) - (tiktoken . [(20230719 129) ((emacs (28 0)) (f (0 20 0))) "Count BPE Tokens" tar ((:commit . "957ece897933460d532057fe60cfddcd9e49d8b5") (:authors ("Zachary Romero")) (:maintainers ("Zachary Romero")) (:maintainer "Zachary Romero") (:keywords "tools") (:url . "https://github.com/zkry/tiktoken.el"))]) + (tiktoken . [(20240103 340) ((emacs (28 0)) (f (0 20 0))) "Count BPE Tokens" tar ((:commit . "1dec1547024c10f32cd49129f937fa1d3ee39d01") (:authors ("Zachary Romero")) (:maintainers ("Zachary Romero")) (:maintainer "Zachary Romero") (:keywords "tools") (:url . "https://github.com/zkry/tiktoken.el"))]) (tikz . [(20220526 521) ((emacs (24 1))) "A minor mode to edit TikZ pictures" tar ((:commit . "4b205afc5c88f050639135d1d57f1276db323842") (:authors ("Emilio Torres-Manzanera" . "torres@uniovi.es")) (:maintainers ("Emilio Torres-Manzanera" . "torres@uniovi.es")) (:maintainer "Emilio Torres-Manzanera" . "torres@uniovi.es") (:keywords "tex") (:url . "https://github.com/emiliotorres/tikz"))]) (tile . [(20161225 357) ((emacs (25 1)) (s (1 9 0)) (dash (2 12 0)) (stream (2 2 3))) "Tile windows with layouts" tar ((:commit . "22660f21f6e95de5aba55cd5d293d4841e9a4661") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainers ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:keywords "tile" "tiling" "window" "manager" "dynamic" "frames") (:url . "https://github.com/IvanMalison/tile"))]) (time-block . [(20230511 1434) ((emacs (25 1)) (ts (0 1))) "Block running commands using time" tar ((:commit . "0fdb488c3fa3da2934ee486613f5bf46712b97d6") (:authors ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainers ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainer "Samuel W. Flint" . "swflint@flintfam.org") (:keywords "tools" "productivity" "convenience") (:url . "https://git.sr.ht/~swflint/time-block-command"))]) (time-ext . [(20170126 1215) nil "more function for time/date" tar ((:commit . "d128becf660fe3f30178eb1b05cd266741f4784a") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "lisp") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/time-ext.el"))]) - (time-uuid-mode . [(20230312 2256) ((emacs (24 3))) "Minor mode for previewing time uuids as an overlay" tar ((:commit . "6f0768edb7588add3713952e5b20e9df8ee51f89") (:authors ("Robert Plant" . "rob@robertplant.io")) (:maintainers ("Robert Plant" . "rob@robertplant.io")) (:maintainer "Robert Plant" . "rob@robertplant.io") (:keywords "extensions" "convenience" "data" "tools") (:url . "https://github.com/RobertPlant/time-uuid-mode"))]) - (timecop . [(20160520 1052) ((cl-lib (0 5)) (datetime-format (0 0 1))) "Freeze Time for testing" tar ((:commit . "3a1871613facc928ff250ed8f12fbc7073e46b75") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "datetime" "testing") (:url . "https://github.com/zonuexe/emacs-datetime"))]) + (time-uuid-mode . [(20240112 1005) ((emacs (24 3))) "Minor mode for previewing time uuids as an overlay" tar ((:commit . "e30f50229c617bdd31a1edcd849cba1f3423fea1") (:authors ("Robert Plant" . "rob@robertplant.io")) (:maintainers ("Robert Plant" . "rob@robertplant.io")) (:maintainer "Robert Plant" . "rob@robertplant.io") (:keywords "extensions" "convenience" "data" "tools") (:url . "https://github.com/RobertPlant/time-uuid-mode"))]) + (timecop . [(20240105 2100) ((emacs (26 3)) (datetime-format (0 0 1))) "Freeze Time for testing" tar ((:commit . "090bfff5c28fa0a6cb629512003c49b3f43ed72d") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "lisp" "datetime" "testing") (:url . "https://github.com/emacs-php/emacs-datetime"))]) (timer-revert . [(20150122 2032) nil "minor mode to revert buffer for a given time interval." tar ((:commit . "615c91dec8b440d2b9b7c725dd733d7432564e45") (:authors ("Yagnesh Raghava Yakkala. http://yagnesh.org")) (:maintainer nil . "hi@yagnesh.org") (:keywords "timer" "revert" "auto-revert.") (:url . "http://github.com/yyr/timer-revert"))]) (timesheet . [(20221004 1702) ((s (1)) (org (9))) "Timesheet management add-on for org-mode" tar ((:commit . "511751b239c84d7619ec1c61d7f108b732b64442") (:authors ("Tom Marble")) (:maintainers ("Tom Marble")) (:maintainer "Tom Marble") (:keywords "org" "timesheet") (:url . "https://github.com/tmarble/timesheet.el"))]) (timonier . [(20170411 800) ((emacs (24 4)) (s (1 11 0)) (f (0 19 0)) (dash (2 12 0)) (pkg-info (0 5 0)) (hydra (0 13 6)) (request (0 2 0)) (all-the-icons (2 0 0))) "Manage Kubernetes Applications" tar ((:commit . "3460a878269424c8d19b7d5d8e04749d0a8bf203") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainers ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "kubernetes" "docker") (:url . "https://github.com/nlamirault/timonier"))]) (timp . [(20160618 803) ((emacs (24 4)) (cl-lib (0 5)) (fifo-class (1 0)) (signal (1 0))) "Multithreading library" tar ((:commit . "59657bf603904635d88c3fe4ff1ce45ee6572428") (:authors ("Mola-T" . "Mola@molamola.xyz")) (:maintainers ("Mola-T" . "Mola@molamola.xyz")) (:maintainer "Mola-T" . "Mola@molamola.xyz") (:keywords "internal" "lisp" "processes" "tools") (:url . "https://github.com/mola-T/timp"))]) - (timu-caribbean-theme . [(20221226 1556) ((emacs (27 1))) "Color theme with cyan as a dominant color" tar ((:commit . "af60151fe35bd1c780b7c4a37032699989ee6162") (:authors ("Aimé Bertrand" . "aime.bertrand@macowners.club")) (:maintainers ("Aimé Bertrand" . "aime.bertrand@macowners.club")) (:maintainer "Aimé Bertrand" . "aime.bertrand@macowners.club") (:keywords "faces" "themes") (:url . "https://gitlab.com/aimebertrand/timu-caribbean-theme"))]) - (timu-macos-theme . [(20230827 1349) ((emacs (27 1))) "Color theme inspired by the macOS UI" tar ((:commit . "7246a60147b082807df22b78d7cbb306e1d3fcb1") (:authors ("Aimé Bertrand" . "aime.bertrand@macowners.club")) (:maintainers ("Aimé Bertrand" . "aime.bertrand@macowners.club")) (:maintainer "Aimé Bertrand" . "aime.bertrand@macowners.club") (:keywords "faces" "themes") (:url . "https://gitlab.com/aimebertrand/timu-macos-theme"))]) - (timu-rouge-theme . [(20230102 1925) ((emacs (27 1))) "Color theme inspired by the Rouge Theme for VSCode" tar ((:commit . "87117f15ea5fcfacbbad23ea6f345d18c2ff0009") (:authors ("Aimé Bertrand" . "aime.bertrand@macowners.club")) (:maintainers ("Aimé Bertrand" . "aime.bertrand@macowners.club")) (:maintainer "Aimé Bertrand" . "aime.bertrand@macowners.club") (:keywords "faces" "themes") (:url . "https://gitlab.com/aimebertrand/timu-rouge-theme"))]) - (timu-spacegrey-theme . [(20230102 59) ((emacs (26 1))) "Color theme inspired by the Spacegray theme in Sublime Text" tar ((:commit . "0d0d977c2149f695de0e4de55ae64a672c34bfac") (:authors ("Aimé Bertrand" . "aime.bertrand@macowners.club")) (:maintainers ("Aimé Bertrand" . "aime.bertrand@macowners.club")) (:maintainer "Aimé Bertrand" . "aime.bertrand@macowners.club") (:keywords "faces" "themes") (:url . "https://gitlab.com/aimebertrand/timu-spacegrey-theme"))]) + (timu-caribbean-theme . [(20240224 2028) ((emacs (27 1))) "Color theme with cyan as a dominant color" tar ((:commit . "ec83fc030ad7c098637df6f3a56d844f8526c571") (:authors ("Aimé Bertrand" . "aime.bertrand@macowners.club")) (:maintainers ("Aimé Bertrand" . "aime.bertrand@macowners.club")) (:maintainer "Aimé Bertrand" . "aime.bertrand@macowners.club") (:keywords "faces" "themes") (:url . "https://gitlab.com/aimebertrand/timu-caribbean-theme"))]) + (timu-line . [(20231002 1016) ((emacs (28 1)) (f (0 20 0))) "Custom and simple mode line" tar ((:commit . "836cb92063076981f93e44f72dccd46a37e96785") (:authors ("Aimé Bertrand" . "aime.bertrand@macowners.club")) (:maintainers ("Aimé Bertrand" . "aime.bertrand@macowners.club")) (:maintainer "Aimé Bertrand" . "aime.bertrand@macowners.club") (:keywords "modeline" "frames" "ui") (:url . "https://gitlab.com/aimebertrand/timu-line"))]) + (timu-macos-theme . [(20240317 2007) ((emacs (27 1))) "Color theme inspired by the macOS UI" tar ((:commit . "6079fa1bf9859955d30d6c51e7d8105588a9b588") (:authors ("Aimé Bertrand" . "aime.bertrand@macowners.club")) (:maintainers ("Aimé Bertrand" . "aime.bertrand@macowners.club")) (:maintainer "Aimé Bertrand" . "aime.bertrand@macowners.club") (:keywords "faces" "themes") (:url . "https://gitlab.com/aimebertrand/timu-macos-theme"))]) + (timu-rouge-theme . [(20240224 2040) ((emacs (27 1))) "Color theme inspired by the Rouge Theme for VSCode" tar ((:commit . "2095a2bedb2682145407e149d1c2b1c0aa02a6f8") (:authors ("Aimé Bertrand" . "aime.bertrand@macowners.club")) (:maintainers ("Aimé Bertrand" . "aime.bertrand@macowners.club")) (:maintainer "Aimé Bertrand" . "aime.bertrand@macowners.club") (:keywords "faces" "themes") (:url . "https://gitlab.com/aimebertrand/timu-rouge-theme"))]) + (timu-spacegrey-theme . [(20240224 2010) ((emacs (26 1))) "Color theme inspired by the Spacegray theme in Sublime Text" tar ((:commit . "1cca501c9640a9f1d6bf717dc36df96d35deeeba") (:authors ("Aimé Bertrand" . "aime.bertrand@macowners.club")) (:maintainers ("Aimé Bertrand" . "aime.bertrand@macowners.club")) (:maintainer "Aimé Bertrand" . "aime.bertrand@macowners.club") (:keywords "faces" "themes") (:url . "https://gitlab.com/aimebertrand/timu-spacegrey-theme"))]) (tinkerer . [(20200914 1756) ((s (1 2 0))) "Elisp wrapper for Tinkerer Blogging Engine." tar ((:commit . "7cedeb264a44cd62bcd9c778dca52316d09e07e5") (:authors ("Yagnesh Raghava Yakkala" . "hi@yagnesh.org")) (:maintainers ("Yagnesh Raghava Yakkala" . "hi@yagnesh.org")) (:maintainer "Yagnesh Raghava Yakkala" . "hi@yagnesh.org") (:keywords "tinkerer" "blog" "wrapper") (:url . "https://github.com/yyr/tinkerer.el"))]) (tiny . [(20220910 1929) nil "Quickly generate linear ranges in Emacs" tar ((:commit . "c107480fca7e42737c51b2afaa33ac31e92a7290") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "convenience") (:url . "https://github.com/abo-abo/tiny"))]) (tiny-menu . [(20220725 1748) ((emacs (24 4))) "Display tiny menus." tar ((:commit . "17eacfd1d44cd4d5482d32eac63229230c3cd3fc") (:authors ("Aaron Bieber" . "aaron@aaronbieber.com")) (:maintainers ("Aaron Bieber" . "aaron@aaronbieber.com")) (:maintainer "Aaron Bieber" . "aaron@aaronbieber.com") (:keywords "menu" "tools") (:url . "https://github.com/aaronbieber/tiny-menu.el"))]) @@ -5056,18 +5184,19 @@ (tj3-mode . [(20180519 1228) nil "major mode for editing TaskJuggler 3 files" tar ((:commit . "1d98eb23f1606392f34ef1b80517cfc940fb9950") (:authors ("Christophe Rhodes" . "christophe@rhodes.io")) (:maintainers ("Christophe Rhodes" . "christophe@rhodes.io")) (:maintainer "Christophe Rhodes" . "christophe@rhodes.io") (:url . "https://github.com/csrhodes/tj3-mode"))]) (tldr . [(20230301 136) ((emacs (24 3))) "tldr client for Emacs" tar ((:commit . "1b09d2032491d3904bd7ee9bf5ba7c7503db6593") (:authors ("Ono Hiroko" . "azazabc123@gmail.com")) (:maintainers ("Ono Hiroko" . "azazabc123@gmail.com")) (:maintainer "Ono Hiroko" . "azazabc123@gmail.com") (:keywords "tools" "docs") (:url . "https://github.com/kuanyui/tldr.el"))]) (tmmofl . [(20121025 1101) nil "Calls functions dependant on font lock highlighting at point" tar ((:commit . "532aa6978e994e2b069ffe37aaf9a0011a07dadc") (:authors ("Phillip Lord" . "p.lord@hgmp.mrc.ac.uk")) (:maintainers ("Phillip Lord" . "p.lord@hgmp.mrc.ac.uk")) (:maintainer "Phillip Lord" . "p.lord@hgmp.mrc.ac.uk") (:keywords "minor mode" "font lock" "toggling."))]) - (tmsu . [(20230807 2218) ((emacs (28 1))) "A basic TMSU interface" tar ((:commit . "8207b4140fd1b3eff2ec4b9818e67148139cb72f") (:authors ("Wojciech Siewierski")) (:maintainers ("Wojciech Siewierski")) (:maintainer "Wojciech Siewierski") (:keywords "files") (:url . "https://github.com/vifon/tmsu.el"))]) - (tmux-pane . [(20200730 520) ((names (0 5)) (emacs (24)) (s (0))) "Provide integration between emacs window and tmux pane" tar ((:commit . "923524efe8e6e5e0d269de6bb253b45e02d9a663") (:keywords "convenience" "terminals" "tmux" "window" "pane" "navigation" "integration") (:url . "https://github.com/laishulu/emacs-tmux-pane"))]) + (tmsu . [(20240117 1813) ((emacs (28 1))) "A basic TMSU interface" tar ((:commit . "c7dc44c97bf420ff0da5d552abfc9782bed70602") (:authors ("Wojciech Siewierski")) (:maintainers ("Wojciech Siewierski")) (:maintainer "Wojciech Siewierski") (:keywords "files") (:url . "https://github.com/vifon/tmsu.el"))]) + (tmux-mode . [(20231130 1249) ((emacs (26 1))) "Major mode for tmux configuration" tar ((:commit . "ee50d02721600c4b31cdafbb9f2ecc5becf1a5f6") (:authors ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainers ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainer "Noah Peart" . "noah.v.peart@gmail.com") (:keywords "languages" "tmux" "config") (:url . "https://github.com/nverno/tmux-mode"))]) + (tmux-pane . [(20240106 131) ((names (0 5)) (emacs (24)) (s (0))) "Provide integration between emacs window and tmux pane" tar ((:commit . "0ab0d40b497e984a589189358e04e322b8165985") (:keywords "convenience" "terminals" "tmux" "window" "pane" "navigation" "integration") (:url . "https://github.com/laishulu/emacs-tmux-pane"))]) (toc-mode . [(20220926 530) ((emacs (26 1))) "Manage outlines/table of contents of pdf and djvu documents" tar ((:commit . "448a0ac00c110802f3124bbf9c5a72bdfc3c3c28") (:authors ("Daniel Laurens Nicolai" . "dalanicolai@gmail.com")) (:maintainers ("Daniel Laurens Nicolai" . "dalanicolai@gmail.com")) (:maintainer "Daniel Laurens Nicolai" . "dalanicolai@gmail.com") (:keywords "tools" "outlines" "convenience") (:url . "https://github.com/dalanicolai/toc-mode"))]) (toc-org . [(20220110 1452) nil "add table of contents to org-mode files (formerly, org-toc)" tar ((:commit . "bf2e4b358efbd860ecafe6e74776de0885d9d100") (:authors ("Sergei Nosov ")) (:maintainers ("Sergei Nosov ")) (:maintainer "Sergei Nosov ") (:keywords "org-mode" "org-toc" "toc-org" "org" "toc" "table" "of" "contents") (:url . "https://github.com/snosov1/toc-org"))]) - (todoist . [(20230120 2208) ((dash (2 15 0)) (transient (0 1 0)) (org (8 3 5)) (emacs (25 3))) "Extension for interacting and managing todoist tasks" tar ((:commit . "d79b4ea4ea4891635966bfc2c769484d2916be80") (:authors ("Adrien Brochard")) (:maintainers ("Adrien Brochard")) (:maintainer "Adrien Brochard") (:keywords "todoist" "task" "todo" "comm") (:url . "https://github.com/abrochard/emacs-todoist"))]) + (todoist . [(20240113 1729) ((dash (2 15 0)) (transient (0 1 0)) (org (8 3 5)) (emacs (25 3))) "Extension for interacting and managing todoist tasks" tar ((:commit . "e756a345d213d93fbb965d1314c4dec62566c653") (:authors ("Adrien Brochard")) (:maintainers ("Adrien Brochard")) (:maintainer "Adrien Brochard") (:keywords "todoist" "task" "todo" "comm") (:url . "https://github.com/abrochard/emacs-todoist"))]) (todotxt . [(20220204 1903) nil "A major mode for editing todo.txt files" tar ((:commit . "ddb25fb931b4bbc1af14c4c712d412af454794c4") (:authors ("Rick Dillon" . "rpdillon@killring.org")) (:maintainers ("Rick Dillon" . "rpdillon@killring.org")) (:maintainer "Rick Dillon" . "rpdillon@killring.org") (:keywords "todo.txt" "todotxt" "todotxt.el") (:url . "https://github.com/rpdillon/todotxt.el"))]) (todotxt-mode . [(20200228 952) nil "Major mode for editing todo.txt files" tar ((:commit . "8b616ce1cf3e18a60757450a0acf22996abb9b79") (:authors ("Adolfo Villafiorita" . "adolfo.villafiorita@me.com")) (:maintainers ("Adolfo Villafiorita" . "adolfo.villafiorita@me.com")) (:maintainer "Adolfo Villafiorita" . "adolfo.villafiorita@me.com") (:keywords "wp" "files"))]) (togetherly . [(20170426 616) ((cl-lib (0 3))) "allow multiple clients to edit a single buffer online" tar ((:commit . "65072b1d5e04c7098c318ebf1af279f596039ef9") (:authors ("zk_phi")) (:maintainers ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))]) (toggle-quotes . [(20140710 926) nil "Toggle between single and double quoted string" tar ((:commit . "33abc221d6887f0518337851318065cd86c34b03") (:authors ("Jim Tian" . "tianjin.sc@gmail.com")) (:maintainers ("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" tar ((:commit . "a0b64834101c2b8b24da365baea1d36e57b069b5") (:authors ("Raghunandan Rao" . "r.raghunandan@gmail.com")) (:maintainers ("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" tar ((:commit . "e82c60e543933880402ede11e9423e48a17dde53") (:authors ("Kenny Liu")) (:maintainers ("Kenny Liu")) (:maintainer "Kenny Liu") (:keywords "hide" "window") (:url . "https://github.com/deadghost/toggle-window"))]) - (tok-theme . [(20230816 1246) ((emacs (27 0))) "Minimal monochromatic theme for Emacs in the spirit of Zmacs and Smalltalk-80." tar ((:commit . "dba88cf798b1483e3459de170fe8bbfd4fe57095") (:authors ("Topi Kettunen" . "topi@topikettunen.com")) (:maintainers ("Topi Kettunen" . "topi@topikettunen.com")) (:maintainer "Topi Kettunen" . "topi@topikettunen.com") (:url . "https://github.com/topikettunen/tok-theme"))]) + (tok-theme . [(20231019 947) ((emacs (27 0))) "Minimal monochromatic theme for Emacs in the spirit of Zmacs and Smalltalk-80." tar ((:commit . "61c86fd2902b6342efe4463230dffdd185159d1c") (:authors ("Topi Kettunen" . "topi@topikettunen.com")) (:maintainers ("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" tar ((:commit . "86fbca422f580a95eb30247e46891184f3ac5c18") (:authors ("Daniel Nagy ")) (:maintainers ("Daniel Nagy" . "danielnagy@posteo.de")) (: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")) (:maintainers ("Konrad Scorciapino" . "scorciapino@gmail.com")) (:maintainer "Konrad Scorciapino" . "scorciapino@gmail.com") (:keywords "time" "productivity" "pomodoro technique"))]) (toml . [(20230411 1449) nil "TOML (Tom's Obvious, Minimal Language) parser" tar ((:commit . "ee4a12bfc8c890c5e8b4bfa35837ce672a882967") (:authors ("Wataru MIYAGUNI" . "gonngo@gmail.com")) (:maintainers ("Wataru MIYAGUNI" . "gonngo@gmail.com")) (:maintainer "Wataru MIYAGUNI" . "gonngo@gmail.com") (:keywords "toml" "parser") (:url . "https://github.com/gongo/emacs-toml"))]) @@ -5075,24 +5204,26 @@ (tommyh-theme . [(20131004 2330) nil "A bright, bold-colored theme for emacs" tar ((:commit . "46d1c69ee0a1ca7c67b569b891a2f28fed89e7d5") (:authors ("William Glass" . "william.glass@gmail.com")) (:maintainers ("William Glass" . "william.glass@gmail.com")) (:maintainer "William Glass" . "william.glass@gmail.com"))]) (tongbu . [(20200414 507) ((emacs (25 1)) (web-server (0 1 2))) "A web server to share text or files between two devices" tar ((:commit . "6f6e5c5446f0c5735357ab520b249ab97295653e") (:authors ("Xu Chunyang")) (:maintainers ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:keywords "tools") (:url . "https://github.com/xuchunyang/tongbu.el"))]) (topspace . [(20220824 134) ((emacs (25 1))) "Recenter line 1 with scrollable upper margin/padding" tar ((:commit . "33c2a6f0a11d1d88cdb2065c5a897e33507f4c86") (:authors ("Trevor Edwin Pogue" . "trevor.pogue@gmail.com")) (:maintainers ("Trevor Edwin Pogue" . "trevor.pogue@gmail.com")) (:maintainer "Trevor Edwin Pogue" . "trevor.pogue@gmail.com") (:keywords "convenience" "scrolling" "center" "cursor" "margin" "padding") (:url . "https://github.com/trevorpogue/topspace"))]) - (topsy . [(20230414 1738) ((emacs (26 3))) "Simple sticky header" tar ((:commit . "149ee929dad667fd7668728d9b59dedb0183dfe5") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "convenience") (:url . "https://github.com/alphapapa/topsy.el"))]) + (topsy . [(20231214 843) ((emacs (26 3)) (compat (29 1))) "Simple sticky header" tar ((:commit . "8b6c6d5026ac72b4c3704ed7bb8fafe1ea343699") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "convenience") (:url . "https://github.com/alphapapa/topsy.el"))]) (tornado-template-mode . [(20141128 1008) nil "A major mode for editing tornado templates" tar ((:commit . "667c0663dbbd279b6c345446b9f2bc50eb52b747") (:authors ("Florian Mounier aka paradoxxxzero")) (:maintainers ("Florian Mounier aka paradoxxxzero")) (:maintainer "Florian Mounier aka paradoxxxzero"))]) (torus . [(20190325 753) ((emacs (26))) "A buffer groups manager" tar ((:commit . "863886f10db77f3d1b16815d77561b6c81d88352") (:authors ("Chimay")) (:maintainers ("Chimay")) (:maintainer "Chimay") (:keywords "files" "buffers" "groups" "persistent" "history" "layout" "tabs") (:url . "https://github.com/chimay/torus"))]) (total-lines . [(20171227 1239) ((emacs (24 3))) "Keep track of a buffer's total number of lines" tar ((:commit . "c762f08d039c8103f71c747e00304f209c2254f4") (:authors ("Hinrik Örn Sigurðsson")) (:maintainers ("Hinrik Örn Sigurðsson")) (:maintainer "Hinrik Örn Sigurðsson") (:keywords "convenience" "mode-line") (:url . "https://github.com/hinrik/total-lines"))]) (totd . [(20150519 1440) ((s (1 9 0)) (cl-lib (0 5))) "Display a random daily emacs command." tar ((:commit . "a715f7f2df416b8a6c827a9493ce7004180a3a4f") (:authors ("Erik Hetzner" . "egh@e6h.org")) (:maintainers ("Erik Hetzner" . "egh@e6h.org")) (:maintainer "Erik Hetzner" . "egh@e6h.org") (:keywords "help"))]) - (totp . [(20230102 1707) ((emacs (27 1))) "Time-based One-time Password (TOTP)" tar ((:commit . "a5e059b8475b32bc7f5ddadda248cf84449ed722") (:authors ("Jürgen Hötzel" . "juergen@hoetzel.info")) (:maintainers ("Jürgen Hötzel" . "juergen@hoetzel.info")) (:maintainer "Jürgen Hötzel" . "juergen@hoetzel.info") (:keywords "tools" "pass" "password") (:url . "https://github.com/juergenhoetzel/emacs-totp"))]) + (totp . [(20240102 1721) ((emacs (27 1))) "Time-based One-time Password (TOTP)" tar ((:commit . "fe05ce6130ff1e9a76fc2aca289083475f70fd52") (:authors ("Jürgen Hötzel" . "juergen@hoetzel.info")) (:maintainers ("Jürgen Hötzel" . "juergen@hoetzel.info")) (:maintainer "Jürgen Hötzel" . "juergen@hoetzel.info") (:keywords "tools" "pass" "password") (:url . "https://github.com/juergenhoetzel/emacs-totp"))]) + (totp-auth . [(20240227 1841) ((emacs (27 1)) (base32 (0 1))) "RFC6238 TOTP" tar ((:commit . "af2ca2f0623d5268e31f1fe19bc1370c14b601b1") (:authors ("Vivek Das Mohapatra" . "vivek@etla.org")) (:maintainers ("Vivek Das Mohapatra" . "vivek@etla.org")) (:maintainer "Vivek Das Mohapatra" . "vivek@etla.org") (:keywords "2fa" "two-factor" "totp" "otp" "password" "comm") (:url . "https://gitlab.com/fledermaus/totp.el"))]) (tox . [(20170404 1059) nil "Launch current python test with tox" tar ((:commit . "7655eb254038d5e34433e8a9d66b3ffc9c72e40c") (:authors ("Chmouel Boudjnah" . "chmouel@chmouel.com")) (:maintainers ("Chmouel Boudjnah" . "chmouel@chmouel.com")) (:maintainer "Chmouel Boudjnah" . "chmouel@chmouel.com") (:keywords "convenience" "tox" "python" "tests") (:url . "https://github.com/chmouel/tox.el"))]) (toxi-theme . [(20160424 2126) ((emacs (24))) "A dark color theme by toxi" tar ((:commit . "9e572c6e149249b96f64722cf6f86c3aaf5f2ede") (:authors ("Karsten Schmidt" . "info@postspectacular.com")) (:maintainers ("Karsten Schmidt" . "info@postspectacular.com")) (:maintainer "Karsten Schmidt" . "info@postspectacular.com") (:url . "http://bitbucket.org/postspectacular/toxi-theme/"))]) (tql-mode . [(20170724 254) ((emacs (24))) "TQL mode" tar ((:commit . "488add79eb3fc8ec02aedaa997fe1ed9e5c3e638") (:authors ("Sean McLaughlin" . "seanmcl@gmail.com")) (:maintainers ("Sean McLaughlin" . "seanmcl@gmail.com")) (:maintainer "Sean McLaughlin" . "seanmcl@gmail.com") (:keywords "languages" "tql"))]) (tr-ime . [(20220604 1107) ((emacs (27 1)) (w32-ime (0 0 1))) "Emulator of IME patch for Windows" tar ((:commit . "87f0677220b755f947fe5f373b6a34e1afb82f3c") (:authors ("Masamichi Hosoda" . "trueroad@trueroad.jp")) (:maintainers ("Masamichi Hosoda" . "trueroad@trueroad.jp")) (:maintainer "Masamichi Hosoda" . "trueroad@trueroad.jp") (:url . "https://github.com/trueroad/tr-emacs-ime-module"))]) (traad . [(20180730 48) ((dash (2 13 0)) (deferred (0 3 2)) (popup (0 5 0)) (request (0 2 0)) (request-deferred (0 2 0)) (virtualenvwrapper (20151123)) (f (0 20 0)) (bind-map (1 1 1))) "emacs interface to the traad refactoring server." tar ((:commit . "98e23363b7e8a590a2f55976123a8c3da75c87a5") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainers ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:url . "https://github.com/abingham/traad"))]) - (tracking . [(20220421 1956) nil "Buffer modification tracking" tar ((:commit . "710f057fedae6e9b820cce9336fef24b7d057e4c") (:authors ("Jorgen Schaefer" . "forcer@forcix.cx")) (:maintainers ("Jorgen Schaefer" . "forcer@forcix.cx")) (:maintainer "Jorgen Schaefer" . "forcer@forcix.cx") (:url . "https://github.com/emacs-circe/circe/wiki/Tracking"))]) + (tracking . [(20240225 1112) nil "Buffer modification tracking" tar ((:commit . "6f33a481af6bce68f55b9e25d5c14c1ed46fa9d9") (:authors ("Jorgen Schaefer" . "forcer@forcix.cx")) (:maintainers ("Jorgen Schaefer" . "forcer@forcix.cx")) (:maintainer "Jorgen Schaefer" . "forcer@forcix.cx") (:url . "https://github.com/emacs-circe/circe/wiki/Tracking"))]) (tracwiki-mode . [(20150119 1621) ((xml-rpc (1 6 8))) "Emacs Major mode for working with Trac" tar ((:commit . "6a620444d59b438f42383b48cd4c19c03105dba6") (:authors ("Matthew Erickson" . "peawee@peawee.net")) (:maintainers ("Matthew Erickson" . "peawee@peawee.net")) (:maintainer "Matthew Erickson" . "peawee@peawee.net") (:keywords "trac" "wiki" "tickets"))]) (tramp-auto-auth . [(20191027 1419) ((emacs (24 4)) (tramp (0 0))) "TRAMP automatic authentication library" tar ((:commit . "f15a12dfab651aff60f4a9d70f868030a12344ac") (:authors ("Bruno Félix Rezende Ribeiro" . "oitofelix@gnu.org")) (:maintainers ("Bruno Félix Rezende Ribeiro" . "oitofelix@gnu.org")) (:maintainer "Bruno Félix Rezende Ribeiro" . "oitofelix@gnu.org") (:keywords "comm" "processes") (:url . "https://github.com/oitofelix/tramp-auto-auth"))]) (tramp-hdfs . [(20210526 339) ((emacs (24 4))) "Tramp extension to access hadoop/hdfs file system in Emacs" tar ((:commit . "aa93bdbb3d5619c262ce53af1981edcd2a0705e5") (:authors ("Raghav Kumar Gautam" . "raghav@apache.org")) (:maintainers ("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" tar ((:commit . "ed75189122737d301f716a30a8013205aa3736f1") (:authors ("Randy Morris" . "randy.morris@archlinux.us")) (:maintainers ("Randy Morris" . "randy.morris@archlinux.us")) (:maintainer "Randy Morris" . "randy.morris@archlinux.us") (:keywords "comm" "terminals") (:url . "https://github.com/randymorris/tramp-term.el"))]) + (transducers . [(20240308 843) ((emacs (28 1))) "Ergonomic, efficient data processing" tar ((:commit . "2d452e4cdc3b5cfa29ee3d7a645ff53d4e993384") (:authors ("Colin Woodbury" . "colin@fosskers.ca")) (:maintainers ("Colin Woodbury" . "colin@fosskers.ca")) (:maintainer "Colin Woodbury" . "colin@fosskers.ca") (:keywords "lisp") (:url . "https://git.sr.ht/~fosskers/transducers.el"))]) (transfer-sh . [(20200601 1708) ((emacs (24 3)) (async (1 0))) "Simple interface for sending buffer contents to transfer.sh" tar ((:commit . "0621a66d00ec91a209a542c10b158095088bd44d") (:keywords "comm" "convenience" "files") (:url . "https://gitlab.com/tuedachu/transfer-sh.el"))]) - (transient . [(20230825 2019) ((emacs (25 1)) (compat (29 1 4 1))) "Transient commands" tar ((:commit . "8cf1238181d57504e68f42fa0d4ef66784b197a9") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "extensions") (:url . "https://github.com/magit/transient"))]) + (transient . [(20240311 1638) ((emacs (26 1)) (compat (29 1 4 4)) (seq (2 24))) "Transient commands" tar ((:commit . "3e30f5bff633a1d0d720305f6c8b5758b8ff1997") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "extensions") (:url . "https://github.com/magit/transient"))]) (transient-dwim . [(20221225 1630) ((emacs (26 1)) (transient (0 1))) "Useful preset transient commands" tar ((:commit . "cb5e0d35729fc6448553b7a17fc5c843f00e8c1d") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "tools") (:url . "https://github.com/conao3/transient-dwim.el"))]) (transient-extras . [(20230721 839) ((emacs (28 1))) "Extra features for transient" tar ((:commit . "ca0d5c597382615f0ee8300ff8718f54f8214359") (:authors ("Al Haji-Ali , Samuel W. Flint" . "swflint@flintfam.org")) (:maintainers ("Al Haji-Ali , Samuel W. Flint" . "swflint@flintfam.org")) (:maintainer "Al Haji-Ali , Samuel W. Flint" . "swflint@flintfam.org") (:keywords "convenience") (:url . "https://github.com/haji-ali/transient-extras.git"))]) (transient-extras-a2ps . [(20230303 1511) ((emacs (28 1)) (transient-extras (1 0 0))) "A transient interface to a2ps" tar ((:commit . "e91a1cddb1f0cb8b99d2bd30db64d467e5fa7ea8") (:authors ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainers ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainer "Samuel W. Flint" . "swflint@flintfam.org") (:keywords "convenience") (:url . "https://git.sr.ht/~swflint/transient-extras-a2ps"))]) @@ -5102,31 +5233,32 @@ (transmission . [(20221130 212) ((emacs (24 4)) (let-alist (1 0 5))) "Interface to a Transmission session" tar ((:commit . "243d5dc15917df2611fd0c9f288faea17a00a396") (:authors ("Mark Oteiza" . "mvoteiza@udel.edu")) (:maintainers ("Mark Oteiza" . "mvoteiza@udel.edu")) (:maintainer "Mark Oteiza" . "mvoteiza@udel.edu") (:keywords "comm" "tools"))]) (transpose-frame . [(20221109 2053) nil "Transpose windows arrangement in a frame" tar ((:commit . "94c87794d53883a2358d13da264ad8dab9a52daa") (:authors ("S. Irie")) (:maintainers ("S. Irie")) (:maintainer "S. Irie") (:keywords "window"))]) (transpose-mark . [(20150405 716) nil "Transpose data using the Emacs mark" tar ((:commit . "667327602004794de97214cf336ac61650ef75b7") (:authors ("Kevin W. van Rooijen" . "kevin.van.rooijen@attichacker.com")) (:maintainers ("Kevin W. van Rooijen" . "kevin.van.rooijen@attichacker.com")) (:maintainer "Kevin W. van Rooijen" . "kevin.van.rooijen@attichacker.com") (:keywords "transpose" "convenience"))]) - (transwin . [(20220921 831) ((emacs (24 3))) "Make window/frame transparent" tar ((:commit . "ed0156a98b6fce94da9045bdffe369f390b70c0c") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "frames" "window" "transparent") (:url . "https://github.com/jcs-elpa/transwin"))]) + (transwin . [(20240126 720) ((emacs (24 3))) "Make window/frame transparent" tar ((:commit . "99f9296a18654cb38f2ffb8682b7532be60bec5e") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("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 . [(20230811 157) ((emacs (25 1))) "Viewing/editing system trash can" tar ((:commit . "52a52a363ce53855790e7a59aed6976eec18c9ea") (:authors ("Shingo Tanaka" . "shingo.fg8@gmail.com")) (:maintainers ("Shingo Tanaka" . "shingo.fg8@gmail.com")) (:maintainer "Shingo Tanaka" . "shingo.fg8@gmail.com") (:keywords "files" "convenience" "unix") (:url . "https://github.com/shingo256/trashed"))]) (travis . [(20150825 1138) ((s (1 9 0)) (dash (2 9 0)) (pkg-info (0 5 0)) (request (0 1 0))) "Emacs client for Travis" tar ((:commit . "c8769d3db10ed4604969049e3bd276afa0a0138e") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainers ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "travis") (:url . "https://github.com/nlamirault/emacs-travis"))]) - (tray . [(20230511 2102) ((emacs (27 1)) (compat (29 1 4 1)) (transient (0 4 0))) "Various transient menus" tar ((:commit . "d620957377e451e8bf7c2eb7a2509a75f1ee160f") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience") (:url . "https://git.sr.ht/~tarsius/tray"))]) - (tree-edit . [(20230419 1753) ((emacs (29 0)) (dash (2 19)) (reazon (0 4 0)) (s (0 0 0))) "A library for structural refactoring and editing" tar ((:commit . "e15b61e7e4ff98c44e6684fd2007bd1cbb31570e") (:authors ("Ethan Leba" . "ethanleba5@gmail.com")) (:maintainers ("Ethan Leba" . "ethanleba5@gmail.com")) (:maintainer "Ethan Leba" . "ethanleba5@gmail.com") (:url . "https://github.com/ethan-leba/tree-edit"))]) + (tray . [(20240101 2226) ((emacs (27 1)) (compat (29 1 4 4)) (transient (0 5 2))) "Various transient menus" tar ((:commit . "15c08ec2b57ce0535f54242088d6051d2cf9a049") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience") (:url . "https://git.sr.ht/~tarsius/tray"))]) + (tree-edit . [(20231124 1712) ((emacs (29 1)) (dash (2 19)) (reazon (0 4 0)) (s (0 0 0))) "A library for structural refactoring and editing" tar ((:commit . "3e71d276e7369ff4525f0e2b84356a31fe6b7782") (:authors ("Ethan Leba" . "ethanleba5@gmail.com")) (:maintainers ("Ethan Leba" . "ethanleba5@gmail.com")) (:maintainer "Ethan Leba" . "ethanleba5@gmail.com") (:url . "https://github.com/ethan-leba/tree-edit"))]) (tree-mode . [(20151104 1331) nil "A mode to manage tree widgets" tar ((:commit . "b06078826d5875d74b0e7b7ac47b0d0917610534") (:authors (nil . "wenbinye@163.com")) (:maintainers (nil . "wenbinye@163.com")) (:maintainer nil . "wenbinye@163.com") (:keywords "help" "convenience" "widget"))]) (tree-sitter . [(20220212 1632) ((emacs (25 1)) (tsc (0 18 0))) "Incremental parsing system" tar ((:commit . "909717c685ff5a2327fa2ca8fb8a25216129361c") (:authors ("Tuấn-Anh Nguyễn" . "ubolonton@gmail.com")) (:maintainers ("Tuấn-Anh Nguyễn" . "ubolonton@gmail.com")) (:maintainer "Tuấn-Anh Nguyễn" . "ubolonton@gmail.com") (:keywords "languages" "tools" "parsers" "tree-sitter") (:url . "https://github.com/emacs-tree-sitter/elisp-tree-sitter"))]) (tree-sitter-ess-r . [(20221012 855) ((emacs (26 1)) (ess (18 10 1)) (tree-sitter (0 12 1)) (tree-sitter-langs (0 12 0))) "R with tree-sitter" tar ((:commit . "9669c00f3d3463e6769725af74c392891e269eed") (:authors ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainers ("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" tar ((:commit . "4ef246db3e4ff99f672fe5e4b416c890f885c09e") (:authors ("Felipe Lema" . "felipelema@mortemale.org")) (:maintainers ("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 . [(20230205 533) ((emacs (26 1)) (tree-sitter (0 15 0))) "Run ispell on tree-sitter text nodes" tar ((:commit . "d8c33c05f689c2cab36b8a9856811f18a4ab7c59") (:authors ("Erick Navarro" . "erick@navarro.io")) (:maintainers ("Erick Navarro" . "erick@navarro.io")) (:maintainer "Erick Navarro" . "erick@navarro.io") (:url . "https://github.com/erickgnavar/tree-sitter-ispell.el"))]) - (tree-sitter-langs . [(20230828 1112) ((emacs (25 1)) (tree-sitter (0 15 0))) "Grammar bundle for tree-sitter" tar ((:commit . "5fe32b5ed92e3e84fc99a917111133e537732847") (:authors ("Tuấn-Anh Nguyễn" . "ubolonton@gmail.com")) (:maintainers ("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 . [(20240317 720) ((emacs (25 1)) (tree-sitter (0 15 0))) "Grammar bundle for tree-sitter" tar ((:commit . "8e058964de718d31931e318551cdac06ceb91197") (:authors ("Tuấn-Anh Nguyễn" . "ubolonton@gmail.com")) (:maintainers ("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"))]) + (treebundel . [(20240210 343) ((emacs (27 1)) (compat (29 1 4 2))) "Bundle related git-worktrees together" tar ((:commit . "2d6c69cb7798a8cb7fcf9923c4580220dd48b3d4") (:authors ("Ben Whitley")) (:maintainers ("Ben Whitley")) (:maintainer "Ben Whitley") (:keywords "convenience" "vc") (:url . "https://github.com/purplg/treebundel"))]) (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" tar ((:commit . "75357757022a4399ab772ff0d92065bd114dabe9") (:authors ("Leo Littlebook" . "Leo.Littlebook@gmail.com")) (:maintainers ("Leo Littlebook" . "Leo.Littlebook@gmail.com")) (:maintainer "Leo Littlebook" . "Leo.Littlebook@gmail.com") (:keywords "outlines" "files" "convenience") (:url . "https://github.com/cyberthal/treefactor"))]) - (treemacs . [(20230822 2039) ((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 . "147594c4b84952a9897261420fea97b725bb6bac") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainers ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) - (treemacs-all-the-icons . [(20230408 1109) ((emacs (26 1)) (all-the-icons (4 0 1)) (treemacs (0 0))) "all-the-icons integration for treemacs" tar ((:commit . "127485317a19254ca20ba1910d10edf7dbaa2d97") (:authors ("Eric Dallo" . "ercdll1337@gmail.com")) (:maintainers ("Eric Dallo" . "ercdll1337@gmail.com")) (:maintainer "Eric Dallo" . "ercdll1337@gmail.com") (:url . "https://github.com/Alexander-Miller/treemacs"))]) - (treemacs-evil . [(20230822 2039) ((emacs (26 1)) (evil (1 2 12)) (treemacs (0 0))) "Evil mode integration for treemacs" tar ((:commit . "76a20a456cbbf45a317e1e5f6f5b970f938a3bfe") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainers ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) - (treemacs-icons-dired . [(20230408 1109) ((treemacs (0 0)) (emacs (26 1))) "Treemacs icons for dired" tar ((:commit . "127485317a19254ca20ba1910d10edf7dbaa2d97") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainers ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) - (treemacs-magit . [(20230703 1929) ((emacs (26 1)) (treemacs (0 0)) (pfuture (1 3)) (magit (2 90 0))) "Magit integration for treemacs" tar ((:commit . "2fed6948fe2bc37f8539c5de232e5ccd4891800a") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainers ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) + (treemacs . [(20240229 2108) ((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 . "8c6df39f01a4d47fda2cc943645fa067f771b748") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainers ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) + (treemacs-all-the-icons . [(20240131 2042) ((emacs (26 1)) (all-the-icons (4 0 1)) (treemacs (0 0))) "all-the-icons integration for treemacs" tar ((:commit . "bcba09c1581c4bd93ff0217d464aead04f6d26d4") (:authors ("Eric Dallo" . "ercdll1337@gmail.com")) (:maintainers ("Eric Dallo" . "ercdll1337@gmail.com")) (:maintainer "Eric Dallo" . "ercdll1337@gmail.com") (:url . "https://github.com/Alexander-Miller/treemacs"))]) + (treemacs-evil . [(20240131 2042) ((emacs (26 1)) (evil (1 2 12)) (treemacs (0 0))) "Evil mode integration for treemacs" tar ((:commit . "bcba09c1581c4bd93ff0217d464aead04f6d26d4") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainers ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) + (treemacs-icons-dired . [(20240131 2042) ((treemacs (0 0)) (emacs (26 1))) "Treemacs icons for dired" tar ((:commit . "bcba09c1581c4bd93ff0217d464aead04f6d26d4") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainers ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) + (treemacs-magit . [(20240131 2042) ((emacs (26 1)) (treemacs (0 0)) (pfuture (1 3)) (magit (2 90 0))) "Magit integration for treemacs" tar ((:commit . "bcba09c1581c4bd93ff0217d464aead04f6d26d4") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainers ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) (treemacs-nerd-icons . [(20230828 544) ((emacs (24 3)) (nerd-icons (0 0 1)) (treemacs (0 0))) "Emacs Nerd Font Icons theme for treemacs" tar ((:commit . "9876cb478145a0ec4e36f64ff6583f3de7126216") (:authors ("Hongyu Ding" . "rainstormstudio@yahoo.com")) (:maintainers ("Hongyu Ding" . "rainstormstudio@yahoo.com")) (:maintainer "Hongyu Ding" . "rainstormstudio@yahoo.com") (:keywords "lisp") (:url . "https://github.com/rainstormstudio/treemacs-nerd-icons"))]) - (treemacs-persp . [(20230703 1929) ((emacs (26 1)) (treemacs (0 0)) (persp-mode (2 9 7)) (dash (2 11 0))) "Persp-mode integration for treemacs" tar ((:commit . "2c576bebccd56ec8e65f4ec5ed5de864d9684fbf") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainers ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) - (treemacs-perspective . [(20230703 1929) ((emacs (26 1)) (treemacs (0 0)) (perspective (2 8)) (dash (2 11 0))) "Perspective integration for treemacs" tar ((:commit . "2c576bebccd56ec8e65f4ec5ed5de864d9684fbf") (:authors ("Alexander Miller" . "alexanderm@web.de") ("Jason Dufair" . "jase@dufair.org")) (:maintainers ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) - (treemacs-projectile . [(20230703 1929) ((emacs (26 1)) (projectile (0 14 0)) (treemacs (0 0))) "Projectile integration for treemacs" tar ((:commit . "2fed6948fe2bc37f8539c5de232e5ccd4891800a") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainers ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) - (treemacs-tab-bar . [(20230703 1929) ((emacs (27 1)) (treemacs (0 0)) (dash (2 11 0))) "Tab bar integration for treemacs" tar ((:commit . "2fed6948fe2bc37f8539c5de232e5ccd4891800a") (:authors ("Alexander Miller" . "alexanderm@web.de") ("Jason Dufair" . "jase@dufair.org") ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainers ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) + (treemacs-persp . [(20240131 2042) ((emacs (26 1)) (treemacs (0 0)) (persp-mode (2 9 7)) (dash (2 11 0))) "Persp-mode integration for treemacs" tar ((:commit . "bcba09c1581c4bd93ff0217d464aead04f6d26d4") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainers ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) + (treemacs-perspective . [(20240131 2042) ((emacs (26 1)) (treemacs (0 0)) (perspective (2 8)) (dash (2 11 0))) "Perspective integration for treemacs" tar ((:commit . "bcba09c1581c4bd93ff0217d464aead04f6d26d4") (:authors ("Alexander Miller" . "alexanderm@web.de") ("Jason Dufair" . "jase@dufair.org")) (:maintainers ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) + (treemacs-projectile . [(20240131 2042) ((emacs (26 1)) (projectile (0 14 0)) (treemacs (0 0))) "Projectile integration for treemacs" tar ((:commit . "bcba09c1581c4bd93ff0217d464aead04f6d26d4") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainers ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) + (treemacs-tab-bar . [(20240131 2042) ((emacs (27 1)) (treemacs (0 0)) (dash (2 11 0))) "Tab bar integration for treemacs" tar ((:commit . "bcba09c1581c4bd93ff0217d464aead04f6d26d4") (:authors ("Alexander Miller" . "alexanderm@web.de") ("Jason Dufair" . "jase@dufair.org") ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainers ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) (treepy . [(20230715 2154) ((emacs (25 1))) "Generic tree traversal tools" tar ((:commit . "75fe3ec37e6f9b2bdfd6d0584efd984d0c00a43e") (:authors ("Daniel Barreto" . "daniel.barreto.n@gmail.com")) (:maintainers ("Daniel Barreto" . "daniel.barreto.n@gmail.com")) (:maintainer "Daniel Barreto" . "daniel.barreto.n@gmail.com") (:keywords "lisp" "maint" "tools") (:url . "https://github.com/volrath/treepy.el"))]) - (treesit-auto . [(20230320 1555) ((emacs (29 0))) "Automatically use tree-sitter enhanced major modes" tar ((:commit . "bac3b9d1d61a4d759f87c80de7be3b808d19cbf6") (:authors ("Robb Enzmann" . "robbenzmann@gmail.com")) (:maintainers ("Robb Enzmann" . "robbenzmann@gmail.com")) (:maintainer "Robb Enzmann" . "robbenzmann@gmail.com") (:keywords "treesitter" "auto" "automatic" "major" "mode" "fallback" "convenience") (:url . "https://github.com/renzmann/treesit-auto.git"))]) - (treeview . [(20220928 43) ((emacs (24 4))) "A generic tree navigation library" tar ((:commit . "d9c10feddf3b959e7b33ce83103e1f0a61162723") (:authors ("Tilman Rassy" . "tilman.rassy@googlemail.com")) (:maintainers ("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"))]) + (treesit-auto . [(20240223 1450) ((emacs (29 0))) "Automatically use tree-sitter enhanced major modes" tar ((:commit . "299dd88c9e5f1ff91a8f1989ad1e97e86c220020") (:authors ("Robb Enzmann" . "robbenzmann@gmail.com")) (:maintainers ("Robb Enzmann" . "robbenzmann@gmail.com")) (:maintainer "Robb Enzmann" . "robbenzmann@gmail.com") (:keywords "treesitter" "auto" "automatic" "major" "mode" "fallback" "convenience") (:url . "https://github.com/renzmann/treesit-auto.git"))]) + (treeview . [(20230728 2343) ((emacs (24 4))) "A generic tree navigation library" tar ((:commit . "c6888e5f3aa0d72a7b4db625fcc2a847fd3bb1ce") (:authors ("Tilman Rassy" . "tilman.rassy@googlemail.com")) (:maintainers ("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" tar ((:commit . "109a1bc10bd0c4b47679a6ca5c4cd27c7c8d4ccb") (:authors ("John Mastro" . "john.b.mastro@gmail.com")) (:maintainers ("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 . [(20230301 2044) ((emacs (24))) "Trinary logic" tar ((:commit . "d4869d260f22d13a9a71327a6d40edc6980d022e") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "languages") (:url . "https://github.com/emacs-elsa/trinary-logic"))]) (tron-legacy-theme . [(20230506 1037) nil "An original retro-futuristic theme inspired by Tron: Legacy" tar ((:commit . "44996469041a9b7f54c2a42ad2a3c16ac9579d77") (:authors ("Ian Y.E. Pan")) (:maintainers ("Ian Y.E. Pan")) (:maintainer "Ian Y.E. Pan") (:url . "https://github.com/ianpan870102/tron-legacy-emacs-theme"))]) @@ -5136,11 +5268,12 @@ (ts . [(20220822 2313) ((emacs (26 1)) (dash (2 14 1)) (s (1 12 0))) "Timestamp and date/time library" tar ((:commit . "552936017cfdec89f7fc20c254ae6b37c3f22c5b") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "calendar" "lisp") (:url . "http://github.com/alphapapa/ts.el"))]) (ts-comint . [(20181219 719) nil "Run a Typescript interpreter in an inferior process window." tar ((:commit . "b280cfe9fe5ecec9d5970043b6b2866f644b39ad") (:authors ("Paul Huff" . "paul.huff@gmail.com")) (:maintainers ("Paul Huff" . "paul.huff@gmail.com")) (:maintainer "Paul Huff" . "paul.huff@gmail.com") (:keywords "typescript" "node" "inferior-mode" "convenience") (:url . "https://github.com/josteink/ts-comint"))]) (tsc . [(20220212 1632) ((emacs (25 1))) "Core Tree-sitter APIs" tar ((:commit . "909717c685ff5a2327fa2ca8fb8a25216129361c") (:authors ("Tuấn-Anh Nguyễn" . "ubolonton@gmail.com") ("Jorge Javier Araya Navarro" . "jorgejavieran@yahoo.com.mx")) (:maintainers ("Tuấn-Anh Nguyễn" . "ubolonton@gmail.com")) (:maintainer "Tuấn-Anh Nguyễn" . "ubolonton@gmail.com") (:keywords "languages" "tools" "parsers" "dynamic-modules" "tree-sitter") (:url . "https://github.com/emacs-tree-sitter/elisp-tree-sitter"))]) + (tsort . [(20231027 334) ((emacs (24 4)) (compat (29 1 4 2))) "Topological sort for Emacs Lisp" tar ((:commit . "3f9cffdbd4ac83a6a69dd4ccbb135e95950494ad") (:authors ("Ethan Hawk" . "ethan.hawk@valpo.edu")) (:maintainers ("Ethan Hawk" . "ethan.hawk@valpo.edu")) (:maintainer "Ethan Hawk" . "ethan.hawk@valpo.edu") (:keywords "algorithm" "tools") (:url . "https://github.com/ehawkvu/tsort.el"))]) (tss . [(20150913 1408) ((auto-complete (1 4 0)) (json-mode (1 1 0)) (log4e (0 2 0)) (yaxception (0 1))) "provide a interface for auto-complete.el/flymake.el on typescript-mode." tar ((:commit . "81ac6351a2ae258fd0ebf916dae9bd5a179fefd0") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "typescript" "completion") (:url . "https://github.com/aki2o/emacs-tss"))]) (tt-mode . [(20130804 1110) nil "Emacs major mode for editing Template Toolkit files." tar ((:commit . "85ed3832e7eef391f7879d9990d59c7a3493c15e") (:authors ("Dave Cross" . "dave@dave.org.uk")) (:maintainers ("Dave Cross" . "dave@dave.org.uk")) (:maintainer "Dave Cross" . "dave@dave.org.uk"))]) (ttl-mode . [(20170920 1329) nil "mode for Turtle (and Notation 3)" tar ((:commit . "b4084667f92afbfe5916d1307916acbd68c52e5e"))]) - (tuareg . [(20230718 2055) ((emacs (26 3)) (caml (4 8))) "OCaml mode" tar ((:commit . "d484910213d6a241d72a651cb46b7de17dac1ad5") (:authors ("Albert Cohen" . "Albert.Cohen@inria.fr") ("Sam Steingold" . "sds@gnu.org") ("Christophe Troestler" . "Christophe.Troestler@umons.ac.be") ("Till Varoquaux" . "till@pps.jussieu.fr") ("Sean McLaughlin" . "seanmcl@gmail.com") ("Stefan Monnier" . "monnier@iro.umontreal.ca")) (:maintainers ("Christophe Troestler" . "Christophe.Troestler@umons.ac.be")) (:maintainer "Christophe Troestler" . "Christophe.Troestler@umons.ac.be") (:keywords "ocaml" "languages") (:url . "https://github.com/ocaml/tuareg"))]) - (tubestatus . [(20220620 2028) ((emacs (26 1)) (request (0 3 2))) "Get the London Tube service status" tar ((:commit . "bf722d441ff96ff8fac6c8d2a798e283fef5613b") (:authors ("Matthieu Petiteau" . "matt@smallwat3r.com")) (:maintainers ("Matthieu Petiteau" . "matt@smallwat3r.com")) (:maintainer "Matthieu Petiteau" . "matt@smallwat3r.com") (:url . "https://github.com/smallwat3r/tubestatus.el"))]) + (tuareg . [(20231009 2143) ((emacs (26 3)) (caml (4 8))) "OCaml mode" tar ((:commit . "1d53723e39f22ab4ab76d31f2b188a2879305092") (:authors ("Albert Cohen" . "Albert.Cohen@inria.fr") ("Sam Steingold" . "sds@gnu.org") ("Christophe Troestler" . "Christophe.Troestler@umons.ac.be") ("Till Varoquaux" . "till@pps.jussieu.fr") ("Sean McLaughlin" . "seanmcl@gmail.com") ("Stefan Monnier" . "monnier@iro.umontreal.ca")) (:maintainers ("Christophe Troestler" . "Christophe.Troestler@umons.ac.be")) (:maintainer "Christophe Troestler" . "Christophe.Troestler@umons.ac.be") (:keywords "ocaml" "languages") (:url . "https://github.com/ocaml/tuareg"))]) + (tubestatus . [(20240317 1855) ((emacs (26 1)) (request (0 3 2))) "Get the London Tube service status" tar ((:commit . "6af28d258560a46652c7adc9527e6891b3282466") (:authors ("Matthieu Petiteau" . "matt@smallwat3r.com")) (:maintainers ("Matthieu Petiteau" . "matt@smallwat3r.com")) (:maintainer "Matthieu Petiteau" . "matt@smallwat3r.com") (:url . "https://github.com/smallwat3r/tubestatus.el"))]) (tumble . [(20160112 729) ((http-post-simple (0)) (cl-lib (0 5))) "an Tumblr mode for Emacs" tar ((:commit . "e8fd7643cccf2b6ea4170f0c5f1f87d007e7fa00") (:authors ("Federico Builes" . "federico.builes@gmail.com")) (:maintainers ("Federico Builes" . "federico.builes@gmail.com")) (:maintainer "Federico Builes" . "federico.builes@gmail.com") (:keywords "tumblr"))]) (tumblesocks . [(20191014 356) ((htmlize (1 39)) (oauth (1 0 3)) (markdown-mode (1 8 1))) "An Emacs tumblr client." tar ((:commit . "0e4c3847e31a59d405b9927107a23dde9531d744") (:authors ("gcr" . "gcr@sneakygcr.net")) (:maintainer "gcr" . "gcr@sneakygcr.net") (:url . "http://github.com/gcr/tumblesocks"))]) (turing-machine . [(20180222 438) ((emacs (24 4))) "Single-tape Turing machine simulator" tar ((:commit . "ad1dccc9c445f9e4465e1c67cbbfea9583153047") (:authors ("Diego A. Mundo" . "diegoamundo@gmail.com")) (:maintainers ("Diego A. Mundo" . "diegoamundo@gmail.com")) (:maintainer "Diego A. Mundo" . "diegoamundo@gmail.com") (:keywords "turing" "machine" "simulation") (:url . "http://github.com/therockmandolinist/turing-machine"))]) @@ -5154,12 +5287,12 @@ (twittering-mode . [(20181121 1402) nil "Major mode for Twitter" tar ((:commit . "114891e8fdb4f06b1326a6cf795e49c205cf9e29") (:authors ("Tadashi MATSUO" . "tad@mymail.twin.ne.jp") ("Y. Hayamizu" . "y.hayamizu@gmail.com") ("Tsuyoshi CHO" . "Tsuyoshi.CHO+develop@Gmail.com") ("Alberto Garcia" . "agarcia@igalia.com") ("Xavier Maillard" . "xavier@maillard.im")) (:maintainers ("Tadashi MATSUO" . "tad@mymail.twin.ne.jp")) (:maintainer "Tadashi MATSUO" . "tad@mymail.twin.ne.jp") (:keywords "twitter" "web") (:url . "http://twmode.sf.net/"))]) (twtxt . [(20220628 309) ((emacs (25 1)) (request (0 2 0))) "A twtxt client for Emacs" tar ((:commit . "eb9efa19086fcae343353f6a5e88c3377fd06dd4") (:authors ("DEADBLACKCLOVER" . "deadblackclover@protonmail.com")) (:maintainers ("DEADBLACKCLOVER" . "deadblackclover@protonmail.com")) (:maintainer "DEADBLACKCLOVER" . "deadblackclover@protonmail.com") (:url . "https://github.com/deadblackclover/twtxt-el"))]) (typescript-mode . [(20230116 1533) ((emacs (24 3))) "Major mode for editing typescript" tar ((:commit . "4fcb4594819caf472ae42ea068a1c7795cf07f46") (:keywords "typescript" "languages") (:url . "http://github.com/ananthakumaran/typescript.el"))]) + (typewriter-roll-mode . [(20240225 1412) ((emacs (24 1))) "Aid for distraction-free writing" tar ((:commit . "99afeb13bd0340a23176c4ebfdabc93117c04069") (:authors ("Peter Badida" . "keyweeusr@gmail.com")) (:maintainers ("Peter Badida" . "keyweeusr@gmail.com")) (:maintainer "Peter Badida" . "keyweeusr@gmail.com") (:keywords "convenience" "line" "carriage" "writing" "distraction" "cr" "rewind") (:url . "https://github.com/KeyWeeUsr/typewriter-roll-mode"))]) (typing . [(20180830 2203) nil "The Typing Of Emacs" tar ((:commit . "a2ef25dde2d8eb91bd9c0c6164cb5208208647fa") (:authors ("Alex Schroeder" . "alex@gnu.org")) (:maintainers ("Alex Schroeder" . "alex@gnu.org")) (:maintainer "Alex Schroeder" . "alex@gnu.org") (:keywords "games") (:url . "http://www.emacswiki.org/emacs/TypingOfEmacs"))]) (typing-game . [(20160426 1220) nil "a simple typing game" tar ((:commit . "616435a5270274f4c7b698697674dbb2039049a4") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "lisp" "game"))]) (typit . [(20220909 1233) ((emacs (24 4)) (f (0 18)) (mmt (0 1 1))) "Typing game similar to tests on 10 fast fingers" tar ((:commit . "6ad0d5a106c4a4428fd131653bbe7c0aab4b5f60") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainers ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:keywords "games") (:url . "https://github.com/mrkkrp/typit"))]) (typo . [(20200706 1714) nil "Minor mode for typographic editing" tar ((:commit . "173ebe4fc7ac38f344b16e6eaf41f79e38f20d57") (:authors ("Jorgen Schaefer" . "forcer@forcix.cx")) (:maintainers ("Jorgen Schaefer" . "forcer@forcix.cx")) (:maintainer "Jorgen Schaefer" . "forcer@forcix.cx") (:keywords "convenience" "wp") (:url . "https://github.com/jorgenschaefer/typoel"))]) (typo-suggest . [(20200830 1143) ((emacs (24 3)) (helm (3 0)) (company (0 9 10)) (s (1 12 0)) (dash (2 13 0))) "Don't make typos with the help of helm and company" tar ((:commit . "3014d18ae2f0b6b857bb613f373e034c743f4d2e") (:authors ("Kadir Can Çetin" . "kadircancetin@gmail.com")) (:maintainers ("Kadir Can Çetin" . "kadircancetin@gmail.com")) (:maintainer "Kadir Can Çetin" . "kadircancetin@gmail.com") (:keywords "convenience" "wp") (:url . "https://github.com/kadircancetin/typo-suggest"))]) - (typst-mode . [(20230819 928) ((polymode (0 2 2)) (emacs (24 3))) "A major mode for working with Typst typesetting system" tar ((:commit . "bbc08e88b5454849debb1c4022af56ff3a7f916e") (:authors ("Ziqi Yang")) (:maintainers ("Ziqi Yang")) (:maintainer "Ziqi Yang") (:keywords "outlines") (:url . "https://github.com/Ziqi-Yang/typst-mode.el"))]) (tzc . [(20230504 445) ((emacs (28 1))) "Converts time between different time zones" tar ((:commit . "e815b43790d9a517f89a2bb592c665bd911a4477") (:authors ("Md Arif Shaikh" . "arifshaikh.astro@gmail.com")) (:maintainers ("Md Arif Shaikh" . "arifshaikh.astro@gmail.com")) (:maintainer "Md Arif Shaikh" . "arifshaikh.astro@gmail.com") (:keywords "convenience") (:url . "https://github.com/md-arif-shaikh/tzc"))]) (ubuntu-theme . [(20150805 1506) nil "A theme inspired by the default terminal colors in Ubuntu" tar ((:commit . "88b0eefc75d4cbcde103057e1c5968d4c3052f69") (:authors ("Francesc Rocher" . "francesc.rocher@gmail.com")) (:maintainers ("Francesc Rocher" . "francesc.rocher@gmail.com")) (:maintainer "Francesc Rocher" . "francesc.rocher@gmail.com") (:url . "http://github.com/rocher/ubuntu-theme"))]) (uci-mode . [(20210626 1956) ((emacs (25 1))) "Major-mode for chess engine interaction" tar ((:commit . "2cdf4de5af96d56108a0a5716416ef3c8ac7bb7c") (:authors ("Dodge Coates and Roland Walker")) (:maintainers ("Dodge Coates and Roland Walker")) (:maintainer "Dodge Coates and Roland Walker") (:keywords "data" "games" "chess") (:url . "https://github.com/dwcoates/uci-mode"))]) @@ -5167,47 +5300,54 @@ (udev-mode . [(20200702 1536) ((emacs (24))) "Major mode for editing udev rules files" tar ((:commit . "5ca236980662141518603672ebdbdf863756da5a") (:authors ("Benjamin Staffin" . "benley@gmail.com")) (:maintainers ("Benjamin Staffin" . "benley@gmail.com")) (:maintainer "Benjamin Staffin" . "benley@gmail.com") (:keywords "languages" "unix") (:url . "https://github.com/benley/emacs-udev-mode"))]) (ue . [(20210929 1301) ((emacs (26 1)) (projectile (2 5 0))) "Minor mode for Unreal Engine projects" tar ((:commit . "7819d5b78e5b52a09b36c634ce404dc8bc3711ef") (:authors ("Oleksandr Manenko" . "seidfzehsd@use.startmail.com")) (:maintainers ("Oleksandr Manenko" . "seidfzehsd@use.startmail.com")) (:maintainer "Oleksandr Manenko" . "seidfzehsd@use.startmail.com") (:keywords "unreal engine" "languages" "tools") (:url . "https://gitlab.com/unrealemacs/ue.el"))]) (uimage . [(20160901 1221) nil "An iimage like mode with the ability to display url images" tar ((:commit . "9893d09160ef7e8c0ecdcd74fca99ffeb5f9d70d") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "lisp" "url" "image"))]) + (uiua-mode . [(20231219 1706) ((emacs (27 1)) (reformatter (0 8))) "Uiua integration" tar ((:commit . "24115f187212a89e600dfb870fc34880355846ed") (:keywords "languages" "uiua") (:url . "https://github.com/crmsnbleyd/uiua-mode"))]) + (uiua-ts-mode . [(20231215 2007) ((emacs (29 1)) (uiua-mode (0 0 5))) "Uiua treesiter mode" tar ((:commit . "1d9b2d4929094e7df7dd23aa1204b4a47c654cc4") (:keywords "languages" "uiua") (:url . "https://github.com/crmsnbleyd/uiua-ts-mode"))]) (ujelly-theme . [(20180214 1624) nil "Ujelly theme for GNU Emacs 24 (deftheme)" tar ((:commit . "bf724ce7806a738d2043544061e5f9bbfc56e674") (:authors ("Mark Tran" . "mark.tran@gmail.com")) (:maintainers ("Mark Tran" . "mark.tran@gmail.com")) (:maintainer "Mark Tran" . "mark.tran@gmail.com") (:url . "http://github.com/marktran/color-theme-ujelly"))]) (ukrainian-holidays . [(20130720 1349) nil "Ukrainian holidays for Emacs calendar." tar ((:commit . "e52b0c92843e9f4d0415a7ba3b8559785497d23d") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/ukrainian-holidays"))]) (uml-mode . [(20200129 1147) ((emacs (24 4)) (seq (0))) "Minor mode for ascii uml sequence diagrams" tar ((:commit . "0ef88c74b48b5400d83ab93e3e089bbe45538fd7") (:authors ("Ian Martins" . "ianxm@jhu.edu")) (:maintainers ("Ian Martins" . "ianxm@jhu.edu")) (:maintainer "Ian Martins" . "ianxm@jhu.edu") (:keywords "docs") (:url . "http://github.com/ianxm/emacs-uml"))]) (uncrustify-mode . [(20130707 1359) nil "Minor mode to automatically uncrustify." tar ((:commit . "2c00d5cf2d1868a5955347438746f4dd82b3b9fc") (:authors ("Tabito Ohtani" . "koko1000ban@gmail.com")) (:maintainers ("Tabito Ohtani" . "koko1000ban@gmail.com")) (:maintainer "Tabito Ohtani" . "koko1000ban@gmail.com") (:keywords "uncrustify"))]) (undercover . [(20210602 2119) ((emacs (24)) (dash (2 0 0)) (shut-up (0 3 2))) "Test coverage library for Emacs Lisp" tar ((:commit . "1d3587f1fad66a747688f36636b67b33b73447d3") (:authors ("Sviridov Alexander" . "sviridov.vmi@gmail.com")) (:maintainers ("Sviridov Alexander" . "sviridov.vmi@gmail.com")) (:maintainer "Sviridov Alexander" . "sviridov.vmi@gmail.com") (:keywords "lisp" "tests" "coverage" "tools") (:url . "https://github.com/sviridov/undercover.el"))]) (underline-with-char . [(20191128 2309) ((emacs (24))) "Underline with a char" tar ((:commit . "36577e72aa4fbfa7f1abad01842359209f543751") (:maintainers (nil . "marcowahlsoft@gmail.com")) (:maintainer nil . "marcowahlsoft@gmail.com") (:keywords "convenience") (:url . "https://gitlab.com/marcowahl/underline-with-char"))]) - (undersea-theme . [(20220616 1950) ((emacs (24 3))) "Theme styled after undersea imagery" tar ((:commit . "6bc351c4cb49ccc7210801e6b54ecc2993289b92") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "theme" "sea") (:url . "https://github.com/jcs-elpa/undersea-theme"))]) + (undersea-theme . [(20240101 1006) ((emacs (24 3))) "Theme styled after undersea imagery" tar ((:commit . "0730e21187367003c533e67cdb676a423a8dccd0") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "theme" "sea") (:url . "https://github.com/jcs-elpa/undersea-theme"))]) (underwater-theme . [(20131118 2) nil "A gentle, deep blue color theme" tar ((:commit . "1fbd4ecd4538256c6c46f9638f883072c73ac927") (:authors ("Jon-Michael Deldin" . "dev@jmdeldin.com")) (:maintainers ("Jon-Michael Deldin" . "dev@jmdeldin.com")) (:maintainer "Jon-Michael Deldin" . "dev@jmdeldin.com") (:keywords "faces"))]) (undo-fu . [(20230808 1340) ((emacs (25 1))) "Undo helper with redo" tar ((:commit . "0e74116fd5c7797811a91ba4eadef50d67523eb6") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.org/ideasman42/emacs-undo-fu"))]) - (undo-fu-session . [(20230703 2353) ((emacs (28 1))) "Persistent undo, available between sessions" tar ((:commit . "a6c4f73bc22401fd36e0f2fd4fe058bb28566d84") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:keywords "convenience") (:url . "https://codeberg.com/ideasman42/emacs-undo-fu-session"))]) + (undo-fu-session . [(20240204 1215) ((emacs (28 1))) "Persistent undo, available between sessions" tar ((:commit . "2b355c9d39b2688f859a762f2289f23fd16fadc4") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:keywords "convenience") (:url . "https://codeberg.org/ideasman42/emacs-undo-fu-session"))]) (undo-propose . [(20210207 45) ((emacs (24 3))) "Simple and safe undo navigation" tar ((:commit . "91a1dfe516d90dab69c368f6669bacb2458ec5e9") (:authors ("Jack Kamm")) (:maintainers ("Jack Kamm")) (:maintainer "Jack Kamm") (:keywords "convenience" "files" "undo" "redo" "history") (:url . "https://github.com/jackkamm/undo-propose.el"))]) (undohist . [(20230508 1226) ((cl-lib (1 0))) "Persistent undo history for GNU Emacs" tar ((:commit . "76338755b8aa710a07d6bc6faa4c03d792e90d82") (:authors ("MATSUYAMA Tomohiro" . "m2ym.pub@gmail.com")) (:maintainers ("MATSUYAMA Tomohiro" . "m2ym.pub@gmail.com")) (:maintainer "MATSUYAMA Tomohiro" . "m2ym.pub@gmail.com") (:keywords "convenience"))]) (unfill . [(20230227 1349) ((emacs (24 1))) "Do the opposite of fill-paragraph or fill-region" tar ((:commit . "075052ce0b4451d7d3ede013ce5a77e6a7a92360") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "convenience") (:url . "https://github.com/purcell/unfill"))]) - (unicad . [(20200914 1500) ((emacs (24)) (nadvice (0 3))) "An elisp port of Mozilla Universal Charset Auto Detector" tar ((:commit . "a5fd4e326a0607acc3776c11f41826e60b6486c6") (:authors ("Qichen Huang" . "unicad.el@gmail.com")) (:maintainers ("Qichen Huang" . "unicad.el@gmail.com")) (:maintainer "Qichen Huang" . "unicad.el@gmail.com") (:keywords "i18n") (:url . "https://github.com/ukari/unicad"))]) + (unicad . [(20230903 1356) ((emacs (24)) (nadvice (0 3))) "An elisp port of Mozilla Universal Charset Auto Detector" tar ((:commit . "fcc220703798d140c86711e2feeb299fd765b5b5") (:authors ("Qichen Huang" . "unicad.el@gmail.com")) (:maintainers ("Qichen Huang" . "unicad.el@gmail.com")) (:maintainer "Qichen Huang" . "unicad.el@gmail.com") (:keywords "i18n") (:url . "https://github.com/ukari/unicad"))]) (unicode-emoticons . [(20150204 1108) nil "Shortcuts for common unicode emoticons" tar ((:commit . "52a09955c2afc1807c0f37f1467ccfc1e1da690a") (:authors ("Gunther Hagleitner")) (:maintainers ("Gunther Hagleitner")) (:maintainer "Gunther Hagleitner") (:keywords "games" "entertainment" "comms") (:url . "https://github.com/hagleitn/unicode-emoticons"))]) (unicode-enbox . [(20140508 2041) ((string-utils (0 3 2)) (ucs-utils (0 7 6)) (list-utils (0 4 2)) (persistent-soft (0 8 8)) (pcache (0 2 3))) "Surround a string with box-drawing characters" tar ((:commit . "4e8ac89b0460eaba6d6eaa8c463eb069660218fa") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "extensions" "interface") (:url . "http://github.com/rolandwalker/unicode-enbox"))]) (unicode-escape . [(20230109 1222) ((emacs (24)) (names (20151201 0)) (dash (2 12 1))) "Escape/Unescape unicode notations" tar ((:commit . "afbb09c774571eefd4e639fc6163280476484363") (:authors ("KOBAYASHI Shigeru (kosh)" . "shigeru.kb@gmail.com")) (:maintainers ("KOBAYASHI Shigeru (kosh)" . "shigeru.kb@gmail.com")) (:maintainer "KOBAYASHI Shigeru (kosh)" . "shigeru.kb@gmail.com") (:keywords "i18n" "unicode") (:url . "https://github.com/kosh04/unicode-escape.el"))]) - (unicode-fonts . [(20220713 1837) ((font-utils (0 7 8)) (ucs-utils (0 8 2)) (list-utils (0 4 2)) (persistent-soft (0 8 10)) (pcache (0 3 1))) "Configure Unicode fonts" tar ((:commit . "44d0a22420c39709d1e1fa659a3f135facf3c986") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "i18n" "faces" "frames" "wp" "interface") (:url . "http://github.com/rolandwalker/unicode-fonts"))]) + (unicode-fonts . [(20230926 1502) ((font-utils (0 7 8)) (ucs-utils (0 8 2)) (list-utils (0 4 2)) (persistent-soft (0 8 10)) (pcache (0 3 1))) "Configure Unicode fonts" tar ((:commit . "6245b97d8ddaeaf1de4dbe2cd85ca0f3b20ef81b") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "i18n" "faces" "frames" "wp" "interface") (:url . "http://github.com/rolandwalker/unicode-fonts"))]) (unicode-math-input . [(20220302 1231) ((emacs (25))) "Insert Unicode math symbols using TeX notation" tar ((:commit . "06bf37d649fc3b41fcd5fa29c0b0eda555aaf8bb") (:authors ("Augusto Stoffel")) (:maintainers ("Augusto Stoffel")) (:maintainer "Augusto Stoffel") (:url . "https://github.com/astoff/unicode-math-input.el"))]) (unicode-progress-reporter . [(20140508 2041) ((emacs (24 1 0)) (ucs-utils (0 7 6)) (list-utils (0 4 2)) (persistent-soft (0 8 8)) (pcache (0 2 3))) "Progress-reporter with fancy characters" tar ((:commit . "17415a96144506e5ffa49377d4c814023e06f425") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "interface") (:url . "http://github.com/rolandwalker/unicode-progress-reporter"))]) (unicode-troll-stopper . [(20190209 411) nil "Minor mode for Highlighting Unicode homoglyphs" tar ((:commit . "5e8be35a7bf6382384a701663f7438ee27e4b67c") (:authors ("Cam Saül" . "cammsaul@gmail.com")) (:maintainers ("Cam Saül" . "cammsaul@gmail.com")) (:maintainer "Cam Saül" . "cammsaul@gmail.com") (:keywords "unicode") (:url . "https://github.com/camsaul/emacs-unicode-troll-stopper"))]) (unicode-whitespace . [(20140508 2041) ((ucs-utils (0 7 6)) (list-utils (0 4 2)) (persistent-soft (0 8 8)) (pcache (0 2 3))) "teach whitespace-mode about fancy characters" tar ((:commit . "b0cbfe4f9998a2c1eb4cba031efcb785ef518916") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "faces" "wp" "interface") (:url . "http://github.com/rolandwalker/unicode-whitespace"))]) (unidecode . [(20201213 1449) nil "Transliterate Unicode to ASCII" tar ((:commit . "525b51b38f5b0435642005957740fe22ecb2a53c") (:authors ("sindikat ")) (:maintainers ("John Mastro" . "john.b.mastro@gmail.com")) (:maintainer "John Mastro" . "john.b.mastro@gmail.com"))]) (unifdef . [(20200517 514) nil "Delete code guarded by processor directives" tar ((:commit . "7a4b76f664c4375e3d98e8af0a29270752c13701") (:authors ("Anders Lindgren")) (:maintainers ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "convenience" "languages") (:url . "https://github.com/Lindydancer/unifdef"))]) - (unify-opening . [(20220521 911) ((emacs (24 4))) "Unify the mechanism to open files" tar ((:commit . "4c6e3447e203a51af116a2117e88d41114950205") (:authors ("Damien Cassou" . "damien.cassou@gmail.com")) (:maintainers ("Damien Cassou" . "damien.cassou@gmail.com")) (:maintainer "Damien Cassou" . "damien.cassou@gmail.com") (:url . "https://github.com/DamienCassou/unify-opening"))]) + (unify-opening . [(20230903 844) ((emacs (24 4))) "Unify the mechanism to open files" tar ((:commit . "282ce0e35ecebbe602bec6f8d64f0192d8a18342") (:authors ("Damien Cassou" . "damien.cassou@gmail.com")) (:maintainers ("Damien Cassou" . "damien.cassou@gmail.com")) (:maintainer "Damien Cassou" . "damien.cassou@gmail.com") (:url . "https://github.com/DamienCassou/unify-opening"))]) (unipoint . [(20140113 2224) nil "a simple way to insert unicode characters by TeX name" tar ((:commit . "5da04aebac35a5c9e1d8704f2231808d42f4b36a") (:authors ("Andrew Gwozdziewycz" . "git@apgwoz.com")) (:maintainers ("Andrew Gwozdziewycz" . "git@apgwoz.com")) (:maintainer "Andrew Gwozdziewycz" . "git@apgwoz.com") (:url . "https://github.com/apgwoz/unipoint"))]) (unison . [(20160704 740) ((emacs (24 1))) "sync with Unison" tar ((:commit . "a78a04c0d1398d00f75a1bd4799622a65bcb0f28") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainers ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org") (:keywords "sync") (:url . "http://github.com/unhammer/unison.el"))]) (unison-mode . [(20160513 1501) nil "Syntax highlighting for unison file synchronization program" tar ((:commit . "0bd6a65c0d12f87fcf7bdff15fe54444959b93bf") (:authors ("Karl Fogelmark" . "karlfogel@gmail.com")) (:maintainers ("Karl Fogelmark" . "karlfogel@gmail.com")) (:maintainer "Karl Fogelmark" . "karlfogel@gmail.com") (:keywords "symchronization" "unison") (:url . "https://github.com/impaktor/unison-mode"))]) (unisonlang-mode . [(20200803 808) ((emacs (25 1))) "Simple major mode for editing Unison" tar ((:commit . "b8da68fc2a6a62a255a6089b0c6794bfa2370f34") (:authors ("Dario Oddenino")) (:maintainers ("Dario Oddenino")) (:maintainer "Dario Oddenino") (:keywords "languages") (:url . "https://github.com/dariooddenino/unison-mode-emacs"))]) (units-mode . [(20221027 303) ((emacs (24 4))) "Mode for conversion between different units" tar ((:commit . "10c8de24180f87b1a8a3b0a9b3fbb29eec925417") (:authors ("Gaurav Atreya" . "allmanpride@gmail.com")) (:maintainers ("Gaurav Atreya" . "allmanpride@gmail.com")) (:maintainer "Gaurav Atreya" . "allmanpride@gmail.com") (:keywords "units" "unit-conversion" "convenience") (:url . "https://github.com/Atreyagaurav/units-mode"))]) (universal-emotions-emoticons . [(20180729 1941) ((emacs (24 4))) "Emoticons For The Six Universal Expressions" tar ((:commit . "9cedd09ee65cb9fa71f27b0ab46a8353bdc00902") (:authors ("Grant Rettke" . "gcr@wisdomandwonder.com")) (:maintainers (nil . "")) (:maintainer nil . "") (:keywords "convenience" "docs" "languages") (:url . "https://github.com/grettke/universal-emotions-emoticons"))]) + (universal-sidecar . [(20240130 2120) ((emacs (26 1)) (magit-section (3 0 0))) "A universal sidecar buffer" tar ((:commit . "d7a30e53fdda44a07160ef438ae1068178f23785") (:authors ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainers ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainer "Samuel W. Flint" . "me@samuelwflint.com") (:url . "https://git.sr.ht/~swflint/emacs-universal-sidecar"))]) + (universal-sidecar-citeproc . [(20240115 1727) ((emacs (28 1)) (citeproc (0 9 4))) "Centralise Citeproc Support for Universal Sidecar" tar ((:commit . "9050eaea7946e613a4b9ecd9dd1462614699edb1") (:authors ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainers ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainer "Samuel W. Flint" . "me@samuelwflint.com") (:keywords "bib" "convenience") (:url . "https://git.sr.ht/~swflint/emacs-universal-sidecar"))]) + (universal-sidecar-elfeed-related . [(20240115 1727) ((emacs (25 1)) (universal-sidecar (1 0 0)) (bibtex-completion (1 0 0)) (elfeed (3 4 1))) "Related Papers Sidecar Section for Elfeed" tar ((:commit . "9050eaea7946e613a4b9ecd9dd1462614699edb1") (:authors ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainers ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainer "Samuel W. Flint" . "me@samuelwflint.com") (:url . "https://git.sr.ht/~swflint/emacs-universal-sidecar"))]) + (universal-sidecar-elfeed-score . [(20240115 1727) ((emacs (25 1)) (universal-sidecar (1 0 0)) (elfeed (3 4 1)) (elfeed-score (1 2 6))) "Show Elfeed Score information in sidecar" tar ((:commit . "9050eaea7946e613a4b9ecd9dd1462614699edb1") (:authors ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainers ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainer "Samuel W. Flint" . "me@samuelwflint.com") (:url . "https://git.sr.ht/~swflint/emacs-universal-sidecar"))]) + (universal-sidecar-roam . [(20240115 1727) ((emacs (26 1)) (universal-sidecar (1 0 0)) (org-roam (2 0 0))) "Integrate universal-sidecar and org-roam" tar ((:commit . "9050eaea7946e613a4b9ecd9dd1462614699edb1") (:authors ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainers ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainer "Samuel W. Flint" . "me@samuelwflint.com") (:url . "https://git.sr.ht/~swflint/emacs-universal-sidecar"))]) (unkillable-scratch . [(20221015 1323) ((emacs (24))) "Disallow the \\*scratch\\* buffer from being killed" tar ((:commit . "6c752e4cd4762bb4bcde2b0b96f2e83740efd104") (:authors ("Eric Crosson" . "eric.s.crosson@utexas.com")) (:maintainers ("Eric Crosson" . "eric.s.crosson@utexas.com")) (:maintainer "Eric Crosson" . "eric.s.crosson@utexas.com") (:keywords "convenience") (:url . "https://github.com/EricCrosson/unkillable-scratch"))]) (unmodified-buffer . [(20220129 2022) ((emacs (24 1))) "Auto revert modified buffer state" tar ((:commit . "9095a3f870aa570804a11d75aba0952294199715") (:authors ("Arthur Colombini Gusmao")) (:maintainers ("Arthur Colombini Gusmao")) (:maintainer "Arthur Colombini Gusmao") (:url . "https://github.com/arthurcgusmao/unmodified-buffer"))]) (unobtrusive-magit-theme . [(20200411 1349) ((emacs (24 1))) "An unobtrusive Magit theme" tar ((:commit . "aede357009655d19d4468320b2b61b0f26a47593") (:authors ("Thomas A. Brown" . "tabsoftwareconsulting@gmail.com")) (:maintainers ("Thomas A. Brown" . "tabsoftwareconsulting@gmail.com")) (:maintainer "Thomas A. Brown" . "tabsoftwareconsulting@gmail.com") (:keywords "faces" "vc" "magit") (:url . "https://github.com/tee3/unobtrusive-magit-theme"))]) - (untappd . [(20210815 1544) ((emacs (26 1)) (request (0 3 2)) (emojify (1 2 1))) "Display your latest Untappd feed" tar ((:commit . "8a31e5888ddd73ed5d2b6ac8ce27acc30f2b59fc") (:authors ("Matthieu Petiteau" . "matt@smallwat3r.com")) (:maintainers ("Matthieu Petiteau" . "matt@smallwat3r.com")) (:maintainer "Matthieu Petiteau" . "matt@smallwat3r.com") (:url . "https://github.com/smallwat3r/untappd.el"))]) + (untappd . [(20240316 1755) ((emacs (26 1)) (request (0 3 2)) (emojify (1 2 1))) "Display your latest Untappd feed" tar ((:commit . "0b46faab755c8f6c4b70a45c24af1673465d9958") (:authors ("Matthieu Petiteau" . "matt@smallwat3r.com")) (:maintainers ("Matthieu Petiteau" . "matt@smallwat3r.com")) (:maintainer "Matthieu Petiteau" . "matt@smallwat3r.com") (:url . "https://github.com/smallwat3r/untappd.el"))]) (untitled-new-buffer . [(20161212 1508) ((emacs (24 4)) (magic-filetype (0 2 0))) "Open untitled new buffer like other text editors." tar ((:commit . "e359ae63bc6310e315b7c25157858f9b9796ed3d") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "files" "convenience") (:url . "https://github.com/zonuexe/untitled-new-buffer.el"))]) (upbo . [(20180422 822) ((dash (2 12 0)) (emacs (24 4))) "Karma Test Runner Integration" tar ((:commit . "63514c484e70cd6eeae828f7e58216e1a3429184") (:authors ("Sungho Kim(shiren)")) (:maintainers ("Sungho Kim(shiren)")) (:maintainer "Sungho Kim(shiren)") (:keywords "javascript" "js" "test" "karma") (:url . "http://github.com/shiren"))]) - (uptimes . [(20191121 1030) ((cl-lib (0 5)) (emacs (24))) "Track and display Emacs session uptimes." tar ((:commit . "29ae6585eeed5a00719b2e52f5ae1082087c1778") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainers ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:keywords "processes" "uptime") (:url . "https://github.com/davep/uptimes.el"))]) + (uptimes . [(20231015 1458) ((cl-lib (0 5)) (emacs (24))) "Track and display session uptimes" tar ((:commit . "84407aba479117344080ebf373e3e9186a96f05c") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainers ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:keywords "processes" "uptime") (:url . "https://github.com/davep/uptimes.el"))]) (url-shortener . [(20170805 242) nil "shorten long url and expand tinyurl" tar ((:commit . "06db8270213b9e352d6c335b0663059a1353d05e") (:authors ("Yu Yang" . "yy2012cn@NOSPAM.gmail.com")) (:maintainers ("Yu Yang" . "yy2012cn@NOSPAM.gmail.com")) (:maintainer "Yu Yang" . "yy2012cn@NOSPAM.gmail.com") (:url . "https://github.com/yuyang0/url-shortener"))]) (urlenc . [(20140116 1456) nil "URL encoding/decoding utility for Emacs." tar ((:commit . "835a6dcb783bbe84714bae87a3464aa0b128bfac") (:authors ("Taiki SUGAWARA" . "buzz.taiki@gmail.com")) (:maintainers ("Taiki SUGAWARA" . "buzz.taiki@gmail.com")) (:maintainer "Taiki SUGAWARA" . "buzz.taiki@gmail.com") (:keywords "url") (:url . "https://github.com/buzztaiki/urlenc-el"))]) - (ursa-ts-mode . [(20230814 1337) ((emacs (29 1))) "Tree-sitter support for Ursa" tar ((:commit . "a1141c424e607850b12059d95f7f9eebeb409b89") (:authors ("Reuben Thomas" . "rrt@sc3d.org")) (:maintainers ("Reuben Thomas" . "rrt@sc3d.org")) (:maintainer "Reuben Thomas" . "rrt@sc3d.org") (:keywords "ursalang" "languages" "tree-sitter") (:url . "https://github.com/ursalang/ursa-ts-mode"))]) + (ursa-ts-mode . [(20231119 1545) ((emacs (29 1))) "Major mode for Ursa, using tree-sitter" tar ((:commit . "8a2a6011ff68852c0714a9ef17b25efc519fdd64") (:authors ("Reuben Thomas" . "rrt@sc3d.org")) (:maintainers ("Reuben Thomas" . "rrt@sc3d.org")) (:maintainer "Reuben Thomas" . "rrt@sc3d.org") (:keywords "ursalang" "languages" "tree-sitter") (:url . "https://github.com/ursalang/ursa-ts-mode"))]) (urscript-mode . [(20190219 1604) ((emacs (24 4))) "major mode for editing URScript." tar ((:commit . "b341f96b129ead8fb74d680cb4f546985bf110a9") (:authors ("Guido Schmidt" . "git@guidoschmidt.cc")) (:maintainers ("Guido Schmidt" . "git@guidoschmidt.cc")) (:maintainer "Guido Schmidt" . "git@guidoschmidt.cc") (:keywords "languages") (:url . "https://github.com/guidoschmidt/urscript-mode"))]) (usage-memo . [(20170926 37) nil "integration of Emacs help system and memo" tar ((:commit . "88e15a9942a3e0a6e36e9c3e51e3edb746067b1a") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "convenience" "languages" "lisp" "help" "tools" "docs") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/usage-memo.el"))]) (use-package . [(20230426 2324) ((emacs (24 3)) (bind-key (2 4))) "A configuration macro for simplifying your .emacs" tar ((:commit . "b59b4dc2361c7b351238990d0c34eece8d79ecf0") (:authors ("John Wiegley" . "johnw@newartisans.com")) (:maintainers ("John Wiegley" . "johnw@newartisans.com")) (:maintainer "John Wiegley" . "johnw@newartisans.com") (:keywords "dotemacs" "startup" "speed" "config" "package" "extensions") (:url . "https://github.com/jwiegley/use-package"))]) @@ -5216,14 +5356,14 @@ (use-package-ensure-system-package . [(20221209 2013) ((use-package (2 1)) (system-packages (1 0 4))) "auto install system packages" tar ((:commit . "bcf0984cf55b70fe6896c6a15f61df92b24f8ffd") (:authors ("Justin Talbott" . "justin@waymondo.com")) (:maintainers ("Justin Talbott" . "justin@waymondo.com")) (:maintainer "Justin Talbott" . "justin@waymondo.com") (:keywords "convenience" "tools" "extensions") (:url . "https://github.com/waymondo/use-package-ensure-system-package"))]) (use-package-hydra . [(20181228 745) ((emacs (24 3)) (use-package (2 4))) "Adds :hydra keyword to use-package macro" tar ((:commit . "8cd55a1128fbdf6327bb38a199d206225896d146") (:authors ("Toon Claes" . "toon@iotcl.com")) (:maintainers ("Toon Claes" . "toon@iotcl.com")) (:maintainer "Toon Claes" . "toon@iotcl.com") (:keywords "convenience" "extensions" "tools") (:url . "https://gitlab.com/to1ne/use-package-hydra"))]) (use-proxy . [(20201209 853) ((exec-path-from-shell (1 12)) (emacs (26 2))) "Enable/Disable proxies respecting your HTTP/HTTPS env" tar ((:commit . "43499194224483b27628fdf99f6f9ff6e731d844") (:authors ("Ray Wang" . "ray.hackmylife@gmail.com")) (:maintainers ("Ray Wang" . "ray.hackmylife@gmail.com")) (:maintainer "Ray Wang" . "ray.hackmylife@gmail.com") (:keywords "proxy" "comm") (:url . "https://github.com/rayw000/use-proxy"))]) - (use-ttf . [(20230503 1015) ((emacs (26 1))) "Keep font consistency across different OSs" tar ((:commit . "a01d9aef26ffc45dbe8d57d7c061a3a80eb79a2b") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "customize" "font" "install" "ttf") (:url . "https://github.com/jcs-elpa/use-ttf"))]) + (use-ttf . [(20240101 928) ((emacs (26 1))) "Keep font consistency across different OSs" tar ((:commit . "e0f61ad6c0b6ecf89ff0b43c430b15c94ec8c8b3") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "customize" "font" "install" "ttf") (:url . "https://github.com/jcs-elpa/use-ttf"))]) (ushin-shapes . [(20230702 2210) ((emacs (27 1)) (svg-tag-mode (0 3 2)) (svg-lib (0 2 5))) "USHIN shapes in org-mode" tar ((:commit . "30171af499d8117a2dbc3e978473793eced49bcb") (:authors ("Joseph Turner" . "joseph@ushin.org")) (:maintainers ("Joseph Turner" . "joseph@ushin.org")) (:maintainer "Joseph Turner" . "joseph@ushin.org") (:keywords "convenience") (:url . "https://git.sr.ht/~ushin/ushin-shapes.el"))]) (utimeclock . [(20230601 25) ((emacs (24 4))) "Simple utility for manual time tracking" tar ((:commit . "484d426a2ecc1ac7b922fd93c7d03da23510fb63") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.org/ideasman42/emacs-utimeclock"))]) - (utop . [(20230707 1535) ((emacs (26)) (tuareg (2 2 0))) "Universal toplevel for OCaml" tar ((:commit . "5b98d2845bf8e46a253593578cf0371d773f6da0") (:authors ("Jeremie Dimino" . "jeremie@dimino.org")) (:maintainers ("Jeremie Dimino" . "jeremie@dimino.org")) (:maintainer "Jeremie Dimino" . "jeremie@dimino.org") (:keywords "ocaml" "languages") (:url . "https://github.com/ocaml-community/utop"))]) + (utop . [(20240226 1308) ((emacs (26)) (tuareg (2 2 0))) "Universal toplevel for OCaml" tar ((:commit . "d4f6f5f7337eeeac9507801c8f147fff518f9d69") (:authors ("Jeremie Dimino" . "jeremie@dimino.org")) (:maintainers ("Jeremie Dimino" . "jeremie@dimino.org")) (:maintainer "Jeremie Dimino" . "jeremie@dimino.org") (:keywords "ocaml" "languages") (:url . "https://github.com/ocaml-community/utop"))]) (uuid . [(20120910 851) nil "UUID's for EmacsLisp" tar ((:commit . "1519bfeb0e31602b840bc8dd35d7c7e732c159fe") (:authors ("James Mastros")) (:maintainers ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:keywords "lisp"))]) - (uuidgen . [(20220405 1345) nil "Provides various UUID generating functions" tar ((:commit . "7b728c1d92e196c3acf87a004949335cfc18eab3") (:authors ("Kan-Ru Chen" . "kanru@kanru.info")) (:maintainers ("Kan-Ru Chen" . "kanru@kanru.info")) (:maintainer "Kan-Ru Chen" . "kanru@kanru.info") (:keywords "extensions" "lisp" "tools"))]) - (uwu-theme . [(20230110 153) ((emacs (24 1))) "An awesome dark color scheme" tar ((:commit . "6b66376b9d7053eb9c23449a601d24511a0b44e6") (:authors ("Kevin Borling")) (:maintainers ("Kevin Borling")) (:maintainer "Kevin Borling") (:keywords "custom themes" "dark" "faces") (:url . "https://github.com/kborling/uwu-theme"))]) - (uxntal-mode . [(20230707 1623) ((emacs (27 1))) "Major mode for Uxntal assembly" tar ((:commit . "0f0bb416d43a940ee7a057db075bf5804708dc5c") (:authors ("d_m" . "d_m@plastic-idolatry.com")) (:maintainers ("d_m" . "d_m@plastic-idolatry.com")) (:maintainer "d_m" . "d_m@plastic-idolatry.com") (:url . "https://github.com/non/uxntal-mode"))]) + (uuidgen . [(20240201 2318) nil "Provides various UUID generating functions" tar ((:commit . "cebbe09d27c63abe61fe8c2e2248587d90265b59") (:authors ("Kan-Ru Chen" . "kanru@kanru.info")) (:maintainers ("Kan-Ru Chen" . "kanru@kanru.info")) (:maintainer "Kan-Ru Chen" . "kanru@kanru.info") (:keywords "extensions" "lisp" "tools"))]) + (uwu-theme . [(20231103 130) ((emacs (24 1))) "An awesome dark color scheme" tar ((:commit . "821c3a84c8e26263d898566cc27b3982854db60c") (:authors ("Kevin Borling")) (:maintainers ("Kevin Borling")) (:maintainer "Kevin Borling") (:keywords "custom themes" "dark" "faces") (:url . "https://github.com/kborling/uwu-theme"))]) + (uxntal-mode . [(20231010 438) ((emacs (27 1))) "Major mode for Uxntal assembly" tar ((:commit . "9cc325992309e7b6f6ea75d64e12fde2a85320ed") (:authors ("d_m" . "d_m@plastic-idolatry.com")) (:maintainers ("d_m" . "d_m@plastic-idolatry.com")) (:maintainer "d_m" . "d_m@plastic-idolatry.com") (:url . "https://github.com/non/uxntal-mode"))]) (v-mode . [(20221007 635) ((emacs (25 1)) (dash (2 17 0)) (hydra (0 15 0))) "A major mode for the V programming language" tar ((:commit . "84f26ab0f0f5b23133292674da9fa4558207c33d") (:keywords "languages" "programming") (:url . "https://github.com/damon-kwok/v-mode"))]) (v2ex-mode . [(20160720 345) ((cl-lib (0 5)) (request (0 2)) (let-alist (1 0 3))) "Major mode for visit http://v2ex.com/ site." tar ((:commit . "b7d19bb594b43ea3824a6f215dd1e5d1d4c0e8ad") (:authors ("Aborn Jiang" . "aborn.jiang@gmail.com")) (:maintainers ("Aborn Jiang" . "aborn.jiang@gmail.com")) (:maintainer "Aborn Jiang" . "aborn.jiang@gmail.com") (:keywords "v2ex" "v2ex.com") (:url . "https://github.com/aborn/v2ex-mode"))]) (vagrant . [(20220730 302) nil "Manage a vagrant box from emacs" tar ((:commit . "eb4ec2053955eda1ac9e5ff92ded88f1919e13f2") (:authors ("Robert Crim" . "rob@servermilk.com")) (:maintainers ("Robert Crim" . "rob@servermilk.com")) (:maintainer "Robert Crim" . "rob@servermilk.com") (:keywords "vagrant" "chef") (:url . "https://github.com/ottbot/vagrant.el"))]) @@ -5242,33 +5382,34 @@ (vc-hgcmd . [(20211021 1704) ((emacs (25 1))) "VC mercurial backend that uses hg command server" tar ((:commit . "d044448965d31ca8214f8bca48487e4d9b9d9a0f") (:authors ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainers ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainer "Andrii Kolomoiets" . "andreyk.mad@gmail.com") (:keywords "vc") (:url . "https://github.com/muffinmad/emacs-vc-hgcmd"))]) (vc-msg . [(20221005 1228) ((emacs (24 4)) (popup (0 5 0))) "Show commit information of current line" tar ((:commit . "027fefad63868cd7695372510c27922656cf996a") (:authors ("Chen Bin ")) (:maintainers ("Chen Bin ")) (:maintainer "Chen Bin ") (:keywords "git" "vc" "svn" "hg" "messenger") (:url . "http://github.com/redguardtoo/vc-msg"))]) (vc-osc . [(20190402 2349) nil "non-resident support for osc version-control" tar ((:commit . "bf5a515ed85f7d7cdfe66ed5bf4ef7554f8561e5") (:authors ("Adam Spiers (see vc.el for full credits)")) (:maintainers ("Adam Spiers" . "aspiers@suse.com")) (:maintainer "Adam Spiers" . "aspiers@suse.com"))]) - (vcomp . [(20230407 1426) ((emacs (24 1))) "Compare version strings" tar ((:commit . "fdd010e9081d62aa6aaa1b25a2df925efd662d0c") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "versions") (:url . "https://github.com/tarsius/vcomp"))]) + (vcomp . [(20240302 2255) ((emacs (25 1))) "Compare version strings" tar ((:commit . "99831d234481a61488aca4b96b842b63a79c732a") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "versions") (:url . "https://github.com/tarsius/vcomp"))]) (vcsh . [(20230402 1229) ((emacs (25 1))) "vcsh integration" tar ((:commit . "b9c0109a8c77446980de668785e6af1e46bdcdcd") (:authors ("Štěpán Němec" . "stepnem@smrk.net")) (:maintainers ("Štěpán Němec" . "stepnem@smrk.net")) (:maintainer "Štěpán Němec" . "stepnem@smrk.net") (:keywords "vc" "files") (:url . "http://git.smrk.net/vcsh.el"))]) (vdf-mode . [(20210303 714) ((emacs (24 3))) "Major mode for editing Valve VDF files." tar ((:commit . "0910d4f847e9c817eb8da5434b3879048ec4ac92") (:authors ("Philipp Middendorf")) (:maintainers ("Philipp Middendorf")) (:maintainer "Philipp Middendorf") (:url . "https://github.com/plapadoo/vdf-mode"))]) (vdiff . [(20230621 201) ((emacs (24 4)) (hydra (0 13 0))) "A diff tool similar to vimdiff" tar ((:commit . "170e968c6a46a572b30c52c1b038232d418734cc") (:authors ("Justin Burkett" . "justin@burkett.cc")) (:maintainers ("Justin Burkett" . "justin@burkett.cc")) (:maintainer "Justin Burkett" . "justin@burkett.cc") (:keywords "diff") (:url . "https://github.com/justbur/emacs-vdiff"))]) (vdiff-magit . [(20220518 1948) ((emacs (24 4)) (vdiff (0 3)) (magit (2 10 0)) (transient (0 1 0))) "magit integration for vdiff" tar ((:commit . "413f32c9f7e66f8379c23b5ab6341695dbcc2f20") (:authors ("Justin Burkett" . "justin@burkett.cc")) (:maintainers ("Justin Burkett" . "justin@burkett.cc")) (:maintainer "Justin Burkett" . "justin@burkett.cc") (:keywords "diff") (:url . "https://github.com/justbur/emacs-vdiff-magit"))]) - (vdirel . [(20220412 646) ((emacs (24 4)) (org-vcard (0 1 0)) (helm (1 7 0)) (seq (1 11))) "Manipulate vdir (i.e., vCard) repositories" tar ((:commit . "4eebcf91bdb9ee10fbbba198c4995ae070442f26") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:url . "https://github.com/DamienCassou/vdirel"))]) + (vdirel . [(20230906 1844) ((emacs (24 4)) (org-vcard (0 1 0)) (helm (1 7 0)) (seq (1 11))) "Manipulate vdir (i.e., vCard) repositories" tar ((:commit . "d60439f0b2b55f2e220241fe73f7f79af80aaad8") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:url . "https://github.com/DamienCassou/vdirel"))]) (vdm-comint . [(20181127 2023) ((emacs (25)) (vdm-mode (0 0 4))) "REPL support for vdm-mode" tar ((:commit . "e131edb0d35de28bd47d6128dd70d9a6fc46e0fa") (:authors ("Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com")) (:maintainers ("Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com")) (:maintainer "Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com") (:keywords "languages") (:url . "https://github.com/peterwvj/vdm-mode"))]) (vdm-mode . [(20190328 1408) ((emacs (25))) "Major mode for the Vienna Development Method" tar ((:commit . "89e7db6ee1a89b8c1f7ce36ce6800c32b5c4ba2d") (:authors ("Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com")) (:maintainers ("Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com")) (:maintainer "Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com") (:keywords "languages") (:url . "https://github.com/peterwvj/vdm-mode"))]) (vdm-snippets . [(20190313 1122) ((emacs (24)) (yasnippet (0 13 0))) "YASnippets for VDM mode" tar ((:commit . "dc1756dd151752b3f538d68326059f8861e4ac66") (:authors ("Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com")) (:maintainers ("Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com")) (:maintainer "Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com") (:keywords "languages") (:url . "https://github.com/peterwvj/vdm-mode"))]) (vector-utils . [(20140508 2041) nil "Vector-manipulation utility functions" tar ((:commit . "5f9ced3960a318d611c3d20ffdc9ca74054fa8b7") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "extensions") (:url . "http://github.com/rolandwalker/vector-utils"))]) (vega-view . [(20210401 1115) ((emacs (25)) (cider (0 24 0)) (parseedn (0 1))) "Vega visualization viewer" tar ((:commit . "3793025a523a86acc6255b4183b12ebfc95e1116") (:authors ("Jack Rusher" . "jack@appliedscience.studio")) (:maintainers ("Jack Rusher" . "jack@appliedscience.studio")) (:maintainer "Jack Rusher" . "jack@appliedscience.studio") (:keywords "multimedia") (:url . "https://www.github.com/applied-science/emacs-vega-view"))]) (vegetative-theme . [(20220822 353) ((autothemer (0 2)) (emacs (24))) "A Theme based on green CRT terminals" tar ((:commit . "db60ce0fe327ae7e4371545179ed94483b1132a8") (:url . "http://github.com/emacsfodder/emacs-theme-vegetative"))]) - (verb . [(20230825 2151) ((emacs (26 3))) "Organize and send HTTP requests" tar ((:commit . "e1e551f6340d58e7782f2c1df7b397229a1c4fe3") (:authors ("Federico Tedin" . "federicotedin@gmail.com")) (:maintainers ("Federico Tedin" . "federicotedin@gmail.com")) (:maintainer "Federico Tedin" . "federicotedin@gmail.com") (:keywords "tools") (:url . "https://github.com/federicotdn/verb"))]) + (verb . [(20240317 1608) ((emacs (26 3))) "Organize and send HTTP requests" tar ((:commit . "a430847beb925ae82007d70f32f3bab38f0054e9") (:authors ("Federico Tedin" . "federicotedin@gmail.com")) (:maintainers ("Federico Tedin" . "federicotedin@gmail.com")) (:maintainer "Federico Tedin" . "federicotedin@gmail.com") (:keywords "tools") (:url . "https://github.com/federicotdn/verb"))]) (veri-kompass . [(20200213 934) ((emacs (25)) (cl-lib (0 5)) (org (8 2 0))) "verilog codebase navigation facility" tar ((:commit . "271903cdf92db05898ee7cffb65641f30fa08280") (:maintainers (nil . "andrea_corallo@yahoo.it")) (:maintainer nil . "andrea_corallo@yahoo.it") (:keywords "languages" "extensions" "verilog" "hardware" "rtl") (:url . "https://gitlab.com/koral/veri-kompass"))]) (verify-url . [(20160426 1228) ((cl-lib (0 5))) "find out invalid urls in the buffer or region" tar ((:commit . "d6f3623cda8cd526a2d198619b137059cb1ba1ab") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "convenience" "usability" "url") (:url . "https://github.com/lujun9972/verify-url"))]) - (verilog-ext . [(20230827 2234) ((emacs (28 2)) (verilog-mode (2023 6 6 141322628)) (verilog-ts-mode (0 0 0)) (eglot (1 9)) (lsp-mode (8 0 1)) (ag (0 48)) (ripgrep (0 4 0)) (hydra (0 15 0)) (apheleia (3 1)) (yasnippet (0 14 0)) (company (0 9 13)) (flycheck (33 -4)) (outshine (3 1 -1)) (async (1 9 7))) "SystemVerilog Extensions" tar ((:commit . "e7e1a3270c75aaa95a11e39d6f3d951306555aa1") (:authors ("Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com")) (:maintainers ("Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com")) (:maintainer "Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com") (:keywords "verilog" "ide" "tools") (:url . "https://github.com/gmlarumbe/verilog-ext"))]) - (verilog-ts-mode . [(20230827 2234) ((emacs (29 1))) "Verilog Tree-sitter major mode" tar ((:commit . "e7e1a3270c75aaa95a11e39d6f3d951306555aa1") (:authors ("Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com")) (:maintainers ("Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com")) (:maintainer "Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com") (:keywords "verilog" "ide" "tools") (:url . "https://github.com/gmlarumbe/verilog-ext"))]) + (verilog-ext . [(20240212 57) ((emacs (29 1)) (verilog-mode (2023 6 6 141322628)) (verilog-ts-mode (0 1 2)) (lsp-mode (8 0 0)) (ag (0 48)) (ripgrep (0 4 0)) (hydra (0 15 0)) (apheleia (3 1)) (yasnippet (0 14 0)) (flycheck (32)) (outshine (3 0 1)) (async (1 9 7))) "SystemVerilog Extensions" tar ((:commit . "9da79ac0c79e8819381002c205ae6817bbc9b642") (:authors ("Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com")) (:maintainers ("Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com")) (:maintainer "Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com") (:keywords "verilog" "ide" "tools") (:url . "https://github.com/gmlarumbe/verilog-ext"))]) + (verilog-ts-mode . [(20240211 210) ((emacs (29 1))) "Verilog Tree-sitter major mode" tar ((:commit . "b055f7b4a7abdc1e1eb9eb5a99ddc288369982d0") (:authors ("Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com")) (:maintainers ("Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com")) (:maintainer "Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com") (:keywords "verilog" "ide" "tools") (:url . "https://github.com/gmlarumbe/verilog-ts-mode"))]) (verona-mode . [(20200823 536) ((emacs (25 1)) (dash (2 17 0)) (hydra (0 15 0))) "A major mode for the Verona programming language" tar ((:commit . "72dd31ef847344d79409503f3c42169041eb3da4") (:keywords "languages" "programming") (:url . "https://github.com/damon-kwok/verona-mode"))]) (versuri . [(20211104 1301) ((emacs (26 1)) (dash (2 16 0)) (request (0 3 0)) (anaphora (1 0 4)) (esxml (0 1 0)) (s (1 12 0)) (esqlite (0 3 1))) "The lyrics package" tar ((:commit . "c8ea562304194f3379ed8f9c6a785ce8ee72898e") (:authors ("Mihai Olteanu" . "mihai_olteanu@fastmail.fm")) (:maintainers ("Mihai Olteanu" . "mihai_olteanu@fastmail.fm")) (:maintainer "Mihai Olteanu" . "mihai_olteanu@fastmail.fm") (:keywords "multimedia") (:url . "https://github.com/mihaiolteanu/versuri/"))]) (vertica . [(20131217 1511) ((sql (3 0))) "Vertica SQL mode extension" tar ((:commit . "3c9647b425c5c13c30bf0cba483646af18196588") (:authors ("Roman Scherer" . "roman@burningswell.com")) (:maintainers ("Roman Scherer" . "roman@burningswell.com")) (:maintainer "Roman Scherer" . "roman@burningswell.com") (:keywords "sql" "vertica"))]) - (vertica-snippets . [(20200423 1200) ((yasnippet (0 6 1))) "Yasnippets for Vertica" tar ((:commit . "6ced718d9120878878700592fab430a8542b748f") (:authors ("Andreas Gerler" . "baron@bundesbrandschatzamt.de")) (:maintainers ("Andreas Gerler" . "baron@bundesbrandschatzamt.de")) (:maintainer "Andreas Gerler" . "baron@bundesbrandschatzamt.de") (:keywords "convenience" "snippets") (:url . "https://github.com/baron42bba/vertica-snippets"))]) - (vertico-prescient . [(20230221 1257) ((emacs (27 1)) (prescient (6 1 0)) (vertico (0 28))) "prescient.el + Vertico" tar ((:commit . "822481e722502081deedbe6b1a9776eda0ca7bfe") (:authors ("Radian LLC" . "contact+prescient@radian.codes")) (:maintainers ("Radian LLC" . "contact+prescient@radian.codes")) (:maintainer "Radian LLC" . "contact+prescient@radian.codes") (:keywords "extensions") (:url . "https://github.com/radian-software/prescient.el"))]) + (vertica-snippets . [(20240221 1629) ((yasnippet (0 6 1))) "Yasnippets for Vertica" tar ((:commit . "efaf893698358a305b1c52fd22a6842b59940855") (:authors ("Andreas Gerler" . "baron@bundesbrandschatzamt.de")) (:maintainers ("Andreas Gerler" . "baron@bundesbrandschatzamt.de")) (:maintainer "Andreas Gerler" . "baron@bundesbrandschatzamt.de") (:keywords "convenience" "snippets") (:url . "https://github.com/baron42bba/vertica-snippets"))]) + (vertico . [(20240128 1526) ((emacs (27 1)) (compat (29 1 4 4))) "VERTical Interactive COmpletion" tar ((:commit . "4a7da56b02c6aefff8f6b4574a530a7cb54bc21a") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainers ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:keywords "convenience" "files" "matching" "completion") (:url . "https://github.com/minad/vertico"))]) + (vertico-prescient . [(20240226 204) ((emacs (27 1)) (prescient (6 1 0)) (vertico (0 28)) (compat (29 1))) "prescient.el + Vertico" tar ((:commit . "c39bf07c56b427bf41aafd7d20eaef5cf3c312b5") (:authors ("Radian LLC" . "contact+prescient@radian.codes")) (:maintainers ("Radian LLC" . "contact+prescient@radian.codes")) (:maintainer "Radian LLC" . "contact+prescient@radian.codes") (:keywords "extensions") (:url . "https://github.com/radian-software/prescient.el"))]) (vertigo . [(20211224 1256) ((dash (2 11 0))) "Jump across lines using the home row." tar ((:commit . "280b30518529242ee36cd436bd2349c34c35abb0") (:authors ("Fox Kiester" . "noct@posteo.net")) (:maintainers ("Fox Kiester" . "noct@posteo.net")) (:maintainer "Fox Kiester" . "noct@posteo.net") (:keywords "vim" "vertigo") (:url . "https://github.com/noctuid/vertigo.el"))]) (vhdl-capf . [(20160221 1734) nil "Completion at point function (capf) for vhdl-mode." tar ((:commit . "290abe217050f33532bc9ccb04f894123402f414") (:authors ("sh-ow" . "sh-ow@users.noreply.github.com")) (:maintainers ("sh-ow" . "sh-ow@users.noreply.github.com")) (:maintainer "sh-ow" . "sh-ow@users.noreply.github.com") (:keywords "convenience" "usability" "vhdl" "completion") (:url . "https://github.com/sh-ow/vhdl-capf"))]) - (vhdl-ext . [(20230827 2234) ((emacs (28 2)) (eglot (1 9)) (lsp-mode (8 0 1)) (ag (0 48)) (ripgrep (0 4 0)) (hydra (0 15 0)) (flycheck (33 -4)) (company (0 9 13)) (outshine (3 1 -1)) (async (1 9 7))) "VHDL Extensions" tar ((:commit . "a76c45dd828f196a0915684adbc5707df0d09a8a") (:authors ("Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com")) (:maintainers ("Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com")) (:maintainer "Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com") (:keywords "vhdl" "ide" "tools") (:url . "https://github.com/gmlarumbe/vhdl-ext"))]) + (vhdl-ext . [(20240212 153) ((emacs (29 1)) (vhdl-ts-mode (0 1 1)) (lsp-mode (8 0 0)) (ag (0 48)) (ripgrep (0 4 0)) (hydra (0 15 0)) (flycheck (32)) (outshine (3 0 1)) (async (1 9 7))) "VHDL Extensions" tar ((:commit . "64111386bd793ceb6a8f78ab5f5caf5655fb3aa0") (:authors ("Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com")) (:maintainers ("Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com")) (:maintainer "Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com") (:keywords "vhdl" "ide" "tools") (:url . "https://github.com/gmlarumbe/vhdl-ext"))]) (vhdl-tools . [(20200330 1819) ((ggtags (0 9 0)) (emacs (26 2)) (helm-rg (0 1)) (outshine (3 1 -1))) "Utilities for navigating vhdl sources" tar ((:commit . "9cb2354874608d971be407ad9299ed918a6c061a") (:authors ("Cayetano Santos")) (:maintainers ("Cayetano Santos")) (:maintainer "Cayetano Santos") (:keywords "convenience" "languages" "vhdl") (:url . "https://gitlab.com/emacs-elisp/vhdl-tools/-/wikis/home"))]) - (vhdl-ts-mode . [(20230827 2234) ((emacs (29 1))) "VHDL Tree-sitter major mode" tar ((:commit . "a76c45dd828f196a0915684adbc5707df0d09a8a") (:authors ("Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com")) (:maintainers ("Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com")) (:maintainer "Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com") (:keywords "vhdl" "ide" "tools") (:url . "https://github.com/gmlarumbe/vhdl-ext"))]) + (vhdl-ts-mode . [(20240211 213) ((emacs (29 1))) "VHDL Tree-sitter major mode" tar ((:commit . "1d17c43993bf9eab97b0658a46fa17e64fc8eb4b") (:authors ("Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com")) (:maintainers ("Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com")) (:maintainer "Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com") (:keywords "vhdl" "ide" "tools") (:url . "https://github.com/gmlarumbe/vhdl-ts-mode"))]) (vi-tilde-fringe . [(20141028 242) ((emacs (24))) "Displays tildes in the fringe on empty lines a la Vi." tar ((:commit . "e6e15638e8c45a5e68d0874d5d8c9a46c4f38a54") (:authors ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainers ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainer "Sylvain Benner" . "sylvain.benner@gmail.com") (:keywords "emulation") (:url . "https://github.com/syl20bnr/vi-tilde-fringe"))]) (viewer . [(20170107 202) nil "View-mode extension" tar ((:commit . "6c8db025bf4021428f7f2c3ef9d74fb13f5d267a") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "view" "extensions") (:url . "http://github.com/rubikitch/viewer/"))]) (viking-mode . [(20160705 2027) nil "kill first, ask later" tar ((:commit . "c76aa265d13ad91d6890d242e142d05e31f0340b") (:authors ("T.v.Dein" . "tlinden@cpan.org")) (:maintainers ("T.v.Dein" . "tlinden@cpan.org")) (:maintainer "T.v.Dein" . "tlinden@cpan.org") (:keywords "kill" "delete") (:url . "https://github.com/tlinden/viking-mode"))]) @@ -5277,13 +5418,14 @@ (vimgolf . [(20200205 1420) nil "VimGolf interface for the One True Editor" tar ((:commit . "f565447ed294898588a19438d56c116555d8c628") (:authors ("Tim Visher" . "tim.visher@gmail.com")) (:maintainers ("Tim Visher" . "tim.visher@gmail.com")) (:maintainer "Tim Visher" . "tim.visher@gmail.com") (:keywords "games" "vimgolf" "vim") (:url . "https://github.com/timvisher/vimgolf.el"))]) (vimish-fold . [(20201205 1156) ((emacs (24 4)) (cl-lib (0 5)) (f (0 18 0))) "Fold text like in Vim" tar ((:commit . "a6501cbfe3db791f9ca17fd986c7202a87f3adb8") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainers ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:keywords "convenience") (:url . "https://github.com/mrkkrp/vimish-fold"))]) (vimrc-mode . [(20181116 1919) nil "Major mode for vimrc files" tar ((:commit . "13bc150a870d5d4a95f1111e4740e2b22813c30e") (:keywords "languages" "vim") (:url . "https://github.com/mcandre/vimrc-mode"))]) + (vimscript-ts-mode . [(20231022 1758) ((emacs (29 1))) "Vim-script major mode using tree-sitter" tar ((:commit . "20aea980ef94d643100638f2528aafc4b136e20c") (:authors ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainers ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainer "Noah Peart" . "noah.v.peart@gmail.com") (:keywords "languages" "vim" "tree-sitter") (:url . "https://github.com/nverno/vimscript-ts-mode"))]) (virtual-auto-fill . [(20200906 2038) ((emacs (25 2)) (adaptive-wrap (0 7)) (visual-fill-column (1 9))) "Readably display text without adding line breaks" tar ((:commit . "a3991ce02d9a6a1624a3f04da80f4ac966a44092") (:authors ("Luis Gerhorst" . "virtual-auto-fill@luisgerhorst.de")) (:maintainers ("Luis Gerhorst" . "virtual-auto-fill@luisgerhorst.de")) (:maintainer "Luis Gerhorst" . "virtual-auto-fill@luisgerhorst.de") (:keywords "convenience" "mail" "outlines" "files" "wp") (:url . "https://github.com/luisgerhorst/virtual-auto-fill"))]) (virtual-comment . [(20220921 221) ((emacs (26 1))) "Virtual Comments" tar ((:commit . "b0c2ac4a9d625b5f4f329bbab879ad86cd7056bd") (:authors ("Thanh Vuong" . "thanhvg@gmail.com")) (:maintainers ("Thanh Vuong" . "thanhvg@gmail.com")) (:maintainer "Thanh Vuong" . "thanhvg@gmail.com") (:url . "https://github.com/thanhvg/emacs-virtual-comment"))]) (virtualenv . [(20140220 2301) nil "Virtualenv for Python" tar ((:commit . "cc82856b6316d5e78073de717f0d5d1a4ee35fa6") (:authors ("Aaron Culich" . "aculich@gmail.com")) (:maintainers ("Aaron Culich" . "aculich@gmail.com")) (:maintainer "Aaron Culich" . "aculich@gmail.com") (:keywords "python" "virtualenv"))]) (virtualenvwrapper . [(20190223 1919) ((dash (1 5 0)) (s (1 6 1))) "a featureful virtualenv tool for Emacs" tar ((:commit . "f753e5ad91c2ff5d11bec424aa8cec141efa6925") (:authors ("James J Porter" . "porterjamesj@gmail.com")) (:maintainers ("James J Porter" . "porterjamesj@gmail.com")) (:maintainer "James J Porter" . "porterjamesj@gmail.com") (:keywords "python" "virtualenv" "virtualenvwrapper") (:url . "http://github.com/porterjamesj/virtualenvwrapper.el"))]) (visible-mark . [(20150624 450) nil "Make marks visible." tar ((:commit . "c1852e13b6b61982738b56977a452ec9026faf1b") (:authors ("Ian Kelling" . "ian@iankelling.org")) (:maintainers ("Ian Kelling" . "ian@iankelling.org")) (:maintainer "Ian Kelling" . "ian@iankelling.org") (:keywords "marking" "color" "faces") (:url . "https://gitlab.com/iankelling/visible-mark"))]) (visual-ascii-mode . [(20150129 1046) nil "Visualize ascii code (small integer) on buffer." tar ((:commit . "99285a099a17472ddd9f1b4f74e9d092dd8c5947") (:authors ("Dewdrops" . "v_v_4474@126.com")) (:maintainers ("Dewdrops" . "v_v_4474@126.com")) (:maintainer "Dewdrops" . "v_v_4474@126.com") (:keywords "presentation") (:url . "https://github.com/Dewdrops/visual-ascii-mode"))]) - (visual-fill-column . [(20230102 1830) ((emacs (25 1))) "fill-column for visual-line-mode" tar ((:commit . "695a59789209c42fa08a5bce92963ee32f4455be") (:authors ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainers ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm") (:url . "https://codeberg.org/joostkremers/visual-fill-column"))]) + (visual-fill-column . [(20240223 2340) ((emacs (25 1))) "fill-column for visual-line-mode" tar ((:commit . "5b9f9309bdf040b72bb2c3d99d1d8a0f0d98c308") (:authors ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainers ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm") (:url . "https://codeberg.org/joostkremers/visual-fill-column"))]) (visual-regexp . [(20210502 2019) ((cl-lib (0 2))) "A regexp/replace command for Emacs with interactive visual feedback" tar ((:commit . "48457d42a5e0fe10fa3a9c15854f1f127ade09b5") (:authors ("Marko Bencun" . "mbencun@gmail.com")) (:maintainers ("Marko Bencun" . "mbencun@gmail.com")) (:maintainer "Marko Bencun" . "mbencun@gmail.com") (:keywords "regexp" "replace" "visual" "feedback") (:url . "https://github.com/benma/visual-regexp.el/"))]) (visual-regexp-steroids . [(20170222 253) ((visual-regexp (1 1))) "Extends visual-regexp to support other regexp engines" tar ((:commit . "a6420b25ec0fbba43bf57875827092e1196d8a9e") (:authors ("Marko Bencun" . "mbencun@gmail.com")) (:maintainers ("Marko Bencun" . "mbencun@gmail.com")) (:maintainer "Marko Bencun" . "mbencun@gmail.com") (:keywords "external" "foreign" "regexp" "replace" "python" "visual" "feedback") (:url . "https://github.com/benma/visual-regexp-steroids.el/"))]) (vlc . [(20200328 1143) ((emacs (25 1))) "VideoLAN VLC Media Player Control" tar ((:commit . "07c4a12904f2700fb8420c4e71395fd59a5e6faa") (:authors ("Xu Chunyang")) (:maintainers ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:keywords "tools") (:url . "https://github.com/xuchunyang/vlc.el"))]) @@ -5293,27 +5435,27 @@ (voca-builder . [(20161101 1645) ((popup (0 5 2))) "Helps you build up your vocabulary" tar ((:commit . "51573beec8cd8308477b0faf453aad93e17f57c5") (:authors ("Yi Tang" . "yi.tang.uk@me.com")) (:maintainers ("Yi Tang" . "yi.tang.uk@me.com")) (:maintainer "Yi Tang" . "yi.tang.uk@me.com") (:keywords "english" "vocabulary") (:url . "https://github.com/yitang/voca-builder"))]) (volatile-highlights . [(20230301 1402) nil "Minor mode for visual feedback on some operations." tar ((:commit . "fcf6e2778454ce514c189a7d1fe70e03ad81c325") (:authors ("K-talo Miyazaki ")) (:maintainers ("K-talo Miyazaki ")) (:maintainer "K-talo Miyazaki ") (:keywords "emulations" "convenience" "wp") (:url . "http://www.emacswiki.org/emacs/download/volatile-highlights.el"))]) (volume . [(20220904 1727) nil "tweak your sound card volume from Emacs" tar ((:commit . "050d3e6d2543a6771a13f95612055864679b6301") (:authors ("Daniel Brockman" . "daniel@brockman.se")) (:maintainers ("Daniel Brockman" . "daniel@brockman.se")) (:maintainer "Daniel Brockman" . "daniel@brockman.se") (:url . "http://www.brockman.se/software/volume-el/"))]) - (vs-dark-theme . [(20230415 435) ((emacs (24 1))) "Visual Studio IDE dark theme" tar ((:commit . "8906a2a593888eafc61c5c202260edaddd3e6c75") (:authors ("Jen-Chieh Shen")) (:maintainers ("Jen-Chieh Shen")) (:maintainer "Jen-Chieh Shen") (:url . "https://github.com/emacs-vs/vs-dark-theme"))]) - (vs-light-theme . [(20230415 434) ((emacs (24 1))) "Visual Studio IDE light theme" tar ((:commit . "dc633afc975b1cfaa1b7435f7425f5548ff1c35a") (:authors ("Jen-Chieh Shen")) (:maintainers ("Jen-Chieh Shen")) (:maintainer "Jen-Chieh Shen") (:url . "https://github.com/emacs-vs/vs-light-theme"))]) + (vs-dark-theme . [(20240223 1002) ((emacs (24 1))) "Visual Studio IDE dark theme" tar ((:commit . "52006b40c7293f524ecb99d3899db7d95c77b317") (:authors ("Jen-Chieh Shen")) (:maintainers ("Jen-Chieh Shen")) (:maintainer "Jen-Chieh Shen") (:url . "https://github.com/emacs-vs/vs-dark-theme"))]) + (vs-light-theme . [(20240223 1002) ((emacs (24 1))) "Visual Studio IDE light theme" tar ((:commit . "36f583c6b36cab827394548a8c9647c3fd066bb1") (:authors ("Jen-Chieh Shen")) (:maintainers ("Jen-Chieh Shen")) (:maintainer "Jen-Chieh Shen") (:url . "https://github.com/emacs-vs/vs-light-theme"))]) (vscdark-theme . [(20191212 107) ((emacs (24 1))) "VS Code Dark+ like theme" tar ((:commit . "f419553e2a2f091a8bc257fb5ab520326e93ddd4") (:authors ("Alexander L. Belikoff")) (:maintainers ("Alexander L. Belikoff")) (:maintainer "Alexander L. Belikoff") (:url . "https://github.com/abelikoff/vscdark-theme"))]) (vscode-dark-plus-theme . [(20230725 1703) nil "Default Visual Studio Code Dark+ theme" tar ((:commit . "65420ca73b543e1e7955905bea1a8d7e5fe6c5ff") (:authors ("Ian Y.E. Pan")) (:maintainers ("Ian Y.E. Pan")) (:maintainer "Ian Y.E. Pan") (:url . "https://github.com/ianpan870102/vscode-dark-plus-emacs-theme"))]) (vscode-icon . [(20230330 2206) ((emacs (25 1))) "Utility package to provide Vscode style icons" tar ((:commit . "3976bc2e7e2fe0068ae59c11d226f67e0e87aaea") (:authors ("James Nguyen" . "james@jojojames.com")) (:maintainers ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com") (:keywords "files" "tools") (:url . "https://github.com/jojojames/vscode-icon-emacs"))]) - (vterm . [(20230417 424) ((emacs (25 1))) "Fully-featured terminal emulator" tar ((:commit . "94e2b0b2b4a750e7907dacd5b4c0584900846dd1") (:authors ("Lukas Fürmetz" . "fuermetz@mailbox.org")) (:maintainers ("Lukas Fürmetz" . "fuermetz@mailbox.org")) (:maintainer "Lukas Fürmetz" . "fuermetz@mailbox.org") (:keywords "terminals") (:url . "https://github.com/akermu/emacs-libvterm"))]) - (vterm-toggle . [(20230610 139) ((emacs (25 1)) (vterm (0 0 1))) "Toggles between the vterm buffer and other buffers." tar ((:commit . "b189a2bb068123c962ed0d917409e5afa68715f5") (:authors (nil . "jixiuf jixiuf@qq.com")) (:maintainers (nil . "jixiuf jixiuf@qq.com")) (:maintainer nil . "jixiuf jixiuf@qq.com") (:keywords "vterm" "terminals") (:url . "https://github.com/jixiuf/vterm-toggle"))]) + (vterm . [(20240318 1617) ((emacs (25 1))) "Fully-featured terminal emulator" tar ((:commit . "303decd923ef83a184b861d34081fd8635484a03") (:authors ("Lukas Fürmetz" . "fuermetz@mailbox.org")) (:maintainers ("Lukas Fürmetz" . "fuermetz@mailbox.org")) (:maintainer "Lukas Fürmetz" . "fuermetz@mailbox.org") (:keywords "terminals") (:url . "https://github.com/akermu/emacs-libvterm"))]) + (vterm-toggle . [(20230912 246) ((emacs (25 1)) (vterm (0 0 1))) "Toggles between the vterm buffer and other buffers." tar ((:commit . "06cb4f3c565e46470a3c4505c11e26066d869715") (:authors (nil . "jixiuf jixiuf@qq.com")) (:maintainers (nil . "jixiuf jixiuf@qq.com")) (:maintainer nil . "jixiuf jixiuf@qq.com") (:keywords "vterm" "terminals") (:url . "https://github.com/jixiuf/vterm-toggle"))]) (vtm . [(20200921 338) nil "Manages vterm buffers with configuration files" tar ((:commit . "d770fd8cff7c24688199392ad93c01485c6a9569") (:keywords "convenience") (:url . "https://github.com/laishulu/emacs-vterm-manager"))]) (vue-html-mode . [(20180428 2035) nil "Major mode for editing Vue.js templates" tar ((:commit . "361a9fa117f044c3072dc5a7344ff7be31725849") (:authors ("Adam Niederer" . "adam.niederer@gmail.com")) (:maintainers ("Adam Niederer" . "adam.niederer@gmail.com")) (:maintainer "Adam Niederer" . "adam.niederer@gmail.com") (:keywords "languages" "vue" "template") (:url . "http://github.com/AdamNiederer/vue-html-mode"))]) - (vue-mode . [(20190415 231) ((mmm-mode (0 5 5)) (vue-html-mode (0 2)) (ssass-mode (0 2)) (edit-indirect (0 1 4))) "Major mode for vue component based on mmm-mode" tar ((:commit . "031edd1f97db6e7d8d6c295c0e6d58dd128b9e71") (:authors ("codefalling" . "code.falling@gmail.com")) (:maintainers ("codefalling" . "code.falling@gmail.com")) (:maintainer "codefalling" . "code.falling@gmail.com") (:keywords "languages"))]) - (vuiet . [(20220218 1024) ((emacs (26 1)) (lastfm (1 1)) (versuri (1 0)) (s (1 12 0)) (bind-key (2 4)) (mpv (0 1 0))) "The music player and explorer for Emacs" tar ((:commit . "aed3272b95fc73fd78712ff7dcfc05916f382fed") (:authors ("Mihai Olteanu" . "mihai_olteanu@fastmail.fm")) (:maintainers ("Mihai Olteanu" . "mihai_olteanu@fastmail.fm")) (:maintainer "Mihai Olteanu" . "mihai_olteanu@fastmail.fm") (:keywords "multimedia") (:url . "https://github.com/mihaiolteanu/vuiet"))]) - (vulpea . [(20230706 1130) ((emacs (27 2)) (org (9 4 4)) (org-roam (2 0 0)) (s (1 12)) (dash (2 19))) "A collection of org-roam note-taking functions" tar ((:commit . "de199a16e294056e2368a2e031b19008cf9f9e52") (:authors ("Boris Buliga" . "boris@d12frosted.io")) (:maintainers ("Boris Buliga" . "boris@d12frosted.io")) (:maintainer "Boris Buliga" . "boris@d12frosted.io") (:url . "https://github.com/d12frosted/vulpea"))]) - (vunit-mode . [(20230813 815) ((hydra (0 14 0)) (emacs (24 3))) "VUnit Runner Interface" tar ((:commit . "24c43fbc1daddadeecea64276dbd9c6ba769e850") (:authors ("Lukas Lichtl" . "support@embed-me.com")) (:maintainers ("Lukas Lichtl" . "support@embed-me.com")) (:maintainer "Lukas Lichtl" . "support@embed-me.com") (:keywords "vunit" "python" "tools") (:url . "https://github.com/embed-me"))]) + (vue-mode . [(20240101 333) ((mmm-mode (0 5 5)) (vue-html-mode (0 2)) (ssass-mode (0 2)) (edit-indirect (0 1 4))) "Major mode for vue component based on mmm-mode" tar ((:commit . "3a8056bc6ea6458265efb91067c7467860d2c118") (:authors ("codefalling" . "code.falling@gmail.com")) (:maintainers ("codefalling" . "code.falling@gmail.com")) (:maintainer "codefalling" . "code.falling@gmail.com") (:keywords "languages") (:url . "https://github.com/AdamNiederer/vue-mode"))]) + (vuiet . [(20231231 1051) ((emacs (26 1)) (lastfm (1 1)) (versuri (1 0)) (s (1 12 0)) (bind-key (2 4)) (mpv (0 1 0)) (ivy (0 14 2))) "The music player and explorer for Emacs" tar ((:commit . "25d79860b165f04d7d39395138ed4f23e982132f") (:authors ("Mihai Olteanu" . "mihai_olteanu@fastmail.fm")) (:maintainers ("Mihai Olteanu" . "mihai_olteanu@fastmail.fm")) (:maintainer "Mihai Olteanu" . "mihai_olteanu@fastmail.fm") (:keywords "multimedia") (:url . "https://github.com/mihaiolteanu/vuiet"))]) + (vulpea . [(20231113 717) ((emacs (27 2)) (org (9 4 4)) (org-roam (2 0 0)) (s (1 12)) (dash (2 19))) "A collection of org-roam note-taking functions" tar ((:commit . "e1ea8480daf3e480effdd7ba3799126295a4a59a") (:authors ("Boris Buliga" . "boris@d12frosted.io")) (:maintainers ("Boris Buliga" . "boris@d12frosted.io")) (:maintainer "Boris Buliga" . "boris@d12frosted.io") (:url . "https://github.com/d12frosted/vulpea"))]) + (vunit-mode . [(20230913 1754) ((hydra (0 14 0)) (emacs (24 3))) "VUnit Runner Interface" tar ((:commit . "a2126892f17a48c857682b6455f963a3fb7e07f0") (:authors ("Lukas Lichtl" . "support@embed-me.com")) (:maintainers ("Lukas Lichtl" . "support@embed-me.com")) (:maintainer "Lukas Lichtl" . "support@embed-me.com") (:keywords "vunit" "python" "tools") (:url . "https://github.com/embed-me"))]) (vyper-mode . [(20180707 1935) ((emacs (24 3))) "Major mode for the Vyper programming language" tar ((:commit . "323dfddfc38f0b11697e9ebaf04d1b53297e54e5") (:authors ("Alex Stokes" . "r.alex.stokes@gmail.com")) (:maintainers ("Alex Stokes" . "r.alex.stokes@gmail.com")) (:maintainer "Alex Stokes" . "r.alex.stokes@gmail.com") (:keywords "languages") (:url . "https://github.com/ralexstokes/vyper-mode"))]) (w32-browser . [(20170101 1954) nil "Run Windows application associated with a file." tar ((:commit . "e5c60eafd8f8d3546a0fa295ad5af2414d36b4e6") (:authors ("Emacs Wiki, Drew Adams")) (:maintainers (nil . "Drew Adams (concat \"drew.adams\" \"@\" \"oracle\" \".com\")")) (:maintainer nil . "Drew Adams (concat \"drew.adams\" \"@\" \"oracle\" \".com\")") (:keywords "mouse" "dired" "w32" "explorer") (:url . "http://www.emacswiki.org/w32-browser.el"))]) (w32-ime . [(20201107 143) ((emacs (24 4))) "Windows IME UI/UX controler" tar ((:commit . "9c62273dce0ba685a591577885b1e216ba832ec1") (:authors ("H.Miyashita") ("MIYOSHI Masanori") ("KOBAYASHI Yasuhiro") ("NTEmacsJP") ("ksugita (gnupack)") ("rzl24ozi") ("TANE") ("Masamichi Hosoda" . "trueroad@trueroad.jp") ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Masamichi Hosoda" . "trueroad@trueroad.jp")) (:maintainer "Masamichi Hosoda" . "trueroad@trueroad.jp") (:url . "https://github.com/trueroad/w32-ime.el"))]) - (w3m . [(20230818 722) nil "an Emacs interface to w3m" tar ((:commit . "e19e72815a3256d6de5347d8878ea6a00f01bc0b") (:keywords "w3m" "www" "hypermedia"))]) + (w3m . [(20231023 653) nil "an Emacs interface to w3m" tar ((:commit . "55baf2bcb1a583d3baae1d37ad0e17b0480ffd02") (:keywords "w3m" "www" "hypermedia"))]) (wacspace . [(20180311 2350) ((dash (1 2 0)) (cl-lib (0 2))) "The WACky WorkSPACE manager for emACS" tar ((:commit . "54d19aab6fd2bc5945b7ffc58104e695064927e2") (:authors ("Emanuel Evans" . "emanuel.evans@gmail.com")) (:maintainer "Emanuel Evans" . "emanuel.evans@gmail.com") (:keywords "workspace") (:url . "http://github.com/shosti/wacspace.el"))]) (waf-mode . [(20170403 1940) nil "Waf integration for Emacs" tar ((:commit . "91c761336aa137b85b88b53b3f0cc60786d70800") (:authors ("Denys Valchuk" . "dvalchuk@gmail.com")) (:maintainers ("Denys Valchuk" . "dvalchuk@gmail.com")) (:maintainer "Denys Valchuk" . "dvalchuk@gmail.com") (:url . "https://bitbucket.org/dvalchuk/waf-mode"))]) (waher-theme . [(20141115 1230) ((emacs (24 1))) "Emacs 24 theme based on waher for st2 by dduckster" tar ((:commit . "60d31519fcfd8e797723d47961b255ae2f2e2c0a") (:authors ("Jasonm23" . "jasonm23@gmail.com")) (:maintainers ("Jasonm23" . "jasonm23@gmail.com")) (:maintainer "Jasonm23" . "jasonm23@gmail.com") (:url . "https://github.com/jasonm23/emacs-waher-theme"))]) - (wakatime-mode . [(20221110 1632) nil "Automatic time tracking extension for WakaTime" tar ((:commit . "ef923829912c3854d230834f81083814b7c9d992") (:authors ("Gabor Torok" . "gabor@20y.hu")) (:maintainers ("Alan Hamlett" . "alan@wakatime.com")) (:maintainer "Alan Hamlett" . "alan@wakatime.com") (:keywords "calendar" "comm"))]) + (wakatime-mode . [(20240203 1221) nil "Automatic time tracking extension for WakaTime" tar ((:commit . "25fb775178d16decb818b75f32fd23301c0f5da0") (:authors ("Gabor Torok" . "gabor@20y.hu")) (:maintainers ("Alan Hamlett" . "alan@wakatime.com")) (:maintainer "Alan Hamlett" . "alan@wakatime.com") (:keywords "calendar" "comm"))]) (wakib-keys . [(20220211 1304) ((emacs (24 4))) "Minor Mode for Modern Keybindings" tar ((:commit . "ed86134f91c532a38d2739dd15ea6cec879cbd8a") (:authors ("Abdulla Bubshait")) (:maintainers ("Abdulla Bubshait")) (:maintainer "Abdulla Bubshait") (:keywords "convenience" "keybindings" "keys") (:url . "https://github.com/darkstego/wakib-keys/"))]) (wal-mode . [(20220409 1214) ((emacs (25 1))) "A major mode for the WAL programming language" tar ((:commit . "16733847f04af1929e590ff3e41f554baa3ba640") (:authors ("Lucas Klemmer" . "lucas.klemmer@jku.at")) (:maintainers ("Lucas Klemmer" . "lucas.klemmer@jku.at")) (:maintainer "Lucas Klemmer" . "lucas.klemmer@jku.at") (:keywords "languages") (:url . "https://github.com/LucasKl/wal-major-mode"))]) (walkclj . [(20220719 1610) ((emacs (25)) (parseclj (0 1 0)) (treepy (0 1 0)) (a (1 0 0))) "Manipulate Clojure parse trees" tar ((:commit . "875ee7a350f5141f425c4b5350a630e1ee1795e8") (:authors ("Arne Brasseur")) (:maintainers ("Arne Brasseur")) (:maintainer "Arne Brasseur") (:keywords "languages") (:url . "https://github.com/plexus/walkclj"))]) @@ -5322,10 +5464,12 @@ (wallpreview . [(20220703 1108) ((emacs (24 4))) "Set wallpapers with image-dired" tar ((:commit . "6eae0549afdfe725b453ca4fb0878c728735892d") (:url . "https://github.com/nryotaro/wallpreview"))]) (wand . [(20220519 1214) nil "Magic wand for Emacs - Select and execute" tar ((:commit . "e4afc0469c818e7ce73ef31c38d911477947d72e") (:authors ("Ha-Duong Nguyen ")) (:maintainers ("Ha-Duong Nguyen ")) (:maintainer "Ha-Duong Nguyen ") (:keywords "extensions" "tools") (:url . "https://github.com/cmpitg/wand"))]) (wandbox . [(20170603 1231) ((emacs (24)) (request (0 3 0)) (s (1 10 0))) "Wandbox client" tar ((:commit . "e002fe41f2cd9b4ce2b1dc80b83301176e9117f1") (:authors ("KOBAYASHI Shigeru (kosh)" . "shigeru.kb@gmail.com")) (:maintainers ("KOBAYASHI Shigeru (kosh)" . "shigeru.kb@gmail.com")) (:maintainer "KOBAYASHI Shigeru (kosh)" . "shigeru.kb@gmail.com") (:keywords "tools") (:url . "https://github.com/kosh04/emacs-wandbox"))]) - (wanderlust . [(20230818 1424) ((emacs (24 5)) (apel (10 8)) (flim (1 14 9)) (semi (1 14 7))) "Yet Another Message Interface on Emacsen" tar ((:commit . "1389dcec6e3242948682eb3e3ce8ead8be2772d8"))]) + (wanderlust . [(20240229 1209) ((emacs (24 5)) (apel (10 8)) (flim (1 14 9)) (semi (1 14 7))) "Yet Another Message Interface on Emacsen" tar ((:commit . "e525f27d29e122bb8baefa1837816f9001fa5085"))]) (warm-night-theme . [(20161101 1428) ((emacs (24))) "Emacs 24 theme with a dark background." tar ((:commit . "020f084d23409b5035150508ba6e57c2509edd64") (:authors ("martin haesler")) (:maintainers ("martin haesler")) (:maintainer "martin haesler"))]) (wasp-mode . [(20230424 1307) ((emacs (24 3))) "A major mode for the Wasp programming language" tar ((:commit . "76198cdd5f0ece3770c3a586115caea3ea613169") (:authors ("XXIV")) (:maintainers ("XXIV")) (:maintainer "XXIV") (:keywords "files" "wasp") (:url . "https://github.com/thechampagne/wasp-mode"))]) + (wat-ts-mode . [(20231006 223) ((emacs (29 1))) "Major modes for webassembly text formats using tree sitter" tar ((:commit . "d2bbd7dbb57482dc0407574d61b2dcad31b96204") (:authors ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainers ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainer "Noah Peart" . "noah.v.peart@gmail.com") (:keywords "wasm" "wat" "wast" "languages" "tree-sitter") (:url . "https://github.com/nverno/wat-ts-mode"))]) (watch-buffer . [(20120331 2044) nil "run a shell command when saving a buffer" tar ((:commit . "a01cf15608c5bf91df253104053041ca1afdf411") (:authors ("Michael Steger" . "mjsteger1@gmail.com")) (:maintainers ("Michael Steger" . "mjsteger1@gmail.com")) (:maintainer "Michael Steger" . "mjsteger1@gmail.com") (:keywords "automation" "convenience") (:url . "https://github.com/mjsteger/watch-buffer"))]) + (wavedrom-mode . [(20230913 2246) ((emacs (29 1))) "WaveDrom Integration" tar ((:commit . "b360aa39c87e033b65676d3ac542bc26fd5abd34") (:authors ("Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com")) (:maintainers ("Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com")) (:maintainer "Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com") (:keywords "fpga" "asic" "tools") (:url . "https://github.com/gmlarumbe/wavedrom-mode"))]) (wavefront-obj-mode . [(20170808 1716) nil "Major mode for Wavefront obj files" tar ((:commit . "34027915de6496460d8e68b5991dd24d47d54859") (:authors ("Sasha Kovar" . "sasha-emacs@arcocene.org")) (:maintainers ("Sasha Kovar" . "sasha-emacs@arcocene.org")) (:maintainer "Sasha Kovar" . "sasha-emacs@arcocene.org") (:url . "http://github.com/abend/wavefront-obj-mode"))]) (wc-goal-mode . [(20140829 1359) nil "Running word count with goals (minor mode)" tar ((:commit . "bf21ab9c5a449bcc20dd207a4915dcec218d2699") (:authors ("Benjamin Beckwith")) (:maintainers ("Benjamin Beckwith")) (:maintainer "Benjamin Beckwith") (:url . "https://github.com/bnbeckwith/wc-goal-mode"))]) (wc-mode . [(20210418 47) ((emacs (24 1))) "Running word count with goals (minor mode)" tar ((:commit . "63be1433b8a63cdc3239cc751e36360429c42b51") (:authors ("Benjamin Beckwith")) (:maintainers ("Benjamin Beckwith")) (:maintainer "Benjamin Beckwith") (:url . "https://github.com/bnbeckwith/wc-mode"))]) @@ -5335,11 +5479,12 @@ (web . [(20141231 2001) ((dash (2 9 0)) (s (1 5 0))) "useful HTTP client" tar ((:commit . "483188dac4bc6b409b985c9dae45f3324a425efd") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainers ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:keywords "lisp" "http" "hypermedia") (:url . "http://github.com/nicferrier/emacs-web"))]) (web-beautify . [(20161115 2247) nil "Format HTML, CSS and JavaScript/JSON" tar ((:commit . "e1b45321d8c11b404b12c8e55afe55eaa7c84ee9") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainers ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com") (:url . "https://github.com/yasuyk/web-beautify"))]) (web-completion-data . [(20160318 848) nil "Shared completion data for ac-html and company-web" tar ((:commit . "c272c94e8a71b779c29653a532f619acad433a4f") (:authors ("Olexandr Sydorchuk" . "olexandr.syd@gmail.com")) (:maintainers ("Olexandr Sydorchuk" . "olexandr.syd@gmail.com")) (:maintainer "Olexandr Sydorchuk" . "olexandr.syd@gmail.com") (:keywords "html" "auto-complete" "company") (:url . "https://github.com/osv/web-completion-data"))]) - (web-mode . [(20230329 601) ((emacs (23 1))) "major mode for editing web templates" tar ((:commit . "57856ba64b9382811b35df0d9ab0a24aede0c1f0") (:authors ("François-Xavier Bois")) (:maintainers ("François-Xavier Bois" . "fxbois@gmail.com")) (:maintainer "François-Xavier Bois" . "fxbois@gmail.com") (:keywords "languages") (:url . "https://web-mode.org"))]) + (web-mode . [(20240315 1838) ((emacs (23 1))) "major mode for editing web templates" tar ((:commit . "a9d21841224da3295f2dd0a90022f5e435e48046") (:authors ("François-Xavier Bois")) (:maintainers ("François-Xavier Bois" . "fxbois@gmail.com")) (:maintainer "François-Xavier Bois" . "fxbois@gmail.com") (:keywords "languages") (:url . "https://web-mode.org"))]) (web-mode-edit-element . [(20190531 852) ((emacs (24 4)) (web-mode (14))) "Helper-functions for attribute- and element-handling" tar ((:commit . "ad5d7e4dc2420bdd00ce65d9adffbd38a5904afa") (:authors ("Julian T. Knabenschuh" . "jtkdevelopments@gmail.com")) (:maintainers ("Julian T. Knabenschuh" . "jtkdevelopments@gmail.com")) (:maintainer "Julian T. Knabenschuh" . "jtkdevelopments@gmail.com") (:keywords "languages" "convenience") (:url . "https://github.com/jtkDvlp/web-mode-edit-element"))]) (web-narrow-mode . [(20170407 210) ((web-mode (14 0 27))) "quick narrow code block in web-mode" tar ((:commit . "b25fae07844875d5b62d14b98442c88817b7e139") (:authors ("Qquanwei" . "quanwei9958@126.com")) (:maintainers ("Johan Andersson" . "quanwei9958@126.com")) (:maintainer "Johan Andersson" . "quanwei9958@126.com") (:keywords "web-mode" "react" "narrow" "web") (:url . "https://github.com/Qquanwei/web-narrow-mode"))]) (web-search . [(20190620 602) ((emacs (24 3))) "Open a web search" tar ((:commit . "a22cbdc663a1895d5a5b69de91e1e3b9eb64b92f") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainers ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:keywords "web" "search") (:url . "https://github.com/xuchunyang/web-search.el"))]) (web-server . [(20210708 2242) ((emacs (24 1)) (cl-lib (0 6))) "Emacs Web Server" tar ((:commit . "6357a1c2d1718778503f7ee0909585094117525b") (:authors ("Eric Schulte" . "schulte.eric@gmail.com")) (:maintainers ("Eric Schulte" . "schulte.eric@gmail.com")) (:maintainer "Eric Schulte" . "schulte.eric@gmail.com") (:keywords "http" "server" "network") (:url . "https://github.com/eschulte/emacs-web-server"))]) + (webdriver . [(20231016 1331) ((emacs (27 1))) "WebDriver local end implementation" tar ((:commit . "f73fc53aea5733d630e66d8da178218983d5898a") (:authors ("Mauro Aranda" . "maurooaranda@gmail.com")) (:maintainers ("Mauro Aranda" . "maurooaranda@gmail.com")) (:maintainer "Mauro Aranda" . "maurooaranda@gmail.com") (:keywords "tools") (:url . "https://gitlab.com/mauroaranda/emacs-webdriver"))]) (webkit-color-picker . [(20180325 736) ((emacs (26 0)) (posframe (0 1 0))) "Insert and adjust colors using Webkit Widgets" tar ((:commit . "765cac80144cad4bc0bf59025ea0199f0486f737") (:authors ("Ozan Sener" . "hi@ozan.email")) (:maintainers ("Ozan Sener" . "hi@ozan.email")) (:maintainer "Ozan Sener" . "hi@ozan.email") (:keywords "tools") (:url . "https://github.com/osener/emacs-webkit-color-picker"))]) (weblio . [(20210718 1410) ((request (0 3 3)) (emacs (25 1))) "Look up Japanese words on Weblio.jp" tar ((:commit . "2b4b0c206440b5c63960214feacfceb0c26231c7") (:authors ("Simon Zelazny")) (:maintainers ("Simon Zelazny")) (:maintainer "Simon Zelazny") (:keywords "langauges" "i18n") (:url . "https://github.com/pzel/weblio"))]) (weblogger . [(20110926 1618) ((xml-rpc (1 6 8))) "Weblog maintenance via XML-RPC APIs" tar ((:commit . "40cfbfc69be6a619173804441db2f407e3fa1731") (:keywords "weblog" "blogger" "cms" "movable" "type" "openweblog" "blog") (:url . "http://launchpad.net/weblogger-el"))]) @@ -5352,16 +5497,16 @@ (weechat-alert . [(20160416 1248) ((weechat (0 3 1)) (cl-lib (0 5)) (alert (1 2))) "Weechat notifier using alerts" tar ((:commit . "a8fd557c8f335322f132c1c6c08b6741d6394e2e") (:authors ("Andreas Klein" . "git@kungi.org")) (:maintainers ("Andreas Klein" . "git@kungi.org")) (:maintainer "Andreas Klein" . "git@kungi.org") (:keywords "irc" "chat" "network" "weechat") (:url . "https://github.com/kungi/weechat-alert"))]) (weibo . [(20150307 2242) ((cl-lib (0 5))) "Weibo client for Emacs" tar ((:commit . "a8abb50b7602fe15fe2bc6400ac29780e956b390") (:authors ("Austin" . "austiny.cn@gmail.com")) (:maintainers ("Austin" . "austiny.cn@gmail.com")) (:maintainer "Austin" . "austiny.cn@gmail.com") (:keywords "weibo") (:url . "https://github.com/austin-----/weibo.emacs"))]) (weyland-yutani-theme . [(20210802 2251) ((emacs (24 1))) "Emacs theme based off Alien movie franchise" tar ((:commit . "e89a63a62e071180c9cdd9067679fadc3f7bf796") (:authors ("Joe Staursky")) (:maintainers ("Joe Staursky")) (:maintainer "Joe Staursky") (:url . "https://github.com/jstaursky/weyland-yutani-theme"))]) - (wfnames . [(20230819 1122) ((emacs (24 4))) "Edit filenames" tar ((:commit . "ea336972227a5ffe29fed0aaa1ccaadf90743db3") (:authors ("Thierry Volpiatto" . "thievol@posteo.net")) (:maintainers ("Thierry Volpiatto" . "thievol@posteo.net")) (:maintainer "Thierry Volpiatto" . "thievol@posteo.net") (:url . "https://github.com/thierryvolpiatto/wfnames"))]) + (wfnames . [(20230924 1538) ((emacs (24 4))) "Edit filenames" tar ((:commit . "19b452fb698a5ba3b0f1d6e7d69a5e19af2c83e7") (:authors ("Thierry Volpiatto" . "thievol@posteo.net")) (:maintainers ("Thierry Volpiatto" . "thievol@posteo.net")) (:maintainer "Thierry Volpiatto" . "thievol@posteo.net") (:url . "https://github.com/thierryvolpiatto/wfnames"))]) (wgrep . [(20230203 1214) ((emacs (25 1))) "Writable grep buffer" tar ((:commit . "b4d69280d8a6a5ded1597e02afbaa811a160383b") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "grep" "edit" "extensions") (:url . "http://github.com/mhayashi1120/Emacs-wgrep/raw/master/wgrep.el"))]) (wgrep-ack . [(20230207 1125) ((emacs (25 1)) (wgrep (3 0 0))) "Writable ack-and-a-half buffer" tar ((:commit . "edf768732a56840db6879706b64c5773c316d619") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "grep" "edit" "extensions") (:url . "http://github.com/mhayashi1120/Emacs-wgrep/raw/master/wgrep-ack.el"))]) (wgrep-ag . [(20230202 315) ((emacs (25 1)) (wgrep (3 0 0))) "Writable ag buffer" tar ((:commit . "ff3cf631b6842432daa59bf604049ca916cce73b") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "grep" "edit" "extensions") (:url . "http://github.com/mhayashi1120/Emacs-wgrep/raw/master/wgrep-ag.el"))]) - (wgrep-deadgrep . [(20230405 936) ((wgrep (2 3 0))) "Writable deadgrep buffer and apply the changes to files" tar ((:commit . "3584e9ba43287d712e0c17df5328211c174e9c60") (:authors ("Masahiro Hayashi , Iku Iwasa" . "iku.iwasa@gmail.com")) (:maintainers ("Masahiro Hayashi , Iku Iwasa" . "iku.iwasa@gmail.com")) (:maintainer "Masahiro Hayashi , Iku Iwasa" . "iku.iwasa@gmail.com") (:keywords "grep" "edit" "extensions") (:url . "http://github.com/mhayashi1120/Emacs-wgrep/raw/master/wgrep-deadgrep.el"))]) + (wgrep-deadgrep . [(20231215 1145) ((wgrep (2 3 0)) (emacs (25 1))) "Writable deadgrep buffer and apply the changes to files" tar ((:commit . "07cd02dddefd99bd4128100579ecaca929a57d6e") (:authors ("Masahiro Hayashi , Iku Iwasa" . "iku.iwasa@gmail.com")) (:maintainers ("Masahiro Hayashi , Iku Iwasa" . "iku.iwasa@gmail.com")) (:maintainer "Masahiro Hayashi , Iku Iwasa" . "iku.iwasa@gmail.com") (:keywords "grep" "edit" "extensions") (:url . "http://github.com/mhayashi1120/Emacs-wgrep/raw/master/wgrep-deadgrep.el"))]) (wgrep-helm . [(20230202 315) ((emacs (25 1)) (wgrep (3 0 0))) "Writable helm-grep-mode buffer" tar ((:commit . "ff3cf631b6842432daa59bf604049ca916cce73b") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "grep" "edit" "extensions") (:url . "http://github.com/mhayashi1120/Emacs-wgrep/raw/master/wgrep-helm.el"))]) (wgrep-pt . [(20230207 1125) ((emacs (25 1)) (wgrep (3 0 0))) "Writable pt buffer" tar ((:commit . "edf768732a56840db6879706b64c5773c316d619") (:authors ("Masahiro Hayashi , Bailey Ling" . "bling@live.ca")) (:maintainers ("Masahiro Hayashi , Bailey Ling" . "bling@live.ca")) (:maintainer "Masahiro Hayashi , Bailey Ling" . "bling@live.ca") (:keywords "grep" "edit" "extensions") (:url . "http://github.com/mhayashi1120/Emacs-wgrep/raw/master/wgrep-pt.el"))]) - (wgsl-mode . [(20221127 2129) ((emacs (24))) "Syntax highlighting for the WebGPU Shading Language" tar ((:commit . "e7856d6755d93e40ed74598a68ef5f607322618b") (:authors ("Anthony Cowley")) (:maintainers ("Anthony Cowley")) (:maintainer "Anthony Cowley") (:keywords "wgsl" "c") (:url . "https://github.com/acowley/wgsl-mode"))]) + (wgsl-mode . [(20231118 1944) ((emacs (24))) "Syntax highlighting for the WebGPU Shading Language" tar ((:commit . "003a4e99491fa2a0b777f74658e6ffc70fd3a8c2") (:authors ("Anthony Cowley")) (:maintainers ("Anthony Cowley")) (:maintainer "Anthony Cowley") (:keywords "wgsl" "c") (:url . "https://github.com/acowley/wgsl-mode"))]) (what-the-commit . [(20150901 1316) nil "Random commit message generator" tar ((:commit . "42604410cfd5be715c8aa730aef4673773454e8b") (:authors ("Dan Barbarito" . "dan@barbarito.me")) (:maintainers ("Dan Barbarito" . "dan@barbarito.me")) (:maintainer "Dan Barbarito" . "dan@barbarito.me") (:keywords "git" "commit" "message") (:url . "http://barbarito.me/"))]) - (which-key . [(20230712 2151) ((emacs (24 4))) "Display available keybindings in popup" tar ((:commit . "df6b0cb8449812e7fb200bc852107fa7eb708496") (:authors ("Justin Burkett" . "justin@burkett.cc")) (:maintainers ("Justin Burkett" . "justin@burkett.cc")) (:maintainer "Justin Burkett" . "justin@burkett.cc") (:url . "https://github.com/justbur/emacs-which-key"))]) + (which-key . [(20240312 2033) ((emacs (24 4))) "Display available keybindings in popup" tar ((:commit . "96911a1d3faf8426a33241f4821319e98421f380") (:authors ("Justin Burkett" . "justin@burkett.cc")) (:maintainers ("Justin Burkett" . "justin@burkett.cc")) (:maintainer "Justin Burkett" . "justin@burkett.cc"))]) (which-key-posframe . [(20230313 1841) ((emacs (26 0)) (posframe (1 4 0)) (which-key (3 6 0))) "Using posframe to show which-key" tar ((:commit . "e4a9ce9a1b20de550fca51f14d055821980d534a") (:authors ("Yanghao Xie" . "yhaoxie@gmail.com")) (:maintainers ("Yanghao Xie" . "yhaoxie@gmail.com")) (:maintainer "Yanghao Xie" . "yhaoxie@gmail.com") (:keywords "convenience" "bindings" "tooltip") (:url . "https://github.com/emacsorphanage/which-key-posframe"))]) (whiley-mode . [(20220501 2219) ((emacs (24 1))) "Major mode for Whiley language" tar ((:commit . "e7cc4759d46be589d421a2235af6771bcde9ae33") (:authors ("David J. Pearce" . "dave01001110@gmail.com")) (:maintainers ("David J. Pearce" . "dave01001110@gmail.com")) (:maintainer "David J. Pearce" . "dave01001110@gmail.com") (:keywords "languages") (:url . "http://github.com/Whiley/WhileyEmacsMode"))]) (whitaker . [(20210203 1149) ((emacs (25))) "Comint interface for Whitaker's Words" tar ((:commit . "a6fda24ccb69a18c0706633326d5cc4fcfaed83a") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com") (:keywords "processes"))]) @@ -5369,7 +5514,7 @@ (white-theme . [(20160917 1743) ((emacs (24))) "Minimalistic light color theme inspired by basic-theme" tar ((:commit . "e9e6d5b9d43da6eb15e86f5fbc8b1ba83abe8c78") (:authors ("Anler Hernandez Peral" . "inbox@anler.me")) (:maintainers ("Anler Hernandez Peral" . "inbox@anler.me")) (:maintainer "Anler Hernandez Peral" . "inbox@anler.me") (:keywords "color" "theme" "minimal" "basic" "simple" "white") (:url . "http://github.com/anler/white-theme.el"))]) (whitespace-cleanup-mode . [(20210510 533) ((emacs (24 1))) "Intelligently call whitespace-cleanup on save" tar ((:commit . "b108b73ddf8f7e747d5a20a681560171e02ad037") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "convenience") (:url . "https://github.com/purcell/whitespace-cleanup-mode"))]) (whizzml-mode . [(20201013 239) ((emacs (24 4))) "Programming mode for editing WhizzML files" tar ((:commit . "3dce3be0c32b9b2d259e462b4b27c530af47466a") (:authors ("Jose Antonio Ortega Ruiz" . "jao@bigml.com")) (:maintainers ("Jose Antonio Ortega Ruiz" . "jao@bigml.com")) (:maintainer "Jose Antonio Ortega Ruiz" . "jao@bigml.com") (:keywords "languages" "lisp"))]) - (whois . [(20230510 919) ((emacs (24))) "Syntax highlighted domain name queries using system whois" tar ((:commit . "bf131b99bb3f5583d27d1c72ef0fbd829ef85664") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "network" "comm") (:url . "https://github.com/lassik/emacs-whois"))]) + (whois . [(20240315 1929) ((emacs (24))) "Syntax highlighted domain name queries using system whois" tar ((:commit . "d4466b296721fa94b2ceab1c51bc9bfd8bbf4e0a") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "network" "comm") (:url . "https://github.com/lassik/emacs-whois"))]) (whole-line-or-region . [(20201214 650) ((emacs (24 1)) (cl-lib (0 6))) "Operate on current line if region undefined" tar ((:commit . "ba193b2034388bbc384cb04093150fca56f7e262") (:authors ("Joe Casadonte" . "emacs@northbound-train.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "convenience" "wp") (:url . "https://github.com/purcell/whole-line-or-region"))]) (why-this . [(20221129 817) ((emacs (27 1))) "Why is this line here? Ask version control" tar ((:commit . "5203d9379afaf6703746823a580c804e1dd98e08") (:authors ("Akib Azmain Turja" . "akib@disroot.org")) (:maintainers ("Akib Azmain Turja" . "akib@disroot.org")) (:maintainer "Akib Azmain Turja" . "akib@disroot.org") (:keywords "tools" "convenience" "vc") (:url . "https://codeberg.org/akib/emacs-why-this"))]) (wide-column . [(20170925 1613) nil "Calls functions dependant on column position." tar ((:commit . "ce9ef4675485a7bea381077866368ef875226b10") (:authors ("Phillip Lord" . "p.lord@russet.org.uk")) (:maintainers ("Phillip Lord" . "p.lord@russet.org.uk")) (:maintainer "Phillip Lord" . "p.lord@russet.org.uk") (:keywords "minor mode" "cursor colour" "column width"))]) @@ -5377,9 +5522,9 @@ (wiki-nav . [(20230304 2212) ((button-lock (1 0 2)) (nav-flash (1 0 0))) "Simple file navigation using [[WikiStrings]]" tar ((:commit . "1f7a89ca05b6167af7d1337ad23a5d923486caac") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "mouse" "button" "hypermedia" "navigation") (:url . "http://github.com/rolandwalker/button-lock"))]) (wiki-summary . [(20181010 1824) ((emacs (24))) "View Wikipedia summaries in Emacs easily." tar ((:commit . "fa41ab6e50b3b80e54148af9d4bac18fd0405000") (:authors ("Danny Gratzer")) (:maintainers ("Danny Gratzer")) (:maintainer "Danny Gratzer") (:keywords "wikipedia" "utility") (:url . "https://github.com/jozefg/wiki-summary.el"))]) (wikinfo . [(20220906 1709) ((emacs (27 1))) "Scrape Wikipedia Infoboxes" tar ((:commit . "bf395c9aaf6be7fda371be611005737d52417fec") (:authors ("Nicholas Vollmer" . "progfolio@protonmail.com")) (:maintainers ("Nicholas Vollmer" . "progfolio@protonmail.com")) (:maintainer "Nicholas Vollmer" . "progfolio@protonmail.com") (:keywords "org" "convenience") (:url . "https://github.com/progfolio/wikinfo"))]) - (wikinforg . [(20230630 116) ((emacs (27 1)) (wikinfo (0 0 0)) (org (9 3))) "Org-mode wikinfo integration" tar ((:commit . "525ab7d72ffbfbb57868f430a67cad010904ccf5") (:authors ("Nicholas Vollmer" . "progfolio@protonmail.com")) (:maintainers ("Nicholas Vollmer" . "progfolio@protonmail.com")) (:maintainer "Nicholas Vollmer" . "progfolio@protonmail.com") (:keywords "org" "convenience") (:url . "https://github.com/progfolio/wikinforg"))]) - (wildcharm-light-theme . [(20230826 941) ((emacs (24 1))) "Port of vim-wildcharm (light) colorscheme" tar ((:commit . "62c35130078fa182eb1946e99cfd86dac6bda921") (:authors ("Maxim Kim" . "habamax@gmail.com")) (:maintainers ("Maxim Kim" . "habamax@gmail.com")) (:maintainer "Maxim Kim" . "habamax@gmail.com") (:url . "https://github.com/habamax/wildcharm-theme"))]) - (wildcharm-theme . [(20230830 213) ((emacs (24 1))) "Port of vim-wildcharm colorscheme" tar ((:commit . "8978899bb3a2b186fa342026a1c83899fa403988") (:authors ("Maxim Kim" . "habamax@gmail.com")) (:maintainers ("Maxim Kim" . "habamax@gmail.com")) (:maintainer "Maxim Kim" . "habamax@gmail.com") (:url . "https://github.com/habamax/wildcharm-theme"))]) + (wikinforg . [(20240104 603) ((emacs (27 1)) (wikinfo (0 0 0)) (org (9 3))) "Org-mode wikinfo integration" tar ((:commit . "6c06f297a45c457e5bd1e2b55e870cd102e2a878") (:authors ("Nicholas Vollmer" . "progfolio@protonmail.com")) (:maintainers ("Nicholas Vollmer" . "progfolio@protonmail.com")) (:maintainer "Nicholas Vollmer" . "progfolio@protonmail.com") (:keywords "org" "convenience") (:url . "https://github.com/progfolio/wikinforg"))]) + (wildcharm-light-theme . [(20231127 537) ((emacs (24 1))) "Port of vim-wildcharm (light) colorscheme" tar ((:commit . "58662e13c179106ea7780e71bd3ef3c1cf74e929") (:authors ("Maxim Kim" . "habamax@gmail.com")) (:maintainers ("Maxim Kim" . "habamax@gmail.com")) (:maintainer "Maxim Kim" . "habamax@gmail.com") (:url . "https://github.com/habamax/wildcharm-theme"))]) + (wildcharm-theme . [(20231127 537) ((emacs (24 1))) "Port of vim-wildcharm colorscheme" tar ((:commit . "58662e13c179106ea7780e71bd3ef3c1cf74e929") (:authors ("Maxim Kim" . "habamax@gmail.com")) (:maintainers ("Maxim Kim" . "habamax@gmail.com")) (:maintainer "Maxim Kim" . "habamax@gmail.com") (:url . "https://github.com/habamax/wildcharm-theme"))]) (wilt . [(20180220 854) ((emacs (24 3)) (dash (2 12 0)) (s (1 10 0))) "An extensions for calculating WILT in a buffer." tar ((:commit . "04dbe37fa35d0b24c791421785d2c97a8cbfe2cc") (:authors ("Austin Bingham" . "austin@sixty-north.com")) (:maintainers ("Austin Bingham" . "austin@sixty-north.com")) (:maintainer "Austin Bingham" . "austin@sixty-north.com") (:url . "https://github.com/sixty-north/emacs-wilt"))]) (win-switch . [(20161009 1627) nil "fast, dynamic bindings for window-switching/resizing" tar ((:commit . "954eb5e4c5737f0c06368c42a7f1c3dd374d782f") (:authors ("Christopher Genovese" . "genovese@cmu.edu")) (:maintainers ("Christopher R. Genovese" . "genovese@cmu.edu")) (:maintainer "Christopher R. Genovese" . "genovese@cmu.edu") (:keywords "window" "switch" "key bindings" "ergonomic" "efficient") (:url . "http://www.stat.cmu.edu/~genovese/emacs/win-switch/"))]) (windata . [(20090830 1040) nil "convert window configuration to list" tar ((:commit . "a723fc446ceaec23d5f29ecc8245d94c99d91625") (:authors (nil . "wenbinye@gmail.com")) (:maintainers (nil . "wenbinye@gmail.com")) (:maintainer nil . "wenbinye@gmail.com") (:keywords "convenience" "frames"))]) @@ -5399,33 +5544,33 @@ (winum . [(20190911 1607) ((cl-lib (0 5)) (dash (2 13 0))) "Navigate windows and frames using numbers." tar ((:commit . "098249c65042ee0308b8236d1ee838c8da8fdf25") (:authors ("Thomas de Beauchêne" . "thomas.de.beauchene@gmail.com")) (:maintainers ("Thomas de Beauchêne" . "thomas.de.beauchene@gmail.com")) (:maintainer "Thomas de Beauchêne" . "thomas.de.beauchene@gmail.com") (:keywords "convenience" "frames" "windows" "multi-screen") (:url . "http://github.com/deb0ch/winum.el"))]) (wisp-mode . [(20220529 1522) ((emacs (24 4))) "Tools for wisp: the Whitespace-to-Lisp preprocessor" tar ((:commit . "1a01003d400db8a42838cabcb26c06d627246a17") (:authors ("Arne Babenhauserheide" . "arne_bab@web.de")) (:maintainers ("Arne Babenhauserheide" . "arne_bab@web.de")) (:maintainer "Arne Babenhauserheide" . "arne_bab@web.de") (:keywords "languages" "lisp" "scheme") (:url . "http://www.draketo.de/english/wisp"))]) (wispjs-mode . [(20170720 1919) ((clojure-mode (0))) "Major mode for Wisp code." tar ((:commit . "60f9f5fd9d1556e2d008939f67eb1b1d0f325fa8") (:authors ("Kris Jenkins" . "krisajenkins@gmail.com")) (:maintainers ("Kris Jenkins" . "krisajenkins@gmail.com")) (:maintainer "Kris Jenkins" . "krisajenkins@gmail.com") (:url . "https://github.com/krisajenkins/wispjs-mode"))]) - (with-editor . [(20230829 1917) ((emacs (25 1)) (compat (29 1 4 1))) "Use the Emacsclient as $EDITOR" tar ((:commit . "d5f3f06cb830311e60c58f656988ef37c05a99e0") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "processes" "terminals") (:url . "https://github.com/magit/with-editor"))]) + (with-editor . [(20240101 2226) ((emacs (25 1)) (compat (29 1 4 1))) "Use the Emacsclient as $EDITOR" tar ((:commit . "d43db3c58c34d4dbc3ce6f68ec24fecf3452b20e") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "processes" "terminals") (:url . "https://github.com/magit/with-editor"))]) (with-emacs . [(20220814 444) ((emacs (24 4))) "Evaluate Emacs Lisp expressions in a separate Emacs process" tar ((:commit . "fb9ef454a4bb2d6de3415807b4858a20a9cc0dad") (:authors ("Gong Qijian" . "gongqijian@gmail.com")) (:maintainers ("Gong Qijian" . "gongqijian@gmail.com")) (:maintainer "Gong Qijian" . "gongqijian@gmail.com") (:keywords "tools") (:url . "https://github.com/twlz0ne/with-emacs.el"))]) (with-namespace . [(20130407 1822) ((dash (1 1 0)) (loop (1 1))) "interoperable elisp namespaces" tar ((:commit . "36828a40428c8e53c117f2df830b2f7a59ddd306") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:keywords "namespaces"))]) (with-proxy . [(20200510 414) ((emacs (24 4))) "Evaluate expressions with proxy" tar ((:commit . "93b1ed2f3060f305009fa71f4fb5bb10173a10e3") (:authors ("Gong Qijian" . "gongqijian@gmail.com")) (:maintainers ("Gong Qijian" . "gongqijian@gmail.com")) (:maintainer "Gong Qijian" . "gongqijian@gmail.com") (:keywords "comm") (:url . "https://github.com/twlz0ne/with-proxy.el"))]) - (with-shell-interpreter . [(20200828 1217) ((emacs (25 1)) (cl-lib (0 6 1))) "Helper for shell command APIs" tar ((:commit . "45b7d6ad63165c82a95966b291abbfe305d3ada2") (:keywords "processes" "terminals") (:url . "https://github.com/p3r7/with-shell-interpreter"))]) + (with-shell-interpreter . [(20230916 1420) ((emacs (25 1)) (cl-lib (0 6 1))) "Helper for shell command APIs" tar ((:commit . "bef977d8058d26d82ab11a7227c88b3011edd127") (:keywords "processes" "terminals") (:url . "https://github.com/p3r7/with-shell-interpreter"))]) (with-simulated-input . [(20210527 2337) ((emacs (24 4))) "A macro to simulate user input non-interactively" tar ((:commit . "ee4d2b75fd99bac3de40675b0a0e03529718f59f") (:authors ("Ryan C. Thompson" . "rct@thompsonclan.org") ("Nikita Bloshchanevich" . "nikblos@outlook.com")) (:maintainers ("Ryan C Thompson" . "rct@thompsonclan.org")) (:maintainer "Ryan C Thompson" . "rct@thompsonclan.org") (:keywords "lisp" "tools" "extensions") (:url . "https://github.com/DarwinAwardWinner/with-simulated-input"))]) (with-venv . [(20210925 2336) ((cl-lib (0 5)) (emacs (24 4))) "Execute with Python virtual environment activated" tar ((:commit . "773192d892ec0341e023d8b5e80639f8eb79f2a5") (:authors ("10sr <8.slashes [at] gmail [dot] com>")) (:maintainers ("10sr <8.slashes [at] gmail [dot] com>")) (:maintainer "10sr <8.slashes [at] gmail [dot] com>") (:keywords "processes" "python" "venv") (:url . "https://github.com/10sr/with-venv-el"))]) (wn-mode . [(20151110 552) ((emacs (24))) "numeric window switching shortcuts" tar ((:commit . "f05c3151523e529af5a0a3fa8c948b61fb369f6e") (:authors ("Anonymous")) (:maintainers ("Luís Oliveira" . "luismbo@gmail.com")) (:maintainer "Luís Oliveira" . "luismbo@gmail.com") (:keywords "buffers" "windows" "switching-windows") (:url . "https://github.com/luismbo/wn-mode"))]) - (wolfram . [(20221111 816) nil "Wolfram Alpha Integration" tar ((:commit . "e3e8bbc70adf544022dfbd3e95b8904d70e71471") (:authors ("Hans Sjunnesson" . "hans.sjunnesson@gmail.com")) (:maintainers ("Hans Sjunnesson" . "hans.sjunnesson@gmail.com")) (:maintainer "Hans Sjunnesson" . "hans.sjunnesson@gmail.com") (:keywords "math"))]) + (wolfram . [(20231220 1950) nil "Wolfram Alpha Integration" tar ((:commit . "743c92f88bb3b6a77bc84ac2221adc6222cebb94") (:authors ("Hans Sjunnesson" . "hans.sjunnesson@gmail.com")) (:maintainers ("Hans Sjunnesson" . "hans.sjunnesson@gmail.com")) (:maintainer "Hans Sjunnesson" . "hans.sjunnesson@gmail.com") (:keywords "math"))]) (wolfram-mode . [(20180307 13) ((emacs (24 3))) "Mathematica editing and inferior mode." tar ((:commit . "be680190cac6ccf579dbce107deaae495928d1b3") (:authors ("Daichi Mochihashi ")) (:maintainers ("Daichi Mochihashi ")) (:maintainer "Daichi Mochihashi ") (:keywords "languages" "processes" "tools") (:url . "https://github.com/kawabata/wolfram-mode/"))]) (wonderland . [(20130913 119) ((dash (2 0 0)) (dash-functional (1 0 0)) (multi (2 0 0)) (emacs (24))) "declarative configuration for Emacsen" tar ((:commit . "28cf6b37000c395ece9519db53147fb826a42bc4") (:authors ("Christina Whyte" . "kurisu.whyte@gmail.com")) (:maintainers ("Christina Whyte" . "kurisu.whyte@gmail.com")) (:maintainer "Christina Whyte" . "kurisu.whyte@gmail.com") (:keywords "configuration" "profile" "wonderland") (:url . "http://github.com/kurisuwhyte/emacs-wonderland"))]) - (wordel . [(20230818 1324) ((emacs (27 1))) "An Elisp implementation of \"Wordle\" (aka \"Lingo\")" tar ((:commit . "70171a21cbe53e407b86440bf7ee93d39cb5ebde") (:authors ("Nicholas Vollmer" . "iarchivedmywholelife@gmail.com")) (:maintainers ("Nicholas Vollmer" . "iarchivedmywholelife@gmail.com")) (:maintainer "Nicholas Vollmer" . "iarchivedmywholelife@gmail.com") (:keywords "games") (:url . "https://github.com/progfolio/wordel"))]) + (wordel . [(20240104 603) ((emacs (27 1))) "An Elisp implementation of \"Wordle\" (aka \"Lingo\")" tar ((:commit . "38a05283c014812c0a54207aa6146f163c707fa5") (:authors ("Nicholas Vollmer" . "iarchivedmywholelife@gmail.com")) (:maintainers ("Nicholas Vollmer" . "iarchivedmywholelife@gmail.com")) (:maintainer "Nicholas Vollmer" . "iarchivedmywholelife@gmail.com") (:keywords "games") (:url . "https://github.com/progfolio/wordel"))]) (wordgen . [(20170803 1820) ((emacs (24)) (cl-lib (0 5))) "Random word generator" tar ((:commit . "aacad928ae99a953e034a831dfd0ebdf7d52ac1d") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainers ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com") (:url . "https://github.com/Fanael/wordgen.el"))]) (wordnut . [(20180313 443) ((emacs (24 4))) "Major mode interface to WordNet" tar ((:commit . "feac531404041855312c1a046bde7ea18c674915"))]) - (wordreference . [(20230710 1203) ((emacs (28 1))) "Interface for wordreference.com" tar ((:commit . "00e563c3b5f1634c8f43516d0e5a9674db7b6099") (:authors ("Marty Hiatt ")) (:maintainers ("Marty Hiatt ")) (:maintainer "Marty Hiatt ") (:keywords "convenience" "translate" "wp" "dictionary") (:url . "https://codeberg.org/martianh/wordreference.el"))]) + (wordreference . [(20240318 2135) ((emacs (28 1))) "Interface for wordreference.com" tar ((:commit . "6cd9e43c809267fc37e21e99d49ded4e4731b48a") (:authors ("Marty Hiatt ")) (:maintainers ("Marty Hiatt ")) (:maintainer "Marty Hiatt ") (:keywords "convenience" "translate" "wp" "dictionary") (:url . "https://codeberg.org/martianh/wordreference.el"))]) (wordsmith-mode . [(20210715 1517) nil "Syntax analysis and NLP text-processing in Emacs (OSX-only)" tar ((:commit . "5d40ceaa2b8d41ab3634ca377ceb6a74deeb2287") (:authors ("istib" . "istib@thebati.net")) (:maintainers ("istib" . "istib@thebati.net")) (:maintainer "istib" . "istib@thebati.net"))]) (worf . [(20220102 835) ((swiper (0 11 0)) (ace-link (0 1 0)) (hydra (0 13 0)) (zoutline (0 1 0))) "A warrior does not press so many keys! (in org-mode)" tar ((:commit . "8681241e118585824cd256e5b026978bf06c7e58") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "lisp") (:url . "https://github.com/abo-abo/worf"))]) (workgroups . [(20110726 1641) nil "workgroups for windows (for Emacs)" tar ((:commit . "9572b3492ee09054dc329f64ed846c962b395e39") (:authors ("tlh" . "thunkout@gmail.com")) (:maintainers ("tlh" . "thunkout@gmail.com")) (:maintainer "tlh" . "thunkout@gmail.com") (:keywords "session" "management" "window-configuration" "persistence"))]) (workgroups2 . [(20230328 1331) ((emacs (25 1))) "save&load multiple named workspaces (or \"workgroups\")" tar ((:commit . "aff9d76b7be5eed33f30be2fabf111818749cbd5") (:authors ("Sergey Pashinin ")) (:maintainers ("Sergey Pashinin ")) (:maintainer "Sergey Pashinin ") (:keywords "session" "management" "window-configuration" "persistence") (:url . "https://github.com/pashinin/workgroups2"))]) - (workroom . [(20230123 1630) ((emacs (25 1)) (project (0 3 0)) (compat (28 1 2 2))) "Named rooms for work without irrelevant distracting buffers" tar ((:commit . "360420501a239f74bff60941d28052fc19a92bce") (:authors ("Akib Azmain Turja" . "akib@disroot.org")) (:maintainers ("Akib Azmain Turja" . "akib@disroot.org")) (:maintainer "Akib Azmain Turja" . "akib@disroot.org") (:keywords "tools" "convenience") (:url . "https://codeberg.org/akib/emacs-workroom"))]) + (workroom . [(20230926 1631) ((emacs (25 1)) (project (0 3 0)) (compat (28 1 2 2))) "Named rooms for work without irrelevant distracting buffers" tar ((:commit . "cb8654191b23c9b02a79660c3d8c969709c6fcbe") (:authors ("Akib Azmain Turja" . "akib@disroot.org")) (:maintainers ("Akib Azmain Turja" . "akib@disroot.org")) (:maintainer "Akib Azmain Turja" . "akib@disroot.org") (:keywords "tools" "convenience") (:url . "https://codeberg.org/akib/emacs-workroom"))]) (world-time-mode . [(20140627 807) nil "show whole days of world-time diffs" tar ((:commit . "ce7a3b45c87eb24cfe61eee453175d64f741d7cc") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainers ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:keywords "tools" "calendar"))]) (wotd . [(20170328 1948) ((emacs (24 4)) (org (8 2 10))) "Fetch word-of-the-day from multiple online sources" tar ((:commit . "d2937a3d91e014f8028a1f33d21c18cc0b065a64") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainers ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions"))]) (wrap-region . [(20140117 720) ((dash (1 0 3))) "Wrap text with punctation or tag" tar ((:commit . "5a910ad23ebb0649e644bf62ad042587341da5da") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainers ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:keywords "speed" "convenience") (:url . "http://github.com/rejeep/wrap-region"))]) (wren-mode . [(20221227 227) ((emacs (24 3))) "A major mode for the Wren programming language" tar ((:commit . "70b1b89f565679a15c8c9c1a9bda98b0d163e83e") (:authors ("XXIV")) (:maintainers ("XXIV")) (:maintainer "XXIV") (:keywords "files" "wren") (:url . "https://github.com/thechampagne/wren-mode"))]) (writefreely . [(20221221 1456) ((emacs (24 3)) (org (9 0)) (ox-gfm (0 0)) (request (0 3))) "Push your Org files as markdown to a writefreely instance" tar ((:commit . "db70444eb5fbe0820754574d70b1ae44967607dc") (:authors ("Daniel Gomez ")) (:maintainers ("Daniel Gomez ")) (:maintainer "Daniel Gomez ") (:keywords "convenience") (:url . "https://github.com/dangom/writefreely.el"))]) (writegood-mode . [(20220511 2109) nil "Polish up poor writing on the fly" tar ((:commit . "d54eadeedb8bf3aa0e0a584c0a7373c69644f4b8") (:authors ("Benjamin Beckwith")) (:maintainers ("Benjamin Beckwith")) (:maintainer "Benjamin Beckwith") (:keywords "writing" "weasel-words" "grammar") (:url . "http://github.com/bnbeckwith/writegood-mode"))]) - (writeroom-mode . [(20220426 2046) ((emacs (25 1)) (visual-fill-column (2 2))) "Minor mode for distraction-free writing" tar ((:commit . "a736205c194d7525feb1e1f10f4186c7b2b62bef") (:authors ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainers ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm") (:keywords "text") (:url . "https://github.com/joostkremers/writeroom-mode"))]) + (writeroom-mode . [(20231103 931) ((emacs (25 1)) (visual-fill-column (2 2))) "Minor mode for distraction-free writing" tar ((:commit . "f4d035e91d20bf1dd3f2857b9cc344f844979a78") (:authors ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainers ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm") (:keywords "text") (:url . "https://github.com/joostkremers/writeroom-mode"))]) (ws-butler . [(20201117 1528) nil "Unobtrusively remove trailing whitespace." tar ((:commit . "e3a38d93e01014cd47bf5af4924459bd145fd7c4") (:authors ("Le Wang")) (:maintainers ("Le Wang")) (:maintainer "Le Wang") (:url . "https://github.com/lewang/ws-butler"))]) (wsd-mode . [(20191031 1211) nil "Emacs major-mode for www.websequencediagrams.com" tar ((:commit . "44aac55afb57cb540559aa1015f9ad2d770dd5c8") (:authors ("Jostein Kjønigsen" . "jostein@gmail.com")) (:maintainers ("Jostein Kjønigsen" . "jostein@gmail.com")) (:maintainer "Jostein Kjønigsen" . "jostein@gmail.com") (:keywords "wsd" "diagrams" "design" "process" "modelling" "uml") (:url . "https://github.com/josteink/wsd-mode"))]) (wttrin . [(20170614 1206) ((emacs (24 4)) (xterm-color (1 0))) "Emacs frontend for weather web service wttr.in" tar ((:commit . "df5427ce2a5ad4dab652dbb1c4a1834d7ddc2abc") (:authors ("Carl X. Su" . "bcbcarl@gmail.com") ("ono hiroko (kuanyui)" . "azazabc123@gmail.com")) (:maintainers ("Carl X. Su" . "bcbcarl@gmail.com")) (:maintainer "Carl X. Su" . "bcbcarl@gmail.com") (:keywords "comm" "weather" "wttrin") (:url . "https://github.com/bcbcarl/emacs-wttrin"))]) @@ -5434,7 +5579,7 @@ (wwtime . [(20151122 1610) nil "Insert a time of day with appropriate world-wide localization" tar ((:commit . "d04d8fa814b5d3644efaeb28f25520ada69acbbd") (:authors ("Norman Walsh" . "ndw@nwalsh.com")) (:maintainers ("Norman Walsh" . "ndw@nwalsh.com")) (:maintainer "Norman Walsh" . "ndw@nwalsh.com") (:keywords "time"))]) (www-synonyms . [(20170128 2251) ((request (0 2 0)) (cl-lib (0 5))) "insert synonym for a word" tar ((:commit . "7e37ea35064ff31c9945f0198a653647d408c936") (:authors ("Bernhard Specht" . "bernhard@specht.net")) (:maintainers ("Bernhard Specht" . "bernhard@specht.net")) (:maintainer "Bernhard Specht" . "bernhard@specht.net") (:keywords "lisp"))]) (x-path-walker . [(20220714 1056) ((helm-core (3 6 0))) "Navigation feature for JSON/XML/HTML based on path (imenu like)" tar ((:commit . "c91deaaba0d5cc9018008a39c96222deacba3868") (:authors (nil . "")) (:maintainers (nil . "")) (:maintainer nil . "") (:keywords "convenience"))]) - (x509-mode . [(20230818 634) ((emacs (25 1)) (compat (29 1 4 2))) "View certificates, CRLs and keys using OpenSSL" tar ((:commit . "fa9245fade7762c5550bac5608125dc64c93769e") (:authors ("Fredrik Axelsson" . "f.axelsson@gmail.com")) (:maintainers ("Fredrik Axelsson" . "f.axelsson@gmail.com")) (:maintainer "Fredrik Axelsson" . "f.axelsson@gmail.com") (:url . "https://github.com/jobbflykt/x509-mode"))]) + (x509-mode . [(20231215 850) ((emacs (25 1)) (compat (29 1 4 2))) "View certificates, CRLs and keys using OpenSSL" tar ((:commit . "b19260d9863f1f7e310154fef71b1f3bd0871241") (:authors ("Fredrik Axelsson" . "f.axelsson@gmail.com")) (:maintainers ("Fredrik Axelsson" . "f.axelsson@gmail.com")) (:maintainer "Fredrik Axelsson" . "f.axelsson@gmail.com") (:url . "https://github.com/jobbflykt/x509-mode"))]) (x86-lookup . [(20210412 2022) ((emacs (24 3)) (cl-lib (0 3))) "jump to x86 instruction documentation" tar ((:commit . "1573d61cc4457737b94624598a891c837fb52c16") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainers ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/x86-lookup"))]) (xbm-life . [(20210508 1640) ((emacs (24 1))) "A XBM version of Conway's Game of Life" tar ((:commit . "ec6abb0182068294a379cb49ad5346b1d757457d") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainers ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de") (:keywords "games") (:url . "https://depp.brause.cc/xbm-life"))]) (xcode-mode . [(20160907 1208) ((emacs (24 4)) (s (1 10 0)) (dash (2 11 0)) (multiple-cursors (1 0 0))) "A minor mode for emacs to perform Xcode like actions." tar ((:commit . "5b5f0a4f505d44840a4924b24e3ef73b8528d98b") (:authors ("Nickolas Lanasa" . "nick@nytekproductions.com")) (:maintainers ("Nickolas Lanasa" . "nick@nytekproductions.com")) (:maintainer "Nickolas Lanasa" . "nick@nytekproductions.com") (:keywords "conveniences"))]) @@ -5442,13 +5587,12 @@ (xcscope . [(20230626 2109) nil "cscope interface for (X)Emacs" tar ((:commit . "2f35b26428dd82c016941744f03aad97df80c47b") (:authors ("Darryl Okahata" . "darrylo@sonic.net") ("Dima Kogan" . "dima@secretsauce.net")) (:maintainers ("Dima Kogan" . "dima@secretsauce.net")) (:maintainer "Dima Kogan" . "dima@secretsauce.net") (:keywords "languages" "c") (:url . "https://github.com/dkogan/xcscope.el"))]) (xenops . [(20220821 1111) ((emacs (26 1)) (aio (1 0)) (auctex (12 2 0)) (avy (0 5 0)) (dash (2 18 0)) (f (0 20 0)) (s (1 12 0))) "A LaTeX editing environment for mathematical documents" tar ((:commit . "4d75c1cd5ee7afba62af3a39a1f43432b295c29c") (:authors ("Dan Davison" . "dandavison7@gmail.com")) (:maintainers ("Dan Davison" . "dandavison7@gmail.com")) (:maintainer "Dan Davison" . "dandavison7@gmail.com") (:url . "https://github.com/dandavison/xenops"))]) (xhair . [(20210801 222) ((emacs (24 3)) (vline (1 0))) "Highlight the current line and column" tar ((:commit . "c7bd7c501c3545aa99dadac386c882fe7c5edd9c") (:keywords "convenience" "faces" "maint") (:url . "https://github.com/Boruch-Baum/emacs-xhair"))]) - (xit-mode . [(20221006 717) ((emacs (24 1))) "A [x]it! major mode" tar ((:commit . "f9f8f07c54090f03107180b125c54e329493a1a7") (:keywords "xit" "todo" "tools" "convinience" "project") (:url . "https://github.com/ryanolsonx/xit-mode"))]) (xkcd . [(20220503 1109) ((json (1 3))) "View xkcd from Emacs" tar ((:commit . "80011da2e7def8f65233d4e0d790ca60d287081d") (:authors ("Vibhav Pant" . "vibhavp@gmail.com")) (:maintainers ("Vibhav Pant" . "vibhavp@gmail.com")) (:maintainer "Vibhav Pant" . "vibhavp@gmail.com") (:keywords "xkcd" "webcomic") (:url . "https://github.com/vibhavp/emacs-xkcd"))]) (xmind-org . [(20220907 1310) ((emacs (27 1)) (org-ml (5 3)) (dash (2 12))) "Import XMind mindmaps into Org" tar ((:commit . "79f0b1d95af2a1b8436cee2d3d6c6115d9c6483d") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainers ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:keywords "outlines" "wp" "files") (:url . "https://github.com/akirak/xmind-org-el"))]) (xml+ . [(20170727 2351) ((emacs (24 4)) (dash (2 12 0))) "Utilities for xml and html trees" tar ((:commit . "232fa863c08fc159b21dd58c39ea45dce3334895") (:authors ("Ben Dean" . "bendean837@gmail.com")) (:maintainers ("Ben Dean" . "bendean837@gmail.com")) (:maintainer "Ben Dean" . "bendean837@gmail.com") (:keywords "xml" "html") (:url . "https://github.com/bddean/xml-plus"))]) (xml-format . [(20191011 1159) ((emacs (25)) (reformatter (0 4))) "XML reformatter using xmllint" tar ((:commit . "2861c4e33e18b077112efa072316b031bca4236c") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainers ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee") (:keywords "languages") (:url . "https://github.com/wbolster/emacs-xml-format"))]) (xml-quotes . [(20200301 1222) nil "read quotations from an XML document" tar ((:commit . "8fc21e43b45f9a50b24642412f05afcc3a316a1f") (:authors ("Norman Walsh" . "ndw@nwalsh.com")) (:maintainers ("Norman Walsh" . "ndw@nwalsh.com")) (:maintainer "Norman Walsh" . "ndw@nwalsh.com") (:keywords "xml" "quotations") (:url . "https://github.com/ndw/xml-quotes"))]) - (xml-rpc . [(20221228 2346) ((emacs (24 1))) "An elisp implementation of clientside XML-RPC" tar ((:commit . "8272789df8a4deab4de7d50e63b73b7d0543bc7f") (:maintainers ("Mark A. Hershberger" . "mah@everybody.org")) (:maintainer "Mark A. Hershberger" . "mah@everybody.org") (:keywords "xml" "rpc" "network" "comm") (:url . "http://github.com/xml-rpc-el/xml-rpc-el"))]) + (xml-rpc . [(20231009 1432) ((emacs (24 1))) "An elisp implementation of clientside XML-RPC" tar ((:commit . "fb6183597be1361be02f46c9a53257ac1dd9715e") (:maintainers ("Mark A. Hershberger" . "mah@everybody.org")) (:maintainer "Mark A. Hershberger" . "mah@everybody.org") (:keywords "xml" "rpc" "network" "comm") (:url . "http://github.com/xml-rpc-el/xml-rpc-el"))]) (xmlgen . [(20170411 1317) nil "A DSL for generating XML." tar ((:commit . "dba66681f0c5e621a9e70e8afb34903c9ffe93c4") (:authors ("Philip Jackson" . "phil@shellarchive.co.uk")) (:maintainers ("Philip Jackson" . "phil@shellarchive.co.uk")) (:maintainer "Philip Jackson" . "phil@shellarchive.co.uk"))]) (xmlunicode . [(20230820 814) nil "Unicode support for XML" tar ((:commit . "5f1c3e48b90588eb56cec67d3efc869a4e95b03a") (:authors ("Norman Walsh" . "ndw@nwalsh.com")) (:maintainers ("Norman Walsh" . "ndw@nwalsh.com")) (:maintainer "Norman Walsh" . "ndw@nwalsh.com") (:keywords "utf-8" "unicode" "xml" "characters"))]) (xo . [(20160403 646) nil "XO linter integration with compilation mode" tar ((:commit . "72fcd867cfa332fdb82f732925cf8977e690af78") (:authors ("J.A" . "jer.github@gmail.com")) (:maintainers ("J.A" . "jer.github@gmail.com")) (:maintainer "J.A" . "jer.github@gmail.com") (:keywords "processes"))]) @@ -5462,21 +5606,21 @@ (xterm-keybinder . [(20160523 56) ((emacs (24 3)) (cl-lib (0 5)) (let-alist (1 0 1))) "Let you extra keybinds in xterm/urxvt" tar ((:commit . "b29c4f700b0fa0c9f627f6725b36462b8fab06d6") (:authors ("Yuta Yamada ")) (:maintainers ("Yuta Yamada ")) (:maintainer "Yuta Yamada ") (:keywords "convenient"))]) (xtest . [(20141214 1706) ((cl-lib (0 5))) "Simple Testing with Emacs & ERT" tar ((:commit . "8099be9c2d856f98489834ddb20a01c6fd8922f1") (:authors ("Mustafa Shameem")) (:maintainers ("Mustafa Shameem")) (:maintainer "Mustafa Shameem") (:keywords "testing" "ert") (:url . "https://github.com/promethial/xtest"))]) (xwidgete . [(20171118 2116) ((emacs (25))) "enhances usability of current xwidget browser" tar ((:commit . "e4e8410fe32176df85b46234717824519443fb04") (:authors ("Tu, Do Hoang" . "tuhdo1710@gmail.com")) (:maintainers ("Tu, Do Hoang")) (:maintainer "Tu, Do Hoang") (:keywords "xwidgete" "tools") (:url . "https://github.com/tuhdo/xwidgete"))]) - (xwidgets-reuse . [(20200817 147) ((emacs (26 1))) "Reuse xwidgets sessions to reduce resource consumption" tar ((:commit . "3f95d81bfce1b3c52f9dcf2890cd2559a5287a33") (:authors ("Boris Glavic" . "lordpretzel@gmail.com")) (:maintainers ("Boris Glavic" . "lordpretzel@gmail.com")) (:maintainer "Boris Glavic" . "lordpretzel@gmail.com") (:keywords "hypermedia") (:url . "https://github.com/lordpretzel/xwidgets-reuse"))]) + (xwidgets-reuse . [(20231205 1315) ((emacs (26 1))) "Reuse xwidgets sessions to reduce resource consumption" tar ((:commit . "4d5cfd24bc470def508e1301951d4057831d852f") (:authors ("Boris Glavic" . "lordpretzel@gmail.com")) (:maintainers ("Boris Glavic" . "lordpretzel@gmail.com")) (:maintainer "Boris Glavic" . "lordpretzel@gmail.com") (:keywords "hypermedia") (:url . "https://github.com/lordpretzel/xwidgets-reuse"))]) (xwiki-mode . [(20211112 511) ((emacs (27 1))) "Major mode for xwiki-formatted text" tar ((:commit . "8b6f2caead8ec804e8d7d37d87eb3b46aa96b6e8") (:authors ("Ackerley Tng" . "ackerleytng@gmail.com")) (:maintainers ("Ackerley Tng" . "ackerleytng@gmail.com")) (:maintainer "Ackerley Tng" . "ackerleytng@gmail.com") (:keywords "languages" "convenience" "tools") (:url . "https://github.com/ackerleytng/xwiki-mode"))]) (xwwp . [(20200917 643) ((emacs (26 1))) "Enhance xwidget webkit browser" tar ((:commit . "f67e070a6e1b233e60274deb717274b000923231") (:authors ("Damien Merenne")) (:maintainers ("Damien Merenne")) (:maintainer "Damien Merenne") (:keywords "convenience") (:url . "https://github.com/canatella/xwwp"))]) (xwwp-follow-link-helm . [(20200917 642) ((emacs (26 1)) (xwwp (0 1))) "Link navigation in `xwidget-webkit' sessions using `helm'" tar ((:commit . "99670ec37e2083eada9691a342441d2fa4589002") (:authors ("Damien Merenne")) (:maintainers ("Damien Merenne")) (:maintainer "Damien Merenne") (:keywords "convenience") (:url . "https://github.com/canatella/xwwp"))]) (xwwp-follow-link-ivy . [(20200917 642) ((emacs (26 1)) (xwwp (0 1))) "Link navigation in `xwidget-webkit' sessions using `ivy'" tar ((:commit . "1f1646feaf3328568da40200cc218337fbbabc1a") (:authors ("Damien Merenne")) (:maintainers ("Damien Merenne")) (:maintainer "Damien Merenne") (:keywords "convenience") (:url . "https://github.com/canatella/xwwp"))]) - (yabaki-theme . [(20230327 630) ((emacs (27 1))) "Yabaki, the cast shadow" tar ((:commit . "5face6a1194b039e09fe19238aa5db05450d7df1") (:authors ("David Goudou" . "david.goudou@gmail.com")) (:maintainers ("David Goudou" . "david.goudou@gmail.com")) (:maintainer "David Goudou" . "david.goudou@gmail.com") (:url . "https://github.com/seamacs/yabaki-theme"))]) + (yabaki-theme . [(20231004 2023) ((emacs (27 1))) "Yabaki, the cast shadow" tar ((:commit . "209f2be321509dac00631fff1b0f7ea01ba382de") (:authors ("David Goudou" . "david.goudou@gmail.com")) (:maintainers ("David Goudou" . "david.goudou@gmail.com")) (:maintainer "David Goudou" . "david.goudou@gmail.com") (:url . "https://codeberg.org/seahorse/yabaki-theme"))]) (yabin . [(20140206 351) nil "Yet Another Bignum package (A thin wrapper of calc.el)." tar ((:commit . "db8c404507560ef9147fcce2b94cd706fbfa03b5") (:authors ("Daisuke Kobayashi" . "d5884jp@gmail.com")) (:maintainers ("Daisuke Kobayashi" . "d5884jp@gmail.com")) (:maintainer "Daisuke Kobayashi" . "d5884jp@gmail.com") (:keywords "data"))]) (yafolding . [(20200119 1353) nil "Folding code blocks based on indentation" tar ((:commit . "4c1888ae45f9241516519ae0ae3a899f2efa05ba") (:authors ("Zeno Zeng" . "zenoofzeng@gmail.com")) (:maintainers ("Zeno Zeng" . "zenoofzeng@gmail.com")) (:maintainer "Zeno Zeng" . "zenoofzeng@gmail.com") (:keywords "folding"))]) (yagist . [(20160418 508) ((cl-lib (0 3))) "Yet Another Emacs integration for gist.github.com" tar ((:commit . "10da4baa272ff0f7052f17debecc340764c7003f") (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "tools") (:url . "https://github.com/mhayashi1120/yagist.el"))]) (yahtzee . [(20220221 803) ((emacs (24 3))) "The yahtzee game" tar ((:commit . "9b42ba4612d3043464414c08a3d60f6ad594566c") (:authors ("Dimitar Dimitrov" . "mail.mitko@gmail.com")) (:maintainers ("Dimitar Dimitrov" . "mail.mitko@gmail.com")) (:maintainer "Dimitar Dimitrov" . "mail.mitko@gmail.com") (:keywords "games") (:url . "https://github.com/drdv/yahtzee"))]) (yalinum . [(20130217 1043) nil "yet another display line numbers." tar ((:commit . "d3e0cbe3f4f5ca311e3298e684901d6fea3ad973") (:authors ("tm8st" . "tm8st@hotmail.co.jp")) (:maintainers ("tm8st" . "tm8st@hotmail.co.jp")) (:maintainer "tm8st" . "tm8st@hotmail.co.jp") (:keywords "convenience" "tools"))]) - (yaml . [(20230714 154) ((emacs (25 1))) "YAML parser for Elisp" tar ((:commit . "ee86566af1ed4975531ab3aa4eb4dba770c227f6") (:authors ("Zachary Romero" . "zkry@posteo.org")) (:maintainers ("Zachary Romero" . "zkry@posteo.org")) (:maintainer "Zachary Romero" . "zkry@posteo.org") (:keywords "tools") (:url . "https://github.com/zkry/yaml.el"))]) + (yaml . [(20231211 1501) ((emacs (25 1))) "YAML parser for Elisp" tar ((:commit . "70c4fcead97e9bd6594e418c922ae769818f4245") (:authors ("Zachary Romero" . "zkry@posteo.org")) (:maintainers ("Zachary Romero" . "zkry@posteo.org")) (:maintainer "Zachary Romero" . "zkry@posteo.org") (:keywords "tools") (:url . "https://github.com/zkry/yaml.el"))]) (yaml-imenu . [(20220406 1703) ((emacs (24 4)) (yaml-mode (0))) "Enhancement of the imenu support in yaml-mode." tar ((:commit . "c1fbba8b03a7bef4fc2b87404914fa9c6eb67b55") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainers ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:keywords "outlining" "convenience" "imenu") (:url . "https://github.com/knu/yaml-imenu.el"))]) - (yaml-mode . [(20230714 440) ((emacs (24 1))) "Major mode for editing YAML files" tar ((:commit . "13728b4b1b1bd33d3a754236a0f23e4c76d6ba91") (:authors ("Yoshiki Kurihara" . "clouder@gmail.com") ("Marshall T. Vandegrift" . "llasram@gmail.com")) (:maintainers ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de") (:keywords "data" "yaml") (:url . "https://github.com/yoshiki/yaml-mode"))]) - (yaml-pro . [(20230315 320) ((emacs (26 1)) (yaml (0 5 1))) "Parser-aided YAML editing features" tar ((:commit . "50fc911b9015708b77872dc60c53f4a4740bef1b") (:authors ("Zachary Romero")) (:maintainers ("Zachary Romero")) (:maintainer "Zachary Romero") (:keywords "tools") (:url . "https://github.com/zkry/yaml-pro"))]) + (yaml-mode . [(20240317 1602) ((emacs (24 1))) "Major mode for editing YAML files" tar ((:commit . "7b5ce294fb15c2c8926fa476d7218aa415550a2a") (:authors ("Yoshiki Kurihara" . "clouder@gmail.com") ("Marshall T. Vandegrift" . "llasram@gmail.com")) (:maintainers ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de") (:keywords "data" "yaml") (:url . "https://github.com/yoshiki/yaml-mode"))]) + (yaml-pro . [(20240313 307) ((emacs (26 1)) (yaml (0 5 1))) "Parser-aided YAML editing features" tar ((:commit . "775c0a4b82c79da0eb91620fb0cbbf6c8642815b") (:authors ("Zachary Romero")) (:maintainers ("Zachary Romero")) (:maintainer "Zachary Romero") (:keywords "tools") (:url . "https://github.com/zkry/yaml-pro"))]) (yaml-tomato . [(20151123 753) ((s (1 9))) "copy or show the yaml path currently under cursor." tar ((:commit . "1272c502fac6ce6b0f8b7f8a9beb353f0b35e13c") (:authors ("qrczeno")) (:maintainers ("qrczeno")) (:maintainer "qrczeno") (:keywords "yaml"))]) (yang-mode . [(20190507 724) nil "major mode for editing YANG files" tar ((:commit . "4b4ab4d4a79d37d6c31c6ea7cccbc425e0b1eded") (:authors ("Martin Bjorklund" . "mbj4668@gmail.com")) (:maintainers ("Martin Bjorklund" . "mbj4668@gmail.com")) (:maintainer "Martin Bjorklund" . "mbj4668@gmail.com"))]) (yankpad . [(20220201 2104) ((emacs (25 1))) "Paste snippets from an org-mode file" tar ((:commit . "927e6d26956ac7219b8a69d641acf486854fba16") (:authors ("Erik Sjöstrand")) (:maintainers ("Erik Sjöstrand")) (:maintainer "Erik Sjöstrand") (:keywords "abbrev" "convenience") (:url . "http://github.com/Kungsgeten/yankpad"))]) @@ -5486,24 +5630,25 @@ (yari . [(20151128 739) nil "Yet Another RI interface for Emacs" tar ((:commit . "a2cb9656ee5dfe1fc2ee3854f3079a1c8e85dbe9") (:authors ("Aleksei Gusev" . "aleksei.gusev@gmail.com")) (:maintainers ("Aleksei Gusev" . "aleksei.gusev@gmail.com")) (:maintainer "Aleksei Gusev" . "aleksei.gusev@gmail.com") (:keywords "tools"))]) (yarn-mode . [(20200208 2332) ((emacs (24 3))) "Major mode for yarn.lock files." tar ((:commit . "8239d4dc7d8a52fa1e3fa81bd32c904a359fcfc1") (:authors ("Nicolás Salas V." . "nikosalas@gmail.com")) (:maintainers ("Nicolás Salas V." . "nikosalas@gmail.com")) (:maintainer "Nicolás Salas V." . "nikosalas@gmail.com") (:keywords "convenience") (:url . "https://github.com/anachronic/yarn-mode"))]) (yascroll . [(20220212 1742) ((emacs (26 1))) "Yet Another Scroll Bar Mode" tar ((:commit . "b4669a6604a3093d3960c494874a7affc6b9c184") (:authors ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience") (:url . "https://github.com/emacsorphanage/yascroll"))]) - (yasnippet . [(20200604 246) ((cl-lib (0 5))) "Yet another snippet extension for Emacs" tar ((:commit . "5cbdbf0d2015540c59ed8ee0fcf4788effdf75b6") (:maintainers ("Noam Postavsky" . "npostavs@gmail.com")) (:maintainer "Noam Postavsky" . "npostavs@gmail.com") (:keywords "convenience" "emulation") (:url . "http://github.com/joaotavora/yasnippet"))]) - (yasnippet-capf . [(20230813 1906) ((emacs (25 1)) (yasnippet (0 14 0))) "Yasnippet Completion At Point Function" tar ((:commit . "40654214db7a44db3a99321447632b43a10fae57") (:authors ("Ellis Kenyő" . "me@elken.dev")) (:maintainers ("Ellis Kenyő" . "me@elken.dev")) (:maintainer "Ellis Kenyő" . "me@elken.dev") (:url . "https://github.com/elken/yasnippet-capf"))]) + (yasnippet . [(20240308 815) ((cl-lib (0 5)) (emacs (24 4))) "Yet another snippet extension for Emacs" tar ((:commit . "33587a8551b8f6991b607d3532062a384c010ce1") (:maintainers ("Noam Postavsky" . "npostavs@gmail.com")) (:maintainer "Noam Postavsky" . "npostavs@gmail.com") (:keywords "convenience" "emulation") (:url . "http://github.com/joaotavora/yasnippet"))]) + (yasnippet-capf . [(20240309 1316) ((emacs (25 1)) (yasnippet (0 14 0))) "Yasnippet Completion At Point Function" tar ((:commit . "9043f8275176a8f198ce8e81fadab1870fa165bb") (:authors ("Ellis Kenyő" . "me@elken.dev")) (:maintainers ("Ellis Kenyő" . "me@elken.dev")) (:maintainer "Ellis Kenyő" . "me@elken.dev") (:url . "https://github.com/elken/yasnippet-capf"))]) (yasnippet-lean . [(20220105 2251) ((yasnippet (0 8 0))) "Collection of snippets for the Lean prover" tar ((:commit . "c75485757cc8675ad4f36c1eb028d9d54dc21733") (:maintainers ("Simon Hudon" . "simon.hudon@gmail.com")) (:maintainer "Simon Hudon" . "simon.hudon@gmail.com") (:keywords "convenience" "snippets" "leanprover") (:url . "https://github.com/leanprover-community/yasnippet-lean"))]) - (yasnippet-snippets . [(20230815 820) ((yasnippet (0 8 0))) "Collection of yasnippet snippets" tar ((:commit . "063f54cea33f59defe9123549bf55ca342457a1c") (:authors ("Andrea Crotti" . "andrea.crotti.0@gmail.com")) (:maintainers ("Andrea Crotti" . "andrea.crotti.0@gmail.com")) (:maintainer "Andrea Crotti" . "andrea.crotti.0@gmail.com") (:keywords "snippets") (:url . "https://github.com/AndreaCrotti/yasnippet-snippets"))]) + (yasnippet-snippets . [(20240221 1621) ((yasnippet (0 8 0))) "Collection of yasnippet snippets" tar ((:commit . "e6ec9f1822913cea7dc67cde6aeb8f2625980950") (:authors ("Andrea Crotti" . "andrea.crotti.0@gmail.com")) (:maintainers ("Andrea Crotti" . "andrea.crotti.0@gmail.com")) (:maintainer "Andrea Crotti" . "andrea.crotti.0@gmail.com") (:keywords "snippets") (:url . "https://github.com/AndreaCrotti/yasnippet-snippets"))]) (yatemplate . [(20211115 1208) ((yasnippet (0 8 1)) (emacs (24 3))) "File templates with yasnippet" tar ((:commit . "275745ce1482edc08efb0b7807bc86d832bcc734") (:authors ("Wieland Hoffmann" . "themineo+yatemplate@gmail.com")) (:maintainers ("Wieland Hoffmann" . "themineo+yatemplate@gmail.com")) (:maintainer "Wieland Hoffmann" . "themineo+yatemplate@gmail.com") (:keywords "files" "convenience") (:url . "https://github.com/mineo/yatemplate"))]) (yatex . [(20221225 512) nil "Yet Another tex-mode for emacs //野鳥//" tar ((:commit . "157aa7974191bbb4707d26b05ce830282ad70ef5"))]) - (yaxception . [(20150105 1540) nil "Provide framework about exception like Java for Elisp" tar ((:commit . "4e94cf3e0b9b5631b0e90eb4b7de597ee7185875") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "exception" "error" "signal") (:url . "https://github.com/aki2o/yaxception"))]) + (yaxception . [(20240107 504) ((emacs (28)) (dash (2 19 1))) "Provide framework about exception like Java for Elisp" tar ((:commit . "5941de88b19752c14e0dce0d2bf562b1288055a0") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "exception" "error" "signal") (:url . "https://github.com/aki2o/yaxception"))]) (ycm . [(20150822 1836) nil "Emacs client for the YouCompleteMe auto-completion server." tar ((:commit . "4da8a14abcd0f4fa3235042ade2e12b5068c0601") (:authors ("Ajay Gopinathan" . "ajay@gopinathan.net")) (:maintainers ("Ajay Gopinathan" . "ajay@gopinathan.net")) (:maintainer "Ajay Gopinathan" . "ajay@gopinathan.net") (:keywords "c" "abbrev"))]) (ycmd . [(20190416 807) ((emacs (24 4)) (dash (2 13 0)) (s (1 11 0)) (deferred (0 5 1)) (cl-lib (0 6 1)) (let-alist (1 0 5)) (request (0 3 0)) (request-deferred (0 3 0)) (pkg-info (0 6))) "emacs bindings to the ycmd completion server" tar ((:commit . "6f4f7384b82203cccf208e3ec09252eb079439f9") (:url . "https://github.com/abingham/emacs-ycmd"))]) (ydk-mode . [(20170114 223) nil "Language support for Yu-Gi-Oh! deck files" tar ((:commit . "f3f125b29408e0b0a34fec27dcb7c02c5dbfd04e") (:authors ("Jackson Ray Hamilton" . "jackson@jacksonrayhamilton.com")) (:maintainers ("Jackson Ray Hamilton" . "jackson@jacksonrayhamilton.com")) (:maintainer "Jackson Ray Hamilton" . "jackson@jacksonrayhamilton.com") (:keywords "faces" "games" "languages" "ydk" "yugioh" "yu-gi-oh") (:url . "https://github.com/jacksonrayhamilton/ydk-mode"))]) - (yeetube . [(20230825 2152) ((emacs (27 2))) "YouTube & Invidious Front End" tar ((:commit . "11c85c1daf0684ff074fd1decdf5eda3b7caf309") (:authors ("Thanos Apollo" . "public@thanosapollo.com")) (:maintainers ("Thanos Apollo" . "public@thanosapollo.com")) (:maintainer "Thanos Apollo" . "public@thanosapollo.com") (:keywords "extensions" "youtube" "videos" "invidious") (:url . "https://git.sr.ht/~thanosapollo/yeetube.el"))]) + (yeetube . [(20240320 1033) ((emacs (27 2)) (compat (29 1 4 2))) "Scrape YouTube - Play with mpv & Download with yt-dlp |" tar ((:commit . "f9c28a527a60811c4b60bdd3730ca25c9522739a") (:authors ("Thanos Apollo" . "public@thanosapollo.org")) (:maintainers ("Thanos Apollo" . "public@thanosapollo.org")) (:maintainer "Thanos Apollo" . "public@thanosapollo.org") (:keywords "extensions" "youtube" "videos") (:url . "https://thanosapollo.org/projects/yeetube/"))]) (yequake . [(20200219 2323) ((emacs (25 2)) (dash (2 14 1))) "Drop-down frames, like Yakuake" tar ((:commit . "d18166e597414350117d0b82a29e509fc53c636d") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "convenience" "window-system" "frames") (:url . "http://github.com/alphapapa/yequake"))]) (yesql-ghosts . [(20150220 1237) ((s (1 9 0)) (dash (2 10 0)) (cider (0 8 0))) "Display ghostly yesql defqueries inline" tar ((:commit . "416198cdc4f316b0912af5e413410937b9b8432b") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainers ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))]) (yesterbox . [(20200327 52) ((emacs (24 3))) "Count number of inbox messages by day" tar ((:commit . "7d890ab3f012b1a48a0e8e437f5fcaeba9825fdc") (:authors ("Stephen J. Eglen" . "sje30@cam.ac.uk")) (:maintainers ("Stephen J. Eglen" . "sje30@cam.ac.uk")) (:maintainer "Stephen J. Eglen" . "sje30@cam.ac.uk") (:keywords "mail") (:url . "http://github.com/sje30/yesterbox"))]) (ynab . [(20200607 2008) ((emacs (26 3)) (cl-lib (0 5)) (ts (0 2))) "Major mode for YNAB (you need a budget)" tar ((:commit . "2c6beb4d2c4996017f6b3c62c26db52a61e5c479") (:authors ("Jim Anders ")) (:maintainers ("Jim Anders" . "jimanders223@gmail.com")) (:maintainer "Jim Anders" . "jimanders223@gmail.com") (:keywords "ynab" "budget" "convenience") (:url . "https://github.com/janders223/ynab.el"))]) (yoficator . [(20190509 1620) nil "Interactively yoficate Russian texts" tar ((:commit . "fa914f9648515bca54b5e558ca57d2b65fa57491") (:authors ("Eugene Minkovskii" . "emin@mccme.ru") ("Alexander Krotov" . "ilabdsf@gmail.com")) (:maintainers ("Eugene Minkovskii" . "emin@mccme.ru")) (:maintainer "Eugene Minkovskii" . "emin@mccme.ru") (:url . "https://gitlab.com/link2xt/yoficator"))]) (yoshi-theme . [(20230801 1741) nil "Theme named after my cat" tar ((:commit . "61e4250ae32744e5434c8faef7d059c7b157f81a") (:authors ("Tom Willemse" . "tom@ryuslash.org")) (:maintainers ("Tom Willemse" . "tom@ryuslash.org")) (:maintainer "Tom Willemse" . "tom@ryuslash.org") (:keywords "faces") (:url . "http://projects.ryuslash.org/yoshi-theme/"))]) - (youdao-dictionary . [(20200722 1705) ((popup (0 5 0)) (pos-tip (0 4 6)) (chinese-word-at-point (0 2)) (names (0 5)) (emacs (24))) "Youdao Dictionary interface for Emacs" tar ((:commit . "8a4815a43565b9bfd257246e4895b8bfafb9d573") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainers ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com") (:keywords "convenience" "chinese" "dictionary") (:url . "https://github.com/xuchunyang/youdao-dictionary.el"))]) + (youdao-dictionary . [(20231005 1920) ((popup (0 5 0)) (pos-tip (0 4 6)) (chinese-word-at-point (0 2)) (names (0 5)) (emacs (24))) "Youdao Dictionary interface for Emacs" tar ((:commit . "eae8efb1efd3fc82cfe87a357fe8f764116d94ef") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainers ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com") (:keywords "convenience" "chinese" "dictionary") (:url . "https://github.com/xuchunyang/youdao-dictionary.el"))]) + (youdotcom . [(20240207 1853) ((emacs (25 1))) "You.com search package" tar ((:commit . "0b835f143e88c3321006a3e48ac5190d071b872c") (:authors ("Samuel Michael Vanié" . "samuelmichaelvanie@gmail.com")) (:maintainers ("Samuel Michael Vanié" . "samuelmichaelvanie@gmail.com")) (:maintainer "Samuel Michael Vanié" . "samuelmichaelvanie@gmail.com") (:keywords "ai" "tools") (:url . "https://github.com/SamuelVanie/youdotcom.el"))]) (youtube-sub-extractor . [(20221116 653) ((emacs (27 1))) "Extract YouTube video subtitles" tar ((:commit . "d69f732299fdf256504e15767c1d7e5de771220e") (:authors ("Ag Ibragimov" . "agzam.ibragimov@gmail.com")) (:maintainers ("Ag Ibragimov" . "agzam.ibragimov@gmail.com")) (:maintainer "Ag Ibragimov" . "agzam.ibragimov@gmail.com") (:keywords "convenience" "multimedia") (:url . "https://github.com/agzam/youtube-sub-extractor.el"))]) (ytdious . [(20210228 2111) ((emacs (25 3))) "Query / Preview YouTube via Invidious" tar ((:commit . "941460b51e43ef6764e15e2b9c4af54c3e56115f") (:authors ("Stefan Huchler") ("Gabriele Rastello")) (:maintainers ("Stefan Huchler")) (:maintainer "Stefan Huchler") (:keywords "youtube" "matching" "multimedia") (:url . "https://github.com/spiderbit/ytdious"))]) (ytdl . [(20230331 1804) ((emacs (26 1)) (async (1 9 4)) (transient (0 2 0)) (dash (2 17 0))) "Emacs Interface for youtube-dl" tar ((:commit . "2ea3daf2f6aa9d18b71fe3e15f05c30a56fca228") (:authors ("Arnaud Hoffmann" . "tuedachu@gmail.com")) (:maintainers ("Arnaud Hoffmann" . "tuedachu@gmail.com")) (:maintainer "Arnaud Hoffmann" . "tuedachu@gmail.com") (:keywords "comm" "multimedia") (:url . "https://gitlab.com/tuedachu/ytdl"))]) @@ -5514,7 +5659,7 @@ (zeal-at-point . [(20180131 2354) nil "Search the word at point with Zeal" tar ((:commit . "0fc3263f44e95acd3e9d91057677621ce4d297ee") (:authors ("Jinzhu" . "wosmvp@gmail.com")) (:maintainers ("Jinzhu" . "wosmvp@gmail.com")) (:maintainer "Jinzhu" . "wosmvp@gmail.com") (:url . "https://github.com/jinzhu/zeal-at-point"))]) (zen-and-art-theme . [(20120622 1437) nil "zen and art color theme for GNU Emacs 24" tar ((:commit . "a7226cbce0bca2501d69a620cb2aeabfc396c232") (:authors ("Nick Parker")) (:maintainers ("Nick Parker")) (:maintainer "Nick Parker"))]) (zen-mode . [(20200609 822) ((emacs (24 3))) "A major mode for the Zen programming language" tar ((:commit . "c1b1806358f3cce6c04b30699987d82dc7d42559") (:authors ("Andrea Orru , Andrew Kelley , kristopher tate , Yoshitaka Takemoto" . "yt.3b8@connectfree.co.jp")) (:maintainers ("Andrea Orru , Andrew Kelley , kristopher tate , Yoshitaka Takemoto" . "yt.3b8@connectfree.co.jp")) (:maintainer "Andrea Orru , Andrew Kelley , kristopher tate , Yoshitaka Takemoto" . "yt.3b8@connectfree.co.jp") (:keywords "zen" "languages") (:url . "https://github.com/zenlang/zen-mode"))]) - (zenburn-theme . [(20230315 1004) nil "A low contrast color theme for Emacs." tar ((:commit . "8a1f9d28f503615e5d9b3eac59a2f3c14e75fc20") (:authors ("Bozhidar Batsov" . "bozhidar@batsov.com")) (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.com")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.com") (:url . "http://github.com/bbatsov/zenburn-emacs"))]) + (zenburn-theme . [(20231120 2002) nil "A low contrast color theme for Emacs." tar ((:commit . "373a07f99ee595dee83b6cee8b6841b5d1c01e38") (:authors ("Bozhidar Batsov" . "bozhidar@batsov.com")) (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.com")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.com") (:url . "http://github.com/bbatsov/zenburn-emacs"))]) (zencoding-mode . [(20140213 822) nil "Unfold CSS-selector-like expressions to markup" tar ((:commit . "58e42af182c98cb9941d27cd042d227fbf4e146c") (:authors ("Chris Done" . "chrisdone@gmail.com")) (:maintainers ("Chris Done" . "chrisdone@gmail.com")) (:maintainer "Chris Done" . "chrisdone@gmail.com") (:keywords "convenience") (:url . "https://github.com/rooney/zencoding"))]) (zenity-color-picker . [(20160302 1154) ((emacs (24 4))) "Insert and adjust colors using Zenity" tar ((:commit . "bdece51052ef7037e0a3481fc1f487939f57777e") (:authors ("Samuel Laurén" . "samuel.lauren@iki.fi")) (:maintainers ("Samuel Laurén" . "samuel.lauren@iki.fi")) (:maintainer "Samuel Laurén" . "samuel.lauren@iki.fi") (:keywords "colors") (:url . "https://bitbucket.org/Soft/zenity-color-picker.el"))]) (zeno-theme . [(20211205 2148) ((emacs (24))) "A dark theme using different shades of blue" tar ((:commit . "70fa7b7442f24ea25eab538b5a22da690745fef5") (:authors ("Bharat Joshi" . "jbharat@outlook.com")) (:maintainers ("Bharat Joshi" . "jbharat@outlook.com")) (:maintainer "Bharat Joshi" . "jbharat@outlook.com") (:keywords "faces" "theme" "dark" "blue") (:url . "https://github.com/jbharat/zeno-theme"))]) @@ -5530,13 +5675,13 @@ (zetteldesk-remark . [(20230517 2020) ((zetteldesk (1 0)) (org-remark (1 0)) (emacs (27 2))) "Org-Remark integration for zetteldesk.el" tar ((:commit . "73f691989c094ec196bb614318ae51b60209a8de") (:authors ("Vidianos Giannitsis" . "vidianosgiannitsis@gmail.com")) (:maintainers ("Vidianos Giannitsis" . "vidianosgiannitsis@gmail.com")) (:maintainer "Vidianos Giannitsis" . "vidianosgiannitsis@gmail.com") (:url . "https://github.com/Vidianos-Giannitsis/zetteldesk-remark.el"))]) (zettelkasten . [(20230108 1724) ((emacs (25 1)) (s (1 10 0))) "Helper functions to organise notes in a Zettelkasten style" tar ((:commit . "cc4d69c302a46b8f802a1871aae091df1f3398ba") (:authors ("Yann Herklotz" . "yann@ymhg.org")) (:maintainers ("Yann Herklotz" . "yann@ymhg.org")) (:maintainer "Yann Herklotz" . "yann@ymhg.org") (:keywords "files" "hypermedia" "notes") (:url . "https://github.com/ymherklotz/emacs-zettelkasten"))]) (zetz-mode . [(20200823 536) ((emacs (25 1)) (dash (2 17 0)) (hydra (0 15 0))) "A major mode for the ZetZ programming language" tar ((:commit . "04da33f4ffa9db5b3556f423276f4fd1db13ec67") (:keywords "languages" "programming") (:url . "https://github.com/damon-kwok/zetz-mode"))]) - (zig-mode . [(20230815 2033) ((emacs (24 3)) (reformatter (0 6))) "A major mode for the Zig programming language" tar ((:commit . "079149a19fc869343130e69d7b944afd3a1813cc") (:authors ("Andrea Orru , Andrew Kelley" . "superjoe30@gmail.com")) (:maintainers ("Andrea Orru , Andrew Kelley" . "superjoe30@gmail.com")) (:maintainer "Andrea Orru , Andrew Kelley" . "superjoe30@gmail.com") (:keywords "zig" "languages") (:url . "https://github.com/zig-lang/zig-mode"))]) - (zim-wiki-mode . [(20230211 1650) ((emacs (25 1)) (helm-ag (0 58)) (helm-projectile (0 14 0)) (dokuwiki-mode (0 1 1)) (link-hint (0 1)) (pretty-hydra (0 2 2))) "Zim Desktop Wiki edit mode" tar ((:commit . "cf3d5a0dfb53d6cba8d7d35420ec18bf81b5bf2f") (:authors ("Will Foran" . "willforan+zim-wiki-mode@gmail.com")) (:maintainers ("Will Foran" . "willforan+zim-wiki-mode@gmail.com")) (:maintainer "Will Foran" . "willforan+zim-wiki-mode@gmail.com") (:keywords "outlines") (:url . "https://github.com/WillForan/zim-wiki-mode"))]) + (zig-mode . [(20240301 1618) ((emacs (26 1)) (reformatter (0 6))) "A major mode for the Zig programming language" tar ((:commit . "b6f5375efeb97026410190f352f1044214fa0289") (:authors ("Andrea Orru" . "andreaorru1991@gmail.com") ("Andrew Kelley" . "superjoe30@gmail.com")) (:maintainers ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "zig" "languages") (:url . "https://github.com/zig-lang/zig-mode"))]) + (zim-wiki-mode . [(20230927 1410) ((emacs (25 1)) (helm-ag (0 58)) (helm-projectile (0 14 0)) (dokuwiki-mode (0 1 1)) (link-hint (0 1)) (pretty-hydra (0 2 2))) "Zim Desktop Wiki edit mode" tar ((:commit . "7c62e0304750654709b4173bcc1e2681cf1fbe49") (:authors ("Will Foran" . "willforan+zim-wiki-mode@gmail.com")) (:maintainers ("Will Foran" . "willforan+zim-wiki-mode@gmail.com")) (:maintainer "Will Foran" . "willforan+zim-wiki-mode@gmail.com") (:keywords "outlines") (:url . "https://github.com/WillForan/zim-wiki-mode"))]) (zimports . [(20211011 2059) ((emacs (26 1)) (projectile (2 1 0))) "Reformat python imports with zimports" tar ((:commit . "76cf76bdc871cb0454a6fc555aeb1aa94f1b6e57") (:url . "https://github.com/schmir/zimports.el"))]) - (zk . [(20230821 2127) ((emacs (25 1))) "Functions for working with Zettelkasten-style linked notes" tar ((:commit . "05b253b60d86799e839239316b660efe69e0268f") (:authors ("Grant Rosson ")) (:maintainers ("Grant Rosson ")) (:maintainer "Grant Rosson ") (:url . "https://github.com/localauthor/zk"))]) - (zk-desktop . [(20230712 1103) ((emacs (27 1)) (zk (0 6)) (zk-index (0 9))) "Desktop environment for zk" tar ((:commit . "5be59ca972f3f624d444b7b7d7ca75a06bcd2ce5") (:authors ("Grant Rosson ")) (:maintainers ("Grant Rosson ")) (:maintainer "Grant Rosson ") (:url . "https://github.com/localauthor/zk"))]) - (zk-index . [(20230712 1103) ((emacs (27 1)) (zk (0 3))) "Index for zk" tar ((:commit . "5be59ca972f3f624d444b7b7d7ca75a06bcd2ce5") (:authors ("Grant Rosson ")) (:maintainers ("Grant Rosson ")) (:maintainer "Grant Rosson ") (:url . "https://github.com/localauthor/zk"))]) - (zk-luhmann . [(20230505 2107) ((emacs (25 1)) (zk (0 4)) (zk-index (0 9))) "Support for Luhmann-style IDs in zk" tar ((:commit . "be0d6aa9fb856736406a43e3908fc4a01e073b99") (:authors ("Grant Rosson ")) (:maintainers ("Grant Rosson ")) (:maintainer "Grant Rosson ") (:url . "https://github.com/localauthor/zk-luhmann"))]) + (zk . [(20240102 1405) ((emacs (25 1))) "Functions for working with Zettelkasten-style linked notes" tar ((:commit . "82f636c1edda416794c7115757ecded64f22afbf") (:authors ("Grant Rosson ")) (:maintainers ("Grant Rosson ")) (:maintainer "Grant Rosson ") (:url . "https://github.com/localauthor/zk"))]) + (zk-desktop . [(20240102 1405) ((emacs (27 1)) (zk (0 6)) (zk-index (0 9))) "Desktop environment for zk" tar ((:commit . "82f636c1edda416794c7115757ecded64f22afbf") (:authors ("Grant Rosson ")) (:maintainers ("Grant Rosson ")) (:maintainer "Grant Rosson ") (:url . "https://github.com/localauthor/zk"))]) + (zk-index . [(20240102 1405) ((emacs (27 1)) (zk (0 3))) "Index for zk" tar ((:commit . "82f636c1edda416794c7115757ecded64f22afbf") (:authors ("Grant Rosson ")) (:maintainers ("Grant Rosson ")) (:maintainer "Grant Rosson ") (:url . "https://github.com/localauthor/zk"))]) + (zk-luhmann . [(20240102 1406) ((emacs (25 1)) (zk (0 4)) (zk-index (0 9))) "Support for Luhmann-style IDs in zk" tar ((:commit . "836943c5f6c6cdb932762385bbdf79e8bcfef3d7") (:authors ("Grant Rosson ")) (:maintainers ("Grant Rosson ")) (:maintainer "Grant Rosson ") (:url . "https://github.com/localauthor/zk-luhmann"))]) (zlc . [(20151011 157) nil "Provides zsh like completion system to Emacs" tar ((:commit . "4dd2ba267ecdeac845a7cbb3147294ee7daa25f4") (:authors ("mooz" . "stillpedant@gmail.com")) (:maintainers ("mooz" . "stillpedant@gmail.com")) (:maintainer "mooz" . "stillpedant@gmail.com") (:keywords "matching" "convenience"))]) (zmq . [(20230608 1856) ((cl-lib (0 5)) (emacs (26))) "ZMQ bindings in elisp" tar ((:commit . "9d5679c54f361f518a426586b51686674fd3b0fa") (:authors ("Nathaniel Nicandro" . "nathanielnicandro@gmail.com")) (:maintainers ("Nathaniel Nicandro" . "nathanielnicandro@gmail.com")) (:maintainer "Nathaniel Nicandro" . "nathanielnicandro@gmail.com") (:keywords "comm") (:url . "https://github.com/nnicandro/emacs-zmq"))]) (znc . [(20210803 159) ((cl-lib (0 2))) "ZNC + ERC" tar ((:commit . "2605f78e37a8a759067dc14fa25a82824ba1bacc") (:authors ("Yaroslav Shirokov")) (:maintainers ("Yaroslav Shirokov")) (:maintainer "Yaroslav Shirokov") (:url . "https://github.com/sshirokov/ZNC.el"))]) @@ -5551,15 +5696,15 @@ (zoom-window . [(20221228 407) ((emacs (24 3))) "Zoom window like tmux" tar ((:commit . "093dd7a5d60141812762eba40b021c76ff41f83d") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-zoom-window"))]) (zop-to-char . [(20160212 1554) ((cl-lib (0 5))) "A replacement of zap-to-char." tar ((:commit . "816ea90337db0545a2f0a5079f4d7b3a2822af7d") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainers ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://github.com/thierryvolpiatto/zop-to-char"))]) (zotelo . [(20160602 949) ((cl-lib (0 5))) "Manage Zotero collections from emacs" tar ((:commit . "d9dc089b9adfcc70a63f2a84269a12eb7cb4c748") (:authors ("Spinu Vitalie")) (:maintainers ("Spinu Vitalie")) (:maintainer "Spinu Vitalie") (:keywords "zotero" "emacs" "reftex" "bibtex" "mozrepl" "bibliography manager") (:url . "https://github.com/vitoshka/zotelo"))]) - (zotero . [(20211008 2207) ((emacs (27 1)) (ht (2 2)) (oauth (1 0 4)) (s (1 12 0))) "Library for the Zotero API" tar ((:commit . "811bd1f14b38c3dde3f80cd8a13490c9900de888") (:authors ("Folkert van der Beek" . "folkertvanderbeek@gmail.com")) (:maintainers ("Folkert van der Beek" . "folkertvanderbeek@gmail.com")) (:maintainer "Folkert van der Beek" . "folkertvanderbeek@gmail.com") (:keywords "zotero" "hypermedia") (:url . "https://gitlab.com/fvdbeek/emacs-zotero"))]) - (zotra . [(20230819 1747) ((emacs (27 1))) "Library to use Zotero translators" tar ((:commit . "9cd9eb36bbc65efcc38ca38fc96730dbbe882fd8") (:authors ("Mohammad Pedramfar ")) (:maintainers ("Mohammad Pedramfar ")) (:maintainer "Mohammad Pedramfar ") (:url . "https://github.com/mpedramfar/zotra"))]) - (zotxt . [(20210908 402) ((request (0 3 2)) (deferred (0 5 1))) "Tools to integrate emacs with Zotero via the zotxt plugin." tar ((:commit . "d344e7ac281a083f4e39e95b5664633a015e2b3b") (:authors ("Erik Hetzner" . "egh@e6h.org")) (:maintainer "Erik Hetzner" . "egh@e6h.org") (:keywords "bib"))]) + (zotero . [(20240112 2111) ((emacs (27 1)) (ht (2 2)) (oauth (1 11)) (s (1 12 0))) "Library for the Zotero API" tar ((:commit . "eef5080e6a2ed0cae12c3d21580864f4b394cd5f") (:authors ("Folkert van der Beek" . "folkertvanderbeek@gmail.com")) (:maintainers ("Folkert van der Beek" . "folkertvanderbeek@gmail.com")) (:maintainer "Folkert van der Beek" . "folkertvanderbeek@gmail.com") (:keywords "zotero" "hypermedia") (:url . "https://gitlab.com/fvdbeek/emacs-zotero"))]) + (zotra . [(20231014 2139) ((emacs (27 1))) "Import bibliographic data from (almost) everywhere" tar ((:commit . "fe9093b226a1678fc6c2fadd31a09d5a22ecdcf1") (:authors ("Mohammad Pedramfar ")) (:maintainers ("Mohammad Pedramfar ")) (:maintainer "Mohammad Pedramfar ") (:url . "https://github.com/mpedramfar/zotra"))]) + (zotxt . [(20240203 647) ((request (0 3 2)) (deferred (0 5 1))) "Tools to integrate emacs with Zotero via the zotxt plugin." tar ((:commit . "7eae5196dbe6fa3045b31412538ce4a81204abc4") (:authors ("Erik Hetzner" . "egh@e6h.org")) (:maintainer "Erik Hetzner" . "egh@e6h.org") (:keywords "bib"))]) (zoutline . [(20220102 835) nil "Simple outline library." tar ((:commit . "32857c6c4b9b0bcbed14d825a10b91a98d5fed0a") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "outline") (:url . "https://github.com/abo-abo/zoutline"))]) - (zoxide . [(20220711 33) ((emacs (25 1))) "Find file by zoxide" tar ((:commit . "b09c06962316d28b14ecbb2340af7c0636ab6d16") (:authors ("Ruoyu Feng" . "emacs@vonfry.name")) (:maintainers ("Ruoyu Feng" . "emacs@vonfry.name")) (:maintainer "Ruoyu Feng" . "emacs@vonfry.name") (:keywords "converience" "matching") (:url . "https://gitlab.com/Vonfry/zoxide.el"))]) + (zoxide . [(20230912 2359) ((emacs (25 1))) "Find file by zoxide" tar ((:commit . "c4b72681b139f40ba82f43d9c93adbd37da7b238") (:authors ("Ruoyu Feng" . "emacs@vonfry.name")) (:maintainers ("Ruoyu Feng" . "emacs@vonfry.name")) (:maintainer "Ruoyu Feng" . "emacs@vonfry.name") (:keywords "converience" "matching") (:url . "https://gitlab.com/Vonfry/zoxide.el"))]) (zpl-mode . [(20180906 1059) ((emacs (24 3))) "ZIMPL major mode" tar ((:commit . "35e7e23c6baf31b5e65dd7405c8ab9b13c70637e") (:url . "https://github.com/ax487/zpl-mode.git"))]) (zpresent . [(20201207 732) ((emacs (25 1)) (org-parser (0 4)) (dash (2 12 0)) (request (0 3 0))) "Simple presentation mode based on org files." tar ((:commit . "341d1a4a91a8acff5be6b81f95695e17c79c5309") (:keywords "comm") (:url . "https://hg.sr.ht/~zck/zpresent"))]) (zprint-format . [(20210602 146) ((emacs (24)) (reformatter (0 3))) "Reformat Clojure code using zprint" tar ((:commit . "fa575c17a40033189f2f23f1a5b27b88c399d200") (:authors ("Derek Passen" . "dpassen1@gmail.com")) (:maintainers ("Derek Passen" . "dpassen1@gmail.com")) (:maintainer "Derek Passen" . "dpassen1@gmail.com") (:keywords "clojure" "zprint" "tools" "languages") (:url . "http://www.github.com/dpassen/zprint-format"))]) - (zprint-mode . [(20200731 1238) ((emacs (24 3))) "Reformat Clojure(Script) code using zprint" tar ((:commit . "b9b72b4918156f2f44aa544be9e19ea391937c2a") (:authors ("Paulus Esterhazy" . "pesterhazy@gmail.com")) (:maintainers ("Paulus Esterhazy" . "pesterhazy@gmail.com")) (:maintainer "Paulus Esterhazy" . "pesterhazy@gmail.com") (:keywords "tools") (:url . "https://github.com/pesterhazy/zprint-mode.el"))]) + (zprint-mode . [(20240311 941) ((emacs (24 3))) "Reformat Clojure(Script) code using zprint" tar ((:commit . "cd7ae7400177b3c233a77c2a46de818c72375362") (:authors ("Paulus Esterhazy" . "pesterhazy@gmail.com")) (:maintainers ("Paulus Esterhazy" . "pesterhazy@gmail.com")) (:maintainer "Paulus Esterhazy" . "pesterhazy@gmail.com") (:keywords "tools") (:url . "https://github.com/pesterhazy/zprint-mode.el"))]) (ztree . [(20210415 1947) ((cl-lib (0))) "Text mode directory tree" tar ((:commit . "f05677f9696e573c8c607e8876fb4a0cccbc491f") (:authors ("Alexey Veretennikov" . "alexey.veretennikov@gmail.com")) (:maintainers ("Alexey Veretennikov" . "alexey.veretennikov@gmail.com")) (:maintainer "Alexey Veretennikov" . "alexey.veretennikov@gmail.com") (:keywords "files" "tools") (:url . "https://github.com/fourier/ztree"))]) (zweilight-theme . [(20170113 605) nil "A dark color theme for Emacs." tar ((:commit . "890f27c939d8a358c9ef0f402fc3314f475ec874") (:authors ("Philip Arvidsson" . "contact@philiparvidsson.com")) (:maintainers ("Philip Arvidsson" . "contact@philiparvidsson.com")) (:maintainer "Philip Arvidsson" . "contact@philiparvidsson.com") (:url . "http://github.com/philiparvidsson/zweilight-emacs"))]) (zygospore . [(20140703 852) nil "reversible C-x 1 (delete-other-windows)" tar ((:commit . "1af5ee663f5a7aa08d96a77cacff834dcdf55ea8") (:authors ("Louis Kottmann" . "louis.kottmann@gmail.com")) (:maintainers ("Louis Kottmann" . "louis.kottmann@gmail.com")) (:maintainer "Louis Kottmann" . "louis.kottmann@gmail.com") (:url . "https://github.com/louiskottmann/zygospore.el"))]) diff --git a/org/elpa/async-20230528.622/async-autoloads.el b/code/elpa/async-20240312.1716/async-autoloads.el similarity index 85% rename from org/elpa/async-20230528.622/async-autoloads.el rename to code/elpa/async-20240312.1716/async-autoloads.el index 8e2db9f..2b4c494 100644 --- a/org/elpa/async-20230528.622/async-autoloads.el +++ b/code/elpa/async-20240312.1716/async-autoloads.el @@ -1,12 +1,14 @@ -;;; async-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- -;; +;;; async-autoloads.el --- automatically extracted autoloads (do not edit) -*- lexical-binding: t -*- +;; Generated by the `loaddefs-generate' function. + +;; This file is part of GNU Emacs. + ;;; Code: -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) +(add-to-list 'load-path (or (and load-file-name (directory-file-name (file-name-directory load-file-name))) (car load-path))) + -;;;### (autoloads nil "async" "async.el" (0 0 0 0)) ;;; Generated autoloads from async.el (autoload 'async-start-process "async" "\ @@ -17,8 +19,7 @@ object will return the process object when the program is finished. Set DEFAULT-DIRECTORY to change PROGRAM's current working directory. -\(fn NAME PROGRAM FINISH-FUNC &rest PROGRAM-ARGS)" nil nil) - +(fn NAME PROGRAM FINISH-FUNC &rest PROGRAM-ARGS)") (autoload 'async-start "async" "\ Execute START-FUNC (often a lambda) in a subordinate Emacs process. When done, the return value is passed to FINISH-FUNC. Example: @@ -88,22 +89,17 @@ passed to FINISH-FUNC). Call `async-get' on such a future always returns nil. It can still be useful, however, as an argument to `async-ready' or `async-wait'. -\(fn START-FUNC &optional FINISH-FUNC)" nil nil) - +(fn START-FUNC &optional FINISH-FUNC)") (register-definition-prefixes "async" '("async-")) -;;;*** -;;;### (autoloads nil "async-bytecomp" "async-bytecomp.el" (0 0 0 -;;;;;; 0)) ;;; Generated autoloads from async-bytecomp.el (autoload 'async-byte-recompile-directory "async-bytecomp" "\ Compile all *.el files in DIRECTORY asynchronously. All *.elc files are systematically deleted before proceeding. -\(fn DIRECTORY &optional QUIET)" nil nil) - +(fn DIRECTORY &optional QUIET)") (defvar async-bytecomp-package-mode nil "\ Non-nil if Async-Bytecomp-Package mode is enabled. See the `async-bytecomp-package-mode' command @@ -111,15 +107,14 @@ for a description of this minor mode. Setting this variable directly does not take effect; either customize it (see the info node `Easy Customization') or call the function `async-bytecomp-package-mode'.") - (custom-autoload 'async-bytecomp-package-mode "async-bytecomp" nil) - (autoload 'async-bytecomp-package-mode "async-bytecomp" "\ Byte compile asynchronously packages installed with package.el. + Async compilation of packages can be controlled by `async-bytecomp-allowed-packages'. -This is a minor mode. If called interactively, toggle the +This is a global minor mode. If called interactively, toggle the `Async-Bytecomp-Package mode' mode. If the prefix argument is positive, enable the mode, and if it is zero or negative, disable the mode. @@ -134,20 +129,16 @@ evaluate `(default-value \\='async-bytecomp-package-mode)'. The mode's hook is called both when the mode is enabled and when it is disabled. -\(fn &optional ARG)" t nil) - +(fn &optional ARG)" t) (autoload 'async-byte-compile-file "async-bytecomp" "\ Byte compile Lisp code FILE asynchronously. Same as `byte-compile-file' but asynchronous. -\(fn FILE)" t nil) - +(fn FILE)" t) (register-definition-prefixes "async-bytecomp" '("async-")) -;;;*** -;;;### (autoloads nil "dired-async" "dired-async.el" (0 0 0 0)) ;;; Generated autoloads from dired-async.el (defvar dired-async-mode nil "\ @@ -157,13 +148,11 @@ for a description of this minor mode. Setting this variable directly does not take effect; either customize it (see the info node `Easy Customization') or call the function `dired-async-mode'.") - (custom-autoload 'dired-async-mode "dired-async" nil) - (autoload 'dired-async-mode "dired-async" "\ Do dired actions asynchronously. -This is a minor mode. If called interactively, toggle the +This is a global minor mode. If called interactively, toggle the `Dired-Async mode' mode. If the prefix argument is positive, enable the mode, and if it is zero or negative, disable the mode. @@ -177,48 +166,40 @@ evaluate `(default-value \\='dired-async-mode)'. The mode's hook is called both when the mode is enabled and when it is disabled. -\(fn &optional ARG)" t nil) - +(fn &optional ARG)" t) (autoload 'dired-async-do-copy "dired-async" "\ Run ‘dired-do-copy’ asynchronously. -\(fn &optional ARG)" t nil) - +(fn &optional ARG)" t) (autoload 'dired-async-do-symlink "dired-async" "\ Run ‘dired-do-symlink’ asynchronously. -\(fn &optional ARG)" t nil) - +(fn &optional ARG)" t) (autoload 'dired-async-do-hardlink "dired-async" "\ Run ‘dired-do-hardlink’ asynchronously. -\(fn &optional ARG)" t nil) - +(fn &optional ARG)" t) (autoload 'dired-async-do-rename "dired-async" "\ Run ‘dired-do-rename’ asynchronously. -\(fn &optional ARG)" t nil) - +(fn &optional ARG)" t) (register-definition-prefixes "dired-async" '("dired-async-")) -;;;*** -;;;### (autoloads nil "smtpmail-async" "smtpmail-async.el" (0 0 0 -;;;;;; 0)) ;;; Generated autoloads from smtpmail-async.el (register-definition-prefixes "smtpmail-async" '("async-smtpmail-")) - -;;;*** -;;;### (autoloads nil nil ("async-pkg.el") (0 0 0 0)) +;;; End of scraped data + +(provide 'async-autoloads) -;;;*** - ;; Local Variables: ;; version-control: never ;; no-byte-compile: t ;; no-update-autoloads: t -;; coding: utf-8 +;; no-native-compile: t +;; coding: utf-8-emacs-unix ;; End: + ;;; async-autoloads.el ends here diff --git a/org/elpa/async-20230528.622/async-bytecomp.el b/code/elpa/async-20240312.1716/async-bytecomp.el similarity index 99% rename from org/elpa/async-20230528.622/async-bytecomp.el rename to code/elpa/async-20240312.1716/async-bytecomp.el index 42dbab3..1558bd4 100644 --- a/org/elpa/async-20230528.622/async-bytecomp.el +++ b/code/elpa/async-20240312.1716/async-bytecomp.el @@ -32,7 +32,7 @@ ;; the new files in the current environment with the old files loaded, creating ;; errors in most packages after upgrades. ;; -;; NB: This package is advicing the function `package--compile'. +;; NB: This package is advising the function `package--compile'. ;;; Code: diff --git a/code/elpa/async-20230528.622/async-pkg.el b/code/elpa/async-20240312.1716/async-pkg.el similarity index 69% rename from code/elpa/async-20230528.622/async-pkg.el rename to code/elpa/async-20240312.1716/async-pkg.el index e6f3baf..c8751f1 100644 --- a/code/elpa/async-20230528.622/async-pkg.el +++ b/code/elpa/async-20240312.1716/async-pkg.el @@ -1,6 +1,6 @@ -(define-package "async" "20230528.622" "Asynchronous processing in Emacs" +(define-package "async" "20240312.1716" "Asynchronous processing in Emacs" '((emacs "24.4")) - :commit "3ae74c0a4ba223ba373e0cb636c385e08d8838be" :authors + :commit "a368df08d34ae0c0a36fc3e90b1ecda252915257" :authors '(("John Wiegley" . "jwiegley@gmail.com")) :maintainers '(("Thierry Volpiatto" . "thievol@posteo.net")) diff --git a/code/elpa/async-20230528.622/async.el b/code/elpa/async-20240312.1716/async.el similarity index 94% rename from code/elpa/async-20230528.622/async.el rename to code/elpa/async-20240312.1716/async.el index e181773..2be7e0b 100644 --- a/code/elpa/async-20230528.622/async.el +++ b/code/elpa/async-20240312.1716/async.el @@ -6,7 +6,7 @@ ;; Maintainer: Thierry Volpiatto ;; Created: 18 Jun 2012 -;; Version: 1.9.7 +;; Version: 1.9.8 ;; Package-Requires: ((emacs "24.4")) ;; Keywords: async @@ -34,6 +34,8 @@ (eval-when-compile (require 'cl-lib)) +(defvar tramp-password-prompt-regexp) + (defgroup async nil "Simple asynchronous processing in Emacs" :group 'lisp) @@ -42,6 +44,12 @@ "Default function to remove text properties in variables." :type 'function) +(defcustom async-prompt-for-password t + "Prompt for password in parent Emacs if needed when non nil. +When this is nil child Emacs will hang forever when a user interaction +for password is required unless a password is stored in a \".authinfo\" file." + :type 'boolean) + (defvar async-debug nil) (defvar async-send-over-pipe t) (defvar async-in-child-emacs nil) @@ -207,7 +215,7 @@ It is intended to be used as follows: (process-name proc) (process-exit-status proc)))) (set (make-local-variable 'async-callback-value-set) t)))))) -(defun async-read-from-client (proc string) +(defun async-read-from-client (proc string &optional prompt-for-pwd) "Process text from client process. The string chunks usually arrive in maximum of 4096 bytes, so a @@ -217,8 +225,18 @@ function. We use a marker `async-read-marker' to track the position of the lasts complete line. Every time we get new input, we try to look for newline, and if found, process the entire line and bump the -marker position to the end of this next line." +marker position to the end of this next line. + +Argument PROMPT-FOR-PWD allow binding lexically the value of +`async-prompt-for-password', if unspecified its global value +is used." (with-current-buffer (process-buffer proc) + (when (and prompt-for-pwd + (boundp 'tramp-password-prompt-regexp) + tramp-password-prompt-regexp + (string-match tramp-password-prompt-regexp string)) + (process-send-string + proc (concat (read-passwd (match-string 0 string)) "\n"))) (goto-char (point-max)) (save-excursion (insert string)) @@ -350,7 +368,7 @@ its FINISH-FUNC is nil." (plist-get value :async-message))) (defun async-send (process-or-key &rest args) - "Send the given message to the asychronous child or parent Emacs. + "Send the given message to the asynchronous child or parent Emacs. To send messages from the parent to a child, PROCESS-OR-KEY is the child process object. ARGS is a plist. Example: @@ -402,6 +420,7 @@ finished. Set DEFAULT-DIRECTORY to change PROGRAM's current working directory." (let* ((buf (generate-new-buffer (concat "*" name "*"))) (buf-err (generate-new-buffer (concat "*" name ":err*"))) + (prt-for-pwd async-prompt-for-password) (proc (let ((process-connection-type nil)) (make-process :name name @@ -418,9 +437,12 @@ working directory." (set (make-local-variable 'async-read-marker) (set-marker (make-marker) (point-min) buf)) (set-marker-insertion-type async-read-marker nil) - (set-process-sentinel proc #'async-when-done) - (set-process-filter proc #'async-read-from-client) + ;; Pass the value of `async-prompt-for-password' to the process + ;; filter fn through the lexical local var prt-for-pwd (Issue#182). + (set-process-filter proc (lambda (proc string) + (async-read-from-client + proc string prt-for-pwd))) (unless (string= name "emacs") (set (make-local-variable 'async-callback-for-process) t)) proc))) diff --git a/code/elpa/async-20230528.622/dired-async.el b/code/elpa/async-20240312.1716/dired-async.el similarity index 91% rename from code/elpa/async-20230528.622/dired-async.el rename to code/elpa/async-20240312.1716/dired-async.el index 8294271..0d76854 100644 --- a/code/elpa/async-20230528.622/dired-async.el +++ b/code/elpa/async-20240312.1716/dired-async.el @@ -81,6 +81,10 @@ or rename for `dired-async-skip-fast'." :risky t :type 'integer) +(defcustom dired-async-large-file-warning-threshold large-file-warning-threshold + "Same as `large-file-warning-threshold' but for dired-async." + :type 'integer) + (defface dired-async-message '((t (:foreground "yellow"))) "Face used for mode-line message.") @@ -115,9 +119,9 @@ or rename for `dired-async-skip-fast'." (sit-for 3) (force-mode-line-update))) -(defun dired-async-processes () +(defun dired-async-processes (&optional propname) (cl-loop for p in (process-list) - when (process-get p 'dired-async-process) + when (process-get p (or propname 'dired-async-process)) collect p)) (defun dired-async-kill-process () @@ -242,6 +246,14 @@ cases if `dired-async-skip-fast' is non-nil." (funcall old-func file-creator operation (nreverse quick-list) name-constructor marker-char)))) +(defun dired-async--abort-if-file-too-large (size op-type filename) + "Warn when FILENAME larger than `dired-async-large-file-warning-threshold'. +Same as `abort-if-file-too-large' but without user-error." + (when (and dired-async-large-file-warning-threshold size + (> size dired-async-large-file-warning-threshold)) + (files--ask-user-about-large-file + size op-type filename nil))) + (defvar overwrite-query) (defun dired-async-create-files (file-creator operation fn-list name-constructor &optional _marker-char) @@ -299,14 +311,22 @@ ESC or `q' to not overwrite any of the remaining files, (file-in-directory-p destname from) (error "Cannot copy `%s' into its subdirectory `%s'" from to))) - (if overwrite - (or (and dired-overwrite-confirmed - (push (cons from to) async-fn-list)) - (progn - (push (dired-make-relative from) failures) - (dired-log "%s `%s' to `%s' failed\n" - operation from to))) - (push (cons from to) async-fn-list))))) + ;; Skip file if it is too large. + (if (and (member operation '("Copy" "Rename")) + (eq (dired-async--abort-if-file-too-large + (file-attribute-size + (file-attributes (file-truename from))) + (downcase operation) from) + 'abort)) + (push from skipped) + (if overwrite + (or (and dired-overwrite-confirmed + (push (cons from to) async-fn-list)) + (progn + (push (dired-make-relative from) failures) + (dired-log "%s `%s' to `%s' failed\n" + operation from to))) + (push (cons from to) async-fn-list)))))) ;; Fix tramp issue #80 with emacs-26, use "-q" only when needed. (setq async-quiet-switch (if (and (boundp 'tramp-cache-read-persistent-data) @@ -361,10 +381,13 @@ ESC or `q' to not overwrite any of the remaining files, (async-start `(lambda () (require 'cl-lib) (require 'dired-aux) (require 'dired-x) ,(async-inject-variables dired-async-env-variables-regexp) + (advice-add #'files--ask-user-about-large-file + :override (lambda (&rest args) nil)) (let ((dired-recursive-copies (quote always)) (dired-copy-preserve-time ,dired-copy-preserve-time) - (dired-create-destination-dirs ',create-dir)) + (dired-create-destination-dirs ',create-dir) + auth-source-save-behavior) (setq overwrite-backup-query nil) ;; Inline `backup-file' as long as it is not ;; available in emacs. diff --git a/code/elpa/async-20230528.622/smtpmail-async.el b/code/elpa/async-20240312.1716/smtpmail-async.el similarity index 100% rename from code/elpa/async-20230528.622/smtpmail-async.el rename to code/elpa/async-20240312.1716/smtpmail-async.el diff --git a/org/elpa/dash-20230714.723/dash-autoloads.el b/code/elpa/dash-20240103.1301/dash-autoloads.el similarity index 84% rename from org/elpa/dash-20230714.723/dash-autoloads.el rename to code/elpa/dash-20240103.1301/dash-autoloads.el index 6783a8d..f908413 100644 --- a/org/elpa/dash-20230714.723/dash-autoloads.el +++ b/code/elpa/dash-20240103.1301/dash-autoloads.el @@ -1,17 +1,29 @@ -;;; dash-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- -;; +;;; dash-autoloads.el --- automatically extracted autoloads (do not edit) -*- lexical-binding: t -*- +;; Generated by the `loaddefs-generate' function. + +;; This file is part of GNU Emacs. + ;;; Code: -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) +(add-to-list 'load-path (or (and load-file-name (directory-file-name (file-name-directory load-file-name))) (car load-path))) + -;;;### (autoloads nil "dash" "dash.el" (0 0 0 0)) ;;; Generated autoloads from dash.el (autoload 'dash-fontify-mode "dash" "\ Toggle fontification of Dash special variables. +Dash-Fontify mode is a buffer-local minor mode intended for Emacs +Lisp buffers. Enabling it causes the special variables bound in +anaphoric Dash macros to be fontified. These anaphoras include +`it', `it-index', `acc', and `other'. In older Emacs versions +which do not dynamically detect macros, Dash-Fontify mode +additionally fontifies Dash macro calls. + +See also `dash-fontify-mode-lighter' and +`global-dash-fontify-mode'. + This is a minor mode. If called interactively, toggle the `Dash-Fontify mode' mode. If the prefix argument is positive, enable the mode, and if it is zero or negative, disable the mode. @@ -26,20 +38,8 @@ evaluate `dash-fontify-mode'. The mode's hook is called both when the mode is enabled and when it is disabled. -Dash-Fontify mode is a buffer-local minor mode intended for Emacs -Lisp buffers. Enabling it causes the special variables bound in -anaphoric Dash macros to be fontified. These anaphoras include -`it', `it-index', `acc', and `other'. In older Emacs versions -which do not dynamically detect macros, Dash-Fontify mode -additionally fontifies Dash macro calls. - -See also `dash-fontify-mode-lighter' and -`global-dash-fontify-mode'. - -\(fn &optional ARG)" t nil) - +(fn &optional ARG)" t) (put 'global-dash-fontify-mode 'globalized-minor-mode t) - (defvar global-dash-fontify-mode nil "\ Non-nil if Global Dash-Fontify mode is enabled. See the `global-dash-fontify-mode' command @@ -47,9 +47,7 @@ for a description of this minor mode. Setting this variable directly does not take effect; either customize it (see the info node `Easy Customization') or call the function `global-dash-fontify-mode'.") - (custom-autoload 'global-dash-fontify-mode "dash" nil) - (autoload 'global-dash-fontify-mode "dash" "\ Toggle Dash-Fontify mode in all buffers. With prefix ARG, enable Global Dash-Fontify mode if ARG is positive; @@ -64,24 +62,22 @@ Dash-Fontify mode is enabled in all buffers where See `dash-fontify-mode' for more information on Dash-Fontify mode. -\(fn &optional ARG)" t nil) - +(fn &optional ARG)" t) (autoload 'dash-register-info-lookup "dash" "\ Register the Dash Info manual with `info-lookup-symbol'. -This allows Dash symbols to be looked up with \\[info-lookup-symbol]." t nil) - +This allows Dash symbols to be looked up with \\[info-lookup-symbol]." t) (register-definition-prefixes "dash" '("!cdr" "!cons" "--" "->" "-a" "-butlast" "-c" "-d" "-e" "-f" "-gr" "-i" "-juxt" "-keep" "-l" "-m" "-no" "-o" "-p" "-r" "-s" "-t" "-u" "-value-to-list" "-when-let" "-zip" "dash-")) - -;;;*** -;;;### (autoloads nil nil ("dash-pkg.el") (0 0 0 0)) +;;; End of scraped data + +(provide 'dash-autoloads) -;;;*** - ;; Local Variables: ;; version-control: never ;; no-byte-compile: t ;; no-update-autoloads: t -;; coding: utf-8 +;; no-native-compile: t +;; coding: utf-8-emacs-unix ;; End: + ;;; dash-autoloads.el ends here diff --git a/org/elpa/dash-20230714.723/dash-pkg.el b/code/elpa/dash-20240103.1301/dash-pkg.el similarity index 69% rename from org/elpa/dash-20230714.723/dash-pkg.el rename to code/elpa/dash-20240103.1301/dash-pkg.el index e2592b7..3b67254 100644 --- a/org/elpa/dash-20230714.723/dash-pkg.el +++ b/code/elpa/dash-20240103.1301/dash-pkg.el @@ -1,6 +1,6 @@ -(define-package "dash" "20230714.723" "A modern list library for Emacs" +(define-package "dash" "20240103.1301" "A modern list library for Emacs" '((emacs "24")) - :commit "f46268c75cb7c18361d3cee942cd4dc14a03aef4" :authors + :commit "e32a70ca636bad42232b6c79f1491dc86802a721" :authors '(("Magnar Sveen" . "magnars@gmail.com")) :maintainers '(("Magnar Sveen" . "magnars@gmail.com")) diff --git a/code/elpa/dash-20230714.723/dash.el b/code/elpa/dash-20240103.1301/dash.el similarity index 99% rename from code/elpa/dash-20230714.723/dash.el rename to code/elpa/dash-20240103.1301/dash.el index d900717..e2d4298 100644 --- a/code/elpa/dash-20230714.723/dash.el +++ b/code/elpa/dash-20240103.1301/dash.el @@ -1,6 +1,6 @@ ;;; dash.el --- A modern list library for Emacs -*- lexical-binding: t -*- -;; Copyright (C) 2012-2023 Free Software Foundation, Inc. +;; Copyright (C) 2012-2024 Free Software Foundation, Inc. ;; Author: Magnar Sveen ;; Version: 2.19.1 diff --git a/code/elpa/dash-20230714.723/dash.info b/code/elpa/dash-20240103.1301/dash.info similarity index 99% rename from code/elpa/dash-20230714.723/dash.info rename to code/elpa/dash-20240103.1301/dash.info index a99d323..be163e2 100644 --- a/code/elpa/dash-20230714.723/dash.info +++ b/code/elpa/dash-20240103.1301/dash.info @@ -2,7 +2,7 @@ This is dash.info, produced by makeinfo version 6.7 from dash.texi. This manual is for Dash version 2.19.1. - Copyright © 2012–2023 Free Software Foundation, Inc. + Copyright © 2012–2024 Free Software Foundation, Inc. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, @@ -24,7 +24,7 @@ Dash This manual is for Dash version 2.19.1. - Copyright © 2012–2023 Free Software Foundation, Inc. + Copyright © 2012–2024 Free Software Foundation, Inc. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, diff --git a/code/elpa/dash-20230714.723/dir b/code/elpa/dash-20240103.1301/dir similarity index 100% rename from code/elpa/dash-20230714.723/dir rename to code/elpa/dash-20240103.1301/dir diff --git a/code/elpa/dashboard-20230331.2304/dashboard-pkg.el b/code/elpa/dashboard-20230331.2304/dashboard-pkg.el deleted file mode 100644 index e40f2fd..0000000 --- a/code/elpa/dashboard-20230331.2304/dashboard-pkg.el +++ /dev/null @@ -1,12 +0,0 @@ -(define-package "dashboard" "20230331.2304" "A startup screen extracted from Spacemacs" - '((emacs "26.1")) - :commit "0f970d298931f9de7b511086728af140bf44a642" :authors - '(("Rakan Al-Hneiti" . "rakan.alhneiti@gmail.com")) - :maintainer - '("Jesús Martínez" . "jesusmartinez93@gmail.com") - :keywords - '("startup" "screen" "tools" "dashboard") - :url "https://github.com/emacs-dashboard/emacs-dashboard") -;; Local Variables: -;; no-byte-compile: t -;; End: diff --git a/code/elpa/dashboard-20230331.2304/dashboard-widgets.el b/code/elpa/dashboard-20230331.2304/dashboard-widgets.el deleted file mode 100644 index fff700e..0000000 --- a/code/elpa/dashboard-20230331.2304/dashboard-widgets.el +++ /dev/null @@ -1,1399 +0,0 @@ -;;; dashboard-widgets.el --- A startup screen extracted from Spacemacs -*- lexical-binding: t -*- - -;; Copyright (c) 2016-2023 emacs-dashboard maintainers -;; -;; Author : Rakan Al-Hneiti -;; Maintainer : Jesús Martínez -;; Shen, Jen-Chieh -;; URL : https://github.com/emacs-dashboard/emacs-dashboard -;; -;; This file is not part of GNU Emacs. -;; -;;; License: GPLv3 -;; -;; Created: October 05, 2016 -;; Package-Version: 1.8.0-SNAPSHOT -;; Keywords: startup, screen, tools, dashboard -;; Package-Requires: ((emacs "26.1")) -;;; Commentary: - -;; An extensible Emacs dashboard, with sections for -;; bookmarks, projects (projectile or project.el), org-agenda and more. - -;;; Code: - -(require 'cl-lib) -(require 'image) -(require 'subr-x) - -;; Compiler pacifier -(declare-function all-the-icons-icon-for-dir "ext:all-the-icons.el") -(declare-function all-the-icons-icon-for-file "ext:all-the-icons.el") -(declare-function all-the-icons-fileicon "ext:data-fileicons.el") -(declare-function all-the-icons-octicon "ext:data-octicons.el") -(declare-function bookmark-get-filename "ext:bookmark.el") -(declare-function bookmark-all-names "ext:bookmark.el") -(declare-function calendar-date-compare "ext:calendar.el") -(declare-function projectile-cleanup-known-projects "ext:projectile.el") -(declare-function projectile-load-known-projects "ext:projectile.el") -(declare-function projectile-mode "ext:projectile.el") -(declare-function projectile-relevant-known-projects "ext:projectile.el") -;;; project.el in Emacs 26 does not contain this function -(declare-function project-known-project-roots "ext:project.el" nil t) -(declare-function project-forget-zombie-projects "ext:project.el" nil t) -(declare-function org-agenda-format-item "ext:org-agenda.el") -(declare-function org-compile-prefix-format "ext:org-agenda.el") -(declare-function org-entry-get "ext:org.el") -(declare-function org-entry-is-done-p "ext:org.el") -(declare-function org-entry-is-todo-p "ext:org.el") -(declare-function org-get-category "ext:org.el") -(declare-function org-get-deadline-time "ext:org.el") -(declare-function org-get-heading "ext:org.el") -(declare-function org-get-priority "ext:org.el") -(declare-function org-get-scheduled-time "ext:org.el") -(declare-function org-get-tags "ext:org.el") -(declare-function org-get-todo-face "ext:org.el") -(declare-function org-get-todo-state "ext:org.el") -(declare-function org-in-archived-heading-p "ext:org.el") -(declare-function org-map-entries "ext:org.el") -(declare-function org-outline-level "ext:org.el") -(declare-function org-release-buffers "ext:org.el") -(declare-function org-time-string-to-time "ext:org.el") -(declare-function org-today "ext:org.el") -(declare-function recentf-cleanup "ext:recentf.el") -(defalias 'org-time-less-p 'time-less-p) -(defvar org-level-faces) -(defvar org-agenda-new-buffers) -(defvar org-agenda-prefix-format) -(defvar org-agenda-todo-keyword-format) -(defvar org-todo-keywords-1) -(defvar all-the-icons-dir-icon-alist) -(defvar package-activated-list) -(defvar elpaca-after-init-time) -(declare-function string-pixel-width "subr-x.el") ; TODO: remove this after 29.1 -(declare-function shr-string-pixel-width "shr.el") ; TODO: remove this after 29.1 - -(defcustom dashboard-page-separator "\n\n" - "Separator to use between the different pages." - :type 'string - :group 'dashboard) - -(defcustom dashboard-image-banner-max-height 0 - "Maximum height of banner image. - -This setting applies only if Emacs supports image transforms or -compiled with Imagemagick support. When value is non-zero the image -banner will be resized to the specified height in pixels, with aspect -ratio preserved." - :type 'integer - :group 'dashboard) - -(defcustom dashboard-image-banner-max-width 0 - "Maximum width of banner image. - -This setting applies if Emacs supports image transforms or compiled -with Imagemagick support. When value is non-zero the image banner -will be resized to the specified width in pixels, with aspect ratio -preserved." - :type 'integer - :group 'dashboard) - -(defcustom dashboard-set-heading-icons nil - "When non nil, heading sections will have icons." - :type 'boolean - :group 'dashboard) - -(defcustom dashboard-set-file-icons nil - "When non nil, file lists will have icons." - :type 'boolean - :group 'dashboard) - -(defcustom dashboard-set-navigator nil - "When non nil, a navigator will be displayed under the banner." - :type 'boolean - :group 'dashboard) - -(defcustom dashboard-set-init-info t - "When non nil, init info will be displayed under the banner." - :type 'boolean - :group 'dashboard) - -(defcustom dashboard-set-footer t - "When non nil, a footer will be displayed at the bottom." - :type 'boolean - :group 'dashboard) - -(defcustom dashboard-footer-messages - '("The one true editor, Emacs!" - "Who the hell uses VIM anyway? Go Evil!" - "Free as free speech, free as free Beer" - "Happy coding!" - "Vi Vi Vi, the editor of the beast" - "Welcome to the church of Emacs" - "While any text editor can save your files, only Emacs can save your soul" - "I showed you my source code, pls respond") - "A list of messages, one of which dashboard chooses to display." - :type 'list - :group 'dashboard) - -(defcustom dashboard-show-shortcuts t - "Whether to show shortcut keys for each section." - :type 'boolean - :group 'dashboard) - -(defconst dashboard-banners-directory - (concat (file-name-directory (locate-library "dashboard")) "banners/") - "Default banner directory.") - -(defconst dashboard-banner-official-png - (concat dashboard-banners-directory "emacs.png") - "Emacs banner image.") - -(defconst dashboard-banner-logo-png - (concat dashboard-banners-directory "logo.png") - "Emacs banner image.") - -(defcustom dashboard-banner-logo-title "Welcome to Emacs!" - "Specify the startup banner." - :type 'string - :group 'dashboard) - -(defcustom dashboard-banner-ascii "EMACS" - "String to be shown in place of the startup banner -if `dashboard-startup-banner' is set to `ascii'." - :type 'string - :group 'dashboard) - -(defcustom dashboard-navigator-buttons nil - "Specify the navigator buttons. -The format is: `icon title help action face prefix suffix`. - -Example: -`((\"☆\" \"Star\" \"Show stars\" (lambda (&rest _) - (show-stars)) warning \"[\" \"]\"))" - :type '(repeat (repeat (list string string string function symbol string string))) - :group 'dashboard) - -(defcustom dashboard-init-info - (lambda () - (let ((package-count 0) (time (emacs-init-time))) - (when (bound-and-true-p package-alist) - (setq package-count (length package-activated-list))) - (when (boundp 'straight--profile-cache) - (setq package-count (+ (hash-table-count straight--profile-cache) package-count))) - (when (fboundp 'elpaca--queued) - (setq time (format "%f seconds" (float-time (time-subtract elpaca-after-init-time - before-init-time)))) - (setq package-count (length (elpaca--queued)))) - (if (zerop package-count) - (format "Emacs started in %s" time) - (format "%d packages loaded in %s" package-count time)))) - "Init info with packages loaded and init time." - :type '(function string) - :group 'dashboard) - -(defcustom dashboard-footer - (nth (random (1- (1+ (length dashboard-footer-messages)))) dashboard-footer-messages) - "A footer with some short message." - :type 'string - :group 'dashboard) - -(defcustom dashboard-display-icons-p #'display-graphic-p - "Predicate to determine whether dashboard should show icons. -Can be nil to not show icons and any truthy value to show them. When set -to a function the result of the function will be interpreted as the -predicate value." - :type '(choice (function :tag "Predicate function") - (boolean :tag "Predicate value")) - :group 'dashboard) - -(defun dashboard-display-icons-p () - "Assert whether to show icons based on the `dashboard-display-icons-p' variable." - (if (functionp dashboard-display-icons-p) - (funcall dashboard-display-icons-p) - dashboard-display-icons-p)) - -(defcustom dashboard-footer-icon - (if (and (dashboard-display-icons-p) - (or (fboundp 'all-the-icons-fileicon) - (require 'all-the-icons nil 'noerror))) - (all-the-icons-fileicon "emacs" - :height 1.1 - :v-adjust -0.05 - :face 'font-lock-keyword-face) - (propertize ">" 'face 'dashboard-footer)) - "Footer's icon." - :type 'string - :group 'dashboard) - -(defcustom dashboard-startup-banner 'official - "Specify the startup banner. -Default value is `official', it displays the Emacs logo. `logo' displays Emacs -alternative logo. If set to `ascii', the value of `dashboard-banner-ascii' -will be used as the banner. An integer value is the index of text banner. -A string value must be a path to a .PNG or .TXT file. If the value is -nil then no banner is displayed." - :type '(choice (const :tag "no banner" nil) - (const :tag "offical" official) - (const :tag "logo" logo) - (const :tag "ascii" ascii) - (integer :tag "index of a text banner") - (string :tag "a path to an image or text banner") - (cons :tag "an image and text banner" - (string :tag "image banner path") - (string :tag "text banner path"))) - :group 'dashboard) - -(defcustom dashboard-item-generators - '((recents . dashboard-insert-recents) - (bookmarks . dashboard-insert-bookmarks) - (projects . dashboard-insert-projects) - (agenda . dashboard-insert-agenda) - (registers . dashboard-insert-registers)) - "Association list of items to how to generate in the startup buffer. -Will be of the form `(list-type . list-function)'. -Possible values for list-type are: `recents', `bookmarks', `projects', -`agenda' ,`registers'." - :type '(repeat (alist :key-type symbol :value-type function)) - :group 'dashboard) - -(defcustom dashboard-projects-backend 'projectile - "The package that supplies the list of recent projects. -With the value `projectile', the projects widget uses the package -projectile (available in MELPA). With the value `project-el', -the widget uses the package project (available in GNU ELPA). - -To activate the projects widget, add e.g. `(projects . 10)' to -`dashboard-items' after making sure the necessary package is -installed." - :type '(choice (const :tag "Use projectile" projectile) - (const :tag "Use project.el" project-el)) - :group 'dashboard) - -(defcustom dashboard-items - '((recents . 5) - (bookmarks . 5) - (agenda . 5)) - "Association list of items to show in the startup buffer. -Will be of the form `(list-type . list-size)'. -If nil it is disabled. Possible values for list-type are: -`recents' `bookmarks' `projects' `agenda' `registers'." - :type '(repeat (alist :key-type symbol :value-type integer)) - :group 'dashboard) - -(defcustom dashboard-item-shortcuts - '((recents . "r") - (bookmarks . "m") - (projects . "p") - (agenda . "a") - (registers . "e")) - "Association list of items and their corresponding shortcuts. -Will be of the form `(list-type . keys)' as understood by `(kbd keys)'. -If nil, shortcuts are disabled. If an entry's value is nil, that item's -shortcut is disbaled. See `dashboard-items' for possible values of list-type.'" - :type '(repeat (alist :key-type symbol :value-type string)) - :group 'dashboard) - -(defcustom dashboard-item-names nil - "Association list of item heading names. -When an item is nil or not present, the default name is used. -Will be of the form `(default-name . new-name)'." - :type '(alist :key-type string :value-type string) - :options '("Recent Files:" "Bookmarks:" "Agenda for today:" - "Agenda for the coming week:" "Registers:" "Projects:") - :group 'dashboard) - -(defcustom dashboard-items-default-length 20 - "Length used for startup lists with otherwise unspecified bounds. -Set to nil for unbounded." - :type 'integer - :group 'dashboard) - -(defcustom dashboard-heading-icons - '((recents . "history") - (bookmarks . "bookmark") - (agenda . "calendar") - (projects . "rocket") - (registers . "database")) - "Association list for the icons of the heading sections. -Will be of the form `(list-type . icon-name-string)`. -If nil it is disabled. Possible values for list-type are: -`recents' `bookmarks' `projects' `agenda' `registers'" - :type '(repeat (alist :key-type symbol :value-type string)) - :group 'dashboard) - -(defcustom dashboard-path-style nil - "Style to display path." - :type '(choice - (const :tag "No specify" nil) - (const :tag "Truncate the beginning part of the path" truncate-beginning) - (const :tag "Truncate the middle part of the path" truncate-middle) - (const :tag "Truncate the end part of the path" truncate-end)) - :group 'dashboard) - -(defcustom dashboard-path-max-length 70 - "Maximum length for path to display." - :type 'integer - :group 'dashboard) - -(defcustom dashboard-path-shorten-string "..." - "String the that displays in the center of the path." - :type 'string - :group 'dashboard) - -(defvar recentf-list nil) - -(defvar dashboard-buffer-name) - -;; -;; Faces -;; -(defface dashboard-text-banner - '((t (:inherit font-lock-keyword-face))) - "Face used for text banners." - :group 'dashboard) - -(defface dashboard-banner-logo-title - '((t :inherit default)) - "Face used for the banner title." - :group 'dashboard) - -(defface dashboard-navigator - '((t (:inherit font-lock-keyword-face))) - "Face used for the navigator." - :group 'dashboard) - -(defface dashboard-heading - '((t (:inherit font-lock-keyword-face))) - "Face used for widget headings." - :group 'dashboard) - -(defface dashboard-items-face - '((t (:inherit widget-button))) - "Face used for items." - :group 'dashboard) - -(defface dashboard-no-items-face - '((t (:inherit widget-button))) - "Face used for no items." - :group 'dashboard) - -(defface dashboard-footer - '((t (:inherit font-lock-doc-face))) - "Face used for widget headings." - :group 'dashboard) - -(define-obsolete-face-alias - 'dashboard-text-banner-face 'dashboard-text-banner "1.2.6") -(define-obsolete-face-alias - 'dashboard-banner-logo-title-face 'dashboard-banner-logo-title "1.2.6") -(define-obsolete-face-alias - 'dashboard-heading-face 'dashboard-heading "1.2.6") - -;; -;; Util -;; -(defmacro dashboard-mute-apply (&rest body) - "Execute BODY without message." - (declare (indent 0) (debug t)) - `(let (message-log-max) - (with-temp-message (or (current-message) nil) - (let ((inhibit-message t)) ,@body)))) - -(defun dashboard-funcall-fboundp (fnc &rest args) - "Call FNC with ARGS if exists." - (when (fboundp fnc) (if args (funcall fnc args) (funcall fnc)))) - -;; TODO: Use function `string-pixel-width' after 29.1 -(defun dashboard-string-pixel-width (str) - "Return the width of STR in pixels." - (if (fboundp #'string-pixel-width) - (string-pixel-width str) - (require 'shr) - (shr-string-pixel-width str))) - -(defun dashboard-str-len (str) - "Calculate STR in pixel width." - (let ((width (frame-char-width)) - (len (dashboard-string-pixel-width str))) - (+ (/ len width) - (if (zerop (% len width)) 0 1)))) ; add one if exceeed - -;; -;; Generic widget helpers -;; -(defun dashboard-subseq (seq end) - "Return the subsequence of SEQ from 0 to END." - (let ((len (length seq))) (butlast seq (- len (min len end))))) - -(defun dashboard-get-shortcut-name (item) - "Get the shortcut name to be used for ITEM." - (let ((elem (rassoc item dashboard-item-shortcuts))) - (and elem (car elem)))) - -(defun dashboard-get-shortcut (item) - "Get the shortcut to be used for ITEM." - (let ((elem (assq item dashboard-item-shortcuts))) - (and elem (cdr elem)))) - -(defmacro dashboard-insert-shortcut (shortcut-id - shortcut-char - search-label - &optional no-next-line) - "Insert a shortcut SHORTCUT-CHAR for a given SEARCH-LABEL. -Optionally, provide NO-NEXT-LINE to move the cursor forward a line." - (let* (;; Ensure punctuation and upper case in search string is not - ;; used to construct the `defun' - (name (downcase (replace-regexp-in-string "[[:punct:]]+" "" (format "%s" search-label)))) - ;; remove symbol quote - (sym (intern (replace-regexp-in-string "'" "" (format "dashboard-jump-to-%s" shortcut-id))))) - `(progn - (eval-when-compile (defvar dashboard-mode-map)) - (defun ,sym nil - ,(concat "Jump to " name ". This code is dynamically generated in `dashboard-insert-shortcut'.") - (interactive) - (unless (search-forward ,search-label (point-max) t) - (search-backward ,search-label (point-min) t)) - ,@(unless no-next-line '((forward-line 1))) - (back-to-indentation)) - (eval-after-load 'dashboard - (define-key dashboard-mode-map ,shortcut-char ',sym))))) - -(defun dashboard-append (msg &optional _messagebuf) - "Append MSG to dashboard buffer. -If MESSAGEBUF is not nil then MSG is also written in message buffer." - (with-current-buffer (get-buffer-create dashboard-buffer-name) - (goto-char (point-max)) - (let ((inhibit-read-only t)) (insert msg)))) - -(defun dashboard-modify-heading-icons (alist) - "Append ALIST items to `dashboard-heading-icons' to modify icons." - (dolist (icon alist) - (add-to-list 'dashboard-heading-icons icon))) - -(defun dashboard-insert-page-break () - "Insert a page break line in dashboard buffer." - (dashboard-append dashboard-page-separator)) - -(defun dashboard-insert-heading (heading &optional shortcut icon) - "Insert a widget HEADING in dashboard buffer, adding SHORTCUT, ICON if provided." - (when (and (dashboard-display-icons-p) dashboard-set-heading-icons) - ;; Try loading `all-the-icons' - (unless (or (fboundp 'all-the-icons-octicon) - (require 'all-the-icons nil 'noerror)) - (error "Package `all-the-icons' isn't installed")) - - (insert (cond - ((string-equal heading "Recent Files:") - (all-the-icons-octicon (cdr (assoc 'recents dashboard-heading-icons)) - :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) - ((string-equal heading "Bookmarks:") - (all-the-icons-octicon (cdr (assoc 'bookmarks dashboard-heading-icons)) - :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) - ((or (string-equal heading "Agenda for today:") - (string-equal heading "Agenda for the coming week:")) - (all-the-icons-octicon (cdr (assoc 'agenda dashboard-heading-icons)) - :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) - ((string-equal heading "Registers:") - (all-the-icons-octicon (cdr (assoc 'registers dashboard-heading-icons)) - :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) - ((string-equal heading "Projects:") - (all-the-icons-octicon (cdr (assoc 'projects dashboard-heading-icons)) - :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) - ((not (null icon)) icon) - (t " "))) - (insert " ")) - - (insert (propertize heading 'face 'dashboard-heading)) - - ;; Turn the inserted heading into an overlay, so that we may freely change - ;; its name without breaking any of the functions that expect the default name. - ;; If there isn't a suitable entry in `dashboard-item-names', - ;; we fallback to using HEADING. In that case we still want it to be an - ;; overlay to maintain consistent behavior (such as the point movement) - ;; between modified and default headings. - (let ((ov (make-overlay (- (point) (length heading)) (point) nil t))) - (overlay-put ov 'display (or (cdr (assoc heading dashboard-item-names)) heading)) - (overlay-put ov 'face 'dashboard-heading)) - (when shortcut (insert (format " (%s)" shortcut)))) - -(defun dashboard-center-text (start end) - "Center the text between START and END." - (save-excursion - (goto-char start) - (let ((width 0)) - (while (< (point) end) - (let* ((line-str (buffer-substring (line-beginning-position) (line-end-position))) - (line-length (dashboard-str-len line-str))) - (setq width (max width line-length))) - (forward-line 1)) - (let ((prefix (propertize " " 'display `(space . (:align-to (- center ,(/ width 2))))))) - (add-text-properties start end `(line-prefix ,prefix indent-prefix ,prefix)))))) - -(defun dashboard-insert-center (&rest strings) - "Insert STRINGS in the center of the buffer." - (let ((start (point))) - (apply #'insert strings) - (dashboard-center-text start (point)))) - -;; -;; BANNER -;; - -(defun dashboard-get-banner-path (index) - "Return the full path to banner with index INDEX." - (concat dashboard-banners-directory (format "%d.txt" index))) - -(defun dashboard--image-supported-p (img) - "Return non-nil if IMG exists and is a supported image type." - ;; In Emacs 29.1 we could use `image-supported-file-p'. However: - ;; - We need to support Emacs 26. - ;; - That function will only look at filenames, this one will inspect the file data itself. - (and (file-exists-p img) (ignore-errors (image-type-available-p (image-type img))))) - -(defun dashboard-choose-banner () - "Return a plist specifying the chosen banner based on `dashboard-startup-banner'." - (pcase dashboard-startup-banner - ('nil nil) - ('official - (append (when (image-type-available-p 'png) - (list :image dashboard-banner-official-png)) - (list :text (dashboard-get-banner-path 1)))) - ('logo - (append (when (image-type-available-p 'png) - (list :image dashboard-banner-logo-png)) - (list :text (dashboard-get-banner-path 1)))) - ('ascii - (append (list :text dashboard-banner-ascii))) - ((pred integerp) - (list :text (dashboard-get-banner-path dashboard-startup-banner))) - ((pred stringp) - (pcase dashboard-startup-banner - ((pred (lambda (f) (not (file-exists-p f)))) - (message "could not find banner %s, use default instead" dashboard-startup-banner) - (list :text (dashboard-get-banner-path 1))) - ((pred (string-suffix-p ".txt")) - (list :text (if (file-exists-p dashboard-startup-banner) - dashboard-startup-banner - (message "could not find banner %s, use default instead" dashboard-startup-banner) - (dashboard-get-banner-path 1)))) - ((pred dashboard--image-supported-p) - (list :image dashboard-startup-banner - :text (dashboard-get-banner-path 1))) - (_ - (message "unsupported file type %s" (file-name-nondirectory dashboard-startup-banner)) - (list :text (dashboard-get-banner-path 1))))) - (`(,img . ,txt) - (list :image (if (dashboard--image-supported-p img) - img - (message "could not find banner %s, use default instead" img) - dashboard-banner-official-png) - :text (if (and (file-exists-p txt) (string-suffix-p ".txt" txt)) - txt - (message "could not find banner %s, use default instead" txt) - (dashboard-get-banner-path 1)))) - (_ - (message "unsupported banner config %s" dashboard-startup-banner)))) - -(defun dashboard--type-is-gif-p (image-path) - "Return if image is a gif. -String -> bool. -Argument IMAGE-PATH path to the image." - (eq 'gif (image-type image-path))) - -(defun dashboard-insert-banner () - "Insert the banner at the top of the dashboard." - (goto-char (point-max)) - (when-let (banner (dashboard-choose-banner)) - (insert "\n") - (let ((start (point)) - buffer-read-only - text-width - image-spec) - (insert "\n") - ;; If specified, insert a text banner. - (when-let (txt (plist-get banner :text)) - (if (eq dashboard-startup-banner 'ascii) - (save-excursion (insert txt)) - (insert-file-contents txt)) - (put-text-property (point) (point-max) 'face 'dashboard-text-banner) - (setq text-width 0) - (while (not (eobp)) - (let ((line-length (- (line-end-position) (line-beginning-position)))) - (if (< text-width line-length) - (setq text-width line-length))) - (forward-line 1))) - ;; If specified, insert an image banner. When displayed in a graphical frame, this will - ;; replace the text banner. - (when-let (img (plist-get banner :image)) - (let ((size-props - (append (when (> dashboard-image-banner-max-width 0) - (list :max-width dashboard-image-banner-max-width)) - (when (> dashboard-image-banner-max-height 0) - (list :max-height dashboard-image-banner-max-height))))) - (setq image-spec - (cond ((dashboard--type-is-gif-p img) - (create-image img)) - ((image-type-available-p 'imagemagick) - (apply 'create-image img 'imagemagick nil size-props)) - (t - (apply 'create-image img nil nil - (when (and (fboundp 'image-transforms-p) - (memq 'scale (funcall 'image-transforms-p))) - size-props)))))) - (add-text-properties start (point) `(display ,image-spec)) - (when (dashboard--type-is-gif-p img) (image-animate image-spec 0 t))) - ;; Finally, center the banner (if any). - (when-let* ((text-align-spec `(space . (:align-to (- center ,(/ text-width 2))))) - (image-align-spec `(space . (:align-to (- center (0.5 . ,image-spec))))) - (prop - (cond - ;; Both an image & text banner. - ((and image-spec text-width) - ;; The quoting is intentional. This is a conditional display spec that will - ;; align the banner at redisplay time. - `((when (display-graphic-p) . ,image-align-spec) - (when (not (display-graphic-p)) . ,text-align-spec))) - ;; One or the other. - (text-width text-align-spec) - (image-spec image-align-spec) - ;; No banner. - (t nil))) - (prefix (propertize " " 'display prop))) - (add-text-properties start (point) `(line-prefix ,prefix wrap-prefix ,prefix))) - (insert "\n\n") - (add-text-properties start (point) '(cursor-intangible t inhibit-isearch t)))) - (when dashboard-banner-logo-title - (dashboard-insert-center (propertize dashboard-banner-logo-title 'face 'dashboard-banner-logo-title)) - (insert "\n\n")) - (dashboard-insert-navigator) - (dashboard-insert-init-info)) - -;; -;; INIT INFO -;; -(defun dashboard-insert-init-info () - "Insert init info when `dashboard-set-init-info' is t." - (when dashboard-set-init-info - (let ((init-info (if (functionp dashboard-init-info) - (funcall dashboard-init-info) - dashboard-init-info))) - (dashboard-insert-center (propertize init-info 'face 'font-lock-comment-face))))) - -(defun dashboard-insert-navigator () - "Insert Navigator of the dashboard." - (when (and dashboard-set-navigator dashboard-navigator-buttons) - (dolist (line dashboard-navigator-buttons) - (dolist (btn line) - (let* ((icon (car btn)) - (title (cadr btn)) - (help (or (cadr (cdr btn)) "")) - (action (or (cadr (cddr btn)) #'ignore)) - (face (or (cadr (cddr (cdr btn))) 'dashboard-navigator)) - (prefix (or (cadr (cddr (cddr btn))) (propertize "[" 'face face))) - (suffix (or (cadr (cddr (cddr (cdr btn)))) (propertize "]" 'face face)))) - (widget-create 'item - :tag (concat - (when icon - (propertize icon 'face - (let ((prop-face (get-text-property 0 'face icon))) - (if prop-face - `(:inherit ,prop-face :inherit ,face) - `(:inherit ,face))))) - (when (and icon title - (not (string-equal icon "")) - (not (string-equal title ""))) - (propertize " " 'face 'variable-pitch)) - (when title (propertize title 'face face))) - :help-echo help - :action action - :button-face 'dashboard-items-face - :mouse-face 'highlight - :button-prefix prefix - :button-suffix suffix - :format "%[%t%]") - (insert " "))) - (dashboard-center-text (line-beginning-position) (line-end-position)) - (insert "\n")) - (insert "\n"))) - -(defmacro dashboard-insert-section (section-name list list-size shortcut-id shortcut-char action &rest widget-params) - "Add a section with SECTION-NAME and LIST of LIST-SIZE items to the dashboard. - -SHORTCUT-CHAR is the keyboard shortcut used to access the section. -ACTION is theaction taken when the user activates the widget button. -WIDGET-PARAMS are passed to the \"widget-create\" function." - `(progn - (dashboard-insert-heading ,section-name - (if (and ,list ,shortcut-char dashboard-show-shortcuts) ,shortcut-char)) - (if ,list - (when (and (dashboard-insert-section-list - ,section-name - (dashboard-subseq ,list ,list-size) - ,action - ,@widget-params) - ,shortcut-id ,shortcut-char) - (dashboard-insert-shortcut ,shortcut-id ,shortcut-char ,section-name)) - (insert (propertize "\n --- No items ---" 'face 'dashboard-no-items-face))))) - -;; -;; Section list -;; -(defmacro dashboard-insert-section-list (section-name list action &rest rest) - "Insert into SECTION-NAME a LIST of items, expanding ACTION and passing REST -to widget creation." - `(when (car ,list) - (mapc - (lambda (el) - (let ((tag ,@rest)) - (insert "\n ") - - (when (and (dashboard-display-icons-p) - dashboard-set-file-icons - (or (fboundp 'all-the-icons-icon-for-dir) - (require 'all-the-icons nil 'noerror))) - (let* ((path (car (last (split-string ,@rest " - ")))) - (icon (if (and (not (file-remote-p path)) - (file-directory-p path)) - (all-the-icons-icon-for-dir path nil "") - (cond - ((or (string-equal ,section-name "Agenda for today:") - (string-equal ,section-name "Agenda for the coming week:")) - (all-the-icons-octicon "primitive-dot" :height 1.0 :v-adjust 0.01)) - ((file-remote-p path) - (all-the-icons-octicon "radio-tower" :height 1.0 :v-adjust 0.01)) - (t (all-the-icons-icon-for-file (file-name-nondirectory path) - :v-adjust -0.05)))))) - (setq tag (concat icon " " ,@rest)))) - - (widget-create 'item - :tag tag - :action ,action - :button-face 'dashboard-items-face - :mouse-face 'highlight - :button-prefix "" - :button-suffix "" - :format "%[%t%]"))) - ,list))) - -;; Footer -(defun dashboard-random-footer () - "Return a random footer from `dashboard-footer-messages'." - (nth (random (length dashboard-footer-messages)) dashboard-footer-messages)) - -(defun dashboard-insert-footer () - "Insert footer of dashboard." - (when-let ((footer (and dashboard-set-footer (dashboard-random-footer)))) - (insert "\n") - (dashboard-insert-center - dashboard-footer-icon - " " - (propertize footer 'face 'dashboard-footer) - "\n"))) - -;; -;; Truncate -;; -(defcustom dashboard-shorten-by-window-width nil - "Shorten path by window edges." - :type 'boolean - :group 'dashboard) - -(defcustom dashboard-shorten-path-offset 0 - "Shorten path offset on the edges." - :type 'integer - :group 'dashboard) - -(defun dashboard-f-filename (path) - "Return file name from PATH." - (file-name-nondirectory path)) - -(defun dashboard-f-base (path) - "Return directory name from PATH." - (file-name-nondirectory (directory-file-name (file-name-directory path)))) - -(defun dashboard-shorten-path-beginning (path) - "Shorten PATH from beginning if exceeding maximum length." - (let* ((len-path (length path)) - (slen-path (dashboard-str-len path)) - (len-rep (dashboard-str-len dashboard-path-shorten-string)) - (len-total (- dashboard-path-max-length len-rep)) - front) - (if (<= slen-path dashboard-path-max-length) path - (setq front (ignore-errors (substring path (- slen-path len-total) len-path))) - (if front (concat dashboard-path-shorten-string front) "")))) - -(defun dashboard-shorten-path-middle (path) - "Shorten PATH from middle if exceeding maximum length." - (let* ((len-path (length path)) - (slen-path (dashboard-str-len path)) - (len-rep (dashboard-str-len dashboard-path-shorten-string)) - (len-total (- dashboard-path-max-length len-rep)) - (center (/ len-total 2)) - (end-back center) - (start-front (- slen-path center)) - back front) - (if (<= slen-path dashboard-path-max-length) path - (setq back (substring path 0 end-back) - front (ignore-errors (substring path start-front len-path))) - (if front (concat back dashboard-path-shorten-string front) "")))) - -(defun dashboard-shorten-path-end (path) - "Shorten PATH from end if exceeding maximum length." - (let* ((len-path (length path)) - (slen-path (dashboard-str-len path)) - (len-rep (dashboard-str-len dashboard-path-shorten-string)) - (diff (- slen-path len-path)) - (len-total (- dashboard-path-max-length len-rep diff)) - back) - (if (<= slen-path dashboard-path-max-length) path - (setq back (ignore-errors (substring path 0 len-total))) - (if (and back (< 0 dashboard-path-max-length)) - (concat back dashboard-path-shorten-string) "")))) - -(defun dashboard--get-base-length (path type) - "Return the length of the base from the PATH by TYPE." - (let* ((is-dir (file-directory-p path)) - (base (if is-dir (dashboard-f-base path) (dashboard-f-filename path))) - (option (cl-case type - (recents 'dashboard-recentf-show-base) - (bookmarks 'dashboard-bookmarks-show-base) - (projects 'dashboard-projects-show-base))) - (option-val (symbol-value option)) - base-len) - (cl-case option-val - (`align (setq base-len (dashboard--align-length-by-type type))) - (`nil (setq base-len 0)) - (t (setq base-len (length base)))) - base-len)) - -(defun dashboard-shorten-path (path type) - "Shorten the PATH by TYPE." - (setq path (abbreviate-file-name path)) - (let ((dashboard-path-max-length - (if (and dashboard-path-style dashboard-shorten-by-window-width) - (- (window-width) (dashboard--get-base-length path type) - dashboard-shorten-path-offset) - dashboard-path-max-length))) - (cl-case dashboard-path-style - (truncate-beginning (dashboard-shorten-path-beginning path)) - (truncate-middle (dashboard-shorten-path-middle path)) - (truncate-end (dashboard-shorten-path-end path)) - (t path)))) - -(defun dashboard-shorten-paths (paths alist type) - "Shorten all path from PATHS by TYPE and store it to ALIST." - (let (lst-display abbrev (index 0)) - (setf (symbol-value alist) nil) ; reset - (dolist (item paths) - (setq abbrev (dashboard-shorten-path item type) - ;; Add salt here, and use for extraction. - ;; See function `dashboard-extract-key-path-alist'. - abbrev (format "%s|%s" index abbrev)) - ;; store `abbrev' as id; and `item' with value - (push (cons abbrev item) (symbol-value alist)) - (push abbrev lst-display) - (cl-incf index)) - (reverse lst-display))) - -(defun dashboard-extract-key-path-alist (key alist) - "Remove salt from KEY, and return true shorten path from ALIST." - (let* ((key (car (assoc key alist))) (split (split-string key "|"))) - (nth 1 split))) - -(defun dashboard-expand-path-alist (key alist) - "Get the full path (un-shorten) using KEY from ALIST." - (cdr (assoc key alist))) - -(defun dashboard--generate-align-format (fmt len) - "Return FMT after inserting align LEN." - (let ((pos (1+ (string-match-p "%s" fmt)))) - (concat (substring fmt 0 pos) - (concat "-" (number-to-string len)) - (substring fmt pos (length fmt))))) - -(defun dashboard--align-length-by-type (type) - "Return the align length by TYPE of the section." - (let ((len-item (cdr (assoc type dashboard-items))) (count 0) (align-length -1) - len-list base) - (cl-case type - (`recents - (require 'recentf) - (setq len-list (length recentf-list)) - (while (and (< count len-item) (< count len-list)) - (setq base (nth count recentf-list) - align-length (max align-length (dashboard-str-len (dashboard-f-filename base)))) - (cl-incf count))) - (`bookmarks - (let ((bookmarks-lst (bookmark-all-names))) - (setq len-list (length bookmarks-lst)) - (while (and (< count len-item) (< count len-list)) - (setq base (nth count bookmarks-lst) - align-length (max align-length (dashboard-str-len base))) - (cl-incf count)))) - (`projects - (let ((projects-lst (dashboard-projects-backend-load-projects))) - (setq len-list (length projects-lst)) - (while (and (< count len-item) (< count len-list)) - (setq base (nth count projects-lst) - align-length (max align-length (dashboard-str-len (dashboard-f-base base)))) - (cl-incf count)))) - (t (error "Unknown type for align length: %s" type))) - align-length)) - -;; -;; Recentf -;; -(defcustom dashboard-recentf-show-base nil - "Show the base file name infront of it's path." - :type '(choice - (const :tag "Don't show the base infront" nil) - (const :tag "Respect format" t) - (const :tag "Align the from base" align)) - :group 'dashboard) - -(defcustom dashboard-recentf-item-format "%s %s" - "Format to use when showing the base of the file name." - :type 'string - :group 'dashboard) - -(defvar dashboard-recentf-alist nil - "Alist records shorten's recent files and it's full paths.") - -(defvar dashboard--recentf-cache-item-format nil - "Cache to record the new generated align format.") - -(defun dashboard-insert-recents (list-size) - "Add the list of LIST-SIZE items from recently edited files." - (setq dashboard--recentf-cache-item-format nil) - (dashboard-mute-apply (recentf-mode 1) (recentf-cleanup)) - (dashboard-insert-section - "Recent Files:" - (dashboard-shorten-paths recentf-list 'dashboard-recentf-alist 'recents) - list-size - 'recents - (dashboard-get-shortcut 'recents) - `(lambda (&rest _) - (find-file-existing (dashboard-expand-path-alist ,el dashboard-recentf-alist))) - (let* ((file (dashboard-expand-path-alist el dashboard-recentf-alist)) - (filename (dashboard-f-filename file)) - (path (dashboard-extract-key-path-alist el dashboard-recentf-alist))) - (cl-case dashboard-recentf-show-base - (`align - (unless dashboard--recentf-cache-item-format - (let* ((len-align (dashboard--align-length-by-type 'recents)) - (new-fmt (dashboard--generate-align-format - dashboard-recentf-item-format len-align))) - (setq dashboard--recentf-cache-item-format new-fmt))) - (format dashboard--recentf-cache-item-format filename path)) - (`nil path) - (t (format dashboard-recentf-item-format filename path)))))) - -;; -;; Bookmarks -;; -(defcustom dashboard-bookmarks-show-base t - "Show the base file name infront of it's path." - :type '(choice - (const :tag "Don't show the base infront" nil) - (const :tag "Respect format" t) - (const :tag "Align the from base" align)) - :group 'dashboard) - -(defcustom dashboard-bookmarks-item-format "%s - %s" - "Format to use when showing the base of the file name." - :type 'string - :group 'dashboard) - -(defvar dashboard--bookmarks-cache-item-format nil - "Cache to record the new generated align format.") - -(defun dashboard-insert-bookmarks (list-size) - "Add the list of LIST-SIZE items of bookmarks." - (require 'bookmark) - (dashboard-insert-section - "Bookmarks:" - (dashboard-subseq (bookmark-all-names) list-size) - list-size - 'bookmarks - (dashboard-get-shortcut 'bookmarks) - `(lambda (&rest _) (bookmark-jump ,el)) - (if-let* ((filename el) - (path (bookmark-get-filename el)) - (path-shorten (dashboard-shorten-path path 'bookmarks))) - (cl-case dashboard-bookmarks-show-base - (`align - (unless dashboard--bookmarks-cache-item-format - (let* ((len-align (dashboard--align-length-by-type 'bookmarks)) - (new-fmt (dashboard--generate-align-format - dashboard-bookmarks-item-format len-align))) - (setq dashboard--bookmarks-cache-item-format new-fmt))) - (format dashboard--bookmarks-cache-item-format filename path-shorten)) - (`nil path-shorten) - (t (format dashboard-bookmarks-item-format filename path-shorten))) - el))) - -;; -;; Projects -;; -(defcustom dashboard-projects-switch-function - nil - "Custom function to switch to projects from dashboard. -If non-NIL, should be bound to a function with one argument. The function will -be called with the root directory of the project to switch to." - :type '(choice (const :tag "Default" nil) function) - :group 'dashboard) - -(defcustom dashboard-projects-show-base nil - "Show the project name infront of it's path." - :type '(choice - (const :tag "Don't show the base infront" nil) - (const :tag "Respect format" t) - (const :tag "Align the from base" align)) - :group 'dashboard) - -(defcustom dashboard-projects-item-format "%s %s" - "Format to use when showing the base of the project name." - :type 'string - :group 'dashboard) - -(defvar dashboard-projects-alist nil - "Alist records the shorten's project paths and it's full paths.") - -(defvar dashboard--projects-cache-item-format nil - "Cache to record the new generated align format.") - -(defun dashboard-insert-projects (list-size) - "Add the list of LIST-SIZE items of projects." - (setq dashboard--projects-cache-item-format nil) - (dashboard-insert-section - "Projects:" - (dashboard-shorten-paths - (dashboard-subseq (dashboard-projects-backend-load-projects) list-size) - 'dashboard-projects-alist 'projects) - list-size - 'projects - (dashboard-get-shortcut 'projects) - `(lambda (&rest _) - (funcall (dashboard-projects-backend-switch-function) - (dashboard-expand-path-alist ,el dashboard-projects-alist))) - (let* ((file (dashboard-expand-path-alist el dashboard-projects-alist)) - (filename (dashboard-f-base file)) - (path (dashboard-extract-key-path-alist el dashboard-projects-alist))) - (cl-case dashboard-projects-show-base - (`align - (unless dashboard--projects-cache-item-format - (let* ((len-align (dashboard--align-length-by-type 'projects)) - (new-fmt (dashboard--generate-align-format - dashboard-projects-item-format len-align))) - (setq dashboard--projects-cache-item-format new-fmt))) - (format dashboard--projects-cache-item-format filename path)) - (`nil path) - (t (format dashboard-projects-item-format filename path)))))) - -(defun dashboard-projects-backend-load-projects () - "Depending on `dashboard-projects-backend' load corresponding backend. -Return function that returns a list of projects." - (cl-case dashboard-projects-backend - (`projectile - (require 'projectile) - (dashboard-mute-apply (projectile-cleanup-known-projects)) - (projectile-load-known-projects)) - (`project-el - (require 'project) - (dashboard-mute-apply (dashboard-funcall-fboundp #'project-forget-zombie-projects)) - (project-known-project-roots)) - (t - (display-warning '(dashboard) - "Invalid value for `dashboard-projects-backend'" - :error)))) - -(defun dashboard-projects-backend-switch-function () - "Return the function to switch to a project. -Custom variable `dashboard-projects-switch-function' variable takes preference -over custom backends." - (or dashboard-projects-switch-function - (cl-case dashboard-projects-backend - (`projectile 'projectile-switch-project-by-name) - (`project-el - (lambda (project) - "This function is used to switch to `PROJECT'." - (let ((default-directory project)) - (project-find-file)))) - (t - (display-warning '(dashboard) - "Invalid value for `dashboard-projects-backend'" - :error))))) - -;; -;; Org Agenda -;; -(defcustom dashboard-week-agenda t - "Show agenda weekly if its not nil." - :type 'boolean - :group 'dashboard) - -(defcustom dashboard-agenda-time-string-format "%Y-%m-%d" - "Format time of agenda entries." - :type 'string - :group 'dashboard) - -(defcustom dashboard-match-agenda-entry nil - "Match agenda to extra filter. -It is the MATCH attribute for `org-map-entries'" - :type 'string - :group 'dashboard) - -(defcustom dashboard-agenda-release-buffers nil - "If not nil use `org-release-buffers' after getting the entries." - :type 'boolean - :group 'dashboard) - -(defcustom dashboard-filter-agenda-entry 'dashboard-filter-agenda-by-time - "Function to filter `org-agenda' entries." - :type '(choice - (const :tag "No filter" dashboard-no-filter-agenda) - (const :tag "Filter by time" dashboard-filter-agenda-by-time) - (const :tag "Filter by todo" dashboard-filter-agenda-by-todo) - (function :tag "Custom function")) - :group 'dashboard) - -(defcustom dashboard-agenda-sort-strategy nil - "A list of strategies to sort the agenda. If nil agenda is not sorted." - :type '(repeat (choice (const priority-up) (const priority-down) - (const time-up) (const time-down) - (const todo-state-up) (const todo-state-down))) - :group 'dashboard) - -(defcustom dashboard-agenda-prefix-format " %i %-12:c %s " - "Format for each entry in the agenda. -When the dashboard-agenda is created this format is inserted into -`org-agenda-prefix-format' as `dashboard-agenda' and compiled with -`org-compile-prefix-format' previous calling `dashboard-agenda-entry-format' for -each agenda entry." - :type 'string - :group 'dashboard) - -(defcustom dashboard-agenda-tags-format 'identity - "Function to format the org agenda tags. -Any custom function would receives the tags from `org-get-tags'" - :type '(choice - (const :tag "Show tags" identity) - (const :tag "Hide tags" ignore) - (function :tag "Custom function")) - :group 'dashboard) - -(defun dashboard-agenda-entry-format () - "Format agenda entry to show it on dashboard. -Also,it set text properties that latter are used to sort entries and perform different actions." - (let* ((scheduled-time (org-get-scheduled-time (point))) - (deadline-time (org-get-deadline-time (point))) - (entry-timestamp (dashboard-agenda--entry-timestamp (point))) - (entry-time (or scheduled-time deadline-time entry-timestamp)) - (item (org-agenda-format-item - (dashboard-agenda--formatted-time) - (dashboard-agenda--formatted-headline) - (org-outline-level) - (org-get-category) - (dashboard-agenda--formatted-tags))) - (todo-state (org-get-todo-state)) - (item-priority (org-get-priority (org-get-heading t t t t))) - (todo-index (and todo-state - (length (member todo-state org-todo-keywords-1)))) - (entry-data (list 'dashboard-agenda-file (buffer-file-name) - 'dashboard-agenda-loc (point) - 'dashboard-agenda-priority item-priority - 'dashboard-agenda-todo-index todo-index - 'dashboard-agenda-time entry-time))) - (add-text-properties 0 (length item) entry-data item) - item)) - -(defun dashboard-agenda--entry-timestamp (point) - "Get the timestamp from an entry at POINT." - (when-let ((timestamp (org-entry-get point "TIMESTAMP"))) - (org-time-string-to-time timestamp))) - -(defun dashboard-agenda--formatted-headline () - "Set agenda faces to `HEADLINE' when face text property is nil." - (let* ((headline (org-get-heading t t t t)) - (todo (or (org-get-todo-state) "")) - (org-level-face (nth (- (org-outline-level) 1) org-level-faces)) - (todo-state (format org-agenda-todo-keyword-format todo))) - (dashboard-agenda--set-face org-level-face headline) - (dashboard-agenda--set-face (org-get-todo-face todo) todo-state) - (concat todo-state " " headline))) - -(defun dashboard-agenda--set-face (face text) - "Add FACE to TEXT but inherit height from `dashboard-items-face'. -If not height is found on FACE or `dashboard-items-face' use `default'." - (let ((height (face-attribute 'dashboard-items-face :height nil 'default))) - (add-face-text-property 0 (length text) `((:height ,height) ,face) nil text))) - -(defun dashboard-agenda--formatted-time () - "Get the scheduled or dead time of an entry. If no time is found return nil." - (when-let ((time (or (org-get-scheduled-time (point)) (org-get-deadline-time (point)) - (dashboard-agenda--entry-timestamp (point))))) - (format-time-string dashboard-agenda-time-string-format time))) - -(defun dashboard-agenda--formatted-tags () - "Apply `dashboard-agenda-tags-format' to org-element tags." - (when dashboard-agenda-tags-format - (funcall dashboard-agenda-tags-format (org-get-tags)))) - -(defun dashboard-due-date-for-agenda () - "Return due-date for agenda period." - (if dashboard-week-agenda - (time-add (current-time) (* 86400 8)) - (time-add (current-time) 86400))) - -(defun dashboard-filter-agenda-by-time () - "Include entry if it has a scheduled-time or deadline-time in the future. -An entry is included if this function returns nil and excluded if returns a -point." - (let ((scheduled-time (org-get-scheduled-time (point))) - (deadline-time (org-get-deadline-time (point))) - (entry-timestamp (dashboard-agenda--entry-timestamp (point))) - (due-date (dashboard-due-date-for-agenda)) - (now (current-time))) - (unless (and (not (org-entry-is-done-p)) - (not (org-in-archived-heading-p)) - (or (and scheduled-time - (org-time-less-p scheduled-time due-date)) - (and deadline-time - (org-time-less-p deadline-time due-date)) - (and entry-timestamp - (org-time-less-p now entry-timestamp) - (org-time-less-p entry-timestamp due-date)))) - (point)))) - -(defun dashboard-filter-agenda-by-todo () - "Include entry if it is todo and not done. -An entry is included if this function returns nil and excluded -if returns a point." - (unless (and (org-entry-is-todo-p) - (not (org-entry-is-done-p)) - (not (org-in-archived-heading-p))) - (point))) - -(defun dashboard-no-filter-agenda () - "No filter agenda entries." - (when (org-entry-is-done-p) (point))) - -(defun dashboard-get-agenda () - "Get agenda items for today or for a week from now." - (if-let ((prefix-format (assoc 'dashboard-agenda org-agenda-prefix-format))) - (setcdr prefix-format dashboard-agenda-prefix-format) - (push (cons 'dashboard-agenda dashboard-agenda-prefix-format) org-agenda-prefix-format)) - (org-compile-prefix-format 'dashboard-agenda) - (prog1 (org-map-entries 'dashboard-agenda-entry-format - dashboard-match-agenda-entry - 'agenda - dashboard-filter-agenda-entry) - (dashboard-agenda--release-buffers))) - -(defun dashboard-agenda--release-buffers () - "Release agenda buffers buffers. -This is what `org-agenda-exit' do." - (when dashboard-agenda-release-buffers - (org-release-buffers org-agenda-new-buffers) - (setq org-agenda-new-buffers nil))) - -(defun dashboard-agenda--sorted-agenda () - "Return agenda sorted by time. - -For now, it only works when dashboard-agenda has been filter by time and -dashboard-agenda-sort is not nil." - (let ((agenda (dashboard-get-agenda)) - (sort-function (dashboard-agenda--sort-function))) - (sort agenda sort-function))) - -(defun dashboard-agenda--sort-function () - "Get the function use to sorted the agenda. - -Depending on the list `dashboard-agenda-sorting-strategy' use this strategies to -build a predicate to compare each enty. -This is similar as `org-entries-lessp' but with a different aproach." - (dashboard-agenda--build-sort-function dashboard-agenda-sort-strategy)) - -(defun dashboard-agenda--build-sort-function (strategies) - "Build a predicate to sort the dashboard agenda. - -If `STRATEGIES' is nil then sort using the nil predicate. Look for the strategy -predicate, the attributes of the entry and compare entries. If no predicate is -found for the strategy it uses nil predicate." - (if (null strategies) (lambda (_dont _care) nil) - (let ((predicate (dashboard-agenda--build-sort-function-predicate - (car strategies))) - (attribute (dashboard-agenda--build-sort-function-attribute - (car strategies)))) - (if (null predicate) (lambda (_dont _care) nil) - (lambda (entry1 entry2) - (dashboard-agenda--compare-entries entry1 entry2 (cdr strategies) - predicate attribute)))))) - -(defun dashboard-agenda--build-sort-function-predicate (strategy) - "Return the predicate to compare two entryes depending on the `STRATEGY'." - (cl-case strategy - (`priority-up '>) - (`priority-down '<) - (`time-up 'org-time-less-p) - (`time-down (lambda (a b) (org-time-less-p b a))) - (`todo-state-up '>) - (`todo-state-down '<))) - -(defun dashboard-agenda--build-sort-function-attribute (strategy) - "Return the argument to compare two entries depending to the `STRATEGY'." - (cond - ((memq strategy '(priority-up priority-down)) 'dashboard-agenda-priority) - ((memq strategy '(time-up time-down)) 'dashboard-agenda-time) - ((memq strategy '(todo-state-up todo-state-down)) 'dashboard-agenda-todo-index) - (t nil))) - -(defun dashboard-agenda--compare-entries (entry1 entry2 strategies predicate attribute) - "Compare `ENTRY1' and `ENTRY2' by `ATTRIBUTE' using `PREDICATE'. -If both attributes are nil or equals the next strategy in `STRATEGIES' is used -to compare." - (let ((arg1 (get-text-property 0 attribute entry1)) - (arg2 (get-text-property 0 attribute entry2))) - (cond - ((or (and (null arg1) (null arg2)) (equal arg1 arg2)) - (apply (dashboard-agenda--build-sort-function strategies) (list entry1 entry2))) - ((null arg1) nil) - ((null arg2) t) - (t (apply predicate (list arg1 arg2)))))) - -(defun dashboard-insert-agenda (list-size) - "Add the list of LIST-SIZE items of agenda." - (require 'org-agenda) - (dashboard-insert-section - (if dashboard-week-agenda - "Agenda for the coming week:" - "Agenda for today:") - (dashboard-agenda--sorted-agenda) - list-size - 'agenda - (dashboard-get-shortcut 'agenda) - `(lambda (&rest _) - (let ((buffer (find-file-other-window (get-text-property 0 'dashboard-agenda-file ,el)))) - (with-current-buffer buffer - (goto-char (get-text-property 0 'dashboard-agenda-loc ,el)) - (switch-to-buffer buffer)))) - (format "%s" el))) - -;; -;; Registers -;; -(defun dashboard-insert-registers (list-size) - "Add the list of LIST-SIZE items of registers." - (require 'register) - (dashboard-insert-section - "Registers:" - register-alist - list-size - 'registers - (dashboard-get-shortcut 'registers) - (lambda (&rest _) (jump-to-register (car el))) - (format "%c - %s" (car el) (register-describe-oneline (car el))))) - -(provide 'dashboard-widgets) -;;; dashboard-widgets.el ends here diff --git a/code/elpa/dashboard-20230331.2304/dashboard.el b/code/elpa/dashboard-20230331.2304/dashboard.el deleted file mode 100644 index 88ea969..0000000 --- a/code/elpa/dashboard-20230331.2304/dashboard.el +++ /dev/null @@ -1,472 +0,0 @@ -;;; dashboard.el --- A startup screen extracted from Spacemacs -*- lexical-binding: t -*- - -;; Copyright (c) 2016-2023 emacs-dashboard maintainers -;; -;; Author : Rakan Al-Hneiti -;; Maintainer : Jesús Martínez -;; Shen, Jen-Chieh -;; URL : https://github.com/emacs-dashboard/emacs-dashboard -;; -;; This file is not part of GNU Emacs. -;; -;;; License: GPLv3 -;; -;; Created: October 05, 2016 -;; Package-Version: 1.8.0-SNAPSHOT -;; Keywords: startup, screen, tools, dashboard -;; Package-Requires: ((emacs "26.1")) -;;; Commentary: - -;; An extensible Emacs dashboard, with sections for -;; bookmarks, projects (projectile or project.el), org-agenda and more. - -;;; Code: - -(require 'ffap) -(require 'recentf) - -(require 'dashboard-widgets) - -(declare-function bookmark-get-filename "ext:bookmark.el") -(declare-function bookmark-all-names "ext:bookmark.el") -(declare-function dashboard-ls--dirs "ext:dashboard-ls.el") -(declare-function dashboard-ls--files "ext:dashboard-ls.el") -(declare-function page-break-lines-mode "ext:page-break-lines.el") -(declare-function projectile-remove-known-project "ext:projectile.el") -(declare-function project-forget-projects-under "ext:project.el") -(declare-function linum-mode "linum.el") - -(declare-function dashboard-refresh-buffer "dashboard.el") - -(defgroup dashboard nil - "Extensible startup screen." - :group 'applications) - -;; Custom splash screen -(defvar dashboard-mode-map - (let ((map (make-sparse-keymap))) - (define-key map (kbd "C-p") 'dashboard-previous-line) - (define-key map (kbd "C-n") 'dashboard-next-line) - (define-key map (kbd "") 'dashboard-previous-line) - (define-key map (kbd "") 'dashboard-next-line) - (define-key map (kbd "k") 'dashboard-previous-line) - (define-key map (kbd "j") 'dashboard-next-line) - (define-key map [tab] 'widget-forward) - (define-key map (kbd "C-i") 'widget-forward) - (define-key map [backtab] 'widget-backward) - (define-key map (kbd "RET") 'dashboard-return) - (define-key map [mouse-1] 'dashboard-mouse-1) - (define-key map (kbd "}") #'dashboard-next-section) - (define-key map (kbd "{") #'dashboard-previous-section) - - (define-key map (kbd "") #'dashboard-remove-item-under) - (define-key map (kbd "") #'dashboard-remove-item-under) - (define-key map (kbd "DEL") #'dashboard-remove-item-under) - - (define-key map (kbd "1") #'dashboard-section-1) - (define-key map (kbd "2") #'dashboard-section-2) - (define-key map (kbd "3") #'dashboard-section-3) - (define-key map (kbd "4") #'dashboard-section-4) - (define-key map (kbd "5") #'dashboard-section-5) - (define-key map (kbd "6") #'dashboard-section-6) - (define-key map (kbd "7") #'dashboard-section-7) - (define-key map (kbd "8") #'dashboard-section-8) - (define-key map (kbd "9") #'dashboard-section-9) - map) - "Keymap for dashboard mode.") - -(defcustom dashboard-after-initialize-hook nil - "Hook that is run after dashboard buffer is initialized." - :group 'dashboard - :type 'hook) - -(define-derived-mode dashboard-mode special-mode "Dashboard" - "Dashboard major mode for startup screen." - :group 'dashboard - :syntax-table nil - :abbrev-table nil - (buffer-disable-undo) - (when (featurep 'whitespace) (whitespace-mode -1)) - (when (featurep 'linum) (linum-mode -1)) - (when (featurep 'display-line-numbers) (display-line-numbers-mode -1)) - (when (featurep 'page-break-lines) (page-break-lines-mode 1)) - (setq-local revert-buffer-function #'dashboard-refresh-buffer) - (setq inhibit-startup-screen t - buffer-read-only t - truncate-lines t)) - -(defcustom dashboard-center-content nil - "Whether to center content within the window." - :type 'boolean - :group 'dashboard) - -(defconst dashboard-buffer-name "*dashboard*" - "Dashboard's buffer name.") - -(defvar dashboard-force-refresh nil - "If non-nil, force refresh dashboard buffer.") - -(defvar dashboard--section-starts nil - "List of section starting positions.") - -;; -;; Util -;; -(defun dashboard--goto-line (line) - "Goto LINE." - (goto-char (point-min)) (forward-line (1- line))) - -(defmacro dashboard--save-excursion (&rest body) - "Execute BODY save window point." - (declare (indent 0) (debug t)) - `(let ((line (line-number-at-pos nil t)) - (column (current-column))) - ,@body - (dashboard--goto-line line) - (move-to-column column))) - -;; -;; Core -;; -(defun dashboard--current-section () - "Return section symbol in dashboard." - (save-excursion - (if (and (search-backward dashboard-page-separator nil t) - (search-forward dashboard-page-separator nil t)) - (let ((ln (thing-at-point 'line))) - (cond ((string-match-p "Recent Files:" ln) 'recents) - ((string-match-p "Bookmarks:" ln) 'bookmarks) - ((string-match-p "Projects:" ln) 'projects) - ((string-match-p "Agenda for " ln) 'agenda) - ((string-match-p "Registers:" ln) 'registers) - ((string-match-p "List Directories:" ln) 'ls-directories) - ((string-match-p "List Files:" ln) 'ls-files) - (t (user-error "Unknown section from dashboard")))) - (user-error "Failed searching dashboard section")))) - -;; -;; Navigation -;; -(defun dashboard-previous-section () - "Navigate back to previous section." - (interactive) - (let ((current-position (point)) current-section-start previous-section-start) - (dolist (elt dashboard--section-starts) - (when (and current-section-start (not previous-section-start)) - (setq previous-section-start elt)) - (when (and (not current-section-start) (< elt current-position)) - (setq current-section-start elt))) - (goto-char (if (eq current-position current-section-start) - previous-section-start - current-section-start)))) - -(defun dashboard-next-section () - "Navigate forward to next section." - (interactive) - (let ((current-position (point)) next-section-start - (section-starts (reverse dashboard--section-starts))) - (dolist (elt section-starts) - (when (and (not next-section-start) - (> elt current-position)) - (setq next-section-start elt))) - (when next-section-start - (goto-char next-section-start)))) - -(defun dashboard--section-lines () - "Return a list of integer represent the starting line number of each section." - (let (pb-lst) - (save-excursion - (goto-char (point-min)) - (while (search-forward dashboard-page-separator nil t) - (when (ignore-errors (dashboard--current-section)) - (push (line-number-at-pos) pb-lst)))) - (setq pb-lst (reverse pb-lst)) - pb-lst)) - -(defun dashboard--goto-section-by-index (index) - "Navigate to item section by INDEX." - (let* ((pg-lst (dashboard--section-lines)) - (items-id (1- index)) - (items-pg (nth items-id pg-lst)) - (items-len (length pg-lst))) - (when (and items-pg (< items-id items-len)) - (dashboard--goto-line items-pg)))) - -(defun dashboard-section-1 () - "Navigate to section 1." (interactive) (dashboard--goto-section-by-index 1)) -(defun dashboard-section-2 () - "Navigate to section 2." (interactive) (dashboard--goto-section-by-index 2)) -(defun dashboard-section-3 () - "Navigate to section 3." (interactive) (dashboard--goto-section-by-index 3)) -(defun dashboard-section-4 () - "Navigate to section 4." (interactive) (dashboard--goto-section-by-index 4)) -(defun dashboard-section-5 () - "Navigate to section 5." (interactive) (dashboard--goto-section-by-index 5)) -(defun dashboard-section-6 () - "Navigate to section 6." (interactive) (dashboard--goto-section-by-index 6)) -(defun dashboard-section-7 () - "Navigate to section 7." (interactive) (dashboard--goto-section-by-index 7)) -(defun dashboard-section-8 () - "Navigate to section 8." (interactive) (dashboard--goto-section-by-index 8)) -(defun dashboard-section-9 () - "Navigate to section 9." (interactive) (dashboard--goto-section-by-index 9)) - -(defun dashboard-previous-line (arg) - "Move point up and position it at that line’s item. -Optional prefix ARG says how many lines to move; default is one line." - (interactive "^p") - (dashboard-next-line (- arg))) - -(defun dashboard-next-line (arg) - "Move point down and position it at that line’s item. -Optional prefix ARG says how many lines to move; default is one line." - ;; code heavily inspired by `dired-next-line' - (interactive "^p") - (let (line-move-visual goal-column) - (line-move arg t)) - ;; We never want to move point into an invisible line. Dashboard doesn’t - ;; use invisible text currently but when it does we’re ready! - (while (and (invisible-p (point)) - (not (if (and arg (< arg 0)) (bobp) (eobp)))) - (forward-char (if (and arg (< arg 0)) -1 1))) - (beginning-of-line-text)) - -;; -;; ffap -;; -(defun dashboard--goto-section (section) - "Move to SECTION declares in variable `dashboard-item-shortcuts'." - (let ((fnc (intern (format "dashboard-jump-to-%s" section)))) - (dashboard-funcall-fboundp fnc))) - -(defun dashboard--current-index (section &optional pos) - "Return the idex by SECTION from POS." - (let (target-ln section-line) - (save-excursion - (when pos (goto-char pos)) - (setq target-ln (line-number-at-pos)) - (dashboard--goto-section section) - (setq section-line (line-number-at-pos))) - (- target-ln section-line))) - -(defun dashboard--section-list (section) - "Return the list from SECTION." - (cl-case section - (`recents recentf-list) - (`bookmarks (bookmark-all-names)) - (`projects (dashboard-projects-backend-load-projects)) - (`ls-directories (dashboard-ls--dirs)) - (`ls-files (dashboard-ls--files)) - (t (user-error "Unknown section for search: %s" section)))) - -(defun dashboard--current-item-in-path () - "Return the path from current dashboard section in path." - (let ((section (dashboard--current-section)) path) - (cl-case section - (`bookmarks (setq path (bookmark-get-filename path))) - (t - (let ((lst (dashboard--section-list section)) - (index (dashboard--current-index section))) - (setq path (nth index lst))))) - path)) - -(defun dashboard--on-path-item-p () - "Return non-nil if current point is on the item path from dashboard." - (save-excursion - (when (= (point) (line-end-position)) (ignore-errors (forward-char -1))) - (eq (get-char-property (point) 'face) 'dashboard-items-face))) - -(defun dashboard--ffap-guesser--adv (fnc &rest args) - "Advice execution around function `ffap-guesser'. - -Argument FNC is the adviced function. -Optional argument ARGS adviced function arguments." - (cl-case major-mode - (`dashboard-mode - (or (and (dashboard--on-path-item-p) - (dashboard--current-item-in-path)) - (apply fnc args))) ; fallback - (t (apply fnc args)))) -(advice-add 'ffap-guesser :around #'dashboard--ffap-guesser--adv) - -;; -;; Removal -;; -(defun dashboard-remove-item-under () - "Remove a item from the current item section." - (interactive) - (cl-case (dashboard--current-section) - (`recents (dashboard-remove-item-recentf)) - (`bookmarks (dashboard-remove-item-bookmarks)) - (`projects (dashboard-remove-item-projects)) - (`agenda (dashboard-remove-item-agenda)) - (`registers (dashboard-remove-item-registers))) - (dashboard--save-excursion (dashboard-refresh-buffer))) - -(defun dashboard-remove-item-recentf () - "Remove a file from `recentf-list'." - (interactive) - (let ((path (save-excursion (end-of-line) (ffap-guesser)))) - (setq recentf-list (delete path recentf-list))) - (dashboard-mute-apply (recentf-save-list))) - -(defun dashboard-remove-item-projects () - "Remove a path from `project--list'." - (interactive) - (let ((path (save-excursion (end-of-line) (ffap-guesser)))) - (dashboard-mute-apply - (cl-case dashboard-projects-backend - (`projectile (projectile-remove-known-project path)) - (`project-el (project-forget-projects-under path)))))) - -(defun dashboard-remove-item-bookmarks () - "Remove a bookmarks from `bookmark-alist'." - (interactive)) ; TODO: .. - -(defun dashboard-remove-item-agenda () - "Remove an agenda from `org-agenda-files'." - (interactive "P") - (let ((agenda-file (get-text-property (point) 'dashboard-agenda-file)) - (agenda-loc (get-text-property (point) 'dashboard-agenda-loc))) - (with-current-buffer (find-file-noselect agenda-file) - (goto-char agenda-loc) - (call-interactively 'org-todo)))) - -(defun dashboard-remove-item-registers () - "Remove a registers from `register-alist'." - (interactive)) ; TODO: .. - -;; -;; Confirmation -;; -(defun dashboard-return () - "Hit return key in dashboard buffer." - (interactive) - (let ((start-ln (line-number-at-pos)) (fd-cnt 0) diff-line entry-pt) - (save-excursion - (while (and (not diff-line) - (not (= (point) (point-min))) - (not (get-char-property (point) 'button)) - (not (= (point) (point-max)))) - (forward-char 1) - (setq fd-cnt (1+ fd-cnt)) - (unless (= start-ln (line-number-at-pos)) - (setq diff-line t))) - (unless (= (point) (point-max)) - (setq entry-pt (point)))) - (when (= fd-cnt 1) - (setq entry-pt (1- (point)))) - (if entry-pt - (widget-button-press entry-pt) - (call-interactively #'widget-button-press)))) - -(defun dashboard-mouse-1 () - "Key for keymap `mouse-1'." - (interactive) - (let ((old-track-mouse track-mouse)) - (when (call-interactively #'widget-button-click) - (setq track-mouse old-track-mouse)))) - -;; -;; Insertion -;; -(defmacro dashboard--with-buffer (&rest body) - "Execute BODY in dashboard buffer." - (declare (indent 0)) - `(with-current-buffer (get-buffer-create dashboard-buffer-name) - (let ((inhibit-read-only t)) ,@body) - (current-buffer))) - -(defun dashboard-maximum-section-length () - "For the just-inserted section, calculate the length of the longest line." - (let ((max-line-length 0)) - (save-excursion - (dashboard-previous-section) - (while (not (eobp)) - (setq max-line-length - (max max-line-length - (- (line-end-position) (line-beginning-position)))) - (forward-line 1))) - max-line-length)) - -(defun dashboard-insert-startupify-lists () - "Insert the list of widgets into the buffer." - (interactive) - (let ((inhibit-redisplay t) - (recentf-is-on (recentf-enabled-p)) - (origial-recentf-list recentf-list) - (dashboard-num-recents (or (cdr (assoc 'recents dashboard-items)) 0)) - (max-line-length 0)) - (when recentf-is-on - (setq recentf-list (dashboard-subseq recentf-list dashboard-num-recents))) - (dashboard--with-buffer - (when (or dashboard-force-refresh (not (eq major-mode 'dashboard-mode))) - (erase-buffer) - (dashboard-insert-banner) - (insert "\n") - (setq dashboard--section-starts nil) - (mapc (lambda (els) - (let* ((el (or (car-safe els) els)) - (list-size - (or (cdr-safe els) - dashboard-items-default-length)) - (item-generator - (cdr-safe (assoc el dashboard-item-generators)))) - (push (point) dashboard--section-starts) - (funcall item-generator list-size) - (goto-char (point-max)) - ;; add a newline so the next section-name doesn't get include - ;; on the same line. - (insert "\n") - (when recentf-is-on - (setq recentf-list origial-recentf-list)) - (setq max-line-length - (max max-line-length (dashboard-maximum-section-length))))) - dashboard-items) - (when dashboard-center-content - (dashboard-center-text - (if dashboard--section-starts - (car (last dashboard--section-starts)) - (point)) - (point-max))) - (save-excursion - (dolist (start dashboard--section-starts) - (goto-char start) - (delete-char -1) ; delete the newline we added previously - (insert dashboard-page-separator))) - (progn - (delete-char -1) - (insert dashboard-page-separator)) - (dashboard-insert-footer) - (goto-char (point-min)) - (dashboard-mode))) - (when recentf-is-on - (setq recentf-list origial-recentf-list)))) - - -;;;###autoload -(defun dashboard-open (&rest _) - "Open (or refresh) the *dashboard* buffer." - (interactive) - (let ((dashboard-force-refresh t)) (dashboard-insert-startupify-lists)) - (switch-to-buffer dashboard-buffer-name)) - -(defalias #'dashboard-refresh-buffer #'dashboard-open) - -;;;###autoload -(defun dashboard-setup-startup-hook () - "Setup post initialization hooks. -If a command line argument is provided, assume a filename and skip displaying -Dashboard." - (when (< (length command-line-args) 2) - (add-hook 'after-init-hook (lambda () - ;; Display useful lists of items - (dashboard-insert-startupify-lists))) - (add-hook 'emacs-startup-hook (lambda () - (switch-to-buffer dashboard-buffer-name) - (goto-char (point-min)) - (redisplay) - (run-hooks 'dashboard-after-initialize-hook))))) - -(provide 'dashboard) -;;; dashboard.el ends here diff --git a/code/elpa/dashboard-20230331.2304/banners/1.txt b/code/elpa/dashboard-20240319.915/banners/1.txt similarity index 100% rename from code/elpa/dashboard-20230331.2304/banners/1.txt rename to code/elpa/dashboard-20240319.915/banners/1.txt diff --git a/code/elpa/dashboard-20230331.2304/banners/2.txt b/code/elpa/dashboard-20240319.915/banners/2.txt similarity index 100% rename from code/elpa/dashboard-20230331.2304/banners/2.txt rename to code/elpa/dashboard-20240319.915/banners/2.txt diff --git a/code/elpa/dashboard-20230331.2304/banners/3.txt b/code/elpa/dashboard-20240319.915/banners/3.txt similarity index 100% rename from code/elpa/dashboard-20230331.2304/banners/3.txt rename to code/elpa/dashboard-20240319.915/banners/3.txt diff --git a/code/elpa/dashboard-20230331.2304/banners/4.txt b/code/elpa/dashboard-20240319.915/banners/4.txt similarity index 100% rename from code/elpa/dashboard-20230331.2304/banners/4.txt rename to code/elpa/dashboard-20240319.915/banners/4.txt diff --git a/code/elpa/dashboard-20230331.2304/banners/emacs.png b/code/elpa/dashboard-20240319.915/banners/emacs.png similarity index 100% rename from code/elpa/dashboard-20230331.2304/banners/emacs.png rename to code/elpa/dashboard-20240319.915/banners/emacs.png diff --git a/code/elpa/dashboard-20230331.2304/banners/logo.png b/code/elpa/dashboard-20240319.915/banners/logo.png similarity index 100% rename from code/elpa/dashboard-20230331.2304/banners/logo.png rename to code/elpa/dashboard-20240319.915/banners/logo.png diff --git a/code/elpa/dashboard-20230331.2304/dashboard-autoloads.el b/code/elpa/dashboard-20240319.915/dashboard-autoloads.el similarity index 50% rename from code/elpa/dashboard-20230331.2304/dashboard-autoloads.el rename to code/elpa/dashboard-20240319.915/dashboard-autoloads.el index c82e439..590bb48 100644 --- a/code/elpa/dashboard-20230331.2304/dashboard-autoloads.el +++ b/code/elpa/dashboard-20240319.915/dashboard-autoloads.el @@ -1,44 +1,39 @@ -;;; dashboard-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- -;; +;;; dashboard-autoloads.el --- automatically extracted autoloads (do not edit) -*- lexical-binding: t -*- +;; Generated by the `loaddefs-generate' function. + +;; This file is part of GNU Emacs. + ;;; Code: -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) +(add-to-list 'load-path (or (and load-file-name (directory-file-name (file-name-directory load-file-name))) (car load-path))) + -;;;### (autoloads nil "dashboard" "dashboard.el" (0 0 0 0)) ;;; Generated autoloads from dashboard.el (autoload 'dashboard-open "dashboard" "\ Open (or refresh) the *dashboard* buffer. -\(fn &rest _)" t nil) - +(fn &rest _)" t) (autoload 'dashboard-setup-startup-hook "dashboard" "\ -Setup post initialization hooks. -If a command line argument is provided, assume a filename and skip displaying -Dashboard." nil nil) - +Setup post initialization hooks unless a command line argument is provided.") (register-definition-prefixes "dashboard" '("dashboard-")) -;;;*** -;;;### (autoloads nil "dashboard-widgets" "dashboard-widgets.el" -;;;;;; (0 0 0 0)) ;;; Generated autoloads from dashboard-widgets.el -(register-definition-prefixes "dashboard-widgets" '("dashboard-" "org-time-less-p" "recentf-list")) - -;;;*** +(register-definition-prefixes "dashboard-widgets" '("dashboard-" "recentf-list")) -;;;### (autoloads nil nil ("dashboard-pkg.el") (0 0 0 0)) +;;; End of scraped data + +(provide 'dashboard-autoloads) -;;;*** - ;; Local Variables: ;; version-control: never ;; no-byte-compile: t ;; no-update-autoloads: t -;; coding: utf-8 +;; no-native-compile: t +;; coding: utf-8-emacs-unix ;; End: + ;;; dashboard-autoloads.el ends here diff --git a/code/elpa/dashboard-20230726.2018/dashboard-pkg.el b/code/elpa/dashboard-20240319.915/dashboard-pkg.el similarity index 71% rename from code/elpa/dashboard-20230726.2018/dashboard-pkg.el rename to code/elpa/dashboard-20240319.915/dashboard-pkg.el index 9f7cb16..7805371 100644 --- a/code/elpa/dashboard-20230726.2018/dashboard-pkg.el +++ b/code/elpa/dashboard-20240319.915/dashboard-pkg.el @@ -1,6 +1,6 @@ -(define-package "dashboard" "20230726.2018" "A startup screen extracted from Spacemacs" +(define-package "dashboard" "20240319.915" "A startup screen extracted from Spacemacs" '((emacs "26.1")) - :commit "6480e0797b41c8ce1de4f37ba8016d177c22ab04" :authors + :commit "e34ce1b4730fb88a33a571b9065114b7a77645f0" :authors '(("Rakan Al-Hneiti" . "rakan.alhneiti@gmail.com")) :maintainers '(("Jesús Martínez" . "jesusmartinez93@gmail.com")) diff --git a/code/elpa/dashboard-20230726.2018/dashboard-widgets.el b/code/elpa/dashboard-20240319.915/dashboard-widgets.el similarity index 88% rename from code/elpa/dashboard-20230726.2018/dashboard-widgets.el rename to code/elpa/dashboard-20240319.915/dashboard-widgets.el index c54459f..2664a17 100644 --- a/code/elpa/dashboard-20230726.2018/dashboard-widgets.el +++ b/code/elpa/dashboard-20240319.915/dashboard-widgets.el @@ -1,20 +1,11 @@ ;;; dashboard-widgets.el --- A startup screen extracted from Spacemacs -*- lexical-binding: t -*- -;; Copyright (c) 2016-2023 emacs-dashboard maintainers -;; -;; Author : Rakan Al-Hneiti -;; Maintainer : Jesús Martínez -;; Shen, Jen-Chieh -;; URL : https://github.com/emacs-dashboard/emacs-dashboard -;; +;; Copyright (c) 2016-2024 emacs-dashboard maintainers + ;; This file is not part of GNU Emacs. ;; ;;; License: GPLv3 ;; -;; Created: October 05, 2016 -;; Package-Version: 1.9.0-SNAPSHOT -;; Keywords: startup, screen, tools, dashboard -;; Package-Requires: ((emacs "26.1")) ;;; Commentary: ;; An extensible Emacs dashboard, with sections for @@ -26,6 +17,9 @@ (require 'image) (require 'subr-x) +;; +;;; Externals + ;; Compiler pacifier (declare-function all-the-icons-icon-for-dir "ext:all-the-icons.el") (declare-function all-the-icons-icon-for-file "ext:all-the-icons.el") @@ -42,7 +36,6 @@ (declare-function projectile-cleanup-known-projects "ext:projectile.el") (declare-function projectile-load-known-projects "ext:projectile.el") (declare-function projectile-mode "ext:projectile.el") -(declare-function projectile-relevant-known-projects "ext:projectile.el") ;;; project.el in Emacs 26 does not contain this function (declare-function project-known-project-roots "ext:project.el" nil t) (declare-function project-forget-zombie-projects "ext:project.el" nil t) @@ -66,7 +59,6 @@ (declare-function org-time-string-to-time "ext:org.el") (declare-function org-today "ext:org.el") (declare-function recentf-cleanup "ext:recentf.el") -(defalias 'org-time-less-p 'time-less-p) (defvar org-level-faces) (defvar org-agenda-new-buffers) (defvar org-agenda-prefix-format) @@ -78,9 +70,29 @@ (declare-function string-pixel-width "subr-x.el") ; TODO: remove this after 29.1 (declare-function shr-string-pixel-width "shr.el") ; TODO: remove this after 29.1 -(defcustom dashboard-page-separator "\n\n" +(make-obsolete-variable 'dashboard-set-navigator + 'dashboard-startupify-list "1.9.0") + +(make-obsolete-variable 'dashboard-set-init-info + 'dashboard-startupify-list "1.9.0") + +(make-obsolete-variable 'dashboard-set-footer + 'dashboard-startupify-list "1.9.0") + +(defvar recentf-list nil) + +(defvar dashboard-buffer-name) + +;; +;;; Customization + +(defcustom dashboard-page-separator "\n" "Separator to use between the different pages." - :type 'string + :type '(choice + (const :tag "Default" "\n") + (const :tag "Use Page indicator (requires page-break-lines)" + "\n\f\n") + (string :tag "Use Custom String")) :group 'dashboard) (defcustom dashboard-image-banner-max-height 0 @@ -103,6 +115,14 @@ preserved." :type 'integer :group 'dashboard) +(defcustom dashboard-image-extra-props nil + "Additional image attributes to assign to the image. +This could be useful for displaying images with transparency, +for example, by setting the `:mask' property to `heuristic'. +See `create-image' and Info node `(elisp)Image Descriptors'." + :type 'plist + :group 'dashboard) + (defcustom dashboard-set-heading-icons nil "When non nil, heading sections will have icons." :type 'boolean @@ -113,21 +133,6 @@ preserved." :type 'boolean :group 'dashboard) -(defcustom dashboard-set-navigator nil - "When non nil, a navigator will be displayed under the banner." - :type 'boolean - :group 'dashboard) - -(defcustom dashboard-set-init-info t - "When non nil, init info will be displayed under the banner." - :type 'boolean - :group 'dashboard) - -(defcustom dashboard-set-footer t - "When non nil, a footer will be displayed at the bottom." - :type 'boolean - :group 'dashboard) - (defcustom dashboard-footer-messages '("The one true editor, Emacs!" "Who the hell uses VIM anyway? Go Evil!" @@ -261,17 +266,10 @@ Example: :type '(function string) :group 'dashboard) -(defcustom dashboard-footer - (nth (random (1- (1+ (length dashboard-footer-messages)))) dashboard-footer-messages) - "A footer with some short message." - :type 'string - :group 'dashboard) - (defcustom dashboard-display-icons-p #'display-graphic-p "Predicate to determine whether dashboard should show icons. -Can be nil to not show icons and any truthy value to show them. When set -to a function the result of the function will be interpreted as the -predicate value." +Can be nil to not show icons and any truthy value to show them. When set to a +function the result of the function will be interpreted as the predicate value." :type '(choice (function :tag "Predicate function") (boolean :tag "Predicate value")) :group 'dashboard) @@ -316,7 +314,7 @@ ARGS should be a plist containing `:height', `:v-adjust', or `:face' properties. ('nerd-icons (apply #'nerd-icons-icon-for-file file args))))) (defun dashboard-octicon (name &rest args) - "Get the formatted octicon. + "Get the formatted octicon by NAME. ARGS should be a plist containing `:height', `:v-adjust', or `:face' properties." (dashboard-replace-displayable (pcase dashboard-icon-type @@ -330,33 +328,48 @@ ARGS should be a plist containing `:height', `:v-adjust', or `:face' properties. (all-the-icons-fileicon "emacs" :height 1.1 :v-adjust -0.05 - :face 'font-lock-keyword-face)) + :face 'dashboard-footer-icon-face)) ('nerd-icons (nerd-icons-sucicon "nf-custom-emacs" :height 1.1 :v-adjust -0.05 - :face 'font-lock-keyword-face))) - (propertize ">" 'face 'dashboard-footer)) + :face 'dashboard-footer-icon-face))) + (propertize ">" 'face 'dashboard-footer-icon-face)) "Footer's icon." :type 'string :group 'dashboard) +(defcustom dashboard-heading-shorcut-format " (%s)" + "String for display key used in headings." + :type 'string + :group 'dashboard) + (defcustom dashboard-startup-banner 'official - "Specify the startup banner. -Default value is `official', it displays the Emacs logo. `logo' displays Emacs -alternative logo. If set to `ascii', the value of `dashboard-banner-ascii' -will be used as the banner. An integer value is the index of text banner. -A string value must be a path to a .PNG or .TXT file. If the value is -nil then no banner is displayed." - :type '(choice (const :tag "no banner" nil) - (const :tag "offical" official) + "Specify the banner type to use. +Value can be + - \\='official displays the official Emacs logo. + - \\='logo displays an alternative Emacs logo. + - an integer which displays one of the text banners. + - a string that specifies the path of an custom banner + supported files types are gif/image/text/xbm. + - a cons of 2 strings which specifies the path of an image to use + and other path of a text file to use if image isn't supported. + - a list that can display an random banner, supported values are: + string (filepath), \\='official, \\='logo and integers." + :type '(choice (const :tag "official" official) (const :tag "logo" logo) (const :tag "ascii" ascii) (integer :tag "index of a text banner") - (string :tag "a path to an image or text banner") - (cons :tag "an image and text banner" + (string :tag "path to an image or text banner") + (cons :tag "image and text banner" (string :tag "image banner path") - (string :tag "text banner path"))) + (string :tag "text banner path")) + (repeat :tag "random banners" + (choice (string :tag "a path to an image or text banner") + (const :tag "official" official) + (const :tag "logo" logo) + (const :tag "ascii" ascii) + (integer :tag "index of a text banner")))) :group 'dashboard) (defcustom dashboard-item-generators @@ -369,10 +382,10 @@ nil then no banner is displayed." Will be of the form `(list-type . list-function)'. Possible values for list-type are: `recents', `bookmarks', `projects', `agenda' ,`registers'." - :type '(repeat (alist :key-type symbol :value-type function)) + :type '(alist :key-type symbol :value-type function) :group 'dashboard) -(defcustom dashboard-projects-backend 'projectile +(defcustom dashboard-projects-backend 'project-el "The package that supplies the list of recent projects. With the value `projectile', the projects widget uses the package projectile (available in MELPA). With the value `project-el', @@ -385,6 +398,11 @@ installed." (const :tag "Use project.el" project-el)) :group 'dashboard) +(defcustom dashboard-remove-missing-entry nil + "If non-nil, try to remove missing entries." + :type 'boolean + :group 'dashboard) + (defcustom dashboard-items '((recents . 5) (bookmarks . 5) @@ -443,13 +461,9 @@ Set to nil for unbounded." :type 'string :group 'dashboard) -(defvar recentf-list nil) - -(defvar dashboard-buffer-name) - -;; -;; Faces ;; +;;; Faces + (defface dashboard-text-banner '((t (:inherit font-lock-keyword-face))) "Face used for text banners." @@ -480,9 +494,14 @@ Set to nil for unbounded." "Face used for no items." :group 'dashboard) -(defface dashboard-footer +(defface dashboard-footer-face '((t (:inherit font-lock-doc-face))) - "Face used for widget headings." + "Face used for footer text." + :group 'dashboard) + +(defface dashboard-footer-icon-face + '((t (:inherit dashboard-footer-face))) + "Face used for icon in footer." :group 'dashboard) (define-obsolete-face-alias @@ -493,8 +512,8 @@ Set to nil for unbounded." 'dashboard-heading-face 'dashboard-heading "1.2.6") ;; -;; Util -;; +;;; Util + (defmacro dashboard-mute-apply (&rest body) "Execute BODY without message." (declare (indent 0) (debug t)) @@ -522,8 +541,8 @@ Set to nil for unbounded." (if (zerop (% len width)) 0 1)))) ; add one if exceeed ;; -;; Generic widget helpers -;; +;;; Widget helpers + (defun dashboard-subseq (seq end) "Return the subsequence of SEQ from 0 to END." (let ((len (length seq))) (butlast seq (- len (min len end))))) @@ -543,6 +562,9 @@ Set to nil for unbounded." search-label &optional no-next-line) "Insert a shortcut SHORTCUT-CHAR for a given SEARCH-LABEL. + +SHORTCUT-ID is the section identifier. + Optionally, provide NO-NEXT-LINE to move the cursor forward a line." (let* (;; Ensure punctuation and upper case in search string is not ;; used to construct the `defun' @@ -577,6 +599,11 @@ If MESSAGEBUF is not nil then MSG is also written in message buffer." "Insert a page break line in dashboard buffer." (dashboard-append dashboard-page-separator)) +(defun dashboard-insert-newline (&optional n) + "Insert N times of newlines." + (dotimes (_ (or n 1)) + (insert "\n"))) + (defun dashboard-insert-heading (heading &optional shortcut icon) "Insert a widget HEADING in dashboard buffer, adding SHORTCUT, ICON if provided." (when (and (dashboard-display-icons-p) dashboard-set-heading-icons) @@ -615,10 +642,10 @@ If MESSAGEBUF is not nil then MSG is also written in message buffer." (let ((ov (make-overlay (- (point) (length heading)) (point) nil t))) (overlay-put ov 'display (or (cdr (assoc heading dashboard-item-names)) heading)) (overlay-put ov 'face 'dashboard-heading)) - (when shortcut (insert (format " (%s)" shortcut)))) + (when shortcut (insert (format dashboard-heading-shorcut-format shortcut)))) -(defun dashboard-center-text (start end) - "Center the text between START and END." +(defun dashboard--find-max-width (start end) + "Return the max width within the region START and END." (save-excursion (goto-char start) (let ((width 0)) @@ -627,8 +654,13 @@ If MESSAGEBUF is not nil then MSG is also written in message buffer." (line-length (dashboard-str-len line-str))) (setq width (max width line-length))) (forward-line 1)) - (let ((prefix (propertize " " 'display `(space . (:align-to (- center ,(/ width 2))))))) - (add-text-properties start end `(line-prefix ,prefix indent-prefix ,prefix)))))) + width))) + +(defun dashboard-center-text (start end) + "Center the text between START and END." + (let* ((width (dashboard--find-max-width start end)) + (prefix (propertize " " 'display `(space . (:align-to (- center ,(/ (float width) 2))))))) + (add-text-properties start end `(line-prefix ,prefix indent-prefix ,prefix)))) (defun dashboard-insert-center (&rest strings) "Insert STRINGS in the center of the buffer." @@ -637,8 +669,7 @@ If MESSAGEBUF is not nil then MSG is also written in message buffer." (dashboard-center-text start (point)))) ;; -;; BANNER -;; +;;; Banner (defun dashboard-get-banner-path (index) "Return the full path to banner with index INDEX." @@ -651,10 +682,9 @@ If MESSAGEBUF is not nil then MSG is also written in message buffer." ;; - That function will only look at filenames, this one will inspect the file data itself. (and (file-exists-p img) (ignore-errors (image-type-available-p (image-type img))))) -(defun dashboard-choose-banner () - "Return a plist specifying the chosen banner based on `dashboard-startup-banner'." - (pcase dashboard-startup-banner - ('nil nil) +(defun dashboard-choose-banner (banner) + "Return a plist specifying the chosen banner based on BANNER." + (pcase banner ('official (append (when (image-type-available-p 'png) (list :image dashboard-banner-official-png)) @@ -666,24 +696,27 @@ If MESSAGEBUF is not nil then MSG is also written in message buffer." ('ascii (append (list :text dashboard-banner-ascii))) ((pred integerp) - (list :text (dashboard-get-banner-path dashboard-startup-banner))) + (list :text (dashboard-get-banner-path banner))) ((pred stringp) - (pcase dashboard-startup-banner + (pcase banner ((pred (lambda (f) (not (file-exists-p f)))) - (message "could not find banner %s, use default instead" dashboard-startup-banner) + (message "could not find banner %s, use default instead" banner) (list :text (dashboard-get-banner-path 1))) ((pred (string-suffix-p ".txt")) - (list :text (if (file-exists-p dashboard-startup-banner) - dashboard-startup-banner - (message "could not find banner %s, use default instead" dashboard-startup-banner) + (list :text (if (file-exists-p banner) + banner + (message "could not find banner %s, use default instead" banner) (dashboard-get-banner-path 1)))) ((pred dashboard--image-supported-p) - (list :image dashboard-startup-banner + (list :image banner :text (dashboard-get-banner-path 1))) (_ - (message "unsupported file type %s" (file-name-nondirectory dashboard-startup-banner)) + (message "unsupported file type %s" (file-name-nondirectory banner)) (list :text (dashboard-get-banner-path 1))))) - (`(,img . ,txt) + ((and + (pred listp) + (pred (lambda (c) (not (proper-list-p c)))) + `(,img . ,txt)) (list :image (if (dashboard--image-supported-p img) img (message "could not find banner %s, use default instead" img) @@ -692,57 +725,72 @@ If MESSAGEBUF is not nil then MSG is also written in message buffer." txt (message "could not find banner %s, use default instead" txt) (dashboard-get-banner-path 1)))) + ((pred proper-list-p) + (let* ((max (length banner)) + (choose (nth (random max) banner))) + (dashboard-choose-banner choose))) (_ - (message "unsupported banner config %s" dashboard-startup-banner)))) + (message "unsupported banner config %s" banner)))) -(defun dashboard--type-is-gif-p (image-path) - "Return if image is a gif. +(defun dashboard--image-animated-p (image-path) + "Return if image is a gif or webp. String -> bool. Argument IMAGE-PATH path to the image." - (eq 'gif (image-type image-path))) + (memq (image-type image-path) '(gif webp))) + +(defun dashboard--type-is-xbm-p (image-path) + "Return if image is a xbm. +String -> bool. +Argument IMAGE-PATH path to the image." + (eq 'xbm (image-type image-path))) (defun dashboard-insert-banner () "Insert the banner at the top of the dashboard." (goto-char (point-max)) - (when-let (banner (dashboard-choose-banner)) + (when-let ((banner (dashboard-choose-banner dashboard-startup-banner))) (insert "\n") (let ((start (point)) buffer-read-only text-width - image-spec) - (insert "\n") + image-spec + (graphic-mode (display-graphic-p))) + (when graphic-mode (insert "\n")) ;; If specified, insert a text banner. - (when-let (txt (plist-get banner :text)) - (if (eq dashboard-startup-banner 'ascii) - (save-excursion (insert txt)) - (insert-file-contents txt)) + (when-let ((txt (plist-get banner :text))) + (if (file-exists-p txt) + (insert-file-contents txt) + (save-excursion (insert txt))) (put-text-property (point) (point-max) 'face 'dashboard-text-banner) (setq text-width 0) (while (not (eobp)) (let ((line-length (- (line-end-position) (line-beginning-position)))) - (if (< text-width line-length) - (setq text-width line-length))) + (when (< text-width line-length) + (setq text-width line-length))) (forward-line 1))) ;; If specified, insert an image banner. When displayed in a graphical frame, this will ;; replace the text banner. - (when-let (img (plist-get banner :image)) - (let ((size-props + (when-let ((img (plist-get banner :image))) + (let ((img-props (append (when (> dashboard-image-banner-max-width 0) (list :max-width dashboard-image-banner-max-width)) (when (> dashboard-image-banner-max-height 0) - (list :max-height dashboard-image-banner-max-height))))) + (list :max-height dashboard-image-banner-max-height)) + dashboard-image-extra-props))) (setq image-spec - (cond ((dashboard--type-is-gif-p img) + (cond ((dashboard--image-animated-p img) + (create-image img)) + ((dashboard--type-is-xbm-p img) (create-image img)) ((image-type-available-p 'imagemagick) - (apply 'create-image img 'imagemagick nil size-props)) + (apply 'create-image img 'imagemagick nil img-props)) (t (apply 'create-image img nil nil (when (and (fboundp 'image-transforms-p) (memq 'scale (funcall 'image-transforms-p))) - size-props)))))) + img-props)))))) (add-text-properties start (point) `(display ,image-spec)) - (when (dashboard--type-is-gif-p img) (image-animate image-spec 0 t))) + (when (ignore-errors (image-multi-frame-p image-spec)) (image-animate image-spec 0 t))) + ;; Finally, center the banner (if any). (when-let* ((text-align-spec `(space . (:align-to (- center ,(/ text-width 2))))) (image-align-spec `(space . (:align-to (- center (0.5 . ,image-spec))))) @@ -761,28 +809,27 @@ Argument IMAGE-PATH path to the image." (t nil))) (prefix (propertize " " 'display prop))) (add-text-properties start (point) `(line-prefix ,prefix wrap-prefix ,prefix))) - (insert "\n\n") - (add-text-properties start (point) '(cursor-intangible t inhibit-isearch t)))) + (insert "\n") + (add-text-properties start (point) '(cursor-intangible t inhibit-isearch t))))) + +(defun dashboard-insert-banner-title () + "Insert `dashboard-banner-logo-title' if it's non-nil." (when dashboard-banner-logo-title (dashboard-insert-center (propertize dashboard-banner-logo-title 'face 'dashboard-banner-logo-title)) - (insert "\n\n")) - (dashboard-insert-navigator) - (dashboard-insert-init-info)) + (insert "\n"))) ;; -;; INIT INFO -;; +;;; Initialize info (defun dashboard-insert-init-info () - "Insert init info when `dashboard-set-init-info' is t." - (when dashboard-set-init-info - (let ((init-info (if (functionp dashboard-init-info) - (funcall dashboard-init-info) - dashboard-init-info))) - (dashboard-insert-center (propertize init-info 'face 'font-lock-comment-face))))) + "Insert init info." + (let ((init-info (if (functionp dashboard-init-info) + (funcall dashboard-init-info) + dashboard-init-info))) + (dashboard-insert-center (propertize init-info 'face 'font-lock-comment-face)))) (defun dashboard-insert-navigator () "Insert Navigator of the dashboard." - (when (and dashboard-set-navigator dashboard-navigator-buttons) + (when dashboard-navigator-buttons (dolist (line dashboard-navigator-buttons) (dolist (btn line) (let* ((icon (car btn)) @@ -814,12 +861,12 @@ Argument IMAGE-PATH path to the image." :format "%[%t%]") (insert " "))) (dashboard-center-text (line-beginning-position) (line-end-position)) - (insert "\n")) - (insert "\n"))) + (insert "\n")))) (defmacro dashboard-insert-section (section-name list list-size shortcut-id shortcut-char action &rest widget-params) "Add a section with SECTION-NAME and LIST of LIST-SIZE items to the dashboard. +SHORTCUT-ID is the section identifier. SHORTCUT-CHAR is the keyboard shortcut used to access the section. ACTION is theaction taken when the user activates the widget button. WIDGET-PARAMS are passed to the \"widget-create\" function." @@ -837,8 +884,8 @@ WIDGET-PARAMS are passed to the \"widget-create\" function." (insert (propertize "\n --- No items ---" 'face 'dashboard-no-items-face))))) ;; -;; Section list -;; +;;; Section list + (defmacro dashboard-insert-section-list (section-name list action &rest rest) "Insert into SECTION-NAME a LIST of items, expanding ACTION and passing REST to widget creation." @@ -874,27 +921,26 @@ to widget creation." :format "%[%t%]"))) ,list))) -;; Footer +;; +;;; Footer + (defun dashboard-random-footer () "Return a random footer from `dashboard-footer-messages'." (nth (random (length dashboard-footer-messages)) dashboard-footer-messages)) (defun dashboard-insert-footer () "Insert footer of dashboard." - (when-let ((footer (and dashboard-set-footer (dashboard-random-footer)))) - (insert "\n") + (when-let ((footer (dashboard-random-footer)) + (footer-icon (dashboard-replace-displayable dashboard-footer-icon))) (dashboard-insert-center - (dashboard-replace-displayable dashboard-footer-icon) - (if (and (stringp dashboard-footer-icon) - (not (string-empty-p dashboard-footer-icon))) - " " - "") - (propertize footer 'face 'dashboard-footer) + (if (string-empty-p footer-icon) footer-icon + (concat footer-icon " ")) + (propertize footer 'face 'dashboard-footer-face) "\n"))) ;; -;; Truncate -;; +;;; Truncate + (defcustom dashboard-shorten-by-window-width nil "Shorten path by window edges." :type 'boolean @@ -1043,8 +1089,8 @@ to widget creation." align-length)) ;; -;; Recentf -;; +;;; Recentf + (defcustom dashboard-recentf-show-base nil "Show the base file name infront of it's path." :type '(choice @@ -1067,7 +1113,10 @@ to widget creation." (defun dashboard-insert-recents (list-size) "Add the list of LIST-SIZE items from recently edited files." (setq dashboard--recentf-cache-item-format nil) - (dashboard-mute-apply (recentf-mode 1) (recentf-cleanup)) + (dashboard-mute-apply + (recentf-mode 1) + (when dashboard-remove-missing-entry + (ignore-errors (recentf-cleanup)))) (dashboard-insert-section "Recent Files:" (dashboard-shorten-paths recentf-list 'dashboard-recentf-alist 'recents) @@ -1091,8 +1140,8 @@ to widget creation." (t (format dashboard-recentf-item-format filename path)))))) ;; -;; Bookmarks -;; +;;; Bookmarks + (defcustom dashboard-bookmarks-show-base t "Show the base file name infront of it's path." :type '(choice @@ -1135,8 +1184,8 @@ to widget creation." el))) ;; -;; Projects -;; +;;; Projects + (defcustom dashboard-projects-switch-function nil "Custom function to switch to projects from dashboard. @@ -1198,11 +1247,16 @@ Return function that returns a list of projects." (cl-case dashboard-projects-backend (`projectile (require 'projectile) - (dashboard-mute-apply (projectile-cleanup-known-projects)) + (when dashboard-remove-missing-entry + (dashboard-mute-apply + (ignore-errors (projectile-cleanup-known-projects)))) (projectile-load-known-projects)) (`project-el (require 'project) - (dashboard-mute-apply (dashboard-funcall-fboundp #'project-forget-zombie-projects)) + (when dashboard-remove-missing-entry + (dashboard-mute-apply + (ignore-errors + (dashboard-funcall-fboundp #'project-forget-zombie-projects)))) (project-known-project-roots)) (t (display-warning '(dashboard) @@ -1227,8 +1281,8 @@ over custom backends." :error))))) ;; -;; Org Agenda -;; +;;; Org Agenda + (defcustom dashboard-week-agenda t "Show agenda weekly if its not nil." :type 'boolean @@ -1359,12 +1413,12 @@ point." (unless (and (not (org-entry-is-done-p)) (not (org-in-archived-heading-p)) (or (and scheduled-time - (org-time-less-p scheduled-time due-date)) + (time-less-p scheduled-time due-date)) (and deadline-time - (org-time-less-p deadline-time due-date)) + (time-less-p deadline-time due-date)) (and entry-timestamp - (org-time-less-p now entry-timestamp) - (org-time-less-p entry-timestamp due-date)))) + (time-less-p now entry-timestamp) + (time-less-p entry-timestamp due-date)))) (point)))) (defun dashboard-filter-agenda-by-todo () @@ -1437,8 +1491,8 @@ found for the strategy it uses nil predicate." (cl-case strategy (`priority-up '>) (`priority-down '<) - (`time-up 'org-time-less-p) - (`time-down (lambda (a b) (org-time-less-p b a))) + (`time-up 'time-less-p) + (`time-down (lambda (a b) (time-less-p b a))) (`todo-state-up '>) (`todo-state-down '<))) @@ -1482,8 +1536,8 @@ to compare." (format "%s" el))) ;; -;; Registers -;; +;;; Registers + (defun dashboard-insert-registers (list-size) "Add the list of LIST-SIZE items of registers." (require 'register) diff --git a/org/elpa/dashboard-20230726.2018/dashboard.el b/code/elpa/dashboard-20240319.915/dashboard.el similarity index 68% rename from org/elpa/dashboard-20230726.2018/dashboard.el rename to code/elpa/dashboard-20240319.915/dashboard.el index 70096fe..28332c3 100644 --- a/org/elpa/dashboard-20230726.2018/dashboard.el +++ b/code/elpa/dashboard-20240319.915/dashboard.el @@ -1,6 +1,6 @@ ;;; dashboard.el --- A startup screen extracted from Spacemacs -*- lexical-binding: t -*- -;; Copyright (c) 2016-2023 emacs-dashboard maintainers +;; Copyright (c) 2016-2024 emacs-dashboard maintainers ;; ;; Author : Rakan Al-Hneiti ;; Maintainer : Jesús Martínez @@ -27,6 +27,9 @@ (require 'dashboard-widgets) +;; +;;; Externals + (declare-function bookmark-get-filename "ext:bookmark.el") (declare-function bookmark-all-names "ext:bookmark.el") (declare-function dashboard-ls--dirs "ext:dashboard-ls.el") @@ -38,6 +41,9 @@ (declare-function dashboard-refresh-buffer "dashboard.el") +;; +;;; Customization + (defgroup dashboard nil "Extensible startup screen." :group 'applications) @@ -45,17 +51,17 @@ ;; Custom splash screen (defvar dashboard-mode-map (let ((map (make-sparse-keymap))) - (define-key map (kbd "C-p") 'dashboard-previous-line) - (define-key map (kbd "C-n") 'dashboard-next-line) - (define-key map (kbd "") 'dashboard-previous-line) - (define-key map (kbd "") 'dashboard-next-line) - (define-key map (kbd "k") 'dashboard-previous-line) - (define-key map (kbd "j") 'dashboard-next-line) - (define-key map [tab] 'widget-forward) - (define-key map (kbd "C-i") 'widget-forward) - (define-key map [backtab] 'widget-backward) - (define-key map (kbd "RET") 'dashboard-return) - (define-key map [mouse-1] 'dashboard-mouse-1) + (define-key map (kbd "C-p") #'dashboard-previous-line) + (define-key map (kbd "C-n") #'dashboard-next-line) + (define-key map (kbd "") #'dashboard-previous-line) + (define-key map (kbd "") #'dashboard-next-line) + (define-key map (kbd "k") #'dashboard-previous-line) + (define-key map (kbd "j") #'dashboard-next-line) + (define-key map [tab] #'widget-forward) + (define-key map (kbd "C-i") #'widget-forward) + (define-key map [backtab] #'widget-backward) + (define-key map (kbd "RET") #'dashboard-return) + (define-key map [mouse-1] #'dashboard-mouse-1) (define-key map (kbd "}") #'dashboard-next-section) (define-key map (kbd "{") #'dashboard-previous-section) @@ -75,11 +81,21 @@ map) "Keymap for dashboard mode.") +(defcustom dashboard-before-initialize-hook nil + "Hook that is run before dashboard buffer is initialized." + :group 'dashboard + :type 'hook) + (defcustom dashboard-after-initialize-hook nil "Hook that is run after dashboard buffer is initialized." :group 'dashboard :type 'hook) +(defcustom dashboard-hide-cursor nil + "Whether to hide the cursor in the dashboard." + :type 'boolean + :group 'dashboard) + (define-derived-mode dashboard-mode special-mode "Dashboard" "Dashboard major mode for startup screen." :group 'dashboard @@ -91,6 +107,8 @@ (when (featurep 'display-line-numbers) (display-line-numbers-mode -1)) (when (featurep 'page-break-lines) (page-break-lines-mode 1)) (setq-local revert-buffer-function #'dashboard-refresh-buffer) + (when dashboard-hide-cursor + (setq-local cursor-type nil)) (setq inhibit-startup-screen t buffer-read-only t truncate-lines t)) @@ -100,6 +118,42 @@ :type 'boolean :group 'dashboard) +(defcustom dashboard-vertically-center-content nil + "Whether to vertically center content within the window." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-startupify-list + '(dashboard-insert-banner + dashboard-insert-newline + dashboard-insert-banner-title + dashboard-insert-newline + dashboard-insert-init-info + dashboard-insert-items + dashboard-insert-newline + dashboard-insert-footer) + "List of dashboard widgets (in order) to insert in dashboard buffer. +Avalaible functions: + `dashboard-insert-newline' + `dashboard-insert-page-break' + `dashboard-insert-banner' + `dashboard-insert-banner-title' + `dashboard-insert-navigator' + `dashboard-insert-init-info' + `dashboard-insert-items' + `dashboard-insert-footer' + +You can also add your custom function or a lambda to the list. +example: + (lambda () (delete-char -1))" + :type '(repeat function) + :group 'dashboard) + +(defcustom dashboard-navigation-cycle nil + "Non-nil cycle the section navigation." + :type 'boolean + :group 'dashboard) + (defconst dashboard-buffer-name "*dashboard*" "Dashboard's buffer name.") @@ -110,8 +164,8 @@ "List of section starting positions.") ;; -;; Util -;; +;;; Util + (defun dashboard--goto-line (line) "Goto LINE." (goto-char (point-min)) (forward-line (1- line))) @@ -126,13 +180,18 @@ (move-to-column column))) ;; -;; Core -;; +;;; Core + +(defun dashboard--separator () + "Return separator used to search." + (concat "\n" dashboard-page-separator)) + (defun dashboard--current-section () "Return section symbol in dashboard." (save-excursion - (if (and (search-backward dashboard-page-separator nil t) - (search-forward dashboard-page-separator nil t)) + (if-let* ((sep (dashboard--separator)) + ((and (search-backward sep nil t) + (search-forward sep nil t)))) (let ((ln (thing-at-point 'line))) (cond ((string-match-p "Recent Files:" ln) 'recents) ((string-match-p "Bookmarks:" ln) 'bookmarks) @@ -145,39 +204,51 @@ (user-error "Failed searching dashboard section")))) ;; -;; Navigation -;; +;;; Navigation + (defun dashboard-previous-section () - "Navigate back to previous section." + "Navigate forward to next section." (interactive) - (let ((current-position (point)) current-section-start previous-section-start) - (dolist (elt dashboard--section-starts) - (when (and current-section-start (not previous-section-start)) - (setq previous-section-start elt)) - (when (and (not current-section-start) (< elt current-position)) - (setq current-section-start elt))) - (goto-char (if (eq current-position current-section-start) - previous-section-start - current-section-start)))) + (let* ((items-len (1- (length dashboard-items))) + (first-item (car (nth 0 dashboard-items))) + (current (or (ignore-errors (dashboard--current-section)) + first-item)) + (items (mapcar #'car dashboard-items)) + (find (cl-position current items :test #'equal)) + (prev-index (1- find)) + (prev (cond (dashboard-navigation-cycle + (if (< prev-index 0) (nth items-len items) + (nth prev-index items))) + (t + (if (< prev-index 0) (nth 0 items) + (nth prev-index items)))))) + (dashboard--goto-section prev))) (defun dashboard-next-section () "Navigate forward to next section." (interactive) - (let ((current-position (point)) next-section-start - (section-starts (reverse dashboard--section-starts))) - (dolist (elt section-starts) - (when (and (not next-section-start) - (> elt current-position)) - (setq next-section-start elt))) - (when next-section-start - (goto-char next-section-start)))) + (let* ((items-len (1- (length dashboard-items))) + (last-item (car (nth items-len dashboard-items))) + (current (or (ignore-errors (dashboard--current-section)) + last-item)) + (items (mapcar #'car dashboard-items)) + (find (cl-position current items :test #'equal)) + (next-index (1+ find)) + (next (cond (dashboard-navigation-cycle + (or (nth next-index items) + (nth 0 items))) + (t + (if (< items-len next-index) + (nth (min items-len next-index) items) + (nth next-index items)))))) + (dashboard--goto-section next))) (defun dashboard--section-lines () "Return a list of integer represent the starting line number of each section." (let (pb-lst) (save-excursion (goto-char (point-min)) - (while (search-forward dashboard-page-separator nil t) + (while (search-forward (dashboard--separator) nil t) (when (ignore-errors (dashboard--current-section)) (push (line-number-at-pos) pb-lst)))) (setq pb-lst (reverse pb-lst)) @@ -232,8 +303,8 @@ Optional prefix ARG says how many lines to move; default is one line." (beginning-of-line-text)) ;; -;; ffap -;; +;;; ffap + (defun dashboard--goto-section (section) "Move to SECTION declares in variable `dashboard-item-shortcuts'." (let ((fnc (intern (format "dashboard-jump-to-%s" section)))) @@ -290,8 +361,8 @@ Optional argument ARGS adviced function arguments." (advice-add 'ffap-guesser :around #'dashboard--ffap-guesser--adv) ;; -;; Removal -;; +;;; Removal + (defun dashboard-remove-item-under () "Remove a item from the current item section." (interactive) @@ -337,8 +408,8 @@ Optional argument ARGS adviced function arguments." (interactive)) ; TODO: .. ;; -;; Confirmation -;; +;;; Confirmation + (defun dashboard-return () "Hit return key in dashboard buffer." (interactive) @@ -368,8 +439,8 @@ Optional argument ARGS adviced function arguments." (setq track-mouse old-track-mouse)))) ;; -;; Insertion -;; +;;; Insertion + (defmacro dashboard--with-buffer (&rest body) "Execute BODY in dashboard buffer." (declare (indent 0)) @@ -377,17 +448,42 @@ Optional argument ARGS adviced function arguments." (let ((inhibit-read-only t)) ,@body) (current-buffer))) -(defun dashboard-maximum-section-length () - "For the just-inserted section, calculate the length of the longest line." - (let ((max-line-length 0)) +(defun dashboard-insert-items () + "Function to insert dashboard items. +See `dashboard-item-generators' for all items available." + (let ((recentf-is-on (recentf-enabled-p)) + (origial-recentf-list recentf-list)) + (mapc (lambda (els) + (let* ((el (or (car-safe els) els)) + (list-size + (or (cdr-safe els) + dashboard-items-default-length)) + (item-generator + (cdr-safe (assoc el dashboard-item-generators)))) + + (insert "\n") + (push (point) dashboard--section-starts) + (funcall item-generator list-size) + (goto-char (point-max)) + + (when recentf-is-on + (setq recentf-list origial-recentf-list)))) + dashboard-items) + + (when dashboard-center-content + (dashboard-center-text + (if dashboard--section-starts + (car (last dashboard--section-starts)) + (point)) + (point-max))) + (save-excursion - (dashboard-previous-section) - (while (not (eobp)) - (setq max-line-length - (max max-line-length - (- (line-end-position) (line-beginning-position)))) - (forward-line 1))) - max-line-length)) + (dolist (start dashboard--section-starts) + (goto-char start) + (insert dashboard-page-separator))) + + (insert "\n") + (insert dashboard-page-separator))) (defun dashboard-insert-startupify-lists () "Insert the list of widgets into the buffer." @@ -395,55 +491,33 @@ Optional argument ARGS adviced function arguments." (let ((inhibit-redisplay t) (recentf-is-on (recentf-enabled-p)) (origial-recentf-list recentf-list) - (dashboard-num-recents (or (cdr (assoc 'recents dashboard-items)) 0)) - (max-line-length 0)) + (dashboard-num-recents (or (cdr (assoc 'recents dashboard-items)) 0))) (when recentf-is-on (setq recentf-list (dashboard-subseq recentf-list dashboard-num-recents))) (dashboard--with-buffer (when (or dashboard-force-refresh (not (eq major-mode 'dashboard-mode))) + (run-hooks 'dashboard-before-initialize-hook) (erase-buffer) - (dashboard-insert-banner) - (insert "\n") (setq dashboard--section-starts nil) - (mapc (lambda (els) - (let* ((el (or (car-safe els) els)) - (list-size - (or (cdr-safe els) - dashboard-items-default-length)) - (item-generator - (cdr-safe (assoc el dashboard-item-generators)))) - (push (point) dashboard--section-starts) - (funcall item-generator list-size) - (goto-char (point-max)) - ;; add a newline so the next section-name doesn't get include - ;; on the same line. - (insert "\n") - (when recentf-is-on - (setq recentf-list origial-recentf-list)) - (setq max-line-length - (max max-line-length (dashboard-maximum-section-length))))) - dashboard-items) - (when dashboard-center-content - (dashboard-center-text - (if dashboard--section-starts - (car (last dashboard--section-starts)) - (point)) - (point-max))) - (save-excursion - (dolist (start dashboard--section-starts) - (goto-char start) - (delete-char -1) ; delete the newline we added previously - (insert dashboard-page-separator))) - (progn - (delete-char -1) - (insert dashboard-page-separator)) - (dashboard-insert-footer) + + (mapc (lambda (fn) + (funcall fn)) + dashboard-startupify-list) + + (when dashboard-vertically-center-content + (goto-char (point-min)) + (when-let* ((content-height (cdr (window-absolute-pixel-position (point-max)))) + (vertical-padding (floor (/ (- (window-pixel-height) content-height) 2))) + ((> vertical-padding 0)) + (vertical-lines (1- (floor (/ vertical-padding (line-pixel-height))))) + ((> vertical-lines 0))) + (insert (make-string vertical-lines ?\n)))) + (goto-char (point-min)) (dashboard-mode))) (when recentf-is-on (setq recentf-list origial-recentf-list)))) - ;;;###autoload (defun dashboard-open (&rest _) "Open (or refresh) the *dashboard* buffer." @@ -462,24 +536,21 @@ Optional argument ARGS adviced function arguments." (with-selected-window space-win (dashboard-insert-startupify-lists))))) +(defun dashboard-initialize () + "Switch to dashboard and run `dashboard-after-initialize-hook'." + (switch-to-buffer dashboard-buffer-name) + (goto-char (point-min)) + (redisplay) + (run-hooks 'dashboard-after-initialize-hook)) + ;;;###autoload (defun dashboard-setup-startup-hook () - "Setup post initialization hooks. -If a command line argument is provided, assume a filename and skip displaying -Dashboard." - (when (< (length command-line-args) 2) - (add-hook 'window-setup-hook (lambda () - ;; 100 means `dashboard-resize-on-hook' will run last - (add-hook 'window-size-change-functions 'dashboard-resize-on-hook 100) - (dashboard-resize-on-hook))) - (add-hook 'after-init-hook (lambda () - ;; Display useful lists of items - (dashboard-insert-startupify-lists))) - (add-hook 'emacs-startup-hook (lambda () - (switch-to-buffer dashboard-buffer-name) - (goto-char (point-min)) - (redisplay) - (run-hooks 'dashboard-after-initialize-hook))))) + "Setup post initialization hooks unless a command line argument is provided." + (when (< (length command-line-args) 2) ;; Assume no file name passed + (add-hook 'window-size-change-functions #'dashboard-resize-on-hook 100) + (add-hook 'window-setup-hook #'dashboard-resize-on-hook) + (add-hook 'after-init-hook #'dashboard-insert-startupify-lists) + (add-hook 'emacs-startup-hook #'dashboard-initialize))) (provide 'dashboard) ;;; dashboard.el ends here diff --git a/code/elpa/devdocs-20230220.2042/devdocs-pkg.el b/code/elpa/devdocs-20230220.2042/devdocs-pkg.el deleted file mode 100644 index c1157bc..0000000 --- a/code/elpa/devdocs-20230220.2042/devdocs-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; Generated package description from devdocs.el -*- no-byte-compile: t -*- -(define-package "devdocs" "20230220.2042" "Emacs viewer for DevDocs" '((emacs "27.1")) :commit "2988d4d201df16d72c3bea465d2b93b554dbddfc" :authors '(("Augusto Stoffel" . "arstoffel@gmail.com")) :maintainer '("Augusto Stoffel" . "arstoffel@gmail.com") :keywords '("help") :url "https://github.com/astoff/devdocs.el") diff --git a/code/elpa/devdocs-20230220.2042/devdocs-autoloads.el b/code/elpa/devdocs-20240301.1838/devdocs-autoloads.el similarity index 60% rename from code/elpa/devdocs-20230220.2042/devdocs-autoloads.el rename to code/elpa/devdocs-20240301.1838/devdocs-autoloads.el index 64fde52..88f4abd 100644 --- a/code/elpa/devdocs-20230220.2042/devdocs-autoloads.el +++ b/code/elpa/devdocs-20240301.1838/devdocs-autoloads.el @@ -1,29 +1,29 @@ -;;; devdocs-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- -;; +;;; devdocs-autoloads.el --- automatically extracted autoloads (do not edit) -*- lexical-binding: t -*- +;; Generated by the `loaddefs-generate' function. + +;; This file is part of GNU Emacs. + ;;; Code: -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) +(add-to-list 'load-path (or (and load-file-name (directory-file-name (file-name-directory load-file-name))) (car load-path))) + -;;;### (autoloads nil "devdocs" "devdocs.el" (0 0 0 0)) ;;; Generated autoloads from devdocs.el (autoload 'devdocs-delete "devdocs" "\ Delete DevDocs documentation. DOC is a document metadata alist. -\(fn DOC)" t nil) - +(fn DOC)" t) (autoload 'devdocs-install "devdocs" "\ Download and install DevDocs documentation. -DOC is a document metadata alist. - -\(fn DOC)" t nil) +DOC is a document slug or metadata alist. If the document is +already installed, reinstall it. +(fn DOC)" t) (autoload 'devdocs-update-all "devdocs" "\ -Reinstall all documents with a new version available." t nil) - +Reinstall all documents with a new version available." t) (autoload 'devdocs-lookup "devdocs" "\ Look up a DevDocs documentation entry. @@ -34,26 +34,27 @@ and set `devdocs-current-docs' for this buffer. If INITIAL-INPUT is not nil, insert it into the minibuffer. -\(fn &optional ASK-DOCS INITIAL-INPUT)" t nil) - +(fn &optional ASK-DOCS INITIAL-INPUT)" t) (autoload 'devdocs-peruse "devdocs" "\ Read a document from the first page. -\(fn DOC)" t nil) - +(fn DOC)" t) (autoload 'devdocs-search "devdocs" "\ Search for QUERY in the DevDocs website. -\(fn QUERY)" t nil) - +(fn QUERY)" t) (register-definition-prefixes "devdocs" '("devdocs-")) - -;;;*** +;;; End of scraped data + +(provide 'devdocs-autoloads) + ;; Local Variables: ;; version-control: never ;; no-byte-compile: t ;; no-update-autoloads: t -;; coding: utf-8 +;; no-native-compile: t +;; coding: utf-8-emacs-unix ;; End: + ;;; devdocs-autoloads.el ends here diff --git a/code/elpa/devdocs-20240301.1838/devdocs-pkg.el b/code/elpa/devdocs-20240301.1838/devdocs-pkg.el new file mode 100644 index 0000000..c91c1c5 --- /dev/null +++ b/code/elpa/devdocs-20240301.1838/devdocs-pkg.el @@ -0,0 +1,14 @@ +(define-package "devdocs" "20240301.1838" "Emacs viewer for DevDocs" + '((emacs "27.1")) + :commit "3424436f333955b39a0803ce9781aaffaae003f5" :authors + '(("Augusto Stoffel" . "arstoffel@gmail.com")) + :maintainers + '(("Augusto Stoffel" . "arstoffel@gmail.com")) + :maintainer + '("Augusto Stoffel" . "arstoffel@gmail.com") + :keywords + '("help") + :url "https://github.com/astoff/devdocs.el") +;; Local Variables: +;; no-byte-compile: t +;; End: diff --git a/code/elpa/devdocs-20230220.2042/devdocs.el b/code/elpa/devdocs-20240301.1838/devdocs.el similarity index 96% rename from code/elpa/devdocs-20230220.2042/devdocs.el rename to code/elpa/devdocs-20240301.1838/devdocs.el index 347bc38..1171968 100644 --- a/code/elpa/devdocs-20230220.2042/devdocs.el +++ b/code/elpa/devdocs-20240301.1838/devdocs.el @@ -4,8 +4,6 @@ ;; Author: Augusto Stoffel ;; Keywords: help -;; Package-Version: 20230220.2042 -;; Package-Commit: 2988d4d201df16d72c3bea465d2b93b554dbddfc ;; URL: https://github.com/astoff/devdocs.el ;; Package-Requires: ((emacs "27.1")) ;; Version: 0.5 @@ -40,7 +38,8 @@ (require 'shr) (require 'url-expand) (eval-when-compile - (require 'let-alist)) + (require 'let-alist) + (require 'subr-x)) (unless (libxml-available-p) (display-warning 'devdocs "This package requires Emacs to be compiled with libxml2")) @@ -131,6 +130,12 @@ its return value; take the necessary precautions." ;;; Documentation management +(defalias 'devdocs--json-parse-buffer + (if (json-available-p) + (lambda () (json-parse-buffer :object-type 'alist)) + (require 'json) + #'json-read)) + (defun devdocs--doc-metadata (slug) "Return the metadata of an installed document named SLUG." (let ((file (expand-file-name (concat slug "/metadata") devdocs-data-dir))) @@ -158,7 +163,7 @@ If necessary, download data from `devdocs-site-url'." (with-temp-buffer (url-insert-file-contents (format "%s/docs.json" devdocs-site-url)) - (json-read)))) + (devdocs--json-parse-buffer)))) (defun devdocs--doc-title (doc) "Title of document DOC. @@ -201,9 +206,14 @@ DOC is a document metadata alist." ;;;###autoload (defun devdocs-install (doc) "Download and install DevDocs documentation. -DOC is a document metadata alist." +DOC is a document slug or metadata alist. If the document is +already installed, reinstall it." (interactive (list (devdocs--read-document "Install documentation: " nil t))) (make-directory devdocs-data-dir t) + (unless (listp doc) + (setq doc (or (seq-find (lambda (it) (string= doc (alist-get 'slug it))) + (devdocs--available-docs)) + (user-error "No such document: %s" doc)))) (let* ((slug (alist-get 'slug doc)) (mtime (alist-get 'mtime doc)) (temp (make-temp-file "devdocs-" t)) @@ -211,16 +221,15 @@ DOC is a document metadata alist." (with-temp-buffer (url-insert-file-contents (format "%s/%s/db.json?%s" devdocs-cdn-url slug mtime)) (dolist-with-progress-reporter - (entry (let ((json-key-type 'string)) - (json-read))) + (entry (devdocs--json-parse-buffer)) "Installing documentation..." (with-temp-file (expand-file-name (url-hexify-string (format "%s.html" (car entry))) temp) - (push (car entry) pages) + (push (symbol-name (car entry)) pages) (insert (cdr entry))))) (with-temp-buffer (url-insert-file-contents (format "%s/%s/index.json?%s" devdocs-cdn-url slug mtime)) - (let ((index (json-read))) + (let ((index (devdocs--json-parse-buffer))) (push `(pages . ,(vconcat (nreverse pages))) index) (with-temp-file (expand-file-name "index" temp) (prin1 index (current-buffer))))) @@ -338,7 +347,7 @@ with the order of appearance in the text." (current (seq-position entries nil pred))) (unless current (user-error "No current entry")) (devdocs--render - (or (ignore-error 'args-out-of-range (elt entries (+ count current))) + (or (ignore-error args-out-of-range (elt entries (+ count current))) (user-error "No %s entry" (if (< count 0) "previous" "next"))))))) (defun devdocs-previous-entry (count) @@ -433,7 +442,8 @@ Interactively, read a page name with completion." (pcase (string-to-char path) ('?/ path) ('?# (concat (devdocs--path-file base) path)) - (_ (seq-rest ;; drop leading slash + (_ (string-remove-prefix + "/" (url-expander-remove-relative-links ;; undocumented function! (concat (file-name-directory base) path)))))) @@ -475,7 +485,7 @@ fragment part of ENTRY.path." (url-hexify-string (devdocs--path-file .path))) devdocs-data-dir))) (erase-buffer) - (setq-local shr-target-id (or .fragment (devdocs--path-fragment .path))) + (setq-local shr-target-id (url-unhex-string (or .fragment (devdocs--path-fragment .path)))) ;; TODO: cl-progv here for shr settings? (shr-insert-document (with-temp-buffer diff --git a/code/elpa/devdocs-browser-20230112.1554/devdocs-browser-autoloads.el b/code/elpa/devdocs-browser-20230112.1554/devdocs-browser-autoloads.el deleted file mode 100644 index 7644c0c..0000000 --- a/code/elpa/devdocs-browser-20230112.1554/devdocs-browser-autoloads.el +++ /dev/null @@ -1,70 +0,0 @@ -;;; devdocs-browser-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 "devdocs-browser" "devdocs-browser.el" (0 0 -;;;;;; 0 0)) -;;; Generated autoloads from devdocs-browser.el - -(autoload 'devdocs-browser-list-docs "devdocs-browser" "\ -Get doc metadata lists, reload cache if REFRESH-CACHE. - -\(fn &optional REFRESH-CACHE)" nil nil) - -(autoload 'devdocs-browser-update-docs "devdocs-browser" "\ -Update doc metadata list. -To upgrade docs content, see `devdocs-browser-upgrade-doc'." t nil) - -(autoload 'devdocs-browser-install-doc "devdocs-browser" "\ -Install doc by SLUG-OR-NAME. -When called interactively, user can choose from the list. -When called interactively with prefix, or FORCE is t, reinstall existing doc. - -\(fn SLUG-OR-NAME &optional FORCE)" t nil) - -(autoload 'devdocs-browser-uninstall-doc "devdocs-browser" "\ -Uninstall doc by SLUG. -When called interactively, user can choose from the list. - -\(fn SLUG)" t nil) - -(autoload 'devdocs-browser-upgrade-doc "devdocs-browser" "\ -Upgrade doc by SLUG, return t if upgrade success. -Also download new version of offline data if -there's offline data for current version. -When called interactively, user can choose from list. -You may need to call `devdocs-browser-update-docs' first. - -\(fn SLUG)" t nil) - -(autoload 'devdocs-browser-upgrade-all-docs "devdocs-browser" "\ -Upgrade all docs." t nil) - -(autoload 'devdocs-browser-open-in "devdocs-browser" "\ -Open entry in specified docs SLUG-OR-NAME-LIST. -When called interactively, user can choose from the list. - -\(fn SLUG-OR-NAME-LIST)" t nil) - -(autoload 'devdocs-browser-open "devdocs-browser" "\ -Open entry in active docs. -Active docs are specified by `devdocs-browser-active-docs', -or `devdocs-browser-major-mode-docs-alist', -or the current doc type if called in a devdocs eww buffer. -When all of them are nil, all installed docs are used." t nil) - -(register-definition-prefixes "devdocs-browser" '("devdocs-browser-")) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; devdocs-browser-autoloads.el ends here diff --git a/code/elpa/devdocs-browser-20230112.1554/devdocs-browser-pkg.el b/code/elpa/devdocs-browser-20230112.1554/devdocs-browser-pkg.el deleted file mode 100644 index c9eb1b9..0000000 --- a/code/elpa/devdocs-browser-20230112.1554/devdocs-browser-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; Generated package description from devdocs-browser.el -*- no-byte-compile: t -*- -(define-package "devdocs-browser" "20230112.1554" "Browse devdocs.io documents using EWW" '((emacs "27.1")) :commit "c316c93306527fcb4069adde94402a48605d42d5" :authors '(("blahgeek" . "i@blahgeek.com")) :maintainer '("blahgeek" . "i@blahgeek.com") :keywords '("docs" "help" "tools") :url "https://github.com/blahgeek/emacs-devdocs-browser") diff --git a/code/elpa/devdocs-browser-20230112.1554/devdocs-browser.el b/code/elpa/devdocs-browser-20230112.1554/devdocs-browser.el deleted file mode 100644 index da6d7d1..0000000 --- a/code/elpa/devdocs-browser-20230112.1554/devdocs-browser.el +++ /dev/null @@ -1,808 +0,0 @@ -;;; devdocs-browser.el --- Browse devdocs.io documents using EWW -*- lexical-binding: t; -*- - -;; Copyright (C) 2021 - -;; Author: blahgeek -;; URL: https://github.com/blahgeek/emacs-devdocs-browser -;; Package-Version: 20230112.1554 -;; Package-Commit: c316c93306527fcb4069adde94402a48605d42d5 -;; Version: 20210525 -;; Keywords: docs, help, tools -;; Package-Requires: ((emacs "27.1")) - -;; This program is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see . - -;;; Commentary: - -;; Browse devdocs.io documents inside Emacs using EWW. - -;;; Code: - -(require 'files) -(require 'shr) -(require 'eww) -(require 'eldoc) -(require 'imenu) - - -(defgroup devdocs-browser nil - "Browse devdocs.io." - :group 'tools - :group 'web) - -(defcustom devdocs-browser-cache-directory - (expand-file-name "devdocs-browser" user-emacs-directory) - "Directory to store devdocs cache files." - :type 'directory - :group 'devdocs-browser) - -(defcustom devdocs-browser-base-url "https://devdocs.io/" - "Base URL to fetch json metadata files." - :type 'string) - -(defcustom devdocs-browser-doc-base-url "https://documents.devdocs.io/" - "Base URL for doc contents." - :type 'string) - -(defcustom devdocs-browser-major-mode-docs-alist - '((c++-mode . ("cpp")) - (c-mode . ("c")) - (go-mode . ("go")) - (python-mode . ("Python")) - (emacs-lisp-mode . ("elisp")) - (rust-mode . ("rust")) - (cmake-mode . ("CMake"))) - "Alist of MAJOR-MODE and list of docset names. -When calling `devdocs-browser-open', this variable will be used -to pick a list of docsets based on the current MAJOR-MODE. -Docset name may be SLUG (e.g. 'python~3.8') or NAME (e.g. 'Python'), -if it's a NAME and multiple choices are possible, -one of the installed docs with the NAME will be used. -Also see `devdocs-browser-active-docs'." - :type '(alist :key-type function - :value-type (list string))) - -(defvar-local devdocs-browser-active-docs - nil - "List of docset names used by `devdocs-browser-open' to pick docsets. -If this var is set to non-nil, -it have higher priority than `devdocs-browser-major-mode-docs-alist'. -See `devdocs-browser-major-mode-docs-alist' for the meaning of NAME.") - -(defcustom devdocs-browser-highlight-lang-mode-alist '() - "Alist of language name and MAJOR-MODE, to highlight HTML pre blocks. -If language is not found in this alist, -`devdocs-browser-highlight-lang-mode-alist-default' will be used. -See https://prismjs.com/ for list of language names." - :type '(alist :key-type string - :value-type function)) - -(defvar devdocs-browser-highlight-lang-mode-alist-default - '(("html" . html-mode) - ("xml" . xml-mode) - ("css" . css-mode) - ("clike" . c-mode) - ("javascript" . js-mode) - ("js" . js-mode) - ("jsx" . js-mode) - ("bash" . sh-mode) - ("shell" . sh-mode) - ("c" . c-mode) - ("cpp" . c++-mode) - ("cmake" . cmake-mode) - ("go" . go-mode) - ("haskell" . haskell-mode) - ("hs" . haskell-mode) - ("java" . java-mode) - ("json" . js-mode) - ("elisp" . elisp-mode) - ("emacs" . elisp-mode) - ("lua" . lua-mode) - ("makefile" . makefile-mode) - ("markdown" . markdown-mode) - ("md" . markdown-mode) - ("nginx" . conf-mode) - ("objectivec" . objc-mode) - ("objc" . objc-mode) - ("perl" . perl-mode) - ("protobuf" . protobuf-mode) - ("python" . python-mode) - ("py" . python-mode) - ("ruby" . ruby-mode) - ("rust" . rust-mode) - ("rb" . ruby-mode) - ("sql" . sql-mode) - ("typescript" . typescript-mode)) - "Default value for `devdocs-browser-highlight-lang-mode-alist'.") - - -(defun devdocs-browser--eww-fontify-pre (dom) - "Return fontified string for pre DOM." - (with-temp-buffer - (shr-generic dom) - (when (> shr-indentation 0) - (save-excursion - (goto-char (point-min)) - (while (not (eobp)) - (shr-indent) - (forward-line 1)))) - (let* ((language (dom-attr dom 'data-language)) - (mode (cdr (or (assoc language devdocs-browser-highlight-lang-mode-alist) - (assoc language devdocs-browser-highlight-lang-mode-alist-default))))) - (when (fboundp mode) - (delay-mode-hooks (funcall mode)) - (font-lock-default-function mode) - (font-lock-default-fontify-region (point-min) (point-max) nil))) - (buffer-string))) - -(defun devdocs-browser--eww-tag-pre (dom) - "Rendering function for pre DOM." - (let ((shr-folding-mode 'none) - (shr-current-font 'default)) - (shr-ensure-newline) - (insert (devdocs-browser--eww-fontify-pre dom)) - (shr-ensure-newline))) - -(defun devdocs-browser--eww-tag-maybe-set-title (dom) - "Maybe set DOM as title if it's not set yet." - (when (zerop (length (plist-get eww-data :title))) - (eww-tag-title dom))) - -(defun devdocs-browser--eww-tag-h1 (dom) - "Rendering function for h1 DOM. Maybe use it as title." - (devdocs-browser--eww-tag-maybe-set-title dom) - (shr-tag-h1 dom)) - -(defun devdocs-browser--eww-tag-h2 (dom) - "Rendering function for h2 DOM. Maybe use it as title." - (devdocs-browser--eww-tag-maybe-set-title dom) - (shr-heading dom (if shr-use-fonts - '(variable-pitch (:height 1.2 :weight bold)) - 'bold))) - -(defun devdocs-browser--eww-tag-h3 (dom) - "Rendering function for h2 DOM. Maybe use it as title." - (devdocs-browser--eww-tag-maybe-set-title dom) - (shr-heading dom (if shr-use-fonts - '(variable-pitch (:height 1.1 :weight bold)) - 'bold))) - -(defun devdocs-browser--eww-tag-h4 (dom) - "Rendering function for h4 DOM." - (shr-heading dom 'bold)) - -(defun devdocs-browser--eww-tag-h5 (dom) - "Rendering function for h5 DOM." - (shr-heading dom 'italic)) - -(defvar-local devdocs-browser--eww-data '() - "Plist data for current eww page, contain :doc and :path.") - -(defun devdocs-browser--eww-fix-url (url) - "Fix links' URL in docs by appending suffix and mtime." - ;; shr-expand-url may be call in a temp buffer - ;; we need to temporary bind this buffer to access the buffer-local variable. - (with-current-buffer (window-buffer) - (let ((url-parsed (url-generic-parse-url url)) - (root-url-parsed (url-generic-parse-url (plist-get eww-data :url))) - (mtime (plist-get (plist-get devdocs-browser--eww-data :doc) :mtime))) - (when (and mtime - (equal (url-type url-parsed) (url-type root-url-parsed)) - (equal (url-host url-parsed) (url-host root-url-parsed)) - (not (string-match-p "\\.html" url))) - (setf (url-filename url-parsed) - (if (equal (url-type url-parsed) "file") - (concat (url-filename url-parsed) ".html") - (format "%s.html?%s" (url-filename url-parsed) mtime))) - (setq url (url-recreate-url url-parsed))))) - url) - -(defun devdocs-browser--eww-parse-url-path (url) - "Return URL's doc :path ('hello/world#target')." - ;; see devdocs-browser--eww-open for url pattern - (when-let* ((url-parsed (url-generic-parse-url url)) - (doc (plist-get devdocs-browser--eww-data :doc)) - (slug (plist-get doc :slug)) - (filename-suffix (if (equal (url-type url-parsed) "file") - ".html" - (format ".html?%s" (plist-get doc :mtime)))) - (filename-prefix (if (equal (url-type url-parsed) "file") - (devdocs-browser-offline-data-dir slug) - (concat "/" slug "/"))) - (path (url-filename url-parsed))) - (when (and (string-prefix-p filename-prefix path) - (string-suffix-p filename-suffix path)) - (setq path (string-remove-prefix filename-prefix path)) - (setq path (string-remove-suffix filename-suffix path)) - (when (url-target url-parsed) - (setq path (concat path "#" (url-target url-parsed)))) - path))) - -(defun devdocs-browser--eww-page-path () - "Return current page's :path ('hello/world#target')." - (devdocs-browser--eww-parse-url-path (plist-get eww-data :url))) - -(defun devdocs-browser--eww-link-eldoc (&optional _) - "Show URL link or description at current point." - (when-let ((url (get-text-property (point) 'shr-url))) - (if-let ((path (devdocs-browser--eww-parse-url-path url))) - (let* ((doc (plist-get devdocs-browser--eww-data :doc)) - (index (plist-get doc :index)) - (entries (plist-get index :entries)) - (entry (seq-find - (lambda (x) (equal (plist-get x :path) path)) - entries))) - (concat - (when entry - (propertize (plist-get entry :name) 'face 'font-lock-keyword-face)) - (when entry - (format " (%s): " (plist-get entry :type))) - (propertize path 'face 'italic))) - (format "External link: %s" (propertize url 'face 'italic))))) - -(defun devdocs-browser--position-by-target (target) - "Find buffer position for TARGET (url hash)." - (save-excursion - (goto-char (point-min)) - (when-let ((match (text-property-search-forward 'shr-target-id target #'member))) - (prop-match-beginning match)))) - -(defun devdocs-browser--imenu-create-index () - "Create index alist for current buffer for imenu. -Can be used as `imenu-create-index-function'." - (when-let* ((doc (plist-get devdocs-browser--eww-data :doc)) - (entries (plist-get (plist-get doc :index) :entries)) - (page-path (devdocs-browser--eww-page-path)) - (page-url (url-generic-parse-url page-path))) - (seq-filter - #'identity - (mapcar - (lambda (entry) - (when-let* ((name (plist-get entry :name)) - (path (plist-get entry :path)) - (url (url-generic-parse-url path)) - (target (url-target url)) - (_ (equal (url-filename url) (url-filename page-url)))) - (cons name (devdocs-browser--position-by-target target)))) - entries)))) - -(define-obsolete-function-alias 'devdocs-browser-eww-goto-target 'imenu "20220917") - -(defun devdocs-browser-eww-open-in-default-browser () - "Open current page in devdocs.io in browser." - (interactive) - (when-let* ((doc (plist-get devdocs-browser--eww-data :doc)) - (slug (plist-get doc :slug)) - (path (devdocs-browser--eww-page-path)) - (url (concat devdocs-browser-base-url slug "/" path))) - (browse-url-default-browser url))) - -(defun devdocs-browser--eww-recenter-advice (res) - "Recenter current cursor for devdocs buffer, used for advice :filter-return (return `RES')." - (when devdocs-browser--eww-data - (recenter)) - res) - -(defun devdocs-browser--eww-browse-url-new-window-advice (args) - "Advice around `eww-browse-url' with ARGS, set NEW-WINDOW if URL is external." - (let ((url (car args)) - (new-window (cadr args))) - (when (and devdocs-browser--eww-data - (not (devdocs-browser--eww-parse-url-path url))) - (setq new-window t)) - (list url new-window))) - -(define-minor-mode devdocs-browser-eww-mode - "Minor mode for browsing devdocs pages with eww." - :lighter " Devdocs" - :interactive nil - :group 'devdocs-browser - :keymap (let ((map (make-sparse-keymap))) - (define-key map (kbd "C-c C-o") #'devdocs-browser-eww-open-in-default-browser) - map) - (setq-local shr-external-rendering-functions - (append shr-external-rendering-functions - '((pre . devdocs-browser--eww-tag-pre) - (h1 . devdocs-browser--eww-tag-h1) - (h2 . devdocs-browser--eww-tag-h2) - (h3 . devdocs-browser--eww-tag-h3) - (h4 . devdocs-browser--eww-tag-h4) - (h5 . devdocs-browser--eww-tag-h5)))) - (setq-local imenu-create-index-function - #'devdocs-browser--imenu-create-index) - (advice-add 'shr-expand-url :filter-return #'devdocs-browser--eww-fix-url) - (advice-add 'eww-display-html :filter-return #'devdocs-browser--eww-recenter-advice) - (advice-add 'eww-browse-url :filter-args #'devdocs-browser--eww-browse-url-new-window-advice) - (add-hook 'eldoc-documentation-functions #'devdocs-browser--eww-link-eldoc nil t) - (eldoc-mode)) - -(defvar devdocs-browser--docs-dir "docs") -(defvar devdocs-browser--index-json-filename "index.json") -(defvar devdocs-browser--metadata-filename "metadata.el") -(defvar devdocs-browser--offline-data-json-filename "content.json") -(defvar devdocs-browser--offline-data-dir-name "content") - -(defun devdocs-browser--completing-read (prompt collection &optional def) - "Helper function for `completing-read'. -PROMPT: same meaning, but this function will append ';' at the end; -COLLECTION: alist of (name . props), where props is a plist with - possibly the following keys: :value, :annotation, :group; -if :group is not nil and name starts with ': ', its removed. -DEF: same meaning;" - ;; convert collection to hashtables for faster completion. `complete-with-action' also supports that. - (setq collection (delq nil collection)) - (let* ((collection-ht (make-hash-table :test 'equal :size (length collection))) - (annotation-function - (lambda (s) - (let ((annotation (plist-get (gethash s collection-ht) :annotation))) - (if annotation - (concat " " annotation) - nil)))) - (group-function - (lambda (s transform) - (let ((group (plist-get (gethash s collection-ht) :group))) - (cond - (transform (if (and group (string-match (rx bos (literal group) ": ") s)) - (replace-match "" t t s) - s)) - (t group)))))) - (mapc (lambda (elem) (puthash (car elem) (cdr elem) collection-ht)) - collection) - (setq prompt (concat prompt - (when def - (format " (default %s)" (funcall group-function def t))) - ": ")) - (let ((res (completing-read - prompt - (lambda (str pred action) - (if (eq action 'metadata) - `(metadata . ((annotation-function . ,annotation-function) - (group-function . ,group-function))) - (complete-with-action action collection str pred))) - nil t ;; require-match - nil nil def))) - (or (plist-get (gethash res collection-ht) :value) - res)))) - -(defun devdocs-browser--json-parse-buffer () - "Same as `json-parse-buffer', with custom settings." - (json-parse-buffer :object-type 'plist :array-type 'array)) - -(defun devdocs-browser--read-json (file-path) - "Read json file in FILE-PATH, if it's a relative path, find it in cache dir." - (let ((filename (expand-file-name file-path devdocs-browser-cache-directory))) - (when (file-exists-p filename) - (with-temp-buffer - (insert-file-contents filename) - (devdocs-browser--json-parse-buffer))))) - -(defun devdocs-browser--fetch-json (url-path file-path &optional base-url) - "Fetch json from BASE-URL / URL-PATH, also save to FILE-PATH. -BASE-URL defaults to `devdocs-browser-base-url'." - (let ((cache-filename (expand-file-name file-path devdocs-browser-cache-directory))) - (unless (file-exists-p (file-name-directory cache-filename)) - (make-directory (file-name-directory cache-filename) t)) - (with-temp-file cache-filename - (erase-buffer) - (url-insert-file-contents (concat (or base-url devdocs-browser-base-url) url-path)) - (devdocs-browser--json-parse-buffer)))) - - -(defvar devdocs-browser--docs-list-cache nil "Cached docs list.") - -;;;###autoload -(defun devdocs-browser-list-docs (&optional refresh-cache) - "Get doc metadata lists, reload cache if REFRESH-CACHE." - (setq devdocs-browser--docs-list-cache - (or (and (not refresh-cache) devdocs-browser--docs-list-cache) - (and (not refresh-cache) (devdocs-browser--read-json "docs.json")) - (devdocs-browser--fetch-json "docs.json" "docs.json")))) - -;;;###autoload -(defun devdocs-browser-update-docs () - "Update doc metadata list. -To upgrade docs content, see `devdocs-browser-upgrade-doc'." - (interactive) - (let ((count (length (devdocs-browser-list-docs t)))) - (message (concat "Doc metadata updated, found total %s docs. " - "You may want to run `devdocs-browser-install-doc' " - "or `devdocs-browser-upgrade-doc'.") - count))) - -(defun devdocs-browser-find-doc (slug-or-name) - "Find doc from docs list by SLUG-OR-NAME." - (let ((docs-list (devdocs-browser-list-docs))) - (seq-find (lambda (doc) - (or (equal (plist-get doc :slug) slug-or-name) - (equal (plist-get doc :name) slug-or-name))) - docs-list))) - -(defvar devdocs-browser--docs-cache '() "Cached doc indexes plist.") - -(defun devdocs-browser--install-doc-internal (doc) - "(Re-)install doc identified by plist DOC. Return t if success." - (let* ((slug (plist-get doc :slug)) - (mtime (plist-get doc :mtime)) - (docs-dir (expand-file-name devdocs-browser--docs-dir devdocs-browser-cache-directory)) - (doc-dir (expand-file-name slug docs-dir)) - success) - (unless (file-exists-p docs-dir) - (make-directory docs-dir t)) - (when (file-exists-p doc-dir) - (delete-directory doc-dir t)) - - ;; do not leave empty directory - (unwind-protect - (progn - (devdocs-browser--fetch-json - (format "docs/%s/index.json?%s" slug mtime) - (expand-file-name devdocs-browser--index-json-filename doc-dir)) - (with-temp-file (expand-file-name devdocs-browser--metadata-filename doc-dir) - (print doc (current-buffer))) - (setq success t)) - (unless success - (delete-directory doc-dir t))) - - (if success - (message "Installed devdocs doc %s version %s" slug mtime) - (message "Failed to install devdocs doc %s" slug)) - ;; remove cache - (setq devdocs-browser--docs-cache - (lax-plist-put devdocs-browser--docs-cache slug nil)) - success)) - -(defun devdocs-browser--doc-readable-name (doc) - "Get human readable name for DOC." - (let ((slug (plist-get doc :slug)) - (name (plist-get doc :name)) - (version (plist-get doc :version)) - (release (plist-get doc :release)) - res) - (setq res (concat slug " (" name)) - (unless (zerop (length version)) - (setq res (concat res " " version))) - (unless (zerop (length release)) - (setq res (concat res ", " release))) - (setq res (concat res ")")) - res)) - -;;;###autoload -(defun devdocs-browser-install-doc (slug-or-name &optional force) - "Install doc by SLUG-OR-NAME. -When called interactively, user can choose from the list. -When called interactively with prefix, or FORCE is t, reinstall existing doc." - (interactive - (let* ((force current-prefix-arg) - (installed-docs - (devdocs-browser-list-installed-slugs)) - (selected-slug - (devdocs-browser--completing-read - "Install doc" - (mapcar (lambda (doc) - (let ((slug (plist-get doc :slug))) - (unless (and (not force) - (member slug installed-docs)) - (cons (devdocs-browser--doc-readable-name doc) - `(:value ,slug))))) - (devdocs-browser-list-docs))))) - (list selected-slug force))) - (let ((doc (devdocs-browser-find-doc slug-or-name))) - (unless (and (not force) - (member (plist-get doc :slug) (devdocs-browser-list-installed-slugs))) - (devdocs-browser--install-doc-internal doc)))) - -;;;###autoload -(defun devdocs-browser-uninstall-doc (slug) - "Uninstall doc by SLUG. -When called interactively, user can choose from the list." - (interactive (list (completing-read "Uninstall doc: " - (devdocs-browser-list-installed-slugs) - nil t))) - (let* ((docs-dir (expand-file-name devdocs-browser--docs-dir devdocs-browser-cache-directory)) - (doc-dir (expand-file-name slug docs-dir))) - (when (file-exists-p doc-dir) - (delete-directory doc-dir t))) - (setq devdocs-browser--docs-cache - (lax-plist-put devdocs-browser--docs-cache slug nil))) - -(defun devdocs-browser--upgrade-readable-name (old-doc new-doc) - "Get human readable name for upgrade from OLD-DOC to NEW-DOC." - (let ((slug (plist-get old-doc :slug)) - (name (plist-get old-doc :name)) - (old-version (plist-get old-doc :version)) - (old-release (plist-get old-doc :release)) - (old-mtime (plist-get old-doc :mtime)) - (new-version (plist-get new-doc :version)) - (new-release (plist-get new-doc :release)) - (new-mtime (plist-get new-doc :mtime)) - res) - (setq res (format "%s (%s" slug name)) - (unless (equal old-version new-version) - (setq res (concat res (format " %s->%s" old-version new-version)))) - (unless (equal old-release new-release) - (setq res (concat res (format ", %s->%s" old-release new-release)))) - (setq res (concat res (format ", %s->%s)" old-mtime new-mtime))) - res)) - -(defun devdocs-browser--upgrade-readable-name-or-nil (slug) - "Get human readable name for upgrading SLUG if it needs upgrade." - (let ((old-doc (devdocs-browser--load-doc slug)) - (new-doc (devdocs-browser-find-doc slug))) - (when (and new-doc - (> (plist-get new-doc :mtime) (plist-get old-doc :mtime))) - (devdocs-browser--upgrade-readable-name old-doc new-doc)))) - -;;;###autoload -(defun devdocs-browser-upgrade-doc (slug) - "Upgrade doc by SLUG, return t if upgrade success. -Also download new version of offline data if -there's offline data for current version. -When called interactively, user can choose from list. -You may need to call `devdocs-browser-update-docs' first." - (interactive - (let (rows) - (dolist (slug (devdocs-browser-list-installed-slugs)) - (let ((desc (devdocs-browser--upgrade-readable-name-or-nil slug))) - (when desc - (push (cons desc slug) rows)))) - (if (null rows) - (progn - (message "All docs up to date") - (list nil)) - (list - (cdr (assoc (completing-read "Upgrade doc: " rows nil t) rows)))))) - (when (and slug (devdocs-browser--upgrade-readable-name-or-nil slug)) - (let* ((has-offline-data (devdocs-browser-offline-data-dir slug)) - (doc (devdocs-browser-find-doc slug)) - (install-success (devdocs-browser--install-doc-internal doc))) - (when (and has-offline-data install-success) - (devdocs-browser--download-offline-data-internal doc)) - install-success))) - -;;;###autoload -(defun devdocs-browser-upgrade-all-docs () - "Upgrade all docs." - (interactive) - (let ((count 0)) - (dolist (slug (devdocs-browser-list-installed-slugs)) - (message "Processing %s..." slug) - (when (devdocs-browser-upgrade-doc slug) - (setq count (1+ count)))) - (message "Upgraded %s docs" count))) - -(defun devdocs-browser-list-installed-slugs () - "Get a list of installed docs' slug name." - (let ((dir (expand-file-name devdocs-browser--docs-dir devdocs-browser-cache-directory))) - (when (file-exists-p dir) - (directory-files dir nil - ;; ignore ".", ".." and hidden files - "^[^.].*")))) - -(defun devdocs-browser-find-installed-doc (slug-or-name) - "Find installed doc by SLUG-OR-NAME." - (let ((docs-list (mapcar #'devdocs-browser-installed-doc-info - (devdocs-browser-list-installed-slugs)))) - (seq-find (lambda (doc) - (or (equal (plist-get doc :slug) slug-or-name) - (equal (plist-get doc :name) slug-or-name))) - docs-list))) - -(defun devdocs-browser-installed-doc-info (slug) - "Get plist info of installed doc identified by SLUG." - (cddr (devdocs-browser--load-doc slug))) - -(defun devdocs-browser--load-doc (slug &optional refresh-cache) - "Load doc identified by SLUG, reload cache if REFRESH-CACHE is not nil. -Result is a plist metadata, with an extra :index field at the beginning." - (or (and (not refresh-cache) (lax-plist-get devdocs-browser--docs-cache slug)) - (let* ((docs-dir (expand-file-name devdocs-browser--docs-dir - devdocs-browser-cache-directory)) - (doc-dir (expand-file-name slug docs-dir)) - (metadata-filename (expand-file-name devdocs-browser--metadata-filename doc-dir)) - (metadata nil) - (index-filename (expand-file-name devdocs-browser--index-json-filename doc-dir)) - (index (devdocs-browser--read-json index-filename)) - res) - (when (file-exists-p metadata-filename) - (with-temp-buffer - (insert-file-contents metadata-filename) - (setq metadata (read (current-buffer)))) - (setq res (append `(:index ,index) metadata)) - (setq devdocs-browser--docs-cache - (lax-plist-put devdocs-browser--docs-cache slug res))) - res))) - -(defun devdocs-browser--download-offline-data-internal (doc) - "(re-)Download and extract offline data for DOC." - (let* ((slug (plist-get doc :slug)) - (mtime (plist-get doc :mtime)) - (docs-dir (expand-file-name devdocs-browser--docs-dir devdocs-browser-cache-directory)) - (doc-dir (expand-file-name slug docs-dir)) - (data-dir (expand-file-name devdocs-browser--offline-data-dir-name doc-dir)) - success) - (unless (file-exists-p doc-dir) - (make-directory doc-dir t)) - (when (file-exists-p data-dir) - (delete-directory data-dir t)) - - ;; do not leave half-complete data directory - (unwind-protect - (let ((data (devdocs-browser--fetch-json - (format "%s/db.json?%s" slug mtime) - (expand-file-name devdocs-browser--offline-data-json-filename doc-dir) - devdocs-browser-doc-base-url))) - ;; write data to files - (dolist (kv (seq-partition data 2)) - (when-let* ((name (substring (symbol-name (car kv)) 1)) - (value (cadr kv)) - ;; prepent "./" to fix paths starting with literal "~" (e.g. deno) - (path (expand-file-name (concat "./" name ".html") data-dir))) - (unless (file-exists-p (file-name-directory path)) - (make-directory (file-name-directory path) t)) - (write-region value nil path))) - (setq success t)) - (unless success - (delete-directory data-dir t))) - - (if success - (message "Installed devdocs offline data %s version %s" slug mtime) - (message "Failed to install devdocs offline data %s" slug)) - - success)) - -(defun devdocs-browser-offline-data-dir (slug) - "Return doc SLUG's offline data dir if present, return nil otherwise." - (let* ((docs-dir (expand-file-name devdocs-browser--docs-dir devdocs-browser-cache-directory)) - (doc-dir (expand-file-name slug docs-dir)) - (data-dir (expand-file-name devdocs-browser--offline-data-dir-name doc-dir))) - (when (file-exists-p data-dir) - (file-name-as-directory data-dir)))) - -(defun devdocs-browser-download-offline-data (slug) - "Download offline data for doc SLUG. -Offline data contains full content pages, -which allows you to view docs without Internet connection. -It may take some time to download offline data. -When called interactively, user can choose from the list." - (interactive (list (completing-read - "Install offline data: " - (seq-filter - (lambda (slug) (null (devdocs-browser-offline-data-dir slug))) - (devdocs-browser-list-installed-slugs)) - nil t))) - (when-let* ((doc (devdocs-browser--load-doc slug))) - (devdocs-browser--download-offline-data-internal doc))) - -(defun devdocs-browser-remove-offline-data (slug) - "Remove offline data for doc SLUG. -When called interactively, user can choose from the list." - (interactive (list (completing-read - "Remove offline data: " - (seq-filter - #'devdocs-browser-offline-data-dir - (devdocs-browser-list-installed-slugs)) - nil t))) - (when-let* ((data-dir (devdocs-browser-offline-data-dir slug))) - (delete-directory data-dir t))) - -(defun devdocs-browser--eww-open (doc path) - "Open PATH for document DOC using eww." - (let* ((slug (plist-get doc :slug)) - (mtime (plist-get doc :mtime)) - base-url url) - ;; cannot use format directly because `path' may contains #query - ;; path: hello/world#query - ;; url for offline: file:///home/path/to/devdocs/python~3.8/hello/world.html#query - ;; url for online: https://documents.devdocs.io/python~3.8/hello/world.html?161818817#query - (let ((offline-data-dir (devdocs-browser-offline-data-dir slug))) - (if offline-data-dir - (progn - (setq base-url (concat "file://" offline-data-dir)) - (setq url (url-generic-parse-url (concat "file://" offline-data-dir path))) - (setf (url-filename url) (concat (url-filename url) ".html"))) - (setq base-url (concat devdocs-browser-doc-base-url slug "/")) - (setq url (url-generic-parse-url - (concat devdocs-browser-doc-base-url slug "/" path))) - (setf (url-filename url) - (format "%s.html?%s" (url-filename url) mtime)))) - - (pop-to-buffer (format "*devdocs-%s*" slug)) - (if devdocs-browser-eww-mode - (eww-save-history) - (eww-mode) - (devdocs-browser-eww-mode)) - (setq-local devdocs-browser--eww-data - (list :doc doc - :base-url base-url)) - - (eww (url-recreate-url url)) - (recenter))) - -(defun devdocs-browser--default-active-slugs (&optional no-fallback-all) - "Default active doc slugs for current buffer, fallback to all slugs if not NO-FALLBACK-ALL." - (if devdocs-browser--eww-data - (list (plist-get (plist-get devdocs-browser--eww-data :doc) :slug)) - (let ((names (or devdocs-browser-active-docs - (alist-get major-mode devdocs-browser-major-mode-docs-alist))) - slugs) - (dolist (name names) - (when-let* ((doc (devdocs-browser-find-installed-doc name)) - (slug (plist-get doc :slug))) - (setq slugs (push slug slugs)))) - (or slugs - (and (not no-fallback-all) (devdocs-browser-list-installed-slugs)))))) - -;;;###autoload -(defun devdocs-browser-open-in (slug-or-name-list) - "Open entry in specified docs SLUG-OR-NAME-LIST. -When called interactively, user can choose from the list." - (interactive - (let ((def (devdocs-browser--default-active-slugs t))) - (list (completing-read-multiple - (concat "Select doc" - (when def (format " (default %s)" def)) - ": ") - (devdocs-browser-list-installed-slugs) - nil t nil nil def)))) - - (let ((current-word-regex - (when-let ((word (thing-at-point 'word t))) - (concat "\\<" (regexp-quote word) "\\>"))) - slugs rows def) - (dolist (slug-or-name slug-or-name-list) - (when-let* ((doc-simple (devdocs-browser-find-installed-doc slug-or-name)) - (slug (plist-get doc-simple :slug)) - (doc (devdocs-browser--load-doc slug)) - (index (plist-get doc :index)) - (entries (plist-get index :entries))) - (setq slugs (push slug slugs)) - (let ((new-rows - (mapcar - (lambda (entry) - (let* ((name (plist-get entry :name)) - (path (plist-get entry :path)) - (type (plist-get entry :type)) - (title (concat slug ": " name))) - (when (and (null def) current-word-regex) - (when (string-match-p current-word-regex name) - (setq def title))) - (cons title `(:value (,doc ,path) - :group ,slug - :annotation ,type)))) - entries))) - (setq rows (append new-rows rows)) - (push (cons (format "%s: INDEX PAGE" slug) - `(:value (,doc "index") - :group ,slug)) - rows)))) - (let* ((selected-value - (devdocs-browser--completing-read - (format "Devdocs browser [%s]" (mapconcat #'identity slugs ",")) - rows def))) - (when selected-value - (apply #'devdocs-browser--eww-open selected-value))))) - -;;;###autoload -(defun devdocs-browser-open () - "Open entry in active docs. -Active docs are specified by `devdocs-browser-active-docs', -or `devdocs-browser-major-mode-docs-alist', -or the current doc type if called in a devdocs eww buffer. -When all of them are nil, all installed docs are used." - (interactive) - (devdocs-browser-open-in (devdocs-browser--default-active-slugs))) - - -(provide 'devdocs-browser) -;;; devdocs-browser.el ends here diff --git a/org/elpa/devdocs-browser-20230423.444/devdocs-browser-autoloads.el b/code/elpa/devdocs-browser-20231231.1455/devdocs-browser-autoloads.el similarity index 67% rename from org/elpa/devdocs-browser-20230423.444/devdocs-browser-autoloads.el rename to code/elpa/devdocs-browser-20231231.1455/devdocs-browser-autoloads.el index 6cc9a9d..9895a7f 100644 --- a/org/elpa/devdocs-browser-20230423.444/devdocs-browser-autoloads.el +++ b/code/elpa/devdocs-browser-20231231.1455/devdocs-browser-autoloads.el @@ -1,37 +1,35 @@ -;;; devdocs-browser-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- -;; +;;; devdocs-browser-autoloads.el --- automatically extracted autoloads (do not edit) -*- lexical-binding: t -*- +;; Generated by the `loaddefs-generate' function. + +;; This file is part of GNU Emacs. + ;;; Code: -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) +(add-to-list 'load-path (or (and load-file-name (directory-file-name (file-name-directory load-file-name))) (car load-path))) + -;;;### (autoloads nil "devdocs-browser" "devdocs-browser.el" (0 0 -;;;;;; 0 0)) ;;; Generated autoloads from devdocs-browser.el (autoload 'devdocs-browser-list-docs "devdocs-browser" "\ Get doc metadata lists, reload cache if REFRESH-CACHE. -\(fn &optional REFRESH-CACHE)" nil nil) - -(autoload 'devdocs-browser-update-docs "devdocs-browser" "\ +(fn &optional REFRESH-CACHE)") +(autoload 'devdocs-browser-update-metadata "devdocs-browser" "\ Update doc metadata list. -To upgrade docs content, see `devdocs-browser-upgrade-doc'." t nil) - +To upgrade docs content, see `devdocs-browser-upgrade-doc'." t) +(defalias 'devdocs-browser-update-docs 'devdocs-browser-update-metadata) (autoload 'devdocs-browser-install-doc "devdocs-browser" "\ Install doc by SLUG-OR-NAME. When called interactively, user can choose from the list. When called interactively with prefix, or FORCE is t, reinstall existing doc. -\(fn SLUG-OR-NAME &optional FORCE)" t nil) - +(fn SLUG-OR-NAME &optional FORCE)" t) (autoload 'devdocs-browser-uninstall-doc "devdocs-browser" "\ Uninstall doc by SLUG. When called interactively, user can choose from the list. -\(fn SLUG)" t nil) - +(fn SLUG)" t) (autoload 'devdocs-browser-upgrade-doc "devdocs-browser" "\ Upgrade doc by SLUG, return t if upgrade success. Also download new version of offline data if @@ -39,36 +37,32 @@ there's offline data for current version. When called interactively, user can choose from list. You may need to call `devdocs-browser-update-docs' first. -\(fn SLUG)" t nil) - +(fn SLUG)" t) (autoload 'devdocs-browser-upgrade-all-docs "devdocs-browser" "\ -Upgrade all docs." t nil) - +Upgrade all docs." t) (autoload 'devdocs-browser-open-in "devdocs-browser" "\ Open entry in specified docs SLUG-OR-NAME-LIST. When called interactively, user can choose from the list. -\(fn SLUG-OR-NAME-LIST)" t nil) - +(fn SLUG-OR-NAME-LIST)" t) (autoload 'devdocs-browser-open "devdocs-browser" "\ Open entry in active docs. Active docs are specified by `devdocs-browser-active-docs', or `devdocs-browser-major-mode-docs-alist', or the current doc type if called in a devdocs eww buffer. -When all of them are nil, all installed docs are used." t nil) - +When all of them are nil, all installed docs are used." t) (register-definition-prefixes "devdocs-browser" '("devdocs-browser-")) - -;;;*** -;;;### (autoloads nil nil ("devdocs-browser-pkg.el") (0 0 0 0)) +;;; End of scraped data + +(provide 'devdocs-browser-autoloads) -;;;*** - ;; Local Variables: ;; version-control: never ;; no-byte-compile: t ;; no-update-autoloads: t -;; coding: utf-8 +;; no-native-compile: t +;; coding: utf-8-emacs-unix ;; End: + ;;; devdocs-browser-autoloads.el ends here diff --git a/org/elpa/devdocs-browser-20230423.444/devdocs-browser-pkg.el b/code/elpa/devdocs-browser-20231231.1455/devdocs-browser-pkg.el similarity index 66% rename from org/elpa/devdocs-browser-20230423.444/devdocs-browser-pkg.el rename to code/elpa/devdocs-browser-20231231.1455/devdocs-browser-pkg.el index 82d4b21..308828f 100644 --- a/org/elpa/devdocs-browser-20230423.444/devdocs-browser-pkg.el +++ b/code/elpa/devdocs-browser-20231231.1455/devdocs-browser-pkg.el @@ -1,6 +1,6 @@ -(define-package "devdocs-browser" "20230423.444" "Browse devdocs.io documents using EWW" +(define-package "devdocs-browser" "20231231.1455" "Browse devdocs.io documents using EWW" '((emacs "27.1")) - :commit "ef7686e4ff4ecab42e1b4a1a5d079bcf947a5b71" :authors + :commit "afc460e687bec4eb947ab85d207778fc3b9b3bbc" :authors '(("blahgeek" . "i@blahgeek.com")) :maintainers '(("blahgeek" . "i@blahgeek.com")) diff --git a/code/elpa/devdocs-browser-20230423.444/devdocs-browser.el b/code/elpa/devdocs-browser-20231231.1455/devdocs-browser.el similarity index 96% rename from code/elpa/devdocs-browser-20230423.444/devdocs-browser.el rename to code/elpa/devdocs-browser-20231231.1455/devdocs-browser.el index ae0df73..8a8235b 100644 --- a/code/elpa/devdocs-browser-20230423.444/devdocs-browser.el +++ b/code/elpa/devdocs-browser-20231231.1455/devdocs-browser.el @@ -125,6 +125,11 @@ See https://prismjs.com/ for list of language names." "Default value for `devdocs-browser-highlight-lang-mode-alist'.") +(defun devdocs-browser--clear-dom-id-attr (dom) + "Clear id attribute for DOM and its children." + (dom-remove-attribute dom 'id) + (mapc #'devdocs-browser--clear-dom-id-attr (dom-non-text-children dom))) + (defun devdocs-browser--eww-fontify-pre (dom) "Return fontified string for pre DOM." (with-temp-buffer @@ -146,6 +151,9 @@ See https://prismjs.com/ for list of language names." (defun devdocs-browser--eww-tag-pre (dom) "Rendering function for pre DOM." + ;; must clear all 'id' attributes in dom. + ;; otherwise, shr would try to add text properties based on it, but since they are rendered in temp-buffer, the marker would be invalid + (devdocs-browser--clear-dom-id-attr dom) (let ((shr-folding-mode 'none) (shr-current-font 'default)) (shr-ensure-newline) @@ -184,6 +192,11 @@ See https://prismjs.com/ for list of language names." "Rendering function for h5 DOM." (shr-heading dom 'italic)) +(defun devdocs-browser--eww-tag-generic-ensure-paragraph (dom) + "Rendering function for generic DOM while ensuring paragraph." + (shr-ensure-paragraph) + (shr-generic dom)) + (defvar-local devdocs-browser--eww-data '() "Plist data for current eww page, contain :doc and :path.") @@ -316,7 +329,9 @@ Can be used as `imenu-create-index-function'." (h2 . devdocs-browser--eww-tag-h2) (h3 . devdocs-browser--eww-tag-h3) (h4 . devdocs-browser--eww-tag-h4) - (h5 . devdocs-browser--eww-tag-h5)))) + (h5 . devdocs-browser--eww-tag-h5) + (summary . devdocs-browser--eww-tag-generic-ensure-paragraph) + (section . devdocs-browser--eww-tag-generic-ensure-paragraph)))) (setq-local imenu-create-index-function #'devdocs-browser--imenu-create-index) (when (boundp 'eww-auto-rename-buffer) @@ -410,7 +425,7 @@ BASE-URL defaults to `devdocs-browser-base-url'." (devdocs-browser--fetch-json "docs.json" "docs.json")))) ;;;###autoload -(defun devdocs-browser-update-docs () +(defun devdocs-browser-update-metadata () "Update doc metadata list. To upgrade docs content, see `devdocs-browser-upgrade-doc'." (interactive) @@ -420,6 +435,10 @@ To upgrade docs content, see `devdocs-browser-upgrade-doc'." "or `devdocs-browser-upgrade-doc'.") count))) +;;;###autoload +(defalias 'devdocs-browser-update-docs 'devdocs-browser-update-metadata) +(make-obsolete 'devdocs-browser-update-docs 'devdocs-browser-update-metadata "20231231") + (defun devdocs-browser-find-doc (slug-or-name) "Find doc from docs list by SLUG-OR-NAME." (let ((docs-list (devdocs-browser-list-docs))) diff --git a/code/elpa/dired-single-20230306.626/dired-single-pkg.el b/code/elpa/dired-single-20230306.626/dired-single-pkg.el deleted file mode 100644 index 226921b..0000000 --- a/code/elpa/dired-single-20230306.626/dired-single-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; Generated package description from dired-single.el -*- no-byte-compile: t -*- -(define-package "dired-single" "20230306.626" "Reuse the current dired buffer" '((emacs "25.1")) :commit "c781b7dcff6e7f9a5060b067d2cdb0acbc840c49" :url "https://codeberg.org/amano.kenji/dired-single") diff --git a/code/elpa/dired-single-20230306.626/dired-single-autoloads.el b/code/elpa/dired-single-20240131.1148/dired-single-autoloads.el similarity index 78% rename from code/elpa/dired-single-20230306.626/dired-single-autoloads.el rename to code/elpa/dired-single-20240131.1148/dired-single-autoloads.el index 19097d9..b409fd9 100644 --- a/code/elpa/dired-single-20230306.626/dired-single-autoloads.el +++ b/code/elpa/dired-single-20240131.1148/dired-single-autoloads.el @@ -1,12 +1,14 @@ -;;; dired-single-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- -;; +;;; dired-single-autoloads.el --- automatically extracted autoloads (do not edit) -*- lexical-binding: t -*- +;; Generated by the `loaddefs-generate' function. + +;; This file is part of GNU Emacs. + ;;; Code: -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) +(add-to-list 'load-path (or (and load-file-name (directory-file-name (file-name-directory load-file-name))) (car load-path))) + -;;;### (autoloads nil "dired-single" "dired-single.el" (0 0 0 0)) ;;; Generated autoloads from dired-single.el (autoload 'dired-single-buffer "dired-single" "\ @@ -29,15 +31,13 @@ specified, the directory or file on the current line is used (assuming it's a Dired buffer). If the current line represents a file, the file is visited in another window. -\(fn &optional DEFAULT-DIRNAME)" t nil) - +(fn &optional DEFAULT-DIRNAME)" t) (autoload 'dired-single-buffer-mouse "dired-single" "\ Mouse-initiated version of `dired-single-buffer' (which see). Argument CLICK is the mouse-click event. -\(fn CLICK)" t nil) - +(fn CLICK)" t) (autoload 'dired-single-magic-buffer "dired-single" "\ Switch to buffer whose name is the value of `dired-single-magic-buffer-name'. @@ -48,28 +48,29 @@ magic buffer, it will prompt for a new directory to visit. Optional argument DEFAULT-DIRNAME specifies the directory to visit (defaults to the currently displayed directory). -\(fn &optional DEFAULT-DIRNAME)" t nil) - +(fn &optional DEFAULT-DIRNAME)" t) (autoload 'dired-single-toggle-buffer-name "dired-single" "\ -Toggle between the 'magic' buffer name and the 'real' Dired buffer name. - -Will also seek to uniquify the 'real' buffer name." t nil) +Toggle between the `magic' buffer name and the `real' Dired buffer name. +Will also seek to uniquify the `real' buffer name." t) (autoload 'dired-single-up-directory "dired-single" "\ Like `dired-up-directory' but with `dired-single-buffer'. If (as OTHER-WINDOW) is non-nil, open the parent directory in a new window. -\(fn &optional OTHER-WINDOW)" t nil) - +(fn &optional OTHER-WINDOW)" t) (register-definition-prefixes "dired-single" '("dired-single-")) - -;;;*** +;;; End of scraped data + +(provide 'dired-single-autoloads) + ;; Local Variables: ;; version-control: never ;; no-byte-compile: t ;; no-update-autoloads: t -;; coding: utf-8 +;; no-native-compile: t +;; coding: utf-8-emacs-unix ;; End: + ;;; dired-single-autoloads.el ends here diff --git a/code/elpa/dired-single-20240131.1148/dired-single-pkg.el b/code/elpa/dired-single-20240131.1148/dired-single-pkg.el new file mode 100644 index 0000000..95c29a7 --- /dev/null +++ b/code/elpa/dired-single-20240131.1148/dired-single-pkg.el @@ -0,0 +1,6 @@ +(define-package "dired-single" "20240131.1148" "Reuse the current dired buffer" + '((emacs "25.1")) + :commit "60fce6599326e12cc2033c28d50b8bf6c6ba164a" :url "https://codeberg.org/amano.kenji/dired-single") +;; Local Variables: +;; no-byte-compile: t +;; End: diff --git a/code/elpa/dired-single-20230306.626/dired-single.el b/code/elpa/dired-single-20240131.1148/dired-single.el similarity index 97% rename from code/elpa/dired-single-20230306.626/dired-single.el rename to code/elpa/dired-single-20240131.1148/dired-single.el index 1eb3510..1b829f7 100644 --- a/code/elpa/dired-single-20230306.626/dired-single.el +++ b/code/elpa/dired-single-20240131.1148/dired-single.el @@ -1,8 +1,6 @@ ;;; dired-single.el --- Reuse the current dired buffer -*- lexical-binding: t; -*- ;; Version: 0.3.1 -;; Package-Version: 20230306.626 -;; Package-Commit: c781b7dcff6e7f9a5060b067d2cdb0acbc840c49 ;; URL: https://codeberg.org/amano.kenji/dired-single ;; License: 0BSD ;; Package-Requires: ((emacs "25.1")) @@ -177,9 +175,9 @@ the currently displayed directory)." ;;;; ------------------------------------------------------------------------ ;;;###autoload (defun dired-single-toggle-buffer-name () - "Toggle between the 'magic' buffer name and the 'real' Dired buffer name. + "Toggle between the `magic' buffer name and the `real' Dired buffer name. -Will also seek to uniquify the 'real' buffer name." +Will also seek to uniquify the `real' buffer name." (interactive) ;; make sure it's a dired buffer diff --git a/code/elpa/dockerfile-mode-20220822.2021/dockerfile-mode-pkg.el b/code/elpa/dockerfile-mode-20220822.2021/dockerfile-mode-pkg.el deleted file mode 100644 index d3b2ea6..0000000 --- a/code/elpa/dockerfile-mode-20220822.2021/dockerfile-mode-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; Generated package description from dockerfile-mode.el -*- no-byte-compile: t -*- -(define-package "dockerfile-mode" "20220822.2021" "Major mode for editing Docker's Dockerfiles" '((emacs "24")) :commit "52c6c00da1d31c0b6c29c74335b3af63ed6bf06c" :keywords '("docker" "languages" "processes" "tools") :url "https://github.com/spotify/dockerfile-mode") diff --git a/code/elpa/dockerfile-mode-20220822.2021/dockerfile-mode-autoloads.el b/code/elpa/dockerfile-mode-20240318.24/dockerfile-mode-autoloads.el similarity index 73% rename from code/elpa/dockerfile-mode-20220822.2021/dockerfile-mode-autoloads.el rename to code/elpa/dockerfile-mode-20240318.24/dockerfile-mode-autoloads.el index af15e38..bade491 100644 --- a/code/elpa/dockerfile-mode-20220822.2021/dockerfile-mode-autoloads.el +++ b/code/elpa/dockerfile-mode-20240318.24/dockerfile-mode-autoloads.el @@ -1,13 +1,14 @@ -;;; dockerfile-mode-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- -;; +;;; dockerfile-mode-autoloads.el --- automatically extracted autoloads (do not edit) -*- lexical-binding: t -*- +;; Generated by the `loaddefs-generate' function. + +;; This file is part of GNU Emacs. + ;;; Code: -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) +(add-to-list 'load-path (or (and load-file-name (directory-file-name (file-name-directory load-file-name))) (car load-path))) + -;;;### (autoloads nil "dockerfile-mode" "dockerfile-mode.el" (0 0 -;;;;;; 0 0)) ;;; Generated autoloads from dockerfile-mode.el (autoload 'dockerfile-build-buffer "dockerfile-mode" "\ @@ -27,31 +28,30 @@ The shell command used to build the image is: -f filename \\ directory -\(fn IMAGE-NAME &optional NO-CACHE)" t nil) - +(fn IMAGE-NAME &optional NO-CACHE)" t) (autoload 'dockerfile-build-no-cache-buffer "dockerfile-mode" "\ Build an image called IMAGE-NAME based upon the buffer without cache. -\(fn IMAGE-NAME)" t nil) - +(fn IMAGE-NAME)" t) (autoload 'dockerfile-mode "dockerfile-mode" "\ A major mode to edit Dockerfiles. \\{dockerfile-mode-map} -\(fn)" t nil) - +(fn)" t) (add-to-list 'auto-mode-alist (cons (concat "[/\\]" "\\(?:Containerfile\\|Dockerfile\\)" "\\(?:\\.[^/\\]*\\)?\\'") 'dockerfile-mode)) - (add-to-list 'auto-mode-alist '("\\.dockerfile\\'" . dockerfile-mode)) - (register-definition-prefixes "dockerfile-mode" '("dockerfile-")) - -;;;*** +;;; End of scraped data + +(provide 'dockerfile-mode-autoloads) + ;; Local Variables: ;; version-control: never ;; no-byte-compile: t ;; no-update-autoloads: t -;; coding: utf-8 +;; no-native-compile: t +;; coding: utf-8-emacs-unix ;; End: + ;;; dockerfile-mode-autoloads.el ends here diff --git a/code/elpa/dockerfile-mode-20240318.24/dockerfile-mode-pkg.el b/code/elpa/dockerfile-mode-20240318.24/dockerfile-mode-pkg.el new file mode 100644 index 0000000..7cb4059 --- /dev/null +++ b/code/elpa/dockerfile-mode-20240318.24/dockerfile-mode-pkg.el @@ -0,0 +1,9 @@ +(define-package "dockerfile-mode" "20240318.24" "Major mode for editing Docker's Dockerfiles" + '((emacs "24") + (s "1.2.0")) + :commit "f6196726342b44081933597a343805db6366e7ac" :keywords + '("docker" "languages" "processes" "tools") + :url "https://github.com/spotify/dockerfile-mode") +;; Local Variables: +;; no-byte-compile: t +;; End: diff --git a/code/elpa/dockerfile-mode-20220822.2021/dockerfile-mode.el b/code/elpa/dockerfile-mode-20240318.24/dockerfile-mode.el similarity index 95% rename from code/elpa/dockerfile-mode-20220822.2021/dockerfile-mode.el rename to code/elpa/dockerfile-mode-20240318.24/dockerfile-mode.el index 656e3d4..ea90ea9 100644 --- a/code/elpa/dockerfile-mode-20220822.2021/dockerfile-mode.el +++ b/code/elpa/dockerfile-mode-20240318.24/dockerfile-mode.el @@ -1,9 +1,7 @@ ;;; dockerfile-mode.el --- Major mode for editing Docker's Dockerfiles -*- lexical-binding: t -*- ;; Copyright (c) 2013 Spotify AB -;; Package-Requires: ((emacs "24")) -;; Package-Version: 20220822.2021 -;; Package-Commit: 52c6c00da1d31c0b6c29c74335b3af63ed6bf06c +;; Package-Requires: ((emacs "24") (s "1.2.0")) ;; Homepage: https://github.com/spotify/dockerfile-mode ;; URL: https://github.com/spotify/dockerfile-mode ;; Version: 1.7 @@ -31,6 +29,7 @@ (require 'sh-script) (require 'rx) +(require 's) (declare-function cygwin-convert-file-name-to-windows "cygw32.c" (file &optional absolute-p)) @@ -158,19 +157,16 @@ Lines beginning with a keyword are ignored, and any others are indented by one `dockerfile-indent-offset'. Functionality toggled by `dockerfile-enable-auto-indent'." (when dockerfile-enable-auto-indent - (unless (member (get-text-property (point-at-bol) 'face) + (unless (member (get-text-property (line-beginning-position) 'face) '(font-lock-comment-delimiter-face font-lock-keyword-face)) (save-excursion (beginning-of-line) - (skip-chars-forward "[ \t]" (point-at-eol)) - (unless (equal (point) (point-at-eol)) ; Ignore empty lines. - ;; Delete existing whitespace. - (delete-char (- (point-at-bol) (point))) - (indent-to dockerfile-indent-offset)))))) + (unless (looking-at-p "\\s-*$") ; Ignore empty lines. + (indent-line-to dockerfile-indent-offset)))))) (defun dockerfile-build-arg-string () "Create a --build-arg string for each element in `dockerfile-build-args'." - (mapconcat (lambda (arg) (concat "--build-arg " (shell-quote-argument arg))) + (mapconcat (lambda (arg) (concat "--build-arg=" (s-replace "\\=" "=" (shell-quote-argument arg)))) dockerfile-build-args " ")) (defun dockerfile-standard-filename (file) diff --git a/code/elpa/elisp-refs-20230309.1638/elisp-refs-autoloads.el b/code/elpa/elisp-refs-20230309.1638/elisp-refs-autoloads.el deleted file mode 100644 index fa7786a..0000000 --- a/code/elpa/elisp-refs-20230309.1638/elisp-refs-autoloads.el +++ /dev/null @@ -1,68 +0,0 @@ -;;; elisp-refs-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 "elisp-refs" "elisp-refs.el" (0 0 0 0)) -;;; Generated autoloads from elisp-refs.el - -(autoload 'elisp-refs-function "elisp-refs" "\ -Display all the references to function SYMBOL, in all loaded -elisp files. - -If called with a prefix, prompt for a directory to limit the search. - -This searches for functions, not macros. For that, see -`elisp-refs-macro'. - -\(fn SYMBOL &optional PATH-PREFIX)" t nil) - -(autoload 'elisp-refs-macro "elisp-refs" "\ -Display all the references to macro SYMBOL, in all loaded -elisp files. - -If called with a prefix, prompt for a directory to limit the search. - -This searches for macros, not functions. For that, see -`elisp-refs-function'. - -\(fn SYMBOL &optional PATH-PREFIX)" t nil) - -(autoload 'elisp-refs-special "elisp-refs" "\ -Display all the references to special form SYMBOL, in all loaded -elisp files. - -If called with a prefix, prompt for a directory to limit the search. - -\(fn SYMBOL &optional PATH-PREFIX)" t nil) - -(autoload 'elisp-refs-variable "elisp-refs" "\ -Display all the references to variable SYMBOL, in all loaded -elisp files. - -If called with a prefix, prompt for a directory to limit the search. - -\(fn SYMBOL &optional PATH-PREFIX)" t nil) - -(autoload 'elisp-refs-symbol "elisp-refs" "\ -Display all the references to SYMBOL in all loaded elisp files. - -If called with a prefix, prompt for a directory to limit the -search. - -\(fn SYMBOL &optional PATH-PREFIX)" t nil) - -(register-definition-prefixes "elisp-refs" '("elisp-")) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; elisp-refs-autoloads.el ends here diff --git a/code/elpa/elisp-refs-20230309.1638/elisp-refs-pkg.el b/code/elpa/elisp-refs-20230309.1638/elisp-refs-pkg.el deleted file mode 100644 index 015e399..0000000 --- a/code/elpa/elisp-refs-20230309.1638/elisp-refs-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; Generated package description from elisp-refs.el -*- no-byte-compile: t -*- -(define-package "elisp-refs" "20230309.1638" "find callers of elisp functions or macros" '((dash "2.12.0") (s "1.11.0")) :commit "6973912994ade71a3e13a24425f1cc648d8b94bb" :authors '(("Wilfred Hughes" . "me@wilfred.me.uk")) :maintainer '("Wilfred Hughes" . "me@wilfred.me.uk") :keywords '("lisp")) diff --git a/code/elpa/elisp-refs-20230309.1638/elisp-refs.el b/code/elpa/elisp-refs-20230309.1638/elisp-refs.el deleted file mode 100644 index ea914d7..0000000 --- a/code/elpa/elisp-refs-20230309.1638/elisp-refs.el +++ /dev/null @@ -1,911 +0,0 @@ -;;; elisp-refs.el --- find callers of elisp functions or macros -*- lexical-binding: t; -*- - -;; Copyright (C) 2016-2020 Wilfred Hughes - -;; Author: Wilfred Hughes -;; Version: 1.6 -;; Package-Version: 20230309.1638 -;; Package-Commit: 6973912994ade71a3e13a24425f1cc648d8b94bb -;; Keywords: lisp -;; Package-Requires: ((dash "2.12.0") (s "1.11.0")) - -;; This program is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see . - -;;; Commentary: - -;; elisp-refs.el is an Emacs package for finding references to -;; functions, macros or variables. Unlike a dumb text search, -;; elisp-refs.el actually parses the code, so it's never confused by -;; comments or `foo-bar' matching `foo'. -;; -;; See https://github.com/Wilfred/refs.el/blob/master/README.md for -;; more information. - -;;; Code: - -(require 'dash) -(require 's) -(require 'format) -(eval-when-compile (require 'cl-lib)) - -;;; Internal - -(defvar elisp-refs-verbose t) - -(defun elisp-refs--format-int (integer) - "Format INTEGER as a string, with , separating thousands." - (let ((number (abs integer)) - (parts nil)) - (while (> number 999) - (push (format "%03d" (mod number 1000)) - parts) - (setq number (/ number 1000))) - (push (format "%d" number) parts) - (concat - (if (< integer 0) "-" "") - (s-join "," parts)))) - -(defsubst elisp-refs--start-pos (end-pos) - "Find the start position of form ending at END-POS -in the current buffer." - (let ((parse-sexp-ignore-comments t)) - (scan-sexps end-pos -1))) - -(defun elisp-refs--sexp-positions (buffer start-pos end-pos) - "Return a list of start and end positions of all the sexps -between START-POS and END-POS (inclusive) in BUFFER. - -Positions exclude quote characters, so given 'foo or `foo, we -report the position of the symbol foo. - -Not recursive, so we don't consider subelements of nested sexps." - (let ((positions nil)) - (with-current-buffer buffer - (condition-case _err - (catch 'done - (while t - (let* ((sexp-end-pos (let ((parse-sexp-ignore-comments t)) - (scan-sexps start-pos 1)))) - ;; If we've reached a sexp beyond the range requested, - ;; or if there are no sexps left, we're done. - (when (or (null sexp-end-pos) (> sexp-end-pos end-pos)) - (throw 'done nil)) - ;; Otherwise, this sexp is in the range requested. - (push (list (elisp-refs--start-pos sexp-end-pos) sexp-end-pos) - positions) - (setq start-pos sexp-end-pos)))) - ;; Terminate when we see "Containing expression ends prematurely" - (scan-error nil))) - (nreverse positions))) - -(defun elisp-refs--read-buffer-form (symbols-with-pos) - "Read a form from the current buffer, starting at point. -Returns a list: -\(form form-start-pos form-end-pos symbol-positions read-start-pos) - -In Emacs 28 and earlier, SYMBOL-POSITIONS is a list of 0-indexed -symbol positions relative to READ-START-POS, according to -`read-symbol-positions-list'. - -In Emacs 29+, SYMBOL-POSITIONS is nil. If SYMBOLS-WITH-POS is -non-nil, forms are read with `read-positioning-symbols'." - (let* ((read-with-symbol-positions t) - (read-start-pos (point)) - (form (if (and symbols-with-pos (fboundp 'read-positioning-symbols)) - (read-positioning-symbols (current-buffer)) - (read (current-buffer)))) - (symbols (if (boundp 'read-symbol-positions-list) - read-symbol-positions-list - nil)) - (end-pos (point)) - (start-pos (elisp-refs--start-pos end-pos))) - (list form start-pos end-pos symbols read-start-pos))) - -(defvar elisp-refs--path nil - "A buffer-local variable used by `elisp-refs--contents-buffer'. -Internal implementation detail.") - -(defun elisp-refs--read-all-buffer-forms (buffer symbols-with-pos) - "Read all the forms in BUFFER, along with their positions." - (with-current-buffer buffer - (goto-char (point-min)) - (let ((forms nil)) - (condition-case err - (while t - (push (elisp-refs--read-buffer-form symbols-with-pos) forms)) - (error - (if (or (equal (car err) 'end-of-file) - ;; TODO: this shouldn't occur in valid elisp files, - ;; but it's happening in helm-utils.el. - (equal (car err) 'scan-error)) - ;; Reached end of file, we're done. - (nreverse forms) - ;; Some unexpected error, propagate. - (error "Unexpected error whilst reading %s position %s: %s" - (abbreviate-file-name elisp-refs--path) (point) err))))))) - -(defun elisp-refs--proper-list-p (val) - "Is VAL a proper list?" - (if (fboundp 'proper-list-p) - ;; `proper-list-p' was added in Emacs 27.1. - ;; http://git.savannah.gnu.org/cgit/emacs.git/commit/?id=2fde6275b69fd113e78243790bf112bbdd2fe2bf - (with-no-warnings (proper-list-p val)) - ;; Earlier Emacs versions only had format-proper-list-p. - (with-no-warnings (format-proper-list-p val)))) - -(defun elisp-refs--walk (buffer form start-pos end-pos symbol match-p &optional path) - "Walk FORM, a nested list, and return a list of sublists (with -their positions) where MATCH-P returns t. FORM is traversed -depth-first (pre-order traversal, left-to-right). - -MATCH-P is called with three arguments: -\(SYMBOL CURRENT-FORM PATH). - -PATH is the first element of all the enclosing forms of -CURRENT-FORM, innermost first, along with the index of the -current form. - -For example if we are looking at h in (e f (g h)), PATH takes the -value ((g . 1) (e . 2)). - -START-POS and END-POS should be the position of FORM within BUFFER." - (cond - ((funcall match-p symbol form path) - ;; If this form matches, just return it, along with the position. - (list (list form start-pos end-pos))) - ;; Otherwise, recurse on the subforms. - ((consp form) - (let ((matches nil) - ;; Find the positions of the subforms. - (subforms-positions - (if (eq (car-safe form) '\`) - ;; Kludge: `elisp-refs--sexp-positions' excludes the ` when - ;; calculating positions. So, to find the inner - ;; positions when walking from `(...) to (...), we - ;; don't need to increment the start position. - (cons nil (elisp-refs--sexp-positions buffer start-pos end-pos)) - ;; Calculate the positions after the opening paren. - (elisp-refs--sexp-positions buffer (1+ start-pos) end-pos)))) - ;; For each subform, recurse if it's a list, or a matching symbol. - (--each (-zip form subforms-positions) - (-let [(subform subform-start subform-end) it] - (when (or - (and (consp subform) (elisp-refs--proper-list-p subform)) - (and (symbolp subform) (eq subform symbol))) - (-when-let (subform-matches - (elisp-refs--walk - buffer subform - subform-start subform-end - symbol match-p - (cons (cons (car-safe form) it-index) path))) - (push subform-matches matches))))) - - ;; Concat the results from all the subforms. - (apply #'append (nreverse matches)))))) - -;; TODO: condition-case (condition-case ... (error ...)) is not a call -;; TODO: (cl-destructuring-bind (foo &rest bar) ...) is not a call -;; TODO: letf, cl-letf, -let, -let* -(defun elisp-refs--function-p (symbol form path) - "Return t if FORM looks like a function call to SYMBOL." - (cond - ((not (consp form)) - nil) - ;; Ignore (defun _ (SYMBOL ...) ...) - ((or (equal (car path) '(defsubst . 2)) - (equal (car path) '(defun . 2)) - (equal (car path) '(defmacro . 2)) - (equal (car path) '(cl-defun . 2))) - nil) - ;; Ignore (lambda (SYMBOL ...) ...) - ((equal (car path) '(lambda . 1)) - nil) - ;; Ignore (let (SYMBOL ...) ...) - ;; and (let* (SYMBOL ...) ...) - ((or - (equal (car path) '(let . 1)) - (equal (car path) '(let* . 1))) - nil) - ;; Ignore (let ((SYMBOL ...)) ...) - ((or - (equal (cl-second path) '(let . 1)) - (equal (cl-second path) '(let* . 1))) - nil) - ;; Ignore (declare-function NAME (ARGS...)) - ((equal (car path) '(declare-function . 3)) - nil) - ;; (SYMBOL ...) - ((eq (car form) symbol) - t) - ;; (foo ... #'SYMBOL ...) - ((--any-p (equal it (list 'function symbol)) form) - t) - ;; (funcall 'SYMBOL ...) - ((and (eq (car form) 'funcall) - (equal `',symbol (cl-second form))) - t) - ;; (apply 'SYMBOL ...) - ((and (eq (car form) 'apply) - (equal `',symbol (cl-second form))) - t))) - -(defun elisp-refs--macro-p (symbol form path) - "Return t if FORM looks like a macro call to SYMBOL." - (cond - ((not (consp form)) - nil) - ;; Ignore (defun _ (SYMBOL ...) ...) - ((or (equal (car path) '(defsubst . 2)) - (equal (car path) '(defun . 2)) - (equal (car path) '(defmacro . 2))) - nil) - ;; Ignore (lambda (SYMBOL ...) ...) - ((equal (car path) '(lambda . 1)) - nil) - ;; Ignore (let (SYMBOL ...) ...) - ;; and (let* (SYMBOL ...) ...) - ((or - (equal (car path) '(let . 1)) - (equal (car path) '(let* . 1))) - nil) - ;; Ignore (let ((SYMBOL ...)) ...) - ((or - (equal (cl-second path) '(let . 1)) - (equal (cl-second path) '(let* . 1))) - nil) - ;; (SYMBOL ...) - ((eq (car form) symbol) - t))) - -;; Looking for a special form is exactly the same as looking for a -;; macro. -(defalias 'elisp-refs--special-p 'elisp-refs--macro-p) - -(defun elisp-refs--variable-p (symbol form path) - "Return t if this looks like a variable reference to SYMBOL. -We consider parameters to be variables too." - (cond - ((consp form) - nil) - ;; Ignore (defun _ (SYMBOL ...) ...) - ((or (equal (car path) '(defsubst . 1)) - (equal (car path) '(defun . 1)) - (equal (car path) '(defmacro . 1)) - (equal (car path) '(cl-defun . 1))) - nil) - ;; (let (SYMBOL ...) ...) is a variable, not a function call. - ((or - (equal (cl-second path) '(let . 1)) - (equal (cl-second path) '(let* . 1))) - t) - ;; (lambda (SYMBOL ...) ...) is a variable - ((equal (cl-second path) '(lambda . 1)) - t) - ;; (let ((SYMBOL ...)) ...) is also a variable. - ((or - (equal (cl-third path) '(let . 1)) - (equal (cl-third path) '(let* . 1))) - t) - ;; Ignore (SYMBOL ...) otherwise, we assume it's a function/macro - ;; call. - ((equal (car path) (cons symbol 0)) - nil) - ((eq form symbol) - t))) - -;; TODO: benchmark building a list with `push' rather than using -;; mapcat. -(defun elisp-refs--read-and-find (buffer symbol match-p) - "Read all the forms in BUFFER, and return a list of all forms that -contain SYMBOL where MATCH-P returns t. - -For every matching form found, we return the form itself along -with its start and end position." - (-non-nil - (--mapcat - (-let [(form start-pos end-pos symbol-positions _read-start-pos) it] - ;; Optimisation: if we have a list of positions for the current - ;; form (Emacs 28 and earlier), and it doesn't contain the - ;; symbol we're looking for, don't bother walking the form. - (when (or (null symbol-positions) (assq symbol symbol-positions)) - (elisp-refs--walk buffer form start-pos end-pos symbol match-p))) - (elisp-refs--read-all-buffer-forms buffer nil)))) - -(defun elisp-refs--walk-positioned-symbols (forms symbol) - "Given a nested list of FORMS, return a list of all positions of SYMBOL. -Assumes `symbol-with-pos-pos' is defined (Emacs 29+)." - (cond - ((symbol-with-pos-p forms) - (let ((symbols-with-pos-enabled t)) - (if (eq forms symbol) - (list (list symbol - (symbol-with-pos-pos forms) - (+ (symbol-with-pos-pos forms) (length (symbol-name symbol)))))))) - ((elisp-refs--proper-list-p forms) - ;; Proper list, use `--mapcat` to reduce how much we recurse. - (--mapcat (elisp-refs--walk-positioned-symbols it symbol) forms)) - ((consp forms) - ;; Improper list, we have to recurse on head and tail. - (append (elisp-refs--walk-positioned-symbols (car forms) symbol) - (elisp-refs--walk-positioned-symbols (cdr forms) symbol))) - ((vectorp forms) - (--mapcat (elisp-refs--walk-positioned-symbols it symbol) forms)))) - -(defun elisp-refs--read-and-find-symbol (buffer symbol) - "Read all the forms in BUFFER, and return a list of all -positions of SYMBOL." - (let* ((symbols-with-pos (fboundp 'symbol-with-pos-pos)) - (forms (elisp-refs--read-all-buffer-forms buffer symbols-with-pos))) - - (if symbols-with-pos - (elisp-refs--walk-positioned-symbols forms symbol) - (-non-nil - (--mapcat - (-let [(_ _ _ symbol-positions read-start-pos) it] - (--map - (-let [(sym . offset) it] - (when (eq sym symbol) - (-let* ((start-pos (+ read-start-pos offset)) - (end-pos (+ start-pos (length (symbol-name sym))))) - (list sym start-pos end-pos)))) - symbol-positions)) - forms))))) - -(defun elisp-refs--filter-obarray (pred) - "Return a list of all the items in `obarray' where PRED returns t." - (let (symbols) - (mapatoms (lambda (symbol) - (when (and (funcall pred symbol) - (not (equal (symbol-name symbol) ""))) - (push symbol symbols)))) - symbols)) - -(defun elisp-refs--loaded-paths () - "Return a list of all files that have been loaded in Emacs. -Where the file was a .elc, return the path to the .el file instead." - (let ((elc-paths (-non-nil (mapcar #'-first-item load-history)))) - (-non-nil - (--map - (let ((el-name (format "%s.el" (file-name-sans-extension it))) - (el-gz-name (format "%s.el.gz" (file-name-sans-extension it)))) - (cond ((file-exists-p el-name) el-name) - ((file-exists-p el-gz-name) el-gz-name) - ;; Ignore files where we can't find a .el file. - (t nil))) - elc-paths)))) - -(defun elisp-refs--contents-buffer (path) - "Read PATH into a disposable buffer, and return it. -Works around the fact that Emacs won't allow multiple buffers -visiting the same file." - (let ((fresh-buffer (generate-new-buffer (format " *refs-%s*" path))) - ;; Be defensive against users overriding encoding - ;; configurations (Helpful bugs #75 and #147). - (coding-system-for-read nil) - (file-name-handler-alist - '(("\\(?:\\.dz\\|\\.txz\\|\\.xz\\|\\.lzma\\|\\.lz\\|\\.g?z\\|\\.\\(?:tgz\\|svgz\\|sifz\\)\\|\\.tbz2?\\|\\.bz2\\|\\.Z\\)\\(?:~\\|\\.~[-[:alnum:]:#@^._]+\\(?:~[[:digit:]]+\\)?~\\)?\\'" . - jka-compr-handler) - ("\\`/:" . file-name-non-special)))) - (with-current-buffer fresh-buffer - (setq-local elisp-refs--path path) - (insert-file-contents path) - ;; We don't enable emacs-lisp-mode because it slows down this - ;; function significantly. We just need the syntax table for - ;; scan-sexps to do the right thing with comments. - (set-syntax-table emacs-lisp-mode-syntax-table)) - fresh-buffer)) - -(defvar elisp-refs--highlighting-buffer - nil - "A temporary buffer used for highlighting. -Since `elisp-refs--syntax-highlight' is a hot function, we -don't want to create lots of temporary buffers.") - -(defun elisp-refs--syntax-highlight (str) - "Apply font-lock properties to a string STR of Emacs lisp code." - ;; Ensure we have a highlighting buffer to work with. - (unless (and elisp-refs--highlighting-buffer - (buffer-live-p elisp-refs--highlighting-buffer)) - (setq elisp-refs--highlighting-buffer - (generate-new-buffer " *refs-highlighting*")) - (with-current-buffer elisp-refs--highlighting-buffer - (delay-mode-hooks (emacs-lisp-mode)))) - - (with-current-buffer elisp-refs--highlighting-buffer - (erase-buffer) - (insert str) - (if (fboundp 'font-lock-ensure) - (font-lock-ensure) - (with-no-warnings - (font-lock-fontify-buffer))) - (buffer-string))) - -(defun elisp-refs--replace-tabs (string) - "Replace tabs in STRING with spaces." - ;; This is important for unindenting, as we may unindent by less - ;; than one whole tab. - (s-replace "\t" (s-repeat tab-width " ") string)) - -(defun elisp-refs--lines (string) - "Return a list of all the lines in STRING. -'a\nb' -> ('a\n' 'b')" - (let ((lines nil)) - (while (> (length string) 0) - (let ((index (s-index-of "\n" string))) - (if index - (progn - (push (substring string 0 (1+ index)) lines) - (setq string (substring string (1+ index)))) - (push string lines) - (setq string "")))) - (nreverse lines))) - -(defun elisp-refs--map-lines (string fn) - "Execute FN for each line in string, and join the result together." - (let ((result nil)) - (dolist (line (elisp-refs--lines string)) - (push (funcall fn line) result)) - (apply #'concat (nreverse result)))) - -(defun elisp-refs--unindent-rigidly (string) - "Given an indented STRING, unindent rigidly until -at least one line has no indent. - -STRING should have a 'elisp-refs-start-pos property. The returned -string will have this property updated to reflect the unindent." - (let* ((lines (s-lines string)) - ;; Get the leading whitespace for each line. - (indents (--map (car (s-match (rx bos (+ whitespace)) it)) - lines)) - (min-indent (-min (--map (length it) indents)))) - (propertize - (elisp-refs--map-lines - string - (lambda (line) (substring line min-indent))) - 'elisp-refs-unindented min-indent))) - -(defun elisp-refs--containing-lines (buffer start-pos end-pos) - "Return a string, all the lines in BUFFER that are between -START-POS and END-POS (inclusive). - -For the characters that are between START-POS and END-POS, -propertize them." - (let (expanded-start-pos expanded-end-pos) - (with-current-buffer buffer - ;; Expand START-POS and END-POS to line boundaries. - (goto-char start-pos) - (beginning-of-line) - (setq expanded-start-pos (point)) - (goto-char end-pos) - (end-of-line) - (setq expanded-end-pos (point)) - - ;; Extract the rest of the line before and after the section we're interested in. - (let* ((before-match (buffer-substring expanded-start-pos start-pos)) - (after-match (buffer-substring end-pos expanded-end-pos)) - ;; Concat the extra text with the actual match, ensuring we - ;; highlight the match as code, but highlight the rest as as - ;; comments. - (text (concat - (propertize before-match - 'face 'font-lock-comment-face) - (elisp-refs--syntax-highlight (buffer-substring start-pos end-pos)) - (propertize after-match - 'face 'font-lock-comment-face)))) - (-> text - (elisp-refs--replace-tabs) - (elisp-refs--unindent-rigidly) - (propertize 'elisp-refs-start-pos expanded-start-pos - 'elisp-refs-path elisp-refs--path)))))) - -(defun elisp-refs--find-file (button) - "Open the file referenced by BUTTON." - (find-file (button-get button 'path)) - (goto-char (point-min))) - -(define-button-type 'elisp-refs-path-button - 'action 'elisp-refs--find-file - 'follow-link t - 'help-echo "Open file") - -(defun elisp-refs--path-button (path) - "Return a button that navigates to PATH." - (with-temp-buffer - (insert-text-button - (abbreviate-file-name path) - :type 'elisp-refs-path-button - 'path path) - (buffer-string))) - -(defun elisp-refs--describe (button) - "Show *Help* for the symbol referenced by BUTTON." - (let ((symbol (button-get button 'symbol)) - (kind (button-get button 'kind))) - (cond ((eq kind 'symbol) - (describe-symbol symbol)) - ((eq kind 'variable) - (describe-variable symbol)) - (t - ;; Emacs uses `describe-function' for functions, macros and - ;; special forms. - (describe-function symbol))))) - -(define-button-type 'elisp-refs-describe-button - 'action 'elisp-refs--describe - 'follow-link t - 'help-echo "Describe") - -(defun elisp-refs--describe-button (symbol kind) - "Return a button that shows *Help* for SYMBOL. -KIND should be 'function, 'macro, 'variable, 'special or 'symbol." - (with-temp-buffer - (insert (symbol-name kind) " ") - (insert-text-button - (symbol-name symbol) - :type 'elisp-refs-describe-button - 'symbol symbol - 'kind kind) - (buffer-string))) - -(defun elisp-refs--pluralize (number thing) - "Human-friendly description of NUMBER occurrences of THING." - (format "%s %s%s" - (elisp-refs--format-int number) - thing - (if (equal number 1) "" "s"))) - -(defun elisp-refs--format-count (symbol ref-count file-count - searched-file-count prefix) - (let* ((file-str (if (zerop file-count) - "" - (format " in %s" (elisp-refs--pluralize file-count "file")))) - (found-str (format "Found %s to %s%s." - (elisp-refs--pluralize ref-count "reference") - symbol - file-str)) - (searched-str (if prefix - (format "Searched %s in %s." - (elisp-refs--pluralize searched-file-count "loaded file") - (elisp-refs--path-button (file-name-as-directory prefix))) - (format "Searched all %s loaded in Emacs." - (elisp-refs--pluralize searched-file-count "file"))))) - (s-word-wrap 70 (format "%s %s" found-str searched-str)))) - -;; TODO: if we have multiple matches on one line, we repeatedly show -;; that line. That's slightly confusing. -(defun elisp-refs--show-results (symbol description results - searched-file-count prefix) - "Given a RESULTS list where each element takes the form \(forms . buffer\), -render a friendly results buffer." - (let ((buf (get-buffer-create (format "*refs: %s*" symbol)))) - (switch-to-buffer buf) - (let ((inhibit-read-only t)) - (erase-buffer) - (save-excursion - ;; Insert the header. - (insert - (elisp-refs--format-count - description - (-sum (--map (length (car it)) results)) - (length results) - searched-file-count - prefix) - "\n\n") - ;; Insert the results. - (--each results - (-let* (((forms . buf) it) - (path (with-current-buffer buf elisp-refs--path))) - (insert - (propertize "File: " 'face 'bold) - (elisp-refs--path-button path) "\n") - (--each forms - (-let [(_ start-pos end-pos) it] - (insert (elisp-refs--containing-lines buf start-pos end-pos) - "\n"))) - (insert "\n"))) - ;; Prepare the buffer for the user. - (elisp-refs-mode))) - ;; Cleanup buffers created when highlighting results. - (when elisp-refs--highlighting-buffer - (kill-buffer elisp-refs--highlighting-buffer)))) - -(defun elisp-refs--loaded-bufs () - "Return a list of open buffers, one for each path in `load-path'." - (mapcar #'elisp-refs--contents-buffer (elisp-refs--loaded-paths))) - -(defun elisp-refs--search-1 (bufs match-fn) - "Call MATCH-FN on each buffer in BUFS, reporting progress -and accumulating results. - -BUFS should be disposable: we make no effort to preserve their -state during searching. - -MATCH-FN should return a list where each element takes the form: -\(form start-pos end-pos)." - (let* (;; Our benchmark suggests we spend a lot of time in GC, and - ;; performance improves if we GC less frequently. - (gc-cons-percentage 0.8) - (total-bufs (length bufs))) - (let ((searched 0) - (forms-and-bufs nil)) - (dolist (buf bufs) - (let* ((matching-forms (funcall match-fn buf))) - ;; If there were any matches in this buffer, push the - ;; matches along with the buffer into our results - ;; list. - (when matching-forms - (push (cons matching-forms buf) forms-and-bufs)) - ;; Give feedback to the user on our progress, because - ;; searching takes several seconds. - (when (and (zerop (mod searched 10)) - elisp-refs-verbose) - (message "Searched %s/%s files" searched total-bufs)) - (cl-incf searched))) - (when elisp-refs-verbose - (message "Searched %s/%s files" total-bufs total-bufs)) - forms-and-bufs))) - -(defun elisp-refs--search (symbol description match-fn &optional path-prefix) - "Find references to SYMBOL in all loaded files; call MATCH-FN on each buffer. -When PATH-PREFIX, limit to loaded files whose path starts with that prefix. - -Display the results in a hyperlinked buffer. - -MATCH-FN should return a list where each element takes the form: -\(form start-pos end-pos)." - (let* ((loaded-paths (elisp-refs--loaded-paths)) - (matching-paths (if path-prefix - (--filter (s-starts-with? path-prefix it) loaded-paths) - loaded-paths)) - (loaded-src-bufs (mapcar #'elisp-refs--contents-buffer matching-paths))) - ;; Use unwind-protect to ensure we always cleanup temporary - ;; buffers, even if the user hits C-g. - (unwind-protect - (progn - (let ((forms-and-bufs - (elisp-refs--search-1 loaded-src-bufs match-fn))) - (elisp-refs--show-results symbol description forms-and-bufs - (length loaded-src-bufs) path-prefix))) - ;; Clean up temporary buffers. - (--each loaded-src-bufs (kill-buffer it))))) - -(defun elisp-refs--completing-read-symbol (prompt &optional filter) - "Read an interned symbol from the minibuffer, -defaulting to the symbol at point. PROMPT is the string to prompt -with. - -If FILTER is given, only offer symbols where (FILTER sym) returns -t." - (let ((filter (or filter (lambda (_) t)))) - (read - (completing-read prompt - (elisp-refs--filter-obarray filter) - nil nil nil nil - (-if-let (sym (thing-at-point 'symbol)) - (when (funcall filter (read sym)) - sym)))))) - -;;; Commands - -;;;###autoload -(defun elisp-refs-function (symbol &optional path-prefix) - "Display all the references to function SYMBOL, in all loaded -elisp files. - -If called with a prefix, prompt for a directory to limit the search. - -This searches for functions, not macros. For that, see -`elisp-refs-macro'." - (interactive - (list (elisp-refs--completing-read-symbol "Function: " #'functionp) - (when current-prefix-arg - (read-directory-name "Limit search to loaded files in: ")))) - (when (not (functionp symbol)) - (if (macrop symbol) - (user-error "%s is a macro. Did you mean elisp-refs-macro?" - symbol) - (user-error "%s is not a function. Did you mean elisp-refs-symbol?" - symbol))) - (elisp-refs--search symbol - (elisp-refs--describe-button symbol 'function) - (lambda (buf) - (elisp-refs--read-and-find buf symbol #'elisp-refs--function-p)) - path-prefix)) - -;;;###autoload -(defun elisp-refs-macro (symbol &optional path-prefix) - "Display all the references to macro SYMBOL, in all loaded -elisp files. - -If called with a prefix, prompt for a directory to limit the search. - -This searches for macros, not functions. For that, see -`elisp-refs-function'." - (interactive - (list (elisp-refs--completing-read-symbol "Macro: " #'macrop) - (when current-prefix-arg - (read-directory-name "Limit search to loaded files in: ")))) - (when (not (macrop symbol)) - (if (functionp symbol) - (user-error "%s is a function. Did you mean elisp-refs-function?" - symbol) - (user-error "%s is not a function. Did you mean elisp-refs-symbol?" - symbol))) - (elisp-refs--search symbol - (elisp-refs--describe-button symbol 'macro) - (lambda (buf) - (elisp-refs--read-and-find buf symbol #'elisp-refs--macro-p)) - path-prefix)) - -;;;###autoload -(defun elisp-refs-special (symbol &optional path-prefix) - "Display all the references to special form SYMBOL, in all loaded -elisp files. - -If called with a prefix, prompt for a directory to limit the search." - (interactive - (list (elisp-refs--completing-read-symbol "Special form: " #'special-form-p) - (when current-prefix-arg - (read-directory-name "Limit search to loaded files in: ")))) - (elisp-refs--search symbol - (elisp-refs--describe-button symbol 'special-form) - (lambda (buf) - (elisp-refs--read-and-find buf symbol #'elisp-refs--special-p)) - path-prefix)) - -;;;###autoload -(defun elisp-refs-variable (symbol &optional path-prefix) - "Display all the references to variable SYMBOL, in all loaded -elisp files. - -If called with a prefix, prompt for a directory to limit the search." - (interactive - ;; This is awkward. We don't want to just offer defvar variables, - ;; because then we can't search for code which uses `let' to bind - ;; symbols. There doesn't seem to be a good way to only offer - ;; variables that have been bound at some point. - (list (elisp-refs--completing-read-symbol "Variable: " ) - (when current-prefix-arg - (read-directory-name "Limit search to loaded files in: ")))) - (elisp-refs--search symbol - (elisp-refs--describe-button symbol 'variable) - (lambda (buf) - (elisp-refs--read-and-find buf symbol #'elisp-refs--variable-p)) - path-prefix)) - -;;;###autoload -(defun elisp-refs-symbol (symbol &optional path-prefix) - "Display all the references to SYMBOL in all loaded elisp files. - -If called with a prefix, prompt for a directory to limit the -search." - (interactive - (list (elisp-refs--completing-read-symbol "Symbol: " ) - (when current-prefix-arg - (read-directory-name "Limit search to loaded files in: ")))) - (elisp-refs--search symbol - (elisp-refs--describe-button symbol 'symbol) - (lambda (buf) - (elisp-refs--read-and-find-symbol buf symbol)) - path-prefix)) - -;;; Mode - -(defvar elisp-refs-mode-map - (let ((map (make-sparse-keymap))) - ;; TODO: it would be nice for TAB to navigate to file buttons too, - ;; like *Help* does. - (set-keymap-parent map special-mode-map) - (define-key map (kbd "") #'elisp-refs-next-match) - (define-key map (kbd "") #'elisp-refs-prev-match) - (define-key map (kbd "n") #'elisp-refs-next-match) - (define-key map (kbd "p") #'elisp-refs-prev-match) - (define-key map (kbd "q") #'kill-this-buffer) - (define-key map (kbd "RET") #'elisp-refs-visit-match) - map) - "Keymap for `elisp-refs-mode'.") - -(define-derived-mode elisp-refs-mode special-mode "Refs" - "Major mode for refs results buffers.") - -(defun elisp--refs-visit-match (open-fn) - "Go to the search result at point. -Open file with function OPEN_FN. `find-file` or `find-file-other-window`" - (interactive) - (let* ((path (get-text-property (point) 'elisp-refs-path)) - (pos (get-text-property (point) 'elisp-refs-start-pos)) - (unindent (get-text-property (point) 'elisp-refs-unindented)) - (column-offset (current-column)) - (line-offset -1)) - (when (null path) - (user-error "No match here")) - - ;; If point is not on the first line of the match, work out how - ;; far away the first line is. - (save-excursion - (while (equal pos (get-text-property (point) 'elisp-refs-start-pos)) - (forward-line -1) - (cl-incf line-offset))) - - (funcall open-fn path) - (goto-char pos) - ;; Move point so we're on the same char in the buffer that we were - ;; on in the results buffer. - (forward-line line-offset) - (beginning-of-line) - (let ((target-offset (+ column-offset unindent)) - (i 0)) - (while (< i target-offset) - (if (looking-at "\t") - (cl-incf i tab-width) - (cl-incf i)) - (forward-char 1))))) - -(defun elisp-refs-visit-match () - "Goto the search result at point." - (interactive) - (elisp--refs-visit-match #'find-file)) - -(defun elisp-refs-visit-match-other-window () - "Goto the search result at point, opening in another window." - (interactive) - (elisp--refs-visit-match #'find-file-other-window)) - - -(defun elisp-refs--move-to-match (direction) - "Move point one match forwards. -If DIRECTION is -1, moves backwards instead." - (let* ((start-pos (point)) - (match-pos (get-text-property start-pos 'elisp-refs-start-pos)) - current-match-pos) - (condition-case _err - (progn - ;; Move forward/backwards until we're on the next/previous match. - (catch 'done - (while t - (setq current-match-pos - (get-text-property (point) 'elisp-refs-start-pos)) - (when (and current-match-pos - (not (equal match-pos current-match-pos))) - (throw 'done nil)) - (forward-char direction))) - ;; Move to the beginning of that match. - (while (equal (get-text-property (point) 'elisp-refs-start-pos) - (get-text-property (1- (point)) 'elisp-refs-start-pos)) - (forward-char -1)) - ;; Move forward until we're on the first char of match within that - ;; line. - (while (or - (looking-at " ") - (eq (get-text-property (point) 'face) - 'font-lock-comment-face)) - (forward-char 1))) - ;; If we're at the last result, don't move point. - (end-of-buffer - (progn - (goto-char start-pos) - (signal 'end-of-buffer nil)))))) - -(defun elisp-refs-prev-match () - "Move to the previous search result in the Refs buffer." - (interactive) - (elisp-refs--move-to-match -1)) - -(defun elisp-refs-next-match () - "Move to the next search result in the Refs buffer." - (interactive) - (elisp-refs--move-to-match 1)) - -(provide 'elisp-refs) -;;; elisp-refs.el ends here diff --git a/org/elpa/elisp-refs-20230309.1638/elisp-refs-autoloads.el b/code/elpa/elisp-refs-20230920.201/elisp-refs-autoloads.el similarity index 72% rename from org/elpa/elisp-refs-20230309.1638/elisp-refs-autoloads.el rename to code/elpa/elisp-refs-20230920.201/elisp-refs-autoloads.el index fa7786a..539a8b3 100644 --- a/org/elpa/elisp-refs-20230309.1638/elisp-refs-autoloads.el +++ b/code/elpa/elisp-refs-20230920.201/elisp-refs-autoloads.el @@ -1,12 +1,14 @@ -;;; elisp-refs-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- -;; +;;; elisp-refs-autoloads.el --- automatically extracted autoloads (do not edit) -*- lexical-binding: t -*- +;; Generated by the `loaddefs-generate' function. + +;; This file is part of GNU Emacs. + ;;; Code: -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) +(add-to-list 'load-path (or (and load-file-name (directory-file-name (file-name-directory load-file-name))) (car load-path))) + -;;;### (autoloads nil "elisp-refs" "elisp-refs.el" (0 0 0 0)) ;;; Generated autoloads from elisp-refs.el (autoload 'elisp-refs-function "elisp-refs" "\ @@ -18,8 +20,7 @@ If called with a prefix, prompt for a directory to limit the search. This searches for functions, not macros. For that, see `elisp-refs-macro'. -\(fn SYMBOL &optional PATH-PREFIX)" t nil) - +(fn SYMBOL &optional PATH-PREFIX)" t) (autoload 'elisp-refs-macro "elisp-refs" "\ Display all the references to macro SYMBOL, in all loaded elisp files. @@ -29,40 +30,40 @@ If called with a prefix, prompt for a directory to limit the search. This searches for macros, not functions. For that, see `elisp-refs-function'. -\(fn SYMBOL &optional PATH-PREFIX)" t nil) - +(fn SYMBOL &optional PATH-PREFIX)" t) (autoload 'elisp-refs-special "elisp-refs" "\ Display all the references to special form SYMBOL, in all loaded elisp files. If called with a prefix, prompt for a directory to limit the search. -\(fn SYMBOL &optional PATH-PREFIX)" t nil) - +(fn SYMBOL &optional PATH-PREFIX)" t) (autoload 'elisp-refs-variable "elisp-refs" "\ Display all the references to variable SYMBOL, in all loaded elisp files. If called with a prefix, prompt for a directory to limit the search. -\(fn SYMBOL &optional PATH-PREFIX)" t nil) - +(fn SYMBOL &optional PATH-PREFIX)" t) (autoload 'elisp-refs-symbol "elisp-refs" "\ Display all the references to SYMBOL in all loaded elisp files. If called with a prefix, prompt for a directory to limit the search. -\(fn SYMBOL &optional PATH-PREFIX)" t nil) - +(fn SYMBOL &optional PATH-PREFIX)" t) (register-definition-prefixes "elisp-refs" '("elisp-")) - -;;;*** +;;; End of scraped data + +(provide 'elisp-refs-autoloads) + ;; Local Variables: ;; version-control: never ;; no-byte-compile: t ;; no-update-autoloads: t -;; coding: utf-8 +;; no-native-compile: t +;; coding: utf-8-emacs-unix ;; End: + ;;; elisp-refs-autoloads.el ends here diff --git a/code/elpa/elisp-refs-20230419.405/elisp-refs-pkg.el b/code/elpa/elisp-refs-20230920.201/elisp-refs-pkg.el similarity index 70% rename from code/elpa/elisp-refs-20230419.405/elisp-refs-pkg.el rename to code/elpa/elisp-refs-20230920.201/elisp-refs-pkg.el index 9884fba..88eab12 100644 --- a/code/elpa/elisp-refs-20230419.405/elisp-refs-pkg.el +++ b/code/elpa/elisp-refs-20230920.201/elisp-refs-pkg.el @@ -1,7 +1,7 @@ -(define-package "elisp-refs" "20230419.405" "find callers of elisp functions or macros" +(define-package "elisp-refs" "20230920.201" "find callers of elisp functions or macros" '((dash "2.12.0") (s "1.11.0")) - :commit "bf3cca8f74065b1b31036f461e3a093b162311bd" :authors + :commit "541a064c3ce27867872cf708354a65d83baf2a6d" :authors '(("Wilfred Hughes" . "me@wilfred.me.uk")) :maintainers '(("Wilfred Hughes" . "me@wilfred.me.uk")) diff --git a/code/elpa/elisp-refs-20230419.405/elisp-refs.el b/code/elpa/elisp-refs-20230920.201/elisp-refs.el similarity index 98% rename from code/elpa/elisp-refs-20230419.405/elisp-refs.el rename to code/elpa/elisp-refs-20230920.201/elisp-refs.el index ee6dafb..21b3546 100644 --- a/code/elpa/elisp-refs-20230419.405/elisp-refs.el +++ b/code/elpa/elisp-refs-20230920.201/elisp-refs.el @@ -398,6 +398,7 @@ visiting the same file." (file-name-handler-alist '(("\\(?:\\.dz\\|\\.txz\\|\\.xz\\|\\.lzma\\|\\.lz\\|\\.g?z\\|\\.\\(?:tgz\\|svgz\\|sifz\\)\\|\\.tbz2?\\|\\.bz2\\|\\.Z\\)\\(?:~\\|\\.~[-[:alnum:]:#@^._]+\\(?:~[[:digit:]]+\\)?~\\)?\\'" . jka-compr-handler) + ("\\(?:^/\\)\\(\\(?:\\(?:\\(-\\|[[:alnum:]]\\{2,\\}\\)\\(?::\\)\\(?:\\([^/:|[:blank:]]+\\)\\(?:@\\)\\)?\\(\\(?:[%._[:alnum:]-]+\\|\\(?:\\[\\)\\(?:\\(?:[[:alnum:]]*:\\)+[.[:alnum:]]*\\)?\\(?:]\\)\\)\\(?:\\(?:#\\)\\(?:[[:digit:]]+\\)\\)?\\)?\\)\\(?:|\\)\\)+\\)?\\(?:\\(-\\|[[:alnum:]]\\{2,\\}\\)\\(?::\\)\\(?:\\([^/:|[:blank:]]+\\)\\(?:@\\)\\)?\\(\\(?:[%._[:alnum:]-]+\\|\\(?:\\[\\)\\(?:\\(?:[[:alnum:]]*:\\)+[.[:alnum:]]*\\)?\\(?:]\\)\\)\\(?:\\(?:#\\)\\(?:[[:digit:]]+\\)\\)?\\)?\\)\\(?::\\)\\([^\n ]*\\'\\)" . tramp-file-name-handler) ("\\`/:" . file-name-non-special)))) (with-current-buffer fresh-buffer (setq-local elisp-refs--path path) @@ -813,7 +814,6 @@ search." (define-key map (kbd "") #'elisp-refs-prev-match) (define-key map (kbd "n") #'elisp-refs-next-match) (define-key map (kbd "p") #'elisp-refs-prev-match) - (define-key map (kbd "q") #'kill-this-buffer) (define-key map (kbd "RET") #'elisp-refs-visit-match) map) "Keymap for `elisp-refs-mode'.") diff --git a/code/elpa/f-20240308.906/f-autoloads.el b/code/elpa/f-20240308.906/f-autoloads.el new file mode 100644 index 0000000..9bba44f --- /dev/null +++ b/code/elpa/f-20240308.906/f-autoloads.el @@ -0,0 +1,28 @@ +;;; f-autoloads.el --- automatically extracted autoloads (do not edit) -*- lexical-binding: t -*- +;; Generated by the `loaddefs-generate' function. + +;; This file is part of GNU Emacs. + +;;; Code: + +(add-to-list 'load-path (or (and load-file-name (directory-file-name (file-name-directory load-file-name))) (car load-path))) + + + +;;; Generated autoloads from f.el + +(register-definition-prefixes "f" '("f-")) + +;;; End of scraped data + +(provide 'f-autoloads) + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; no-native-compile: t +;; coding: utf-8-emacs-unix +;; End: + +;;; f-autoloads.el ends here diff --git a/code/elpa/f-20240308.906/f-pkg.el b/code/elpa/f-20240308.906/f-pkg.el new file mode 100644 index 0000000..90dbbd7 --- /dev/null +++ b/code/elpa/f-20240308.906/f-pkg.el @@ -0,0 +1,16 @@ +(define-package "f" "20240308.906" "Modern API for working with files and directories" + '((emacs "24.1") + (s "1.7.0") + (dash "2.2.0")) + :commit "1e7020dc0d4c52d3da9bd610d431cab13aa02d8c" :authors + '(("Johan Andersson" . "johan.rejeep@gmail.com")) + :maintainers + '(("Lucien Cartier-Tilet" . "lucien@phundrak.com")) + :maintainer + '("Lucien Cartier-Tilet" . "lucien@phundrak.com") + :keywords + '("files" "directories") + :url "http://github.com/rejeep/f.el") +;; Local Variables: +;; no-byte-compile: t +;; End: diff --git a/code/elpa/f-20240308.906/f-shortdoc.el b/code/elpa/f-20240308.906/f-shortdoc.el new file mode 100644 index 0000000..f5c82b7 --- /dev/null +++ b/code/elpa/f-20240308.906/f-shortdoc.el @@ -0,0 +1,438 @@ +;;; f-shortdoc.el --- Shortdoc for f.el -*- lexical-binding: t; no-byte-compile: t; -*- + +;; Author: Lucien Cartier-Tilet +;; Maintainer: Lucien Cartier-Tilet +;; Version: 0.1.0 +;; Package-Requires: ((emacs "28.1")) +;; Homepage: https://github.com/rejeep/f.el + +;; This file is not part of GNU Emacs + +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + + +;;; Commentary: + +;; Shortdoc implementation for f.el + +;;; Code: + +(when (version<= "28.1" emacs-version) + (require 'shortdoc) + + (define-short-documentation-group f + "Paths" + (f-join + :eval (f-join "path") + :eval (f-join "path" "to") + :eval (f-join "/" "path" "to" "heaven") + :eval (f-join "path" "/to" "file")) + + (f-split + :eval (f-split "path") + :eval (f-split "path/to") + :eval (f-split "/path/to/heaven") + :eval (f-split "~/back/to/earth")) + + (f-expand + :no-eval (f-expand "name") + :result-string "/default/directory/name" + :no-eval (f-expand "name" "other/directory") + :result-string "other/directory/name") + + (f-filename + :eval (f-filename "path/to/file.ext") + :eval (f-filename "path/to/directory")) + + (f-dirname + :eval (f-dirname "path/to/file.ext") + :eval (f-dirname "path/to/directory") + :eval (f-dirname "/")) + + (f-common-parent + :eval (f-common-parent '("foo/bar/baz" "foo/bar/qux" "foo/bar/mux")) + :eval (f-common-parent '("/foo/bar/baz" "/foo/bar/qux" "/foo/bax/mux")) + :eval (f-common-parent '("foo/bar/baz" "quack/bar/qux" "lack/bar/mux"))) + + (f-ext + :eval (f-ext "path/to/file") + :eval (f-ext "path/to/file.txt") + :eval (f-ext "path/to/file.txt.org")) + + (f-no-ext + :eval (f-no-ext "path/to/file") + :eval (f-no-ext "path/to/file.txt") + :eval (f-no-ext "path/to/file.txt.org")) + + (f-swap-ext + :eval (f-swap-ext "path/to/file.ext" "org")) + + (f-base + :eval (f-base "path/to/file.ext") + :eval (f-base "path/to/directory")) + + (f-relative + :eval (f-relative "/some/path/relative/to/my/file.txt" "/some/path/") + :eval (f-relative "/default/directory/my/file.txt")) + + (f-short + :no-eval (f-short "/Users/foo/Code/on/macOS") + :result-string "~/Code/on/macOS" + :no-eval (f-short "/home/foo/Code/on/linux") + :result-string "~/Code/on/linux" + :eval (f-short "/path/to/Code/bar")) + + (f-long + :eval (f-long "~/Code/bar") + :eval (f-long "/path/to/Code/bar")) + + (f-canonical + :eval (f-canonical "/path/to/real/file") + :no-eval (f-canonical "/link/to/file") + :result-string "/path/to/real/file") + + (f-slash + :no-eval (f-slash "/path/to/file") + :result-string "/path/to/file" + :no-eval (f-slash "/path/to/dir") + :result-string "/path/to/dir/" + :no-eval (f-slash "/path/to/dir/") + :result-string "/path/to/dir/") + + (f-full + :eval (f-full "~/path/to/file") + :eval (f-full "~/path/to/dir") + :eval (f-full "~/path/to/dir/")) + + (f-uniquify + :eval (f-uniquify '("/foo/bar" "/foo/baz" "/foo/quux")) + :eval (f-uniquify '("/foo/bar" "/www/bar" "/foo/quux")) + :eval (f-uniquify '("/foo/bar" "/www/bar" "/www/bar/quux")) + :eval (f-uniquify '("/foo/bar" "/foo/baz" "/home/www/bar" "/home/www/baz" "/var/foo" "/opt/foo/www/baz"))) + + (f-uniquify-alist + :eval (f-uniquify-alist '("/foo/bar" "/foo/baz" "/foo/quux")) + :eval (f-uniquify-alist '("/foo/bar" "/www/bar" "/foo/quux")) + :eval (f-uniquify-alist '("/foo/bar" "/www/bar" "/www/bar/quux")) + :eval (f-uniquify-alist '("/foo/bar" "/foo/baz" "/home/www/bar" "/home/www/baz" "/var/foo" "/opt/foo/www/baz"))) + + "I/O" + (f-read-bytes + :no-eval* (f-read-bytes "path/to/binary/data")) + + (f-write-bytes + :no-eval* (f-write-bytes (unibyte-string 72 101 108 108 111 32 119 111 114 108 100) "path/to/binary/data")) + + (f-append-bytes + :no-eval* (f-append-bytes "path/to/file" (unibyte-string 72 101 108 108 111 32 119 111 114 108 100))) + + (f-read-text + :no-eval* (f-read-text "path/to/file.txt" 'utf-8) + :no-eval* (f-read "path/to/file.txt" 'utf-8)) + + (f-write-text + :no-eval* (f-write-text "Hello world" 'utf-8 "path/to/file.txt") + :no-eval* (f-write "Hello world" 'utf-8 "path/to/file.txt")) + + (f-append-text + :no-eval* (f-append-text "Hello world" 'utf-8 "path/to/file.txt") + :no-eval* (f-append "Hello world" 'utf-8 "path/to/file.txt")) + + "Destructive" + (f-mkdir + :no-eval (f-mkdir "dir") + :result-string "creates /default/directory/dir" + :no-eval (f-mkdir "other" "dir") + :result-string "creates /default/directory/other/dir" + :no-eval (f-mkdir "/" "some" "path") + :result-string "creates /some/path" + :no-eval (f-mkdir "~" "yet" "another" "dir") + :result-string "creates ~/yet/another/dir") + + (f-mkdir-full-path + :no-eval (f-mkdir-full-path "dir") + :result-string "creates /default/directory/dir" + :no-eval (f-mkdir-full-path "other/dir") + :result-string "creates /default/directory/other/dir" + :no-eval (f-mkdir-full-path "/some/path") + :result-string "creates /some/path" + :no-eval (f-mkdir-full-path "~/yet/another/dir") + :result-string "creates ~/yet/another/dir") + + (f-delete + :no-eval* (f-delete "dir") + :no-eval* (f-delete "other/dir" t) + :no-eval* (f-delete "path/to/file.txt")) + + (f-symlink + :no-eval* (f-symlink "path/to/source" "path/to/link")) + + (f-move + :no-eval* (f-move "path/to/file.txt" "new-file.txt") + :no-eval* (f-move "path/to/file.txt" "other/path")) + + (f-copy + :no-eval* (f-copy "path/to/file.txt" "new-file.txt") + :no-eval* (f-copy "path/to/dir" "other/dir")) + + (f-copy-contents + :no-eval* (f-copy-contents "path/to/dir" "path/to/other/dir")) + + (f-touch + :no-eval* (f-touch "path/to/existing/file.txt") + :no-eval* (f-touch "path/to/non/existing/file.txt")) + + "Predicates" + (f-exists-p + :no-eval* (f-exists-p "path/to/file.txt") + :no-eval* (f-exists-p "path/to/dir")) + + (f-directory-p + :no-eval* (f-directory-p "path/to/file.txt") + :no-eval* (f-directory-p "path/to/dir")) + + (f-file-p + :no-eval* (f-file-p "path/to/file.txt") + :no-eval* (f-file-p "path/to/dir")) + + (f-symlink-p + :no-eval* (f-symlink-p "path/to/file.txt") + :no-eval* (f-symlink-p "path/to/dir") + :no-eval* (f-symlink-p "path/to/link")) + + (f-readable-p + :no-eval* (f-readable-p "path/to/file.txt") + :no-eval* (f-readable-p "path/to/dir")) + + (f-writable-p + :no-eval* (f-writable-p "path/to/file.txt") + :no-eval* (f-writable-p "path/to/dir")) + + (f-executable-p + :no-eval* (f-executable-p "path/to/file.txt") + :no-eval* (f-executable-p "path/to/dir")) + + (f-absolute-p + :eval (f-absolute-p "path/to/dir") + :eval (f-absolute-p "/full/path/to/dir")) + + (f-relative-p + :eval (f-relative-p "path/to/dir") + :eval (f-relative-p "/full/path/to/dir")) + + (f-root-p + :eval (f-root-p "/") + :eval (f-root-p "/not/root")) + + (f-ext-p + :eval (f-ext-p "path/to/file.el" "el") + :eval (f-ext-p "path/to/file.el" "txt") + :eval (f-ext-p "path/to/file.el") + :eval (f-ext-p "path/to/file")) + + (f-same-p + :eval (f-same-p "foo.txt" "foo.txt") + :eval (f-same-p "foo/bar/../baz" "foo/baz") + :eval (f-same-p "/path/to/foo.txt" "/path/to/bar.txt")) + + (f-parent-of-p + :no-eval (f-parent-of-p "/path/to" "/path/to/dir") + :result t + :no-eval (f-parent-of-p "/path/to/dir" "/path/to") + :result nil + :no-eval (f-parent-of-p "/path/to" "/path/to") + :result nil) + + (f-child-of-p + :no-eval (f-child-of-p "/path/to" "/path/to/dir") + :result nil + :no-eval (f-child-of-p "/path/to/dir" "/path/to") + :result t + :no-eval (f-child-of-p "/path/to" "/path/to") + :result nil) + + (f-ancestor-of-p + :no-eval (f-ancestor-of-p "/path/to" "/path/to/dir") + :result t + :no-eval (f-ancestor-of-p "/path" "/path/to/dir") + :result t + :no-eval (f-ancestor-of-p "/path/to/dir" "/path/to") + :result nil + :no-eval (f-ancestor-of-p "/path/to" "/path/to") + :result nil) + + (f-descendant-of-p + :no-eval (f-descendant-of-p "/path/to/dir" "/path/to") + :result t + :no-eval (f-descendant-of-p "/path/to/dir" "/path") + :result t + :no-eval (f-descendant-of-p "/path/to" "/path/to/dir") + :result nil + :no-eval (f-descendant-of-p "/path/to" "/path/to") + :result nil) + + (f-hidden-p + :eval (f-hidden-p "path/to/foo") + :eval (f-hidden-p ".path/to/foo") + :eval (f-hidden-p "path/.to/foo") + :eval (f-hidden-p "path/to/.foo") + :eval (f-hidden-p ".path/to/foo" 'any) + :eval (f-hidden-p "path/.to/foo" 'any) + :eval (f-hidden-p "path/to/.foo" 'any) + :eval (f-hidden-p ".path/to/foo" 'last) + :eval (f-hidden-p "path/.to/foo" 'last) + :eval (f-hidden-p "path/to/.foo" 'last)) + + (f-empty-p + :no-eval (f-empty-p "/path/to/empty-file") + :result t + :no-eval (f-empty-p "/path/to/file-with-contents") + :result nil + :no-eval (f-empty-p "/path/to/empty-dir/") + :result t + :no-eval (f-empty-p "/path/to/dir-with-contents/") + :result nil) + + (f-older-p + :no-eval (f-older-p "older-file.txt" "newer-file.txt") + :result t + :no-eval (f-older-p "newer-file.txt" "older-file.txt") + :result nil + :no-eval (f-older-p "same-time1.txt" "same-time2.txt") + :result nil) + + (f-newer-p + :no-eval (f-newer-p "newer-file.txt" "older-file.txt") + :result t + :no-eval (f-newer-p "older-file.txt" "newer-file.txt") + :result nil + :no-eval (f-newer-p "same-time1.txt" "same-time2.txt") + :result nil) + + (f-same-time-p + :no-eval (f-same-time-p "same-time1.txt" "same-time2.txt") + :result t + :no-eval (f-same-time-p "newer-file.txt" "older-file.txt") + :result nil + :no-eval (f-same-time-p "older-file.txt" "newer-file.txt") + :result nil) + + "Stats" + (f-size + :no-eval* (f-size "path/to/file.txt") + :no-eval* (f-size "path/to/dir")) + + (f-depth + :eval (f-depth "/") + :eval (f-depth "/var/") + :eval (f-depth "/usr/local/bin")) + + (f-change-time + :no-eval (f-change-time "path/to/file.txt") + :result (25517 48756 26337 111000) + :no-eval (f-change-time "path/to/dir") + :result (25517 57887 344657 210000) + :no-eval (f-change-time "path/to/file.txt" t) + :result (1672330868026337111 . 1000000000) + :no-eval (f-change-time "path/to/dir" t) + :result (1672339999344657210 . 1000000000) + :no-eval (f-change-time "path/to/file.txt" 'seconds) + :result 1672330868 + :no-eval (f-change-time "path/to/dir" 'seconds) + :result 1672339999) + + (f-modification-time + :no-eval (f-modification-time "path/to/file.txt") + :result (25517 48756 26337 111000) + :no-eval (f-modification-time "path/to/dir") + :result (25517 57887 344657 210000) + :no-eval (f-modification-time "path/to/file.txt" t) + :result (1672330868026337111 . 1000000000) + :no-eval (f-modification-time "path/to/dir" t) + :result (1672339999344657210 . 1000000000) + :no-eval (f-modification-time "path/to/file.txt" 'seconds) + :result 1672330868 + :no-eval (f-modification-time "path/to/dir" 'seconds) + :result 1672339999) + + (f-access-time + :no-eval (f-access-time "path/to/file.txt") + :result (25517 48756 26337 111000) + :no-eval (f-access-time "path/to/dir") + :result (25517 57887 344657 210000) + :no-eval (f-access-time "path/to/file.txt" t) + :result (1672330868026337111 . 1000000000) + :no-eval (f-access-time "path/to/dir" t) + :result (1672339999344657210 . 1000000000) + :no-eval (f-access-time "path/to/file.txt" 'seconds) + :result 1672330868 + :no-eval (f-access-time "path/to/dir" 'seconds) + :result 1672339999) + + "Misc" + (f-this-file + :no-eval* (f-this-file)) + + (f-path-separator + :eval (f-path-separator)) + + (f-glob + :no-eval* (f-glob "path/to/*.el") + :no-eval* (f-glob "*.el" "path/to")) + + (f-entries + :no-eval* (f-entries "path/to/dir") + :no-eval* (f-entries "path/to/dir" (lambda (file) (s-matches? "test" file))) + :no-eval* (f-entries "path/to/dir" nil t) + :no-eval* (f--entries "path/to/dir" (s-matches? "test" it))) + + (f-directories + :no-eval* (f-directories "path/to/dir") + :no-eval* (f-directories "path/to/dir" (lambda (dir) (equal (f-filename dir) "test"))) + :no-eval* (f-directories "path/to/dir" nil t) + :no-eval* (f--directories "path/to/dir" (equal (f-filename it) "test"))) + + (f-files + :no-eval* (f-files "path/to/dir") + :no-eval* (f-files "path/to/dir" (lambda (file) (equal (f-ext file) "el"))) + :no-eval* (f-files "path/to/dir" nil t) + :no-eval* (f--files "path/to/dir" (equal (f-ext it) "el"))) + + (f-root + :eval (f-root)) + + (f-traverse-upwards + :no-eval* (f-traverse-upwards + (lambda (path) + (f-exists? (f-expand ".git" path))) + start-path) + + :no-eval* (f--traverse-upwards (f-exists? (f-expand ".git" it)) start-path)) + + (f-with-sandbox + :no-eval (f-with-sandbox foo-path + (f-touch (f-expand "foo" foo-path))) + :no-eval (f-with-sandbox (list foo-path bar-path) + (f-touch (f-expand "foo" foo-path)) + (f-touch (f-expand "bar" bar-path))) + :no-eval (f-with-sandbox foo-path + (f-touch (f-expand "bar" bar-path)))))) ;; "Destructive operation outside sandbox" + +(eval-when-compile + (when (version< emacs-version "28.1") + (warn "Emacs should not be compiling this file"))) + +(provide 'f-shortdoc) + +;;; f-shortdoc.el ends here diff --git a/code/elpa/f-20240308.906/f.el b/code/elpa/f-20240308.906/f.el new file mode 100644 index 0000000..dd50b86 --- /dev/null +++ b/code/elpa/f-20240308.906/f.el @@ -0,0 +1,799 @@ +;;; f.el --- Modern API for working with files and directories -*- lexical-binding: t; -*- + +;; Copyright (C) 2013 Johan Andersson + +;; Author: Johan Andersson +;; Maintainer: Lucien Cartier-Tilet +;; Version: 0.20.0 +;; Package-Requires: ((emacs "24.1") (s "1.7.0") (dash "2.2.0")) +;; Keywords: files, directories +;; Homepage: http://github.com/rejeep/f.el + +;; This file is NOT part of GNU Emacs. + +;;; License: + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3, or (at your option) +;; any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. + +;;; Commentary: +;; +;; Much inspired by magnar's excellent s.el and dash.el, f.el is a +;; modern API for working with files and directories in Emacs. + +;;; Code: + + + +(require 's) +(require 'dash) +(when (version<= "28.1" emacs-version) + (when (< emacs-major-version 29) + (require 'f-shortdoc nil t))) + +(put 'f-guard-error 'error-conditions '(error f-guard-error)) +(put 'f-guard-error 'error-message "Destructive operation outside sandbox") + +(defvar f--guard-paths nil + "List of allowed paths to modify when guarded. + +Do not modify this variable.") + +(defmacro f--destructive (path &rest body) + "If PATH is allowed to be modified, yield BODY. + +If PATH is not allowed to be modified, throw error." + (declare (indent 1)) + `(if f--guard-paths + (if (--any? (or (f-same-p it ,path) + (f-ancestor-of-p it ,path)) f--guard-paths) + (progn ,@body) + (signal 'f-guard-error (list ,path f--guard-paths))) + ,@body)) + + +;;;; Paths + +(defun f-join (&rest args) + "Join ARGS to a single path. + +Be aware if one of the arguments is an absolute path, `f-join' +will discard all the preceeding arguments and make this absolute +path the new root of the generated path." + (let (path + (relative (f-relative-p (car args)))) + (mapc + (lambda (arg) + (setq path (cond ((not path) arg) + ((f-absolute-p arg) + (progn + (setq relative nil) + arg)) + (t (f-expand arg path))))) + args) + (if relative (f-relative path) path))) + +(defun f-split (path) + "Split PATH and return list containing parts." + (let ((parts (split-string path (f-path-separator) 'omit-nulls))) + (if (string= (s-left 1 path) (f-path-separator)) + (push (f-path-separator) parts) + parts))) + +(defun f-expand (path &optional dir) + "Expand PATH relative to DIR (or `default-directory'). +PATH and DIR can be either a directory names or directory file +names. Return a directory name if PATH is a directory name, and +a directory file name otherwise. File name handlers are +ignored." + (let (file-name-handler-alist) + (expand-file-name path dir))) + +(defun f-filename (path) + "Return the name of PATH." + (file-name-nondirectory (directory-file-name path))) + +(defalias 'f-parent 'f-dirname) + +(defun f-dirname (path) + "Return the parent directory to PATH." + (let ((parent (file-name-directory + (directory-file-name (f-expand path default-directory))))) + (unless (f-same-p path parent) + (if (f-relative-p path) + (f-relative parent) + (directory-file-name parent))))) + +(defun f-common-parent (paths) + "Return the deepest common parent directory of PATHS." + (cond + ((not paths) nil) + ((not (cdr paths)) (f-parent (car paths))) + (:otherwise + (let* ((paths (-map 'f-split paths)) + (common (caar paths)) + (re nil)) + (while (and (not (null (car paths))) (--all? (equal (car it) common) paths)) + (setq paths (-map 'cdr paths)) + (push common re) + (setq common (caar paths))) + (cond + ((null re) "") + ((and (= (length re) 1) (f-root-p (car re))) + (f-root)) + (:otherwise + (concat (apply 'f-join (nreverse re)) "/"))))))) + +(defalias 'f-ext 'file-name-extension) + +(defalias 'f-no-ext 'file-name-sans-extension) + +(defun f-swap-ext (path ext) + "Return PATH but with EXT as the new extension. +EXT must not be nil or empty." + (if (s-blank-p ext) + (error "Extension cannot be empty or nil") + (concat (f-no-ext path) "." ext))) + +(defun f-base (path) + "Return the name of PATH, excluding the extension of file." + (f-no-ext (f-filename path))) + +(defalias 'f-relative 'file-relative-name) + +(defalias 'f-short 'abbreviate-file-name) +(defalias 'f-abbrev 'abbreviate-file-name) + +(defun f-long (path) + "Return long version of PATH." + (f-expand path)) + +(defalias 'f-canonical 'file-truename) + +(defun f-slash (path) + "Append slash to PATH unless one already. + +Some functions, such as `call-process' requires there to be an +ending slash." + (if (f-dir-p path) + (file-name-as-directory path) + path)) + +(defun f-full (path) + "Return absolute path to PATH, with ending slash." + (f-slash (f-long path))) + +(defun f--uniquify (paths) + "Helper for `f-uniquify' and `f-uniquify-alist'." + (let* ((files-length (length paths)) + (uniq-filenames (--map (cons it (f-filename it)) paths)) + (uniq-filenames-next (-group-by 'cdr uniq-filenames))) + (while (/= files-length (length uniq-filenames-next)) + (setq uniq-filenames-next + (-group-by 'cdr + (--mapcat + (let ((conf-files (cdr it))) + (if (> (length conf-files) 1) + (--map (cons + (car it) + (concat + (f-filename (s-chop-suffix (cdr it) + (car it))) + (f-path-separator) (cdr it))) + conf-files) + conf-files)) + uniq-filenames-next)))) + uniq-filenames-next)) + +(defun f-uniquify (files) + "Return unique suffixes of FILES. + +This function expects no duplicate paths." + (-map 'car (f--uniquify files))) + +(defun f-uniquify-alist (files) + "Return alist mapping FILES to unique suffixes of FILES. + +This function expects no duplicate paths." + (-map 'cadr (f--uniquify files))) + + +;;;; I/O + +(defun f-read-bytes (path &optional beg end) + "Read binary data from PATH. + +Return the binary data as unibyte string. The optional second +and third arguments BEG and END specify what portion of the file +to read." + (with-temp-buffer + (set-buffer-multibyte nil) + (setq buffer-file-coding-system 'binary) + (insert-file-contents-literally path nil beg end) + (buffer-substring-no-properties (point-min) (point-max)))) + +(defalias 'f-read 'f-read-text) +(defun f-read-text (path &optional coding) + "Read text with PATH, using CODING. + +CODING defaults to `utf-8'. + +Return the decoded text as multibyte string." + (decode-coding-string (f-read-bytes path) (or coding 'utf-8))) + +(defalias 'f-write 'f-write-text) +(defun f-write-text (text coding path) + "Write TEXT with CODING to PATH. + +TEXT is a multibyte string. CODING is a coding system to encode +TEXT with. PATH is a file name to write to." + (f-write-bytes (encode-coding-string text coding) path)) + +(defun f-unibyte-string-p (s) + "Determine whether S is a unibyte string." + (not (multibyte-string-p s))) + +(defun f-write-bytes (data path) + "Write binary DATA to PATH. + +DATA is a unibyte string. PATH is a file name to write to." + (f--write-bytes data path nil)) + +(defalias 'f-append 'f-append-text) +(defun f-append-text (text coding path) + "Append TEXT with CODING to PATH. + +If PATH does not exist, it is created." + (f-append-bytes (encode-coding-string text coding) path)) + +(defun f-append-bytes (data path) + "Append binary DATA to PATH. + +If PATH does not exist, it is created." + (f--write-bytes data path :append)) + +(defun f--write-bytes (data filename append) + "Write binary DATA to FILENAME. +If APPEND is non-nil, append the DATA to the existing contents." + (f--destructive filename + (unless (f-unibyte-string-p data) + (signal 'wrong-type-argument (list 'f-unibyte-string-p data))) + (let ((coding-system-for-write 'binary) + (write-region-annotate-functions nil) + (write-region-post-annotation-function nil)) + (write-region data nil filename append :silent) + nil))) + + +;;;; Destructive + +(defun f-mkdir (&rest dirs) + "Create directories DIRS. + +DIRS should be a successive list of directories forming together +a full path. The easiest way to call this function with a fully +formed path is using `f-split' alongside it: + + (apply #\\='f-mkdir (f-split \"path/to/file\")) + +Although it works sometimes, it is not recommended to use fully +formed paths in the function. In this case, it is recommended to +use `f-mkdir-full-path' instead." + (let (path) + (-each + dirs + (lambda (dir) + (setq path (f-expand dir path)) + (unless (f-directory-p path) + (f--destructive path (make-directory path))))))) + +(defun f-mkdir-full-path (dir) + "Create DIR from a full path. + +This function is similar to `f-mkdir' except it can accept a full +path instead of requiring several successive directory names." + (apply #'f-mkdir (f-split dir))) + +(defun f-delete (path &optional force) + "Delete PATH, which can be file or directory. + +If FORCE is t, a directory will be deleted recursively." + (f--destructive path + (if (or (f-file-p path) (f-symlink-p path)) + (delete-file path) + (delete-directory path force)))) + +(defun f-symlink (source path) + "Create a symlink to SOURCE from PATH." + (f--destructive path (make-symbolic-link source path))) + +(defun f-move (from to) + "Move or rename FROM to TO. +If TO is a directory name, move FROM into TO." + (f--destructive to (rename-file from to t))) + +(defun f-copy (from to) + "Copy file or directory FROM to TO. +If FROM names a directory and TO is a directory name, copy FROM +into TO as a subdirectory." + (f--destructive to + (if (f-file-p from) + (copy-file from to) + ;; The behavior of `copy-directory' differs between Emacs 23 and + ;; 24 in that in Emacs 23, the contents of `from' is copied to + ;; `to', while in Emacs 24 the directory `from' is copied to + ;; `to'. We want the Emacs 24 behavior. + (if (> emacs-major-version 23) + (copy-directory from to) + (if (f-dir-p to) + (progn + (apply 'f-mkdir (f-split to)) + (let ((new-to (f-expand (f-filename from) to))) + (copy-directory from new-to))) + (copy-directory from to)))))) + +(defun f-copy-contents (from to) + "Copy contents in directory FROM, to directory TO." + (unless (f-exists-p to) + (error "Cannot copy contents to non existing directory %s" to)) + (unless (f-dir-p from) + (error "Cannot copy contents as %s is a file" from)) + (--each (f-entries from) + (f-copy it (file-name-as-directory to)))) + +(defun f-touch (path) + "Update PATH last modification date or create if it does not exist." + (f--destructive path + (if (f-file-p path) + (set-file-times path) + (f-write-bytes "" path)))) + + +;;;; Predicates + +(defalias 'f-exists-p 'file-exists-p) +(defalias 'f-exists? 'file-exists-p) + +(defalias 'f-directory-p 'file-directory-p) +(defalias 'f-directory? 'file-directory-p) +(defalias 'f-dir-p 'file-directory-p) +(defalias 'f-dir? 'file-directory-p) + + +(defalias 'f-file-p 'file-regular-p) +(defalias 'f-file? 'file-regular-p) + +(defun f-symlink-p (path) + "Return t if PATH is symlink, false otherwise." + (not (not (file-symlink-p path)))) + +(defalias 'f-symlink? 'f-symlink-p) + +(defalias 'f-readable-p 'file-readable-p) +(defalias 'f-readable? 'file-readable-p) + +(defalias 'f-writable-p 'file-writable-p) +(defalias 'f-writable? 'file-writable-p) + +(defalias 'f-executable-p 'file-executable-p) +(defalias 'f-executable? 'file-executable-p) + +(defalias 'f-absolute-p 'file-name-absolute-p) +(defalias 'f-absolute? 'file-name-absolute-p) + +(defun f-relative-p (path) + "Return t if PATH is relative, false otherwise." + (not (f-absolute-p path))) + +(defalias 'f-relative? 'f-relative-p) + +(defun f-root-p (path) + "Return t if PATH is root directory, false otherwise." + (not (f-parent path))) + +(defalias 'f-root? 'f-root-p) + +(defun f-ext-p (path &optional ext) + "Return t if extension of PATH is EXT, false otherwise. + +If EXT is nil or omitted, return t if PATH has any extension, +false otherwise. + +The extension, in a file name, is the part that follows the last +'.', excluding version numbers and backup suffixes." + (if ext + (string= (f-ext path) ext) + (not (eq (f-ext path) nil)))) + +(defalias 'f-ext? 'f-ext-p) + +(defalias 'f-equal-p 'f-same-p) +(defalias 'f-equal? 'f-same-p) + +(defun f-same-p (path-a path-b) + "Return t if PATH-A and PATH-B are references to same file." + (equal + (f-canonical (directory-file-name (f-expand path-a))) + (f-canonical (directory-file-name (f-expand path-b))))) + +(defalias 'f-same? 'f-same-p) + +(defun f-parent-of-p (path-a path-b) + "Return t if PATH-A is parent of PATH-B." + (--when-let (f-parent path-b) + (f-same-p path-a it))) + +(defalias 'f-parent-of? 'f-parent-of-p) + +(defun f-child-of-p (path-a path-b) + "Return t if PATH-A is child of PATH-B." + (--when-let (f-parent path-a) + (f-same-p it path-b))) + +(defalias 'f-child-of? 'f-child-of-p) + +(defun f-ancestor-of-p (path-a path-b) + "Return t if PATH-A is ancestor of PATH-B." + (unless (f-same-p path-a path-b) + (string-prefix-p (f-full path-a) + (f-full path-b)))) + +(defalias 'f-ancestor-of? 'f-ancestor-of-p) + +(defun f-descendant-of-p (path-a path-b) + "Return t if PATH-A is desendant of PATH-B." + (unless (f-same-p path-a path-b) + (let ((path-a (f-split (f-full path-a))) + (path-b (f-split (f-full path-b))) + (parent-p t)) + (while (and path-b parent-p) + (if (string= (car path-a) (car path-b)) + (setq path-a (cdr path-a) + path-b (cdr path-b)) + (setq parent-p nil))) + parent-p))) + +(defalias 'f-descendant-of? 'f-descendant-of-p) + +(defun f-hidden-p (path &optional behavior) + "Return t if PATH is hidden, nil otherwise. + +BEHAVIOR controls when a path should be considered as hidden +depending on its value. Beware, if PATH begins with \"./\", the +current dir \".\" will not be considered as hidden. + +When BEHAVIOR is nil, it will only check if the path begins with +a dot, as in .a/b/c, and return t if there is one. This is the +old behavior of f.el left as default for backward-compatibility +purposes. + +When BEHAVIOR is ANY, return t if any of the elements of PATH is +hidden, nil otherwise. + +When BEHAVIOR is LAST, return t only if the last element of PATH +is hidden, nil otherwise. + +TODO: Hidden directories and files on Windows are marked +differently than on *NIX systems. This should be properly +implemented." + (let ((split-path (f-split path)) + (check-hidden (lambda (elt) + (and (string= (substring elt 0 1) ".") + (not (member elt '("." ".."))))))) + (pcase behavior + ('any (-any check-hidden split-path)) + ('last (apply check-hidden (last split-path))) + (otherwise (if (null otherwise) + (funcall check-hidden (car split-path)) + (error "Invalid value %S for argument BEHAVIOR" otherwise)))))) + +(defalias 'f-hidden? 'f-hidden-p) + +(defun f-empty-p (path) + "If PATH is a file, return t if the file in PATH is empty, nil otherwise. +If PATH is directory, return t if directory has no files, nil otherwise." + (if (f-directory-p path) + (equal (f-files path nil t) nil) + (= (f-size path) 0))) + +(defalias 'f-empty? 'f-empty-p) + + +;;;; Stats + +(defun f-size (path) + "Return size of PATH. + +If PATH is a file, return size of that file. If PATH is +directory, return sum of all files in PATH." + (if (f-directory-p path) + (-sum (-map 'f-size (f-files path nil t))) + (nth 7 (file-attributes path)))) + +(defun f-depth (path) + "Return the depth of PATH. + +At first, PATH is expanded with `f-expand'. Then the full path is used to +detect the depth. +'/' will be zero depth, '/usr' will be one depth. And so on." + (- (length (f-split (f-expand path))) 1)) + +;; For Emacs 28 and below, forward-declare ‘current-time-list’, which was +;; introduced in Emacs 29. +(defvar current-time-list) + +(defun f--get-time (path timestamp-p fn) + "Helper function, get time-related information for PATH. +Helper for `f-change-time', `f-modification-time', +`f-access-time'. It is meant to be called internally, avoid +calling it manually unless you have to. + +If TIMESTAMP-P is non-nil, return the date requested as a +timestamp. If the value is \\='seconds, return the timestamp as +a timestamp with a one-second precision. Otherwise, the +timestamp is returned in a (TICKS . HZ) format, see +`current-time' if using Emacs 29 or newer. + +Otherwise, if TIMESTAMP-P is nil, return the default style of +`current-time'. + +FN is the function specified by the caller function to retrieve +the correct data from PATH." + (let* ((current-time-list (not timestamp-p)) + (date (apply fn (list (file-attributes path)))) + (emacs29-or-newer-p (version<= "29" emacs-version))) + (cond + ((and (eq timestamp-p 'seconds) emacs29-or-newer-p) + (/ (car date) (cdr date))) + ((or (and (not (eq timestamp-p 'seconds)) emacs29-or-newer-p) + (and (not timestamp-p) (not emacs29-or-newer-p))) + date) + ((and (eq timestamp-p 'seconds) (not emacs29-or-newer-p)) + (+ (* (nth 0 date) (expt 2 16)) + (nth 1 date))) + ((and timestamp-p (not emacs29-or-newer-p)) + `(,(+ (* (nth 0 date) (expt 2 16) 1000) + (* (nth 1 date) 1000) + (nth 3 date)) + . 1000))))) + +(defun f-change-time (path &optional timestamp-p) + "Return the last status change time of PATH. + +The status change time (ctime) of PATH in the same format as +`current-time'. For details on TIMESTAMP-P and the format of the +returned value, see `f--get-time'." + (f--get-time path + timestamp-p + (if (fboundp 'file-attribute-status-change-time) + #'file-attribute-status-change-time + (lambda (f) (nth 6 f))))) + +(defun f-modification-time (path &optional timestamp-p) + "Return the last modification time of PATH. +The modification time (mtime) of PATH in the same format as +`current-time'. For details on TIMESTAMP-P and the format of the +returned value, see `f--get-time'." + (f--get-time path + timestamp-p + (if (fboundp 'file-attribute-modification-time) + #'file-attribute-modification-time + (lambda (f) (nth 5 f))))) + +(defun f-access-time (path &optional timestamp-p) + "Return the last access time of PATH. +The access time (atime) of PATH is in the same format as +`current-time'. For details on TIMESTAMP-P and the format of the +returned value, see `f--get-time'." + (f--get-time path + timestamp-p + (if (fboundp 'file-attribute-access-time) + #'file-attribute-access-time + (lambda (f) (nth 4 f))))) + +(defun f--three-way-compare (a b) + "Three way comparison. + +Return -1 if A < B. +Return 0 if A = B. +Return 1 if A > B." + (cond ((< a b) -1) + ((= a b) 0) + ((> a b) 1))) + +;; TODO: How to properly test this function? +(defun f--date-compare (file other method) + "Three-way comparison of the date of FILE and OTHER. + +This function can return three values: +* 1 means FILE is newer than OTHER +* 0 means FILE and NEWER share the same date +* -1 means FILE is older than OTHER + +The statistics used for the date comparison depends on METHOD. +When METHOD is null, compare their modification time. Otherwise, +compare their change time when METHOD is \\='change, or compare +their last access time when METHOD is \\='access." + (let* ((fn-method (cond + ((eq 'change method) #'f-change-time) + ((eq 'access method) #'f-access-time) + ((null method) #'f-modification-time) + (t (error "Unknown method %S" method)))) + (date-file (apply fn-method (list file))) + (date-other (apply fn-method (list other))) + (dates (-zip-pair date-file date-other))) + (-reduce-from (lambda (acc elt) + (if (= acc 0) + (f--three-way-compare (car elt) (cdr elt)) + acc)) + 0 + dates))) + +(defun f-older-p (file other &optional method) + "Compare if FILE is older than OTHER. + +For more info on METHOD, see `f--date-compare'." + (< (f--date-compare file other method) 0)) + +(defalias 'f-older? #'f-older-p) + +(defun f-newer-p (file other &optional method) + "Compare if FILE is newer than OTHER. + +For more info on METHOD, see `f--date-compare'." + (> (f--date-compare file other method) 0)) + +(defalias 'f-newer? #'f-newer-p) + +(defun f-same-time-p (file other &optional method) + "Check if FILE and OTHER share the same access or modification time. + +For more info on METHOD, see `f--date-compare'." + (= (f--date-compare file other method) 0)) + +(defalias 'f-same-time? #'f-same-time-p) + + +;;;; Misc + +(defun f-this-file () + "Return path to this file." + (cond + (load-in-progress load-file-name) + ((and (boundp 'byte-compile-current-file) byte-compile-current-file) + byte-compile-current-file) + (:else (buffer-file-name)))) + +(defvar f--path-separator nil + "A variable to cache result of `f-path-separator'.") + +(defun f-path-separator () + "Return path separator." + (or f--path-separator + (setq f--path-separator (substring (f-join "x" "y") 1 2)))) + +(defun f-glob (pattern &optional path) + "Find PATTERN in PATH." + (file-expand-wildcards + (f-join (or path default-directory) pattern))) + +(defun f--collect-entries (path recursive) + (let (result + (entries + (-reject + (lambda (file) + (member (f-filename file) '("." ".."))) + (directory-files path t)))) + (cond (recursive + (mapc + (lambda (entry) + (if (f-file-p entry) + (setq result (cons entry result)) + (when (f-directory-p entry) + (setq result (cons entry result)) + (if (f-readable-p entry) + (setq result (append result (f--collect-entries entry recursive))) + result)))) + entries)) + (t (setq result entries))) + result)) + +(defmacro f--entries (path body &optional recursive) + "Anaphoric version of `f-entries'." + `(f-entries + ,path + (lambda (path) + (let ((it path)) + ,body)) + ,recursive)) + +(defun f-entries (path &optional fn recursive) + "Find all files and directories in PATH. + +FN - called for each found file and directory. If FN returns a thruthy +value, file or directory will be included. +RECURSIVE - Search for files and directories recursive." + (let ((entries (f--collect-entries path recursive))) + (if fn (-select fn entries) entries))) + +(defmacro f--directories (path body &optional recursive) + "Anaphoric version of `f-directories'." + `(f-directories + ,path + (lambda (path) + (let ((it path)) + ,body)) + ,recursive)) + +(defun f-directories (path &optional fn recursive) + "Find all directories in PATH. See `f-entries'." + (let ((directories (-select 'f-directory-p (f--collect-entries path recursive)))) + (if fn (-select fn directories) directories))) + +(defmacro f--files (path body &optional recursive) + "Anaphoric version of `f-files'." + `(f-files + ,path + (lambda (path) + (let ((it path)) + ,body)) + ,recursive)) + +(defun f-files (path &optional fn recursive) + "Find all files in PATH. See `f-entries'." + (let ((files (-select 'f-file-p (f--collect-entries path recursive)))) + (if fn (-select fn files) files))) + +(defmacro f--traverse-upwards (body &optional path) + "Anaphoric version of `f-traverse-upwards'." + `(f-traverse-upwards + (lambda (dir) + (let ((it dir)) + ,body)) + ,path)) + +(defun f-traverse-upwards (fn &optional path) + "Traverse up as long as FN return nil, starting at PATH. + +If FN returns a non-nil value, the path sent as argument to FN is +returned. If no function callback return a non-nil value, nil is +returned." + (unless path + (setq path default-directory)) + (when (f-relative-p path) + (setq path (f-expand path))) + (if (funcall fn path) + path + (unless (f-root-p path) + (f-traverse-upwards fn (f-parent path))))) + +(defun f-root () + "Return absolute root." + (f-traverse-upwards 'f-root-p)) + +(defmacro f-with-sandbox (path-or-paths &rest body) + "Only allow PATH-OR-PATHS and descendants to be modified in BODY." + (declare (indent 1)) + `(let ((paths (if (listp ,path-or-paths) + ,path-or-paths + (list ,path-or-paths)))) + (unwind-protect + (let ((f--guard-paths paths)) + ,@body) + (setq f--guard-paths nil)))) + +(provide 'f) + +;;; f.el ends here diff --git a/code/elpa/helm-20240320.541/.dir-locals.el b/code/elpa/helm-20240320.541/.dir-locals.el new file mode 100644 index 0000000..ded5c00 --- /dev/null +++ b/code/elpa/helm-20240320.541/.dir-locals.el @@ -0,0 +1,9 @@ +;;; Directory Local Variables +;;; For more information see (info "(emacs) Directory Variables") + +((nil . ((bug-reference-bug-regexp . "\\(\\b\\(?:[Ii]ssue ?#?\\|[Bb]ug ?#?\\|[Pp]atch ?#\\|RFE ?#\\|PR [a-z+-]+/\\)\\([0-9]+\\(?:#[0-9]+\\)?\\)\\)") + (bug-reference-url-format . "https://github.com/emacs-helm/helm/issues/%s") + (byte-compile-warnings . (not obsolete docstrings docstrings-non-ascii-quotes)))) + (emacs-lisp-mode . ((mode . bug-reference-prog) + (indent-tabs-mode . nil) + (fill-column . 80)))) diff --git a/code/elpa/helm-20240320.541/emacs-helm.sh b/code/elpa/helm-20240320.541/emacs-helm.sh new file mode 100644 index 0000000..cc57118 --- /dev/null +++ b/code/elpa/helm-20240320.541/emacs-helm.sh @@ -0,0 +1,265 @@ +#!/usr/bin/env sh + + +## Copyright (C) 2012 ~ 2023 Thierry Volpiatto +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program. If not, see . + +## Commentary: +# Preconfigured `emacs -Q' with a basic Helm configuration. + + +# If TEMP env var exists, use it, otherwise declare it. +test -z "$TEMP" && TEMP="/tmp" + +CONF_FILE="$TEMP/helm-cfg.el" +EMACS=emacs +QUICK=-Q +TOOLBARS=-1 +LOAD_PACKAGES= + +usage () { + cat >&1 < $CONF_FILE <\`helm-find-files'\\n\ +;; - \`occur'(M-s o) =>\`helm-occur'\\n\ +;; - \`list-buffers'(C-x C-b) =>\`helm-buffers-list'\\n\ +;; - \`completion-at-point'(M-tab) =>\`helm-lisp-completion-at-point'[1]\\n\ +;; - \`apropos-command'(C-h a) =>\`helm-apropos'\\n\ +;; - \`dabbrev-expand'(M-/) =>\`helm-dabbrev'\\n\ +;; - \`execute-extended-command'(M-x) =>\`helm-M-x'\\n\\n +;; Some other Emacs commands are \"helmized\" by \`helm-mode'.\\n\ +;; [1] Coming with emacs-24.4, \`completion-at-point' is \"helmized\" by \`helm-mode'\\n\ + +;; which provides Helm completion in many places like \`shell-mode'.\\n\ +;; Find context help for most Helm commands with \`C-h m'.\\n\ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\\n\\n")) + +(setq load-path (quote $LOAD_PATH)) + +(defvar default-package-manager nil) +;; /home/you/.emacs.d/.local/straight/build-27.1/helm +(defvar initial-package-directory (file-name-directory (file-truename "$0"))) + +(defvar bootstrap-version) +(let* ((packages "$LOAD_PACKAGES") + (pkg-list (and packages + (not (equal packages "")) + (split-string packages ","))) + ;; /home/you/.emacs.d/.local/straight/build-27.1 + (straight-path (file-name-directory (directory-file-name initial-package-directory))) + ;; /home/you/.emacs.d/.local/straight/build-27.1/async + (async-path (expand-file-name "async" straight-path)) + ;; /home/you/.emacs.d/.local/straight/repos/straight.el/bootstrap.el + (bootstrap-file + (expand-file-name "repos/straight.el/bootstrap.el" + (file-name-directory (directory-file-name straight-path)))) + (bootstrap-version 5)) + (when (file-exists-p bootstrap-file) + (setq default-package-manager 'straight) + (load bootstrap-file nil 'nomessage) + (add-to-list 'load-path async-path) + (when pkg-list + (dolist (pkg pkg-list) + (let* ((pkg-path (expand-file-name pkg straight-path)) + (autoload-file (expand-file-name + (format "%s-autoloads.el" pkg) + pkg-path))) + (add-to-list 'load-path pkg-path) + (if (file-exists-p autoload-file) + (load autoload-file nil 'nomessage) + (straight-use-package (intern pkg)))))))) + +(unless (eq default-package-manager 'straight) + (require 'package) + ;; User may be using a non standard \`package-user-dir'. + ;; Modify \`package-directory-list' instead of \`package-user-dir' + ;; in case the user starts Helm from a non-ELPA installation. + (unless (file-equal-p package-user-dir (locate-user-emacs-file "elpa")) + ;; Something like /home/you/.emacs.d/somedir/else/elpa/ + ;; starting from default-directory is wrong in case helm.sh is a symlink + ;; or e.g. helm --chdir foo have been used. + (add-to-list 'package-directory-list (directory-file-name + (file-name-directory + (directory-file-name initial-package-directory))))) + + (let* ((str-lst "$LOAD_PACKAGES") + (load-packages (and str-lst + (not (string= str-lst "")) + (split-string str-lst ",")))) + (setq package-load-list + (if (equal load-packages '("all")) + '(all) + (append '((helm-core t) (helm t) (async t) (popup t) (wfnames t)) + (mapcar (lambda (p) (list (intern p) t)) load-packages))))) + + (package-initialize)) + +(add-to-list 'load-path initial-package-directory) + +(unless (> $TOOLBARS 0) + (setq default-frame-alist '((vertical-scroll-bars . nil) + (tool-bar-lines . 0) + (menu-bar-lines . 0) + (fullscreen . nil)))) +(blink-cursor-mode -1) +(load "helm-autoloads" nil t) +(helm-mode 1) +(with-eval-after-load 'tramp-cache (setq tramp-cache-read-persistent-data t)) +(with-eval-after-load 'auth-source (setq auth-source-save-behavior nil)) +(define-key global-map [remap find-file] 'helm-find-files) +(define-key global-map [remap occur] 'helm-occur) +(define-key global-map [remap list-buffers] 'helm-buffers-list) +(define-key global-map [remap dabbrev-expand] 'helm-dabbrev) +(define-key global-map [remap execute-extended-command] 'helm-M-x) +(define-key global-map [remap apropos-command] 'helm-apropos) +(unless (boundp 'completion-in-region-function) + (define-key lisp-interaction-mode-map [remap completion-at-point] 'helm-lisp-completion-at-point) + (define-key emacs-lisp-mode-map [remap completion-at-point] 'helm-lisp-completion-at-point)) +(add-hook 'kill-emacs-hook #'(lambda () (and (file-exists-p "$CONF_FILE") (delete-file "$CONF_FILE")))) +EOF + +$EMACS "$QUICK" -l "$CONF_FILE" "$@" diff --git a/code/elpa/helm-20240320.541/helm-adaptive.el b/code/elpa/helm-20240320.541/helm-adaptive.el new file mode 100644 index 0000000..98be39a --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-adaptive.el @@ -0,0 +1,284 @@ +;;; helm-adaptive.el --- Adaptive Sorting of Candidates. -*- lexical-binding: t -*- + +;; Original Author: Tamas Patrovics + +;; Copyright (C) 2007 Tamas Patrovics +;; Copyright (C) 2012 ~ 2023 Thierry Volpiatto + +;; 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 'helm) + + +(defgroup helm-adapt nil + "Adaptative sorting of candidates for Helm." + :group 'helm) + +(defcustom helm-adaptive-history-file + (locate-user-emacs-file "helm-adaptive-history") + "Path of file where history information is stored. +When nil history is not saved nor restored after Emacs restart +unless you save/restore `helm-adaptive-history' with something +else like psession or desktop." + :type 'string) + +(defcustom helm-adaptive-history-length 50 + "Maximum number of candidates stored for a source." + :type 'number) + +(defcustom helm-adaptive-sort-by-frequent-recent-usage t + "Try to sort on an average of frequent and recent usage when non-nil. + +When nil sort on frequency usage only. + +Only frequency: +When candidate have low frequency, you have to hit on it many +times to make it going up on top. + +Frequency+recent: +Even with a low frequency, candidate go up on top. If a candidate +have a high frequency but it is not used since some time, it goes +down slowly, but as soon you reuse it it go up on top quickly." + :type 'boolean) + +;; Internal +(defvar helm-adaptive-done nil + "nil if history information is not yet stored for the current +selection.") + +(defvar helm-adaptive-history nil + "Contains the stored history information. +Format: ((SOURCE-NAME + (SELECTED-CANDIDATE (PATTERN . NUMBER-OF-USE) ...) ...) ...)") + +(defconst helm-adaptive-freq-coefficient 5) +(defconst helm-adaptive-recent-coefficient 2) + +(defun helm-adaptive-done-reset () + (setq helm-adaptive-done nil)) + +;;;###autoload +(define-minor-mode helm-adaptive-mode + "Toggle adaptive sorting in all sources." + :global t + (if helm-adaptive-mode + (progn + (unless helm-adaptive-history + (helm-adaptive-maybe-load-history)) + (add-hook 'kill-emacs-hook #'helm-adaptive-save-history) + ;; Should run at beginning of `helm-initial-setup'. + (add-hook 'helm-before-initialize-hook #'helm-adaptive-done-reset) + ;; Should run at beginning of `helm-exit-minibuffer'. + (add-hook 'helm-before-action-hook #'helm-adaptive-store-selection) + ;; Should run at beginning of `helm-select-action'. + (add-hook 'helm-select-action-hook #'helm-adaptive-store-selection)) + (helm-adaptive-save-history) + (setq helm-adaptive-history nil) + (remove-hook 'kill-emacs-hook #'helm-adaptive-save-history) + (remove-hook 'helm-before-initialize-hook #'helm-adaptive-done-reset) + (remove-hook 'helm-before-action-hook #'helm-adaptive-store-selection) + (remove-hook 'helm-select-action-hook #'helm-adaptive-store-selection))) + +(defun helm-adapt-use-adaptive-p (&optional source-name) + "Return current source only if it use adaptive history, nil otherwise." + (when helm-adaptive-mode + (let* ((source (or source-name (helm-get-current-source))) + (adapt-source (or (assoc-default 'filtered-candidate-transformer source) + (assoc-default 'candidate-transformer source)))) + (if (listp adapt-source) + (and (memq 'helm-adaptive-sort adapt-source) source) + (and (eq adapt-source 'helm-adaptive-sort) source))))) + +(defun helm-adaptive-store-selection () + "Store history information for the selected candidate." + (unless helm-adaptive-done + (setq helm-adaptive-done t) + (let ((source (helm-adapt-use-adaptive-p))) + (when source + (let* ((source-name (assoc-default 'name source)) + (source-info (or (assoc source-name helm-adaptive-history) + (progn + (push (list source-name) helm-adaptive-history) + (car helm-adaptive-history)))) + (selection (helm-get-selection nil t)) + (selection-info (progn + (setcdr source-info + (cons + (let ((found (assoc selection (cdr source-info)))) + (if (not found) + ;; new entry + (list selection) + ;; move entry to the beginning of the + ;; list, so that it doesn't get + ;; trimmed when the history is + ;; truncated + (setcdr source-info + (delete found (cdr source-info))) + found)) + (cdr source-info))) + (cadr source-info))) + (pattern-info (progn + (setcdr selection-info + (cons + (let ((found (assoc helm-pattern (cdr selection-info)))) + (if (not found) + ;; new entry + (cons helm-pattern 0) + ;; move entry to the beginning of the + ;; list, so if two patterns used the + ;; same number of times then the one + ;; used last appears first in the list + (setcdr selection-info + (delete found (cdr selection-info))) + found)) + (cdr selection-info))) + (cadr selection-info))) + (timestamp-info (helm-aif (assq 'timestamp (cdr selection-info)) + it + (setcdr selection-info (cons (cons 'timestamp 0) (cdr selection-info))) + (cadr selection-info)))) + ;; Increase usage count. + (setcdr pattern-info (1+ (cdr pattern-info))) + ;; Update timestamp. + (setcdr timestamp-info (float-time)) + ;; Truncate history if needed. + (if (> (length (cdr selection-info)) helm-adaptive-history-length) + (setcdr selection-info + (helm-take (cdr selection-info) helm-adaptive-history-length)))))))) + +(defun helm-adaptive-maybe-load-history () + "Load `helm-adaptive-history-file' which contain `helm-adaptive-history'. +Returns nil if `helm-adaptive-history-file' doesn't exist." + (when (and helm-adaptive-history-file + (file-readable-p helm-adaptive-history-file)) + (load-file helm-adaptive-history-file))) + +(defun helm-adaptive-save-history (&optional arg) + "Save history information to the file given by `helm-adaptive-history-file'." + (interactive "p") + (when helm-adaptive-history-file + (with-temp-buffer + (insert + ";; -*- mode: emacs-lisp -*-\n" + ";; History entries used for helm adaptive display.\n") + (let (print-length print-level) + (prin1 `(setq helm-adaptive-history ',helm-adaptive-history) + (current-buffer))) + (insert ?\n) + (write-region (point-min) (point-max) helm-adaptive-history-file nil + (unless arg 'quiet))))) + +(defun helm-adaptive-sort (candidates source) + "Sort the CANDIDATES for SOURCE by usage frequency. +This is a filtered candidate transformer you can use with the +`filtered-candidate-transformer' attribute." + (let* ((source-name (assoc-default 'name source)) + (source-info (assoc source-name helm-adaptive-history))) + (if source-info + (let ((usage + ;; Loop in the SOURCE entry of `helm-adaptive-history' + ;; and assemble a list containing the (CANDIDATE + ;; . USAGE-COUNT) pairs. + (cl-loop with cf = (if helm-adaptive-sort-by-frequent-recent-usage + helm-adaptive-freq-coefficient 1) + with cr = helm-adaptive-recent-coefficient + for (src-cand . infos) in (cdr source-info) + for count-freq = 0 + for count-rec = + (helm-aif (and helm-adaptive-sort-by-frequent-recent-usage + (assq 'timestamp infos)) + (* cr (+ (float-time) (cdr it))) + 0) + do (cl-loop for (pattern . score) in + (remove (assq 'timestamp infos) infos) + ;; If current pattern is equal to + ;; the previously used one then + ;; this candidate has priority + ;; (that's why its count-freq is + ;; boosted by 10000) and it only + ;; has to compete with other + ;; candidates which were also + ;; selected with the same pattern. + if (equal pattern helm-pattern) + return (setq count-freq (+ 10000 score)) + else do (cl-incf count-freq score)) + and collect (cons src-cand (+ (* count-freq cf) count-rec)) + into results + ;; Sort the list in descending order, so + ;; candidates with highest priority come + ;; first. + finally return + (sort results (lambda (first second) + (> (cdr first) (cdr second))))))) + (if (consp usage) + ;; Put those candidates first which have the highest usage count. + (cl-loop for (cand . _freq) in usage + for info = (or (and (assq 'multiline source) + (replace-regexp-in-string + "\n\\'" "" cand)) + ;; Some transformers like in + ;; bookmarks may add a leading + ;; space to provide additional + ;; infos like an icon as a + ;; display prop, strip out this + ;; leading space for + ;; comparison. Same for a + ;; trailing space (helm + ;; boookmark add bmk location as + ;; a display prop when + ;; displaying it). + (helm-aand (replace-regexp-in-string "\\` " "" cand) + (replace-regexp-in-string " \\'" "" it))) + when (cl-member info candidates + :test 'helm-adaptive-compare) + collect (car it) into sorted + and do (setq candidates + (cl-remove info candidates + :test 'helm-adaptive-compare)) + finally return (append sorted candidates)) + (message "Your `%s' is maybe corrupted or too old, \ +you should reinitialize it with `helm-reset-adaptive-history'" + helm-adaptive-history-file) + (sit-for 1) + candidates)) + ;; if there is no information stored for this source then do nothing + candidates))) + +;;;###autoload +(defun helm-reset-adaptive-history () + "Delete all `helm-adaptive-history' and his file. +Useful when you have a old or corrupted +`helm-adaptive-history-file'." + (interactive) + (when (y-or-n-p "Really delete all your `helm-adaptive-history'? ") + (setq helm-adaptive-history nil) + (when (and helm-adaptive-history-file + (file-exists-p helm-adaptive-history-file)) + (delete-file helm-adaptive-history-file)))) + +(defun helm-adaptive-compare (x y) + "Compare display parts if some of candidates X and Y. + +Arguments X and Y are cons cell in (DISPLAY . REAL) format or +atoms." + (equal (if (listp x) (car x) x) + (if (listp y) (car y) y))) + + +(provide 'helm-adaptive) + +;;; helm-adaptive.el ends here diff --git a/code/elpa/helm-20240320.541/helm-autoloads.el b/code/elpa/helm-20240320.541/helm-autoloads.el new file mode 100644 index 0000000..a6f1318 --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-autoloads.el @@ -0,0 +1,990 @@ +;;; helm-autoloads.el --- automatically extracted autoloads (do not edit) -*- lexical-binding: t -*- +;; Generated by the `loaddefs-generate' function. + +;; This file is part of GNU Emacs. + +;;; Code: + +(add-to-list 'load-path (or (and load-file-name (directory-file-name (file-name-directory load-file-name))) (car load-path))) + + + +;;; Generated autoloads from helm-adaptive.el + +(defvar helm-adaptive-mode nil "\ +Non-nil if Helm-Adaptive mode is enabled. +See the `helm-adaptive-mode' command +for a description of this minor mode. +Setting this variable directly does not take effect; +either customize it (see the info node `Easy Customization') +or call the function `helm-adaptive-mode'.") +(custom-autoload 'helm-adaptive-mode "helm-adaptive" nil) +(autoload 'helm-adaptive-mode "helm-adaptive" "\ +Toggle adaptive sorting in all sources. + +This is a global minor mode. If called interactively, toggle the +`Helm-Adaptive mode' mode. If the prefix argument is positive, +enable the mode, and if it is zero or negative, disable the mode. + +If called from Lisp, toggle the mode if ARG is `toggle'. Enable +the mode if ARG is nil, omitted, or is a positive number. +Disable the mode if ARG is a negative number. + +To check whether the minor mode is enabled in the current buffer, +evaluate `(default-value \\='helm-adaptive-mode)'. + +The mode's hook is called both when the mode is enabled and when +it is disabled. + +(fn &optional ARG)" t) +(autoload 'helm-reset-adaptive-history "helm-adaptive" "\ +Delete all `helm-adaptive-history' and his file. +Useful when you have a old or corrupted +`helm-adaptive-history-file'." t) +(register-definition-prefixes "helm-adaptive" '("helm-adapt")) + + +;;; Generated autoloads from helm-bookmark.el + +(autoload 'helm-bookmarks "helm-bookmark" "\ +Preconfigured `helm' for bookmarks." t) +(autoload 'helm-filtered-bookmarks "helm-bookmark" "\ +Preconfigured `helm' for bookmarks (filtered by category). +Optional source `helm-source-bookmark-addressbook' is loaded only +if external addressbook-bookmark package is installed." t) +(register-definition-prefixes "helm-bookmark" '("bmk" "bookmark" "helm-")) + + +;;; Generated autoloads from helm-buffers.el + +(autoload 'helm-buffers-quit-and-find-file-fn "helm-buffers" "\ + + +(fn SOURCE)") +(autoload 'helm-buffers-list "helm-buffers" "\ +Preconfigured `helm' to list buffers." t) +(autoload 'helm-mini "helm-buffers" "\ +Preconfigured `helm' displaying `helm-mini-default-sources'." t) +(register-definition-prefixes "helm-buffers" '("helm-")) + + +;;; Generated autoloads from helm-color.el + +(autoload 'helm-colors "helm-color" "\ +Preconfigured `helm' for color." t) +(register-definition-prefixes "helm-color" '("helm-")) + + +;;; Generated autoloads from helm-command.el + +(autoload 'helm-M-x "helm-command" "\ +Preconfigured `helm' for Emacs commands. +It is `helm' replacement of regular `M-x' +`execute-extended-command'. + +Unlike regular `M-x' Emacs vanilla `execute-extended-command' +command, the prefix args if needed, can be passed AFTER starting +`helm-M-x'. When a prefix arg is passed BEFORE starting +`helm-M-x', the first `C-u' while in `helm-M-x' session will +disable it. + +You can get help on each command by persistent action. + +(fn ARG)" t) +(register-definition-prefixes "helm-command" '("helm-")) + + +;;; Generated autoloads from helm-dabbrev.el + +(autoload 'helm-dabbrev "helm-dabbrev" "\ +Preconfigured helm for dynamic abbreviations." t) +(register-definition-prefixes "helm-dabbrev" '("helm-dabbrev-")) + + +;;; Generated autoloads from helm-elisp.el + +(autoload 'helm-lisp-completion-at-point "helm-elisp" "\ +Preconfigured Helm for Lisp symbol completion at point." t) +(autoload 'helm-get-first-line-documentation "helm-elisp" "\ +Return first line documentation of symbol SYM truncated at END-COLUMN. +If SYM is not documented, return \"Not documented\". +Argument NAME allows specifiying what function to use to display +documentation when SYM name is the same for function and variable. + +(fn SYM &optional (NAME \"describe-function\") (END-COLUMN 72))") +(autoload 'helm-complete-file-name-at-point "helm-elisp" "\ +Preconfigured Helm to complete file name at point. + +(fn &optional FORCE)" t) +(autoload 'helm-lisp-indent "helm-elisp" nil t) +(autoload 'helm-apropos "helm-elisp" "\ +Preconfigured Helm to describe commands, functions, variables and faces. +In non interactives calls DEFAULT argument should be provided as +a string, i.e. the `symbol-name' of any existing symbol. + +(fn DEFAULT)" t) +(autoload 'helm-manage-advice "helm-elisp" "\ +Preconfigured `helm' to disable/enable function advices." t) +(autoload 'helm-locate-library "helm-elisp" "\ +Preconfigured helm to locate elisp libraries. + +When `completions-detailed' or `helm-completions-detailed' is non +nil, a description of libraries is provided. The libraries are +partially cached in the variables +`helm--locate-library-doc-cache' and +`helm--locate-library-cache'. TIP: You can make these vars +persistent for faster start with the psession package, using M-x +psession-make-persistent-variable. NOTE: The caches affect as +well `find-libray' and `locate-library' when `helm-mode' is +enabled and `completions-detailed' is non nil. There is no need +to refresh the caches, they will be updated automatically if some +new libraries are found, however when a library update its +headers and the description change you can reset the caches with +a prefix arg. + +(fn &optional ARG)" t) +(autoload 'helm-timers "helm-elisp" "\ +Preconfigured `helm' for timers." t) +(autoload 'helm-complex-command-history "helm-elisp" "\ +Preconfigured `helm' for complex command history." t) +(register-definition-prefixes "helm-elisp" '("helm-" "with-helm-show-completion")) + + +;;; Generated autoloads from helm-epa.el + +(defvar helm-epa-mode nil "\ +Non-nil if Helm-Epa mode is enabled. +See the `helm-epa-mode' command +for a description of this minor mode. +Setting this variable directly does not take effect; +either customize it (see the info node `Easy Customization') +or call the function `helm-epa-mode'.") +(custom-autoload 'helm-epa-mode "helm-epa" nil) +(autoload 'helm-epa-mode "helm-epa" "\ +Enable helm completion on gpg keys in epa functions. + +This is a global minor mode. If called interactively, toggle the +`Helm-Epa mode' mode. If the prefix argument is positive, enable +the mode, and if it is zero or negative, disable the mode. + +If called from Lisp, toggle the mode if ARG is `toggle'. Enable +the mode if ARG is nil, omitted, or is a positive number. +Disable the mode if ARG is a negative number. + +To check whether the minor mode is enabled in the current buffer, +evaluate `(default-value \\='helm-epa-mode)'. + +The mode's hook is called both when the mode is enabled and when +it is disabled. + +(fn &optional ARG)" t) +(autoload 'helm-epa-list-keys "helm-epa" "\ +List all gpg keys. +This is the helm interface for `epa-list-keys'." t) +(register-definition-prefixes "helm-epa" '("helm-epa")) + + +;;; Generated autoloads from helm-eshell.el + +(autoload 'helm-esh-pcomplete "helm-eshell" "\ +Preconfigured `helm' to provide Helm completion in Eshell." t) +(autoload 'helm-eshell-history "helm-eshell" "\ +Preconfigured Helm for Eshell history." t) +(autoload 'helm-eshell-prompts "helm-eshell" "\ +Pre-configured `helm' to browse the prompts of the current Eshell." t) +(autoload 'helm-eshell-prompts-all "helm-eshell" "\ +Pre-configured `helm' to browse the prompts of all Eshell sessions." t) +(register-definition-prefixes "helm-eshell" '("helm-e")) + + +;;; Generated autoloads from helm-eval.el + +(autoload 'helm-eval-expression "helm-eval" "\ +Preconfigured `helm' for `helm-source-evaluation-result'. + +(fn ARG)" t) +(autoload 'helm-eval-expression-with-eldoc "helm-eval" "\ +Preconfigured `helm' for `helm-source-evaluation-result' with `eldoc' support." t) +(autoload 'helm-calcul-expression "helm-eval" "\ +Preconfigured `helm' for `helm-source-calculation-result'." t) +(register-definition-prefixes "helm-eval" '("helm-")) + + +;;; Generated autoloads from helm-external.el + +(autoload 'helm-run-external-command "helm-external" "\ +Preconfigured `helm' to run External PROGRAM asyncronously from Emacs. +If program is already running try to run `helm-raise-command' if +defined otherwise exit with error. You can set your own list of +commands with `helm-external-commands-list'." t) +(register-definition-prefixes "helm-external" '("helm-")) + + +;;; Generated autoloads from helm-fd.el + +(register-definition-prefixes "helm-fd" '("helm-fd-")) + + +;;; Generated autoloads from helm-files.el + +(defvar helm-ff-icon-mode nil "\ +Non-nil if Helm-Ff-Icon mode is enabled. +See the `helm-ff-icon-mode' command +for a description of this minor mode. +Setting this variable directly does not take effect; +either customize it (see the info node `Easy Customization') +or call the function `helm-ff-icon-mode'.") +(custom-autoload 'helm-ff-icon-mode "helm-files" nil) +(autoload 'helm-ff-icon-mode "helm-files" "\ +Display icons from `all-the-icons' package in HFF when enabled. + +This is a global minor mode. If called interactively, toggle the +`Helm-Ff-Icon mode' mode. If the prefix argument is positive, +enable the mode, and if it is zero or negative, disable the mode. + +If called from Lisp, toggle the mode if ARG is `toggle'. Enable +the mode if ARG is nil, omitted, or is a positive number. +Disable the mode if ARG is a negative number. + +To check whether the minor mode is enabled in the current buffer, +evaluate `(default-value \\='helm-ff-icon-mode)'. + +The mode's hook is called both when the mode is enabled and when +it is disabled. + +(fn &optional ARG)" t) +(autoload 'helm-ff-clear-image-dired-thumbnails-cache "helm-files" "\ +Clear `helm-ff-image-dired-thumbnails-cache'. +You may want to do this after customizing +`image-dired-thumbnail-storage' which may change the place where +thumbnail files are stored." t) +(autoload 'helm-ff-cleanup-image-dired-dir-and-cache "helm-files" "\ +Cleanup `image-dired-dir' directory. +Delete all thumb files that are no more associated with an existing +image file in `helm-ff-image-dired-thumbnails-cache'." t) +(autoload 'helm-projects-history "helm-files" "\ +Jump to project already visisted with `helm-browse-project'. + +(fn &optional ARG)" t) +(autoload 'helm-browse-project "helm-files" "\ +Preconfigured helm to browse projects. +Browse files and see status of project with its VCS. +Only HG and GIT are supported for now. +Fall back to `helm-browse-project-find-files' if current +directory is not under control of one of those VCS. +With a prefix ARG browse files recursively, with two prefix ARG +rebuild the cache. +If the current directory is found in the cache, start +`helm-browse-project-find-files' even with no prefix ARG. +NOTE: The prefix ARG have no effect on the VCS controlled +directories. + +Needed dependencies for VCS: + +and +. + +(fn ARG)" t) +(autoload 'helm-find-files "helm-files" "\ +Preconfigured `helm' for helm implementation of `find-file'. +Called with a prefix arg show history if some. +Don't call it from programs, use `helm-find-files-1' instead. +This is the starting point for nearly all actions you can do on +files. + +(fn ARG)" t) +(register-definition-prefixes "helm-files" '("eshell-command-aliases-list" "helm-")) + + +;;; Generated autoloads from helm-find.el + +(autoload 'helm-find "helm-find" "\ +Preconfigured `helm' for the find shell command. + +Recursively find files whose names are matched by all specified +globbing PATTERNs under the current directory using the external +program specified in `find-program' (usually \"find\"). Every +input PATTERN is silently wrapped into two stars: *PATTERN*. + +With prefix argument, prompt for a directory to search. + +When user option `helm-findutils-search-full-path' is non-nil, +match against complete paths, otherwise, against file names +without directory part. + +The (possibly empty) list of globbing PATTERNs can be followed by +the separator \"*\" plus any number of additional arguments that +are passed to \"find\" literally. + +(fn ARG)" t) +(register-definition-prefixes "helm-find" '("helm-")) + + +;;; Generated autoloads from helm-font.el + +(autoload 'helm-select-xfont "helm-font" "\ +Preconfigured `helm' to select Xfont." t) +(autoload 'helm-ucs "helm-font" "\ +Preconfigured `helm' for `ucs-names'. + +Called with a prefix arg force reloading cache. + +(fn ARG)" t) +(register-definition-prefixes "helm-font" '("helm-")) + + +;;; Generated autoloads from helm-for-files.el + +(autoload 'helm-for-files "helm-for-files" "\ +Preconfigured `helm' for opening files. +Run all sources defined in `helm-for-files-preferred-list'." t) +(autoload 'helm-multi-files "helm-for-files" "\ +Preconfigured helm like `helm-for-files' but running locate only on demand. + +Allow toggling back and forth from locate to others sources with +`helm-multi-files-toggle-locate-binding' key. +This avoids launching locate needlessly when what you are +searching for is already found." t) +(autoload 'helm-recentf "helm-for-files" "\ +Preconfigured `helm' for `recentf'." t) +(register-definition-prefixes "helm-for-files" '("helm-")) + + +;;; Generated autoloads from helm-global-bindings.el + +(register-definition-prefixes "helm-global-bindings" '("helm-command-")) + + +;;; Generated autoloads from helm-grep.el + +(autoload 'helm-goto-precedent-file "helm-grep" "\ +Go to previous file in Helm grep/etags buffers." t) +(autoload 'helm-goto-next-file "helm-grep" "\ +Go to previous file in Helm grep/etags buffers." t) +(autoload 'helm-revert-next-error-last-buffer "helm-grep" "\ +Revert last `next-error' buffer from `current-buffer'. + +Accept to revert only `helm-grep-mode' or `helm-occur-mode' buffers. +Use this when you want to revert the `next-error' buffer after +modifications in `current-buffer'." t) +(autoload 'helm-do-grep-ag "helm-grep" "\ +Preconfigured `helm' for grepping with AG in `default-directory'. +With prefix arg prompt for type if available with your AG +version. + +(fn ARG)" t) +(autoload 'helm-grep-do-git-grep "helm-grep" "\ +Preconfigured `helm' for git-grepping `default-directory'. +With a prefix arg ARG git-grep the whole repository. + +(fn ARG)" t) +(register-definition-prefixes "helm-grep" '("helm-")) + + +;;; Generated autoloads from helm-help.el + +(autoload 'helm-documentation "helm-help" "\ +Preconfigured `helm' for Helm documentation. +With a prefix arg refresh the documentation. + +Find here the documentation of all documented sources." t) +(defvar helm-comp-read-mode-line "\\C/\\[helm-cr-empty-string]:Empty \\\\[helm-help]:Help \\[helm-select-action]:Act \\[helm-maybe-exit-minibuffer]/f1/f2/f-n:NthAct \\[helm-toggle-suspend-update]:Tog.suspend \\[helm-customize-group]:Conf") +(defvar helm-read-file-name-mode-line-string "\\\\[helm-help]:Help C/\\[helm-cr-empty-string]:Empty \\\\[helm-select-action]:Act \\[helm-maybe-exit-minibuffer]/f1/f2/f-n:NthAct \\[helm-toggle-suspend-update]:Tog.suspend \\[helm-customize-group]:Conf" "\ +String displayed in mode-line in `helm-source-find-files'.") +(defvar helm-top-mode-line "\\\\[helm-help]:Help \\\\[helm-select-action]:Act \\[helm-maybe-exit-minibuffer]/f1/f2/f-n:NthAct \\[helm-toggle-suspend-update]:Tog.suspend \\[helm-customize-group]:Conf") +(register-definition-prefixes "helm-help" '("helm-")) + + +;;; Generated autoloads from helm-id-utils.el + +(autoload 'helm-gid "helm-id-utils" "\ +Preconfigured `helm' for `gid' command line of `ID-Utils'. +Need A database created with the command `mkid' above +`default-directory'. +Need id-utils as dependency which provide `mkid', `gid' etc.. +See ." t) +(register-definition-prefixes "helm-id-utils" '("helm-gid-")) + + +;;; Generated autoloads from helm-imenu.el + +(autoload 'helm-imenu "helm-imenu" "\ +Preconfigured `helm' for `imenu'." t) +(autoload 'helm-imenu-in-all-buffers "helm-imenu" "\ +Fetch Imenu entries in all buffers with similar mode as current. +A mode is similar as current if it is the same, it is derived +i.e. `derived-mode-p' or it have an association in +`helm-imenu-all-buffer-assoc'." t) +(register-definition-prefixes "helm-imenu" '("helm-")) + + +;;; Generated autoloads from helm-info.el + +(autoload 'helm-info "helm-info" "\ +Preconfigured `helm' for searching Info files' indices. + +With a prefix argument \\[universal-argument], set REFRESH to +non-nil. + +Optional parameter REFRESH, when non-nil, re-evaluates +`helm-default-info-index-list'. If the variable has been +customized, set it to its saved value. If not, set it to its +standard value. See `custom-reevaluate-setting' for more. + +REFRESH is useful when new Info files are installed. If +`helm-default-info-index-list' has not been customized, the new +Info files are made available. + +(fn &optional REFRESH)" t) +(autoload 'helm-info-at-point "helm-info" "\ +Preconfigured `helm' for searching info at point." t) +(register-definition-prefixes "helm-info" '("helm-")) + + +;;; Generated autoloads from helm-locate.el + +(autoload 'helm-projects-find-files "helm-locate" "\ +Find files with locate in `helm-locate-project-list'. +With a prefix arg refresh the database in each project. + +(fn UPDATE)" t) +(autoload 'helm-locate "helm-locate" "\ +Preconfigured `helm' for Locate. +Note: you can add locate options after entering pattern. +See \\='man locate' for valid options and also `helm-locate-command'. + +You can specify a local database with prefix argument ARG. +With two prefix arg, refresh the current local db or create it if +it doesn't exists. + +To create a user specific db, use +\"updatedb -l 0 -o db_path -U directory\". +Where db_path is a filename matched by +`helm-locate-db-file-regexp'. + +(fn ARG)" t) +(register-definition-prefixes "helm-locate" '("helm-")) + + +;;; Generated autoloads from helm-man.el + +(autoload 'helm-man-woman "helm-man" "\ +Preconfigured `helm' for Man and Woman pages. +With a prefix arg reinitialize the cache. + +(fn ARG)" t) +(register-definition-prefixes "helm-man" '("helm-")) + + +;;; Generated autoloads from helm-misc.el + +(defvar helm-minibuffer-history-mode nil "\ +Non-nil if Helm-Minibuffer-History mode is enabled. +See the `helm-minibuffer-history-mode' command +for a description of this minor mode. +Setting this variable directly does not take effect; +either customize it (see the info node `Easy Customization') +or call the function `helm-minibuffer-history-mode'.") +(custom-autoload 'helm-minibuffer-history-mode "helm-misc" nil) +(autoload 'helm-minibuffer-history-mode "helm-misc" "\ +Bind `helm-minibuffer-history-key' in al minibuffer maps. + +This mode is enabled by `helm-mode', so there is no need to enable it directly. + +This is a global minor mode. If called interactively, toggle the +`Helm-Minibuffer-History mode' mode. If the prefix argument is +positive, enable the mode, and if it is zero or negative, disable +the mode. + +If called from Lisp, toggle the mode if ARG is `toggle'. Enable +the mode if ARG is nil, omitted, or is a positive number. +Disable the mode if ARG is a negative number. + +To check whether the minor mode is enabled in the current buffer, +evaluate `(default-value \\='helm-minibuffer-history-mode)'. + +The mode's hook is called both when the mode is enabled and when +it is disabled. + +(fn &optional ARG)" t) +(autoload 'helm-world-time "helm-misc" "\ +Preconfigured `helm' to show world time. +Default action change TZ environment variable locally to emacs." t) +(autoload 'helm-insert-latex-math "helm-misc" "\ +Preconfigured helm for latex math symbols completion." t) +(autoload 'helm-ratpoison-commands "helm-misc" "\ +Preconfigured `helm' to execute ratpoison commands." t) +(autoload 'helm-stumpwm-commands "helm-misc" "\ +Preconfigured helm for stumpwm commands." t) +(autoload 'helm-minibuffer-history "helm-misc" "\ +Preconfigured `helm' for `minibuffer-history'." t) +(register-definition-prefixes "helm-misc" '("helm-")) + + +;;; Generated autoloads from helm-mode.el + +(autoload 'helm-comp-read "helm-mode" "\ +Read a string in the minibuffer, with helm completion. + +It is helm `completing-read' equivalent. + +- PROMPT is the prompt name to use. + +- COLLECTION can be a list, alist, vector, obarray or hash-table. + For alists and hash-tables their car are use as real value of + candidate unless ALISTP is non-nil. + It can be also a function that receives three arguments: + the values string, predicate and t. See `all-completions' for more details. + +Keys description: + +- TEST: A predicate called with one arg i.e candidate. + +- INITIAL-INPUT: Same as input arg in `helm'. + +- PRESELECT: See preselect arg of `helm'. + +- DEFAULT: This option is used only for compatibility with regular + Emacs `completing-read' (Same as DEFAULT arg of `completing-read'). + +- BUFFER: Name of helm-buffer. + +- MUST-MATCH: Candidate selected must be one of COLLECTION. + +- FUZZY: Enable fuzzy matching. + +- REVERSE-HISTORY: When non--nil display history source after current + source completion. + +- REQUIRES-PATTERN: Same as helm attribute, default is 0. + +- HISTORY: A symbol where each result will be saved. + If not specified as a symbol an error will popup. + When specified, all elements of HISTORY are displayed in + a special source before or after COLLECTION according to REVERSE-HISTORY. + The main difference with INPUT-HISTORY is that the result of the + completion is saved whereas in INPUT-HISTORY it is the minibuffer + contents which is saved when you exit. + Don't use the same symbol for INPUT-HISTORY and HISTORY. + NOTE: As mentionned above this has nothing to do with + `minibuffer-history-variable', therefore if you want to save this + history persistently, you will have to add this variable to the + relevant variable of your favorite tool for persistent emacs session + i.e. psession, desktop etc... + +- RAW-HISTORY: When non-nil do not remove backslashs if some in + HISTORY candidates. + +- INPUT-HISTORY: A symbol. The minibuffer input history will be + stored there, if nil or not provided, `minibuffer-history' + will be used instead. You can navigate in this history with + `M-p' and `M-n'. + Don't use the same symbol for INPUT-HISTORY and HISTORY. + +- CASE-FOLD: Same as `helm-case-fold-search'. + +- PERSISTENT-ACTION: A function called with one arg i.e candidate. + +- PERSISTENT-HELP: A string to document PERSISTENT-ACTION. + +- MODE-LINE: A string or list to display in mode line. + Default is `helm-comp-read-mode-line'. + +- KEYMAP: A keymap to use in this `helm-comp-read'. + (the keymap will be shared with history source) + +- NAME: The name related to this local source. + +- HEADER-NAME: A function to alter NAME, see `helm'. + +- EXEC-WHEN-ONLY-ONE: Bound `helm-execute-action-at-once-if-one' + to non--nil. (possibles values are t or nil). + +- VOLATILE: Use volatile attribute. + +- SORT: A predicate to give to `sort' e.g `string-lessp' + Use this only on small data as it is inefficient. + If you want to sort faster add a sort function to + FC-TRANSFORMER. + Note that FUZZY when enabled is already providing a sort function. + +- FC-TRANSFORMER: A `filtered-candidate-transformer' function + or a list of functions. + +- HIST-FC-TRANSFORMER: A `filtered-candidate-transformer' + function for the history source. + +- MARKED-CANDIDATES: If non-nil return candidate or marked candidates as a list. + +- NOMARK: When non--nil don't allow marking candidates. + +- ALISTP: + When non-nil (default) pass the value of (DISPLAY . REAL) + candidate in COLLECTION to action when COLLECTION is an alist or a + hash-table, otherwise DISPLAY is always returned as result on exit, + which is the default when using `completing-read'. + See `helm-comp-read-get-candidates'. + +- CANDIDATES-IN-BUFFER: when non--nil use a source build with + `helm-source-in-buffer' which is much faster. + Argument VOLATILE have no effect when CANDIDATES-IN-BUFFER is non--nil. + +- GET-LINE: Specify the :get-line slot of `helm-source-in-buffer', has no effect + when CANDIDATES-IN-BUFFER is nil. + +- MATCH-PART: Allow matching only one part of candidate. + See match-part documentation in `helm-source'. + +- MATCH-DYNAMIC: See match-dynamic in `helm-source-sync' + It has no effect when used with CANDIDATES-IN-BUFFER. + +- ALLOW-NEST: Allow nesting this `helm-comp-read' in a helm session. + See `helm'. + +- MULTILINE: See multiline in `helm-source'. + +- COERCE: See coerce in `helm-source'. + +- GROUP: See group in `helm-source'. + +Any prefix args passed during `helm-comp-read' invocation will be recorded +in `helm-current-prefix-arg', otherwise if prefix args were given before +`helm-comp-read' invocation, the value of `current-prefix-arg' will be used. +That means you can pass prefix args before or after calling a command +that use `helm-comp-read'. See `helm-M-x' for example. + +(fn PROMPT COLLECTION &key TEST INITIAL-INPUT DEFAULT PRESELECT (BUFFER \"*Helm Completions*\") MUST-MATCH FUZZY REVERSE-HISTORY (REQUIRES-PATTERN 0) (HISTORY nil SHISTORY) RAW-HISTORY INPUT-HISTORY (CASE-FOLD helm-comp-read-case-fold-search) (PERSISTENT-ACTION nil) (PERSISTENT-HELP \"DoNothing\") (MODE-LINE helm-comp-read-mode-line) HELP-MESSAGE (KEYMAP helm-comp-read-map) (NAME \"Helm Completions\") HEADER-NAME CANDIDATES-IN-BUFFER (GET-LINE #\\='buffer-substring) DIACRITICS MATCH-PART MATCH-DYNAMIC EXEC-WHEN-ONLY-ONE QUIT-WHEN-NO-CAND (VOLATILE t) SORT FC-TRANSFORMER HIST-FC-TRANSFORMER (MARKED-CANDIDATES helm-comp-read-use-marked) NOMARK (ALISTP t) (CANDIDATE-NUMBER-LIMIT helm-candidate-number-limit) MULTILINE ALLOW-NEST COERCE (GROUP \\='helm))") +(autoload 'helm-read-file-name "helm-mode" "\ +Read a file name with helm completion. + +It is helm `read-file-name' emulation. + +Argument PROMPT is the default prompt to use. + +Keys description: + +- NAME: Source name, default to \"Read File Name\". + +- INITIAL-INPUT: Where to start reading file name, + default to `default-directory' or $HOME. + +- BUFFER: `helm-buffer' name, defaults to \"*Helm Completions*\". + +- TEST: A predicate called with one arg \\='candidate'. + +- NORET: Allow disabling helm-ff-RET (have no effect if helm-ff-RET + isn't bound to RET). + +- CASE-FOLD: Same as `helm-case-fold-search'. + +- PRESELECT: helm preselection. + +- HISTORY: Display HISTORY in a special source. + +- MUST-MATCH: Can be \\='confirm, nil, or t. + +- FUZZY: Enable fuzzy matching when non-nil (Enabled by default). + +- MARKED-CANDIDATES: When non--nil return a list of marked candidates. + +- NOMARK: When non--nil don't allow marking candidates. + +- ALISTP: Don't use `all-completions' in history + (take effect only on history). + +- PERSISTENT-ACTION-IF: a persistent if action function. + +- PERSISTENT-HELP: persistent help message. + +- MODE-LINE: A mode line message, default is + `helm-read-file-name-mode-line-string'. + +(fn PROMPT &key (NAME \"Read File Name\") INITIAL-INPUT (BUFFER \"*Helm file completions*\") TEST NORET (CASE-FOLD helm-file-name-case-fold-search) PRESELECT HISTORY MUST-MATCH (FUZZY t) DEFAULT MARKED-CANDIDATES (CANDIDATE-NUMBER-LIMIT helm-ff-candidate-number-limit) NOMARK (ALISTP t) (PERSISTENT-ACTION-IF \\='helm-find-files-persistent-action-if) (PERSISTENT-HELP \"Hit1 Expand Candidate, Hit2 or (C-u) Find file\") (MODE-LINE helm-read-file-name-mode-line-string))") +(defvar helm-mode nil "\ +Non-nil if Helm mode is enabled. +See the `helm-mode' command +for a description of this minor mode. +Setting this variable directly does not take effect; +either customize it (see the info node `Easy Customization') +or call the function `helm-mode'.") +(custom-autoload 'helm-mode "helm-mode" nil) +(autoload 'helm-mode "helm-mode" "\ +Toggle generic helm completion. + +All functions in Emacs that use `completing-read', +`read-file-name', `completion-in-region' and friends will use helm +interface when this mode is turned on. + +However you can modify this behavior for functions of your choice +with `helm-completing-read-handlers-alist'. + +Called with a positive arg, turn on unconditionally, with a +negative arg turn off. +You can toggle it with M-x `helm-mode'. + +About `ido-mode': +DO NOT enable `ido-everywhere' when using `helm-mode'. Instead of +using `ido-mode', add the commands where you want to use ido to +`helm-completing-read-handlers-alist' with `ido' as value. + +Note: This mode is incompatible with Emacs23. + +(fn &optional ARG)" t) +(register-definition-prefixes "helm-mode" '("helm-")) + + +;;; Generated autoloads from helm-net.el + +(autoload 'helm-browse-url-firefox "helm-net" "\ +Same as `browse-url-firefox' but detach from Emacs. + +So when you quit Emacs you can keep your Firefox session open and +not be prompted to kill the Firefox process. + +NOTE: Probably not supported on some systems (e.g., Windows). + +(fn URL &optional IGNORE)" t) +(autoload 'helm-browse-url-opera "helm-net" "\ +Browse URL with Opera browser and detach from Emacs. + +So when you quit Emacs you can keep your Opera session open and +not be prompted to kill the Opera process. + +NOTE: Probably not supported on some systems (e.g., Windows). + +(fn URL &optional IGNORE)" t) +(autoload 'helm-browse-url-chromium "helm-net" "\ +Browse URL with Google Chrome browser. + +(fn URL &optional IGNORE)" t) +(autoload 'helm-browse-url-uzbl "helm-net" "\ +Browse URL with uzbl browser. + +(fn URL &optional IGNORE)" t) +(autoload 'helm-browse-url-conkeror "helm-net" "\ +Browse URL with conkeror browser. + +(fn URL &optional IGNORE)" t) +(autoload 'helm-browse-url-nyxt "helm-net" "\ +Browse URL with nyxt browser. + +(fn URL &optional IGNORE)" t) +(autoload 'helm-surfraw "helm-net" "\ +Preconfigured `helm' to search PATTERN with search ENGINE. + +(fn PATTERN ENGINE)" t) +(autoload 'helm-google-suggest "helm-net" "\ +Preconfigured `helm' for Google search with Google suggest." t) +(register-definition-prefixes "helm-net" '("helm-")) + + +;;; Generated autoloads from helm-occur.el + +(autoload 'helm-occur "helm-occur" "\ +Preconfigured helm for searching lines matching pattern in `current-buffer'. + +When `helm-source-occur' is member of +`helm-sources-using-default-as-input' which is the default, +symbol at point is searched at startup. + +When a region is marked search only in this region by narrowing. + +To search in multiples buffers start from one of the commands listing +buffers (i.e. a helm command using `helm-source-buffers-list' like +`helm-mini') and use the multi occur buffers action. + +This is the helm implementation that collect lines matching pattern +like vanilla Emacs `occur' but have nothing to do with it, the search +engine beeing completely different and also much faster." t) +(autoload 'helm-occur-visible-buffers "helm-occur" "\ +Run helm-occur on all visible buffers in frame." t) +(autoload 'helm-occur-from-isearch "helm-occur" "\ +Invoke `helm-occur' from isearch. + +To use this bind it to a key in `isearch-mode-map'." t) +(autoload 'helm-multi-occur-from-isearch "helm-occur" "\ +Invoke `helm-multi-occur' from isearch. + +With a prefix arg, reverse the behavior of +`helm-moccur-always-search-in-current'. +The prefix arg can be set before calling +`helm-multi-occur-from-isearch' or during the buffer selection. + +To use this bind it to a key in `isearch-mode-map'." t) +(register-definition-prefixes "helm-occur" '("helm-")) + + +;;; Generated autoloads from helm-packages.el + +(autoload 'helm-packages "helm-packages" "\ +Helm interface to manage packages. + +With a prefix arg ARG refresh package list. + +When installing or upgrading ensure to refresh the package list +to avoid errors with outdated packages no more availables. + +(fn &optional ARG)" t) +(register-definition-prefixes "helm-packages" '("helm-packages-")) + + +;;; Generated autoloads from helm-regexp.el + +(autoload 'helm-regexp "helm-regexp" "\ +Preconfigured helm to build regexps. +`query-replace-regexp' can be run from there against found regexp." t) +(register-definition-prefixes "helm-regexp" '("helm-")) + + +;;; Generated autoloads from helm-ring.el + +(autoload 'helm-mark-ring "helm-ring" "\ +Preconfigured `helm' for `helm-source-mark-ring'." t) +(autoload 'helm-global-mark-ring "helm-ring" "\ +Preconfigured `helm' for `helm-source-global-mark-ring'." t) +(autoload 'helm-all-mark-rings "helm-ring" "\ +Preconfigured `helm' for mark rings. +Source used are `helm-source-global-mark-ring' and +`helm-source-mark-ring'." t) +(autoload 'helm-register "helm-ring" "\ +Preconfigured `helm' for Emacs registers." t) +(autoload 'helm-show-kill-ring "helm-ring" "\ +Preconfigured `helm' for `kill-ring'. +It is drop-in replacement of `yank-pop'. + +First call open the kill-ring browser, next calls move to next line." t) +(autoload 'helm-execute-kmacro "helm-ring" "\ +Preconfigured helm for keyboard macros. +Define your macros with `f3' and `f4'. +See (info \"(emacs) Keyboard Macros\") for detailed infos." t) +(register-definition-prefixes "helm-ring" '("helm-")) + + +;;; Generated autoloads from helm-semantic.el + +(autoload 'helm-semantic "helm-semantic" "\ +Preconfigured `helm' for `semantic'. +If ARG is supplied, pre-select symbol at point instead of current. + +(fn ARG)" t) +(autoload 'helm-semantic-or-imenu "helm-semantic" "\ +Preconfigured helm for `semantic' or `imenu'. +If ARG is supplied, pre-select symbol at point instead of current +semantic tag in scope. + +If `semantic-mode' is active in the current buffer, then use +semantic for generating tags, otherwise fall back to `imenu'. +Fill in the symbol at point by default. + +(fn ARG)" t) +(register-definition-prefixes "helm-semantic" '("helm-s")) + + +;;; Generated autoloads from helm-sys.el + +(defvar helm-top-poll-mode nil "\ +Non-nil if Helm-Top-Poll mode is enabled. +See the `helm-top-poll-mode' command +for a description of this minor mode. +Setting this variable directly does not take effect; +either customize it (see the info node `Easy Customization') +or call the function `helm-top-poll-mode'.") +(custom-autoload 'helm-top-poll-mode "helm-sys" nil) +(autoload 'helm-top-poll-mode "helm-sys" "\ +Refresh automatically helm top buffer once enabled. + +This is a global minor mode. If called interactively, toggle the +`Helm-Top-Poll mode' mode. If the prefix argument is positive, +enable the mode, and if it is zero or negative, disable the mode. + +If called from Lisp, toggle the mode if ARG is `toggle'. Enable +the mode if ARG is nil, omitted, or is a positive number. +Disable the mode if ARG is a negative number. + +To check whether the minor mode is enabled in the current buffer, +evaluate `(default-value \\='helm-top-poll-mode)'. + +The mode's hook is called both when the mode is enabled and when +it is disabled. + +(fn &optional ARG)" t) +(autoload 'helm-top "helm-sys" "\ +Preconfigured `helm' for top command." t) +(autoload 'helm-list-emacs-process "helm-sys" "\ +Preconfigured `helm' for Emacs process." t) +(autoload 'helm-xrandr-set "helm-sys" "\ +Preconfigured helm for xrandr." t) +(register-definition-prefixes "helm-sys" '("helm-")) + + +;;; Generated autoloads from helm-tags.el + +(autoload 'helm-etags-select "helm-tags" "\ +Preconfigured helm for etags. +If called with a prefix argument REINIT +or if any of the tag files have been modified, reinitialize cache. + +This function aggregates three sources of tag files: + + 1) An automatically located file in the parent directories, + by `helm-etags-get-tag-file'. + 2) `tags-file-name', which is commonly set by `find-tag' command. + 3) `tags-table-list' which is commonly set by `visit-tags-table' command. + +(fn REINIT)" t) +(register-definition-prefixes "helm-tags" '("helm-")) + + +;;; Generated autoloads from helm-types.el + +(register-definition-prefixes "helm-types" '("helm-")) + + +;;; Generated autoloads from helm-utils.el + +(defvar helm-popup-tip-mode nil "\ +Non-nil if Helm-Popup-Tip mode is enabled. +See the `helm-popup-tip-mode' command +for a description of this minor mode. +Setting this variable directly does not take effect; +either customize it (see the info node `Easy Customization') +or call the function `helm-popup-tip-mode'.") +(custom-autoload 'helm-popup-tip-mode "helm-utils" nil) +(autoload 'helm-popup-tip-mode "helm-utils" "\ +Show help-echo informations in a popup tip at end of line. + +This is a global minor mode. If called interactively, toggle the +`Helm-Popup-Tip mode' mode. If the prefix argument is positive, +enable the mode, and if it is zero or negative, disable the mode. + +If called from Lisp, toggle the mode if ARG is `toggle'. Enable +the mode if ARG is nil, omitted, or is a positive number. +Disable the mode if ARG is a negative number. + +To check whether the minor mode is enabled in the current buffer, +evaluate `(default-value \\='helm-popup-tip-mode)'. + +The mode's hook is called both when the mode is enabled and when +it is disabled. + +(fn &optional ARG)" t) +(register-definition-prefixes "helm-utils" '("helm-" "with-helm-display-marked-candidates")) + + +;;; Generated autoloads from helm-x-files.el + +(register-definition-prefixes "helm-x-files" '("helm-")) + +;;; End of scraped data + +(provide 'helm-autoloads) + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; no-native-compile: t +;; coding: utf-8-emacs-unix +;; End: + +;;; helm-autoloads.el ends here diff --git a/code/elpa/helm-20240320.541/helm-bookmark.el b/code/elpa/helm-20240320.541/helm-bookmark.el new file mode 100644 index 0000000..290a35f --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-bookmark.el @@ -0,0 +1,846 @@ +;;; helm-bookmark.el --- Helm for Emacs regular Bookmarks. -*- lexical-binding: t -*- + +;; Copyright (C) 2012 ~ 2023 Thierry Volpiatto + +;; 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 'bookmark) +(require 'helm) +(require 'helm-lib) +(require 'helm-help) +(require 'helm-types) +(require 'helm-utils) +(require 'helm-info) +(require 'helm-adaptive) +(require 'helm-net) + +(declare-function helm-browse-project "helm-files" (arg)) +(declare-function addressbook-bookmark-edit "ext:addressbook-bookmark.el" (bookmark)) +(declare-function all-the-icons-fileicon "ext:all-the-icons.el") +(declare-function all-the-icons-icon-for-file"ext:all-the-icons.el") +(declare-function all-the-icons-octicon "ext:all-the-icons.el") +(declare-function all-the-icons-match-to-alist "ext:all-the-icons.el") +(declare-function all-the-icons-faicon "ext:all-the-icons.el") + +(defvar all-the-icons-dir-icon-alist) + + +(defgroup helm-bookmark nil + "Predefined configurations for `helm.el'." + :group 'helm) + +(defcustom helm-bookmark-show-location nil + "Show location of bookmark on display." + :type 'boolean) + +(defcustom helm-bookmark-default-filtered-sources + (append '(helm-source-bookmark-org + helm-source-bookmark-files&dirs + helm-source-bookmark-helm-find-files + helm-source-bookmark-info + helm-source-bookmark-gnus + helm-source-bookmark-mu4e + helm-source-bookmark-man + helm-source-bookmark-images + helm-source-bookmark-w3m) + (list 'helm-source-bookmark-uncategorized + 'helm-source-bookmark-set)) + "List of sources to use in `helm-filtered-bookmarks'." + :type '(repeat (choice symbol))) + +(defcustom helm-bookmark-use-icon nil + "Display candidates with an icon with `all-the-icons' when non nil. +Don't use `setq' to set this." + :type 'boolean + :set (lambda (var val) + (if (require 'all-the-icons nil t) + (set var val) + (set var nil)))) + +(defcustom helm-bookmark-default-sort-method 'adaptive + "Sort method for `helm-filtered-bookmarks'. + +Value can be either \\='native' or \\='adaptive'. + +Once you use \\='native' the bookmark variable `bookmark-sort-flag' +will be honored." + :type '(choice + (symbol :tag "Helm adaptive sort method" adaptive) + (symbol :tag "Native bookmark sort method" native)) + ;; Don't use the :set function until functions and variables below + ;; are not loaded i.e. use set-default only for now. + :initialize 'custom-initialize-changed + :set (lambda (var val) + (set var val) + (cl-loop for s in (remove 'helm-source-bookmark-set + helm-bookmark-default-filtered-sources) + for fn = (intern (format "%s-builder" s)) + do (set s (funcall fn))))) + +(defgroup helm-bookmark-faces nil + "Customize the appearance of helm-bookmark." + :prefix "helm-" + :group 'helm-bookmark + :group 'helm-faces) + +(defface helm-bookmark-info + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "green")) + "Face used for W3m Emacs bookmarks (not w3m bookmarks)." + :group 'helm-bookmark-faces) + +(defface helm-bookmark-w3m + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "yellow")) + "Face used for W3m Emacs bookmarks (not w3m bookmarks)." + :group 'helm-bookmark-faces) + +(defface helm-bookmark-gnus + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "magenta")) + "Face used for Gnus bookmarks." + :group 'helm-bookmark-faces) + +(defface helm-bookmark-man + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "Orange4")) + "Face used for Woman/man bookmarks." + :group 'helm-bookmark-faces) + +(defface helm-bookmark-file + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "Deepskyblue2")) + "Face used for file bookmarks." + :group 'helm-bookmark-faces) + +(defface helm-bookmark-file-not-found + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "Slategray4")) + "Face used for file bookmarks." + :group 'helm-bookmark-faces) + +(defface helm-bookmark-directory + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :inherit helm-ff-directory)) + "Face used for file bookmarks." + :group 'helm-bookmark-faces) + +(defface helm-bookmark-addressbook + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "tomato")) + "Face used for addressbook bookmarks." + :group 'helm-bookmark-faces) + + +(defvar helm-bookmark-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map helm-map) + (define-key map (kbd "C-c o") #'helm-bookmark-run-jump-other-window) + (define-key map (kbd "C-c C-o") #'helm-bookmark-run-jump-other-frame) + (define-key map (kbd "C-c C-t") #'helm-bookmark-run-jump-other-tab) + (define-key map (kbd "C-d") #'helm-bookmark-run-delete) + (define-key map (kbd "C-]") #'helm-bookmark-toggle-filename) + (define-key map (kbd "M-e") #'helm-bookmark-run-edit) + map) + "Generic Keymap for Emacs bookmark sources.") + +(defclass helm-source-basic-bookmarks (helm-source-in-buffer helm-type-bookmark) + ((init :initform (lambda () + (bookmark-maybe-load-default-file) + (helm-init-candidates-in-buffer + 'global + (if (and (fboundp 'bookmark-maybe-sort-alist) + (fboundp 'bookmark-name-from-full-record)) + (mapcar 'bookmark-name-from-full-record + (bookmark-maybe-sort-alist)) + (bookmark-all-names))))) + (filtered-candidate-transformer :initform 'helm-bookmark-transformer) + (find-file-target :initform #'helm-bookmarks-quit-an-find-file-fn))) + +(defvar helm-source-bookmarks + (helm-make-source "Bookmarks" 'helm-source-basic-bookmarks) + "See (info \"(emacs)Bookmarks\").") + +(defun helm-bookmark-transformer (candidates _source) + (cl-loop for i in candidates + for loc = (bookmark-location i) + for len = (string-width i) + for trunc = (if (> len bookmark-bmenu-file-column) + (helm-substring i bookmark-bmenu-file-column) + i) + for sep = (make-string (- (+ bookmark-bmenu-file-column 2) + (length trunc)) + ? ) + if helm-bookmark-show-location + collect (cons (concat trunc sep (if (listp loc) (car loc) loc)) i) + else collect i)) + +(defun helm-bookmark-toggle-filename-1 (_candidate) + (let* ((real (helm-get-selection helm-buffer)) + (trunc (if (> (string-width real) bookmark-bmenu-file-column) + (helm-substring real bookmark-bmenu-file-column) + real))) + (setq helm-bookmark-show-location (not helm-bookmark-show-location)) + (helm-update (if helm-bookmark-show-location + (regexp-quote trunc) + (regexp-quote real))))) + +(helm-make-persistent-command-from-action helm-bookmark-toggle-filename + "Toggle bookmark location visibility." + 'toggle-filename 'helm-bookmark-toggle-filename-1) + +(defun helm-bookmark-jump-1 (candidate &optional fn) + (let (;; FIXME Why is prefarg necessary here? + (current-prefix-arg helm-current-prefix-arg) + non-essential) + (bookmark-jump candidate fn))) + +(defun helm-bookmark-jump (candidate) + "Jump to bookmark action." + (helm-bookmark-jump-1 candidate)) + +(defun helm-bookmark-jump-other-frame (candidate) + "Jump to bookmark in other frame action." + (helm-bookmark-jump-1 candidate #'switch-to-buffer-other-frame)) + +(defun helm-bookmark-jump-other-window (candidate) + "Jump to bookmark in other window action." + (helm-bookmark-jump-1 candidate #'switch-to-buffer-other-window)) + +(defun helm-bookmark-jump-other-tab (candidate) + "Jump to bookmark action." + (cl-assert (fboundp 'tab-bar-mode) nil "Tab-bar-mode not available") + (helm-bookmark-jump-1 candidate #'switch-to-buffer-other-tab)) + +;;; bookmark-set +;; +(defvar helm-source-bookmark-set + (helm-build-dummy-source "Set Bookmark" + :filtered-candidate-transformer + (lambda (_candidates _source) + (list (or (and (not (string= helm-pattern "")) + helm-pattern) + "Enter a bookmark name to record"))) + :action '(("Set bookmark" . (lambda (candidate) + (if (string= helm-pattern "") + (message "No bookmark name given for record") + (bookmark-set candidate)))))) + "See (info \"(emacs)Bookmarks\").") + + +;;; Predicates +;; +(defconst helm-bookmark--non-file-filename " - no file -" + "Name to use for `filename' entry, for non-file bookmarks.") + +(defun helm-bookmark-gnus-bookmark-p (bookmark) + "Return non-nil if BOOKMARK is a Gnus bookmark. +BOOKMARK is a bookmark name or a bookmark record." + (or (eq (bookmark-get-handler bookmark) 'bmkext-jump-gnus) + (eq (bookmark-get-handler bookmark) 'gnus-summary-bookmark-jump) + (eq (bookmark-get-handler bookmark) 'bookmarkp-jump-gnus) + (eq (bookmark-get-handler bookmark) 'bmkp-jump-gnus))) + +(defun helm-bookmark-mu4e-bookmark-p (bookmark) + "Return non nil if BOOKMARK is a mu4e bookmark. +BOOKMARK is a bookmark name or a bookmark record." + (memq (bookmark-get-handler bookmark) + '(mu4e-bookmark-jump mu4e--jump-to-bookmark))) + +(defun helm-bookmark-w3m-bookmark-p (bookmark) + "Return non-nil if BOOKMARK is a W3m bookmark. +BOOKMARK is a bookmark name or a bookmark record." + (or (eq (bookmark-get-handler bookmark) 'bmkext-jump-w3m) + (eq (bookmark-get-handler bookmark) 'bookmark-w3m-bookmark-jump) + (eq (bookmark-get-handler bookmark) 'bookmarkp-jump-w3m) + (eq (bookmark-get-handler bookmark) 'bmkp-jump-w3m))) + +(defun helm-bookmark-woman-bookmark-p (bookmark) + "Return non-nil if BOOKMARK is a Woman bookmark. +BOOKMARK is a bookmark name or a bookmark record." + (or (eq (bookmark-get-handler bookmark) 'bmkext-jump-woman) + (eq (bookmark-get-handler bookmark) 'woman-bookmark-jump) + (eq (bookmark-get-handler bookmark) 'bookmarkp-jump-woman) + (eq (bookmark-get-handler bookmark) 'bmkp-jump-woman))) + +(defun helm-bookmark-man-bookmark-p (bookmark) + "Return non-nil if BOOKMARK is a Man bookmark. +BOOKMARK is a bookmark name or a bookmark record." + (or (eq (bookmark-get-handler bookmark) 'bmkext-jump-man) + (eq (bookmark-get-handler bookmark) 'Man-bookmark-jump) + (eq (bookmark-get-handler bookmark) 'bookmarkp-jump-man) + (eq (bookmark-get-handler bookmark) 'bmkp-jump-man))) + +(defun helm-bookmark-woman-man-bookmark-p (bookmark) + "Return non-nil if BOOKMARK is a Man or Woman bookmark. +BOOKMARK is a bookmark name or a bookmark record." + (or (helm-bookmark-man-bookmark-p bookmark) + (helm-bookmark-woman-bookmark-p bookmark))) + +(defun helm-bookmark-info-bookmark-p (bookmark) + "Return non-nil if BOOKMARK is an Info bookmark. +BOOKMARK is a bookmark name or a bookmark record." + (eq (bookmark-get-handler bookmark) 'Info-bookmark-jump)) + +(defun helm-bookmark-image-bookmark-p (bookmark) + "Return non-nil if BOOKMARK bookmarks an image file." + (if (stringp bookmark) + (assq 'image-type (assq bookmark bookmark-alist)) + (assq 'image-type bookmark))) + +(defun helm-bookmark-file-p (bookmark) + "Return non-nil if BOOKMARK bookmarks a file or directory. +BOOKMARK is a bookmark name or a bookmark record. +This excludes bookmarks of a more specific kind (Info, Gnus, and W3m)." + (let* ((filename (bookmark-get-filename bookmark)) + (isnonfile (equal filename helm-bookmark--non-file-filename))) + (and filename (not isnonfile) (not (bookmark-get-handler bookmark))))) + +(defun helm-bookmark-org-file-p (bookmark) + (let* ((filename (bookmark-get-filename bookmark))) + (or (string-suffix-p ".org" filename t) + (string-suffix-p ".org_archive" filename t)))) + +(defun helm-bookmark-helm-find-files-p (bookmark) + "Return non-nil if BOOKMARK bookmarks a `helm-find-files' session. +BOOKMARK is a bookmark name or a bookmark record." + (eq (bookmark-get-handler bookmark) 'helm-ff-bookmark-jump)) + +(defun helm-bookmark-addressbook-p (bookmark) + "Return non--nil if BOOKMARK is a contact recorded with addressbook-bookmark. +BOOKMARK is a bookmark name or a bookmark record." + (if (listp bookmark) + (string= (assoc-default 'type bookmark) "addressbook") + (string= (assoc-default + 'type (assoc bookmark bookmark-alist)) "addressbook"))) + +(defun helm-bookmark-uncategorized-bookmark-p (bookmark) + "Return non--nil if BOOKMARK match no known category." + (cl-loop for pred in '(helm-bookmark-org-file-p + helm-bookmark-addressbook-p + helm-bookmark-gnus-bookmark-p + helm-bookmark-mu4e-bookmark-p + helm-bookmark-w3m-bookmark-p + helm-bookmark-woman-man-bookmark-p + helm-bookmark-info-bookmark-p + helm-bookmark-image-bookmark-p + helm-bookmark-file-p + helm-bookmark-helm-find-files-p + helm-bookmark-addressbook-p) + never (funcall pred bookmark))) + +(defun helm-bookmark-filter-setup-alist (fn) + "Return a filtered `bookmark-alist' sorted alphabetically." + (cl-loop for b in (if (and (fboundp 'bookmark-maybe-sort-alist) + (eq helm-bookmark-default-sort-method 'native)) + (bookmark-maybe-sort-alist) + bookmark-alist) + for name = (car b) + when (funcall fn b) collect + (propertize name 'location (bookmark-location name)))) + +;;; Bookmark handlers +;; +(defvar w3m-async-exec) +(defun helm-bookmark-jump-w3m (bookmark) + "Jump to W3m bookmark BOOKMARK, setting a new tab. +If `browse-url-browser-function' is set to something else than +`w3m-browse-url' use it." + (require 'helm-net) + (let* ((file (or (bookmark-prop-get bookmark 'filename) + (bookmark-prop-get bookmark 'url))) + (buf (generate-new-buffer-name "*w3m*")) + (w3m-async-exec nil) + ;; If user don't have anymore w3m installed let it browse its + ;; bookmarks with default browser otherwise assume bookmark + ;; have been bookmarked from w3m and use w3m. + (browse-url-browser-function (or (and (fboundp 'w3m-browse-url) + (executable-find "w3m") + 'w3m-browse-url) + browse-url-browser-function)) + (really-use-w3m (equal browse-url-browser-function 'w3m-browse-url))) + (helm-browse-url file really-use-w3m) + (when really-use-w3m + (bookmark-default-handler + `("" (buffer . ,buf) . ,(bookmark-get-bookmark-record bookmark)))))) + +;; All bookmarks recorded with the handler provided with w3m +;; (`bookmark-w3m-bookmark-jump') will use our handler which open +;; the bookmark in a new tab or in an external browser depending +;; on `browse-url-browser-function'. +(defalias 'bookmark-w3m-bookmark-jump #'helm-bookmark-jump-w3m) + +;; Provide compatibility with old handlers provided in external +;; packages bookmark-extensions.el and bookmark+. +(defalias 'bmkext-jump-woman #'woman-bookmark-jump) +(defalias 'bmkext-jump-man #'Man-bookmark-jump) +(defalias 'bmkext-jump-w3m #'helm-bookmark-jump-w3m) +(defalias 'bmkext-jump-gnus #'gnus-summary-bookmark-jump) +(defalias 'bookmarkp-jump-gnus #'gnus-summary-bookmark-jump) +(defalias 'bookmarkp-jump-w3m #'helm-bookmark-jump-w3m) +(defalias 'bookmarkp-jump-woman #'woman-bookmark-jump) +(defalias 'bookmarkp-jump-man #'Man-bookmark-jump) +(defalias 'bmkp-jump-gnus #'gnus-summary-bookmark-jump) +(defalias 'bmkp-jump-w3m #'helm-bookmark-jump-w3m) +(defalias 'bmkp-jump-woman #'woman-bookmark-jump) +(defalias 'bmkp-jump-man #'Man-bookmark-jump) + + +;;;; Filtered bookmark sources +;; +;; +(defclass helm-source-filtered-bookmarks (helm-source-in-buffer helm-type-bookmark) + ((filtered-candidate-transformer + :initform (delq nil + `(,(and (eq helm-bookmark-default-sort-method 'adaptive) + 'helm-adaptive-sort) + helm-highlight-bookmark))) + (find-file-target :initform #'helm-bookmarks-quit-an-find-file-fn))) + +(defun helm-bookmarks-quit-an-find-file-fn (source) + (let* ((sel (helm-get-selection nil nil source)) + (bmk (assoc (replace-regexp-in-string "\\`\\*" "" sel) + bookmark-alist))) + (helm-aif (bookmark-get-filename bmk) + (if (and helm--url-regexp + (string-match helm--url-regexp it)) + it (expand-file-name it)) + (expand-file-name default-directory)))) + +(defun helm-bookmark-build-source (name buildfn &optional class &rest args) + (apply #'helm-make-source name + (or class 'helm-source-filtered-bookmarks) + :init (lambda () + (bookmark-maybe-load-default-file) + (helm-init-candidates-in-buffer + 'global (funcall buildfn))) + args)) + +;;; W3m bookmarks. +;; +(defun helm-bookmark-w3m-setup-alist () + "Specialized filter function for bookmarks w3m." + (helm-bookmark-filter-setup-alist 'helm-bookmark-w3m-bookmark-p)) + +(defun helm-source-bookmark-w3m-builder () + (helm-bookmark-build-source "Bookmark W3m" #'helm-bookmark-w3m-setup-alist)) + +(defvar helm-source-bookmark-w3m (helm-source-bookmark-w3m-builder)) + +;;; Images +;; +(defun helm-bookmark-images-setup-alist () + "Specialized filter function for images bookmarks." + (helm-bookmark-filter-setup-alist 'helm-bookmark-image-bookmark-p)) + +(defun helm-source-bookmark-images-builder () + (helm-bookmark-build-source "Bookmark Images" #'helm-bookmark-images-setup-alist)) + +(defvar helm-source-bookmark-images (helm-source-bookmark-images-builder)) + +;;; Woman Man +;; +(defun helm-bookmark-man-setup-alist () + "Specialized filter function for bookmarks w3m." + (helm-bookmark-filter-setup-alist 'helm-bookmark-woman-man-bookmark-p)) + +(defun helm-source-bookmark-man-builder () + (helm-bookmark-build-source "Bookmark Woman&Man" #'helm-bookmark-man-setup-alist)) + +(defvar helm-source-bookmark-man (helm-source-bookmark-man-builder)) + +;;; Org files +;; +(defun helm-bookmark-org-setup-alist () + "Specialized filter function for Org file bookmarks." + (helm-bookmark-filter-setup-alist 'helm-bookmark-org-file-p)) + +(defun helm-source-bookmark-org-builder () + (helm-bookmark-build-source "Bookmark Org files" #'helm-bookmark-org-setup-alist)) + +(defvar helm-source-bookmark-org (helm-source-bookmark-org-builder)) + +;;; Gnus +;; +(defun helm-bookmark-gnus-setup-alist () + "Specialized filter function for bookmarks gnus." + (helm-bookmark-filter-setup-alist 'helm-bookmark-gnus-bookmark-p)) + +(defun helm-source-bookmark-gnus-builder () + (helm-bookmark-build-source "Bookmark Gnus" #'helm-bookmark-gnus-setup-alist)) + +(defvar helm-source-bookmark-gnus (helm-source-bookmark-gnus-builder)) + +;;; Mu4e +;; +(defun helm-bookmark-mu4e-setup-alist () + (helm-bookmark-filter-setup-alist 'helm-bookmark-mu4e-bookmark-p)) + +(defun helm-source-bookmark-mu4e-builder () + (helm-bookmark-build-source "Bookmark Mu4e" #'helm-bookmark-mu4e-setup-alist)) + +(defvar helm-source-bookmark-mu4e (helm-source-bookmark-mu4e-builder)) + +;;; Info +;; +(defun helm-bookmark-info-setup-alist () + "Specialized filter function for bookmarks info." + (helm-bookmark-filter-setup-alist 'helm-bookmark-info-bookmark-p)) + +(defun helm-source-bookmark-info-builder () + (helm-bookmark-build-source "Bookmark Info" #'helm-bookmark-info-setup-alist)) + +(defvar helm-source-bookmark-info (helm-source-bookmark-info-builder)) + +;;; Files and directories +;; +(defun helm-bookmark-local-files-setup-alist () + "Specialized filter function for bookmarks locals files." + (helm-bookmark-filter-setup-alist 'helm-bookmark-file-p)) + +(defun helm-source-bookmark-files&dirs-builder () + (helm-bookmark-build-source + "Bookmark Files&Directories" #'helm-bookmark-local-files-setup-alist)) + +(defvar helm-source-bookmark-files&dirs + (helm-source-bookmark-files&dirs-builder)) + +;;; Helm find files sessions. +;; +(defun helm-bookmark-helm-find-files-setup-alist () + "Specialized filter function for `helm-find-files' bookmarks." + (helm-bookmark-filter-setup-alist 'helm-bookmark-helm-find-files-p)) + +(defun helm-bookmark-browse-project (candidate) + "Run `helm-browse-project' from action." + (with-helm-default-directory + (bookmark-get-filename candidate) + (helm-browse-project nil))) + +(helm-make-command-from-action helm-bookmark-run-browse-project + "Run `helm-bookmark-browse-project' from keyboard." + 'helm-bookmark-browse-project) + +(defvar helm-bookmark-find-files-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map helm-bookmark-map) + (define-key map (kbd "C-x C-d") #'helm-bookmark-run-browse-project) + map)) + +;; Same as `helm-source-filtered-bookmarks' but override actions and keymap +;; specifically for helm-find-files bookmarks. +(defclass helm-bookmark-override-inheritor (helm-source) ()) + +(cl-defmethod helm--setup-source ((source helm-bookmark-override-inheritor)) + ;; Ensure `helm-source-in-buffer' method is called. + (cl-call-next-method) + (setf (slot-value source 'action) + (helm-append-at-nth + (cl-loop for (name . action) in helm-type-bookmark-actions + ;; We don't want those actions in helm-find-files bookmarks. + unless (memq action '(helm-bookmark-jump-other-frame + helm-bookmark-jump-other-window + helm-bookmark-jump-other-tab)) + collect (cons name action)) + '(("Browse project" . helm-bookmark-browse-project)) 1)) + (setf (slot-value source 'keymap) helm-bookmark-find-files-map)) + +(defclass helm-bookmark-find-files-class (helm-source-filtered-bookmarks + helm-bookmark-override-inheritor) + ()) + +(defun helm-source-bookmark-helm-find-files-builder () + (helm-bookmark-build-source + "Bookmark helm-find-files sessions" + #'helm-bookmark-helm-find-files-setup-alist + 'helm-bookmark-find-files-class + :persistent-action (lambda (_candidate) (ignore)) + :persistent-help "Do nothing")) + +(defvar helm-source-bookmark-helm-find-files + (helm-source-bookmark-helm-find-files-builder)) + +;;; Uncategorized bookmarks +;; +(defun helm-bookmark-uncategorized-setup-alist () + "Specialized filter function for uncategorized bookmarks." + (helm-bookmark-filter-setup-alist 'helm-bookmark-uncategorized-bookmark-p)) + +(defun helm-source-bookmark-uncategorized-builder () + (helm-bookmark-build-source + "Bookmark uncategorized" #'helm-bookmark-uncategorized-setup-alist)) + +(defvar helm-source-bookmark-uncategorized + (helm-source-bookmark-uncategorized-builder)) + + +;;; Transformer +;; +(defun helm-highlight-bookmark (bookmarks _source) + "Used as `filtered-candidate-transformer' to colorize bookmarks." + (let ((non-essential t)) + (cl-loop for i in bookmarks + for isfile = (bookmark-get-filename i) + for hff = (helm-bookmark-helm-find-files-p i) + for handlerp = (and (fboundp 'bookmark-get-handler) + (bookmark-get-handler i)) + for isw3m = (and (fboundp 'helm-bookmark-w3m-bookmark-p) + (helm-bookmark-w3m-bookmark-p i)) + for isgnus = (and (fboundp 'helm-bookmark-gnus-bookmark-p) + (helm-bookmark-gnus-bookmark-p i)) + for ismu4e = (and (fboundp 'helm-bookmark-mu4e-bookmark-p) + (helm-bookmark-mu4e-bookmark-p i)) + for isman = (and (fboundp 'helm-bookmark-man-bookmark-p) ; Man + (helm-bookmark-man-bookmark-p i)) + for iswoman = (and (fboundp 'helm-bookmark-woman-bookmark-p) ; Woman + (helm-bookmark-woman-bookmark-p i)) + for isannotation = (bookmark-get-annotation i) + for isabook = (string= (bookmark-prop-get i 'type) + "addressbook") + for isinfo = (eq handlerp 'Info-bookmark-jump) + for loc = (bookmark-location i) + for len = (string-width i) + for trunc = (if (and helm-bookmark-show-location + (> len bookmark-bmenu-file-column)) + (helm-substring + i bookmark-bmenu-file-column) + i) + for icon = (when helm-bookmark-use-icon + (cond ((and isfile hff) + (helm-aif (or (all-the-icons-match-to-alist + (helm-basename (helm-basedir isfile t)) + all-the-icons-dir-icon-alist) + (all-the-icons-match-to-alist + (helm-basename isfile) + all-the-icons-dir-icon-alist)) + (apply (car it) (cdr it)) + (all-the-icons-octicon "file-directory"))) + (isw3m (all-the-icons-faicon "firefox")) + ((and isfile isinfo) (all-the-icons-octicon "info")) + ((or iswoman isman) + (all-the-icons-fileicon "man-page")) + ((or isgnus ismu4e) + (all-the-icons-octicon "mail-read")) + (isfile (all-the-icons-icon-for-file (helm-basename isfile))))) + ;; Add a * if bookmark have annotation + if (and isannotation (not (string-equal isannotation ""))) + do (setq trunc (concat "*" (if helm-bookmark-show-location trunc i))) + for sep = (and helm-bookmark-show-location + (make-string (- (+ bookmark-bmenu-file-column 2) + (string-width trunc)) + ? )) + for bmk = (cond ( ;; info buffers + isinfo + (propertize trunc 'face 'helm-bookmark-info + 'help-echo isfile)) + ( ;; w3m buffers + isw3m + (propertize trunc 'face 'helm-bookmark-w3m + 'help-echo isfile)) + ( ;; gnus buffers + isgnus + (propertize trunc 'face 'helm-bookmark-gnus + 'help-echo isfile)) + ( ;; Man Woman + (or iswoman isman) + (propertize trunc 'face 'helm-bookmark-man + 'help-echo isfile)) + ( ;; Addressbook + isabook + (propertize trunc 'face 'helm-bookmark-addressbook)) + (;; Directories (helm-find-files) + hff + (if (and (file-remote-p isfile) + (not (file-remote-p isfile nil t))) + (propertize trunc 'face 'helm-bookmark-file-not-found + 'help-echo isfile) + (propertize trunc 'face 'helm-bookmark-directory + 'help-echo isfile))) + ( ;; Directories (dired) + (and isfile + ;; This is needed because `non-essential' + ;; is not working on Emacs-24.2 and the behavior + ;; of tramp seems to have changed since previous + ;; versions (Need to reenter password even if a + ;; first connection have been established, + ;; probably when host is named differently + ;; i.e machine/localhost) + (and (not (file-remote-p isfile)) + (file-directory-p isfile))) + (propertize trunc 'face 'helm-bookmark-directory + 'help-echo isfile)) + ( ;; Non existing files. + (and isfile + ;; Be safe and call `file-exists-p' + ;; only if file is not remote or + ;; remote but connected. + (or (and (file-remote-p isfile) + (not (file-remote-p isfile nil t))) + (not (file-exists-p isfile)))) + (propertize trunc 'face 'helm-bookmark-file-not-found + 'help-echo isfile)) + ( ;; regular files + t + (propertize trunc 'face 'helm-bookmark-file + 'help-echo isfile))) + collect (if helm-bookmark-show-location + (cons (concat (and icon (propertize " " 'display (concat icon " "))) + bmk + (propertize + " " 'display + (concat sep (if (listp loc) (car loc) loc)))) + i) + (cons (concat (and icon (propertize " " 'display (concat icon " "))) + bmk) + i))))) + + +;;; Edit/rename/save bookmarks. +;; +;; +(defun helm-bookmark-edit-bookmark (bookmark-name) + "Edit bookmark's name and file name, and maybe save them. +BOOKMARK-NAME is the current (old) name of the bookmark to be +renamed." + (let ((bmk (helm-bookmark-get-bookmark-from-name bookmark-name)) + (handler (bookmark-prop-get bookmark-name 'handler))) + (if (eq handler 'addressbook-bookmark-jump) + (addressbook-bookmark-edit + (assoc bmk bookmark-alist)) + (helm-bookmark-edit-bookmark-1 bookmark-name handler)))) + +(defun helm-bookmark-edit-bookmark-1 (bookmark-name handler) + (let* ((helm--reading-passwd-or-string t) + (bookmark-fname (bookmark-get-filename bookmark-name)) + (bookmark-loc (bookmark-prop-get bookmark-name 'location)) + (message-id (bookmark-prop-get bookmark-name 'message-id)) + (new-name (read-from-minibuffer "Name: " bookmark-name)) + (new-loc (and (or bookmark-fname bookmark-loc) + (read-from-minibuffer "FileName or Location: " + (or bookmark-fname + (if (consp bookmark-loc) + (car bookmark-loc) + bookmark-loc))))) + (new-message-id (and (memq handler '(mu4e--jump-to-bookmark + mu4e-bookmark-jump)) + (read-string "Message-id: " message-id)))) + (when (and (not (equal new-name "")) + (or (not (equal new-loc "")) + (not (equal new-message-id ""))) + (y-or-n-p "Save changes? ")) + (if bookmark-fname + (progn + (helm-bookmark-rename bookmark-name new-name 'batch) + (bookmark-set-filename new-name new-loc)) + (bookmark-prop-set + (bookmark-get-bookmark bookmark-name) + (cond (new-loc 'location) + (new-message-id 'message-id)) + (or new-loc new-message-id)) + (helm-bookmark-rename bookmark-name new-name 'batch)) + (helm-bookmark-maybe-save-bookmark) + (list new-name new-loc)))) + +(defun helm-bookmark-maybe-save-bookmark () + "Increment save counter and maybe save `bookmark-alist'." + (setq bookmark-alist-modification-count (1+ bookmark-alist-modification-count)) + (when (bookmark-time-to-save-p) (bookmark-save))) + +(defun helm-bookmark-rename (old &optional new batch) + "Change bookmark's name from OLD to NEW. +Interactively: + If called from the keyboard, then prompt for OLD. + If called from the menubar, select OLD from a menu. +If NEW is nil, then prompt for its string value. + +If BATCH is non-nil, then do not rebuild the menu list. + +While the user enters the new name, repeated `C-w' inserts +consecutive words from the buffer into the new bookmark name." + (interactive (list (bookmark-completing-read "Old bookmark name"))) + (bookmark-maybe-historicize-string old) + (bookmark-maybe-load-default-file) + (save-excursion (skip-chars-forward " ") (setq bookmark-yank-point (point))) + (setq bookmark-current-buffer (current-buffer)) + (let ((newname (or new (read-from-minibuffer + "New name: " nil + (let ((now-map (copy-keymap minibuffer-local-map))) + (define-key now-map "\C-w" #'bookmark-yank-word) + now-map) + nil 'bookmark-history)))) + (bookmark-set-name old newname) + (setq bookmark-current-bookmark newname) + (unless batch (bookmark-bmenu-surreptitiously-rebuild-list)) + (helm-bookmark-maybe-save-bookmark) newname)) + +(helm-make-command-from-action helm-bookmark-run-edit + "Run `helm-bookmark-edit-bookmark' from keyboard." + 'helm-bookmark-edit-bookmark) + + +(helm-make-command-from-action helm-bookmark-run-jump-other-frame + "Jump to bookmark other frame from keyboard." + 'helm-bookmark-jump-other-frame) + +(helm-make-command-from-action helm-bookmark-run-jump-other-window + "Jump to bookmark other window from keyboard." + 'helm-bookmark-jump-other-window) + +(helm-make-command-from-action helm-bookmark-run-jump-other-tab + "Jump to bookmark other tab from keyboard." + 'helm-bookmark-jump-other-tab) + +(helm-make-command-from-action helm-bookmark-run-delete + "Delete bookmark from keyboard." + 'helm-delete-marked-bookmarks) + +(defun helm-bookmark-get-bookmark-from-name (bmk) + "Return bookmark name even if it is a bookmark with annotation. +E.g. prepended with *." + (let ((bookmark (replace-regexp-in-string "\\`\\*" "" bmk))) + (if (assoc bookmark bookmark-alist) bookmark bmk))) + +(defun helm-delete-marked-bookmarks (_ignore) + "Delete this bookmark or all marked bookmarks." + (dolist (i (helm-marked-candidates)) + (bookmark-delete (helm-bookmark-get-bookmark-from-name i) + 'batch))) + + +;;;###autoload +(defun helm-bookmarks () + "Preconfigured `helm' for bookmarks." + (interactive) + (helm :sources '(helm-source-bookmarks + helm-source-bookmark-set) + :buffer "*helm bookmarks*" + :default (buffer-name helm-current-buffer))) + +;;;###autoload +(defun helm-filtered-bookmarks () + "Preconfigured `helm' for bookmarks (filtered by category). +Optional source `helm-source-bookmark-addressbook' is loaded only +if external addressbook-bookmark package is installed." + (interactive) + (helm :sources helm-bookmark-default-filtered-sources + :prompt "Search Bookmark: " + :buffer "*helm filtered bookmarks*" + :default (list (thing-at-point 'symbol) + (buffer-name helm-current-buffer)))) + +(provide 'helm-bookmark) + +;;; helm-bookmark.el ends here diff --git a/code/elpa/helm-20240320.541/helm-buffers.el b/code/elpa/helm-20240320.541/helm-buffers.el new file mode 100644 index 0000000..e8f3c50 --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-buffers.el @@ -0,0 +1,1181 @@ +;;; helm-buffers.el --- helm support for buffers. -*- lexical-binding: t -*- + +;; Copyright (C) 2012 ~ 2023 Thierry Volpiatto + +;; 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 'helm) +(require 'helm-types) +(require 'helm-utils) +(require 'helm-grep) +(require 'helm-regexp) +(require 'helm-help) +(require 'helm-occur) + +(declare-function helm-comp-read "helm-mode") +(declare-function helm-browse-project "helm-files") +(declare-function helm-ff-switch-to-shell "helm-files") +(declare-function all-the-icons-icon-for-file "ext:all-the-icons.el") +(declare-function all-the-icons-octicon "ext:all-the-icons.el") + +(defvar all-the-icons-mode-icon-alist) +(defvar dired-buffers) +(defvar org-directory) +(defvar helm-ff-default-directory) + + +(defgroup helm-buffers nil + "Buffers related Applications and libraries for Helm." + :group 'helm) + +(defcustom helm-boring-buffer-regexp-list + '("\\` " "\\`\\*helm" "\\`\\*Echo Area" "\\`\\*Minibuf") + "The regexp list that match boring buffers. +Buffer candidates matching these regular expression will be +filtered from the list of candidates if the +`helm-skip-boring-buffers' candidate transformer is used." + :type '(repeat (choice regexp))) + +(defcustom helm-white-buffer-regexp-list nil + "The regexp list of not boring buffers. +These buffers will be displayed even if they match one of +`helm-boring-buffer-regexp-list'." + :type '(repeat (choice regexp))) + +(defcustom helm-buffers-favorite-modes '(lisp-interaction-mode + emacs-lisp-mode + text-mode + org-mode) + "List of preferred mode to open new buffers with." + :type '(repeat (choice function))) + +(defcustom helm-buffer-max-length 20 + "Max length of buffer names before truncate. +When disabled (nil) use the longest `buffer-name' length found." + :type '(choice (const :tag "Disabled" nil) + (integer :tag "Length before truncate"))) + +(defcustom helm-buffer-details-flag t + "Always show details in buffer list when non-nil." + :type 'boolean) + +(defcustom helm-buffers-fuzzy-matching nil + "Fuzzy matching buffer names when non-nil. +Only buffer names are fuzzy matched when this is enabled, +`major-mode' matching is not affected by this." + :type 'boolean) + +(defcustom helm-buffer-skip-remote-checking nil + "Ignore checking for `file-exists-p' on remote files." + :type 'boolean) + +(defcustom helm-buffers-truncate-lines t + "Truncate lines in `helm-buffers-list' when non-nil." + :type 'boolean) + +(defcustom helm-buffers-left-margin-width helm-left-margin-width + "`left-margin-width' value for `helm-mini' and `helm-buffers-list'." + :type 'integer) + +(defcustom helm-mini-default-sources '(helm-source-buffers-list + helm-source-recentf + helm-source-buffer-not-found) + "Default sources list used in `helm-mini'. + +When adding a source here it is up to you to ensure the library +of this source is accessible and properly loaded." + :type '(repeat (choice symbol))) + +(defcustom helm-buffers-end-truncated-string "..." + "The string to display at end of truncated buffer names." + :type 'string) + +(defcustom helm-buffers-column-separator " " + "Separator for columns in buffer listing." + :type 'string) + +(defcustom helm-buffer--pretty-names '((dired-mode . "Dired") + (lisp-interaction-mode . "Lisp Inter")) + "An alist specifying pretty names for modes. +Most of the time buffer's `mode-name' is a string so no need to +add it here as there is no need to compute it, but sometimes it +may be a mode-line specification which may be costly to compute, +in this case add here the pretty name as a string to avoid this +costly computation. Also if some pretty names are too long you +can add your own abbreviation here." + :type '(alist :key-type symbol :value-type string)) + +(defcustom helm-buffers-maybe-switch-to-tab nil + "Switch to buffer in its tab when non nil. +This has no effect when `tab-bar-mode' is not available." + :type 'boolean) + +(defcustom helm-buffer-list-reorder-fn #'helm-buffers-reorder-buffer-list + "A function in charge of ordering the initial buffer list. +It takes two arguments VISIBLES buffers and OTHERS buffers. +Arg VISIBLES handles the buffers visibles in this frame. +Arg OTHERS handles all the other buffers. +You can write a function that reorder VISIBLES and OTHERS as you +want. +Default function returns OTHERS buffers on top and VISIBLES +buffer at the end. See `helm-buffers-reorder-buffer-list'." + :type 'function) + +(defcustom helm-buffers-sort-fn helm-fuzzy-sort-fn + "The sort function to use in `helm-buffers-list'. + +Default to `helm-fuzzy-sort-fn' you can use +`helm-fuzzy-matching-sort-fn-preserve-ties-order' as alternative if +you want to keep the recentest order when narrowing candidates." + :type 'function) + +(defcustom helm-buffers-show-icons nil + "Prefix buffer names with an icon when non nil. +Don't use `setq' to set this." + :type 'boolean + :set (lambda (var val) + (if (require 'all-the-icons nil t) + (set var val) + (set var nil)))) + + +;;; Faces +;; +;; +(defgroup helm-buffers-faces nil + "Customize the appearance of helm-buffers." + :prefix "helm-" + :group 'helm-buffers + :group 'helm-faces) + +(defface helm-buffer-saved-out + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "red" :background "black")) + "Face used for buffer files modified outside of emacs." + :group 'helm-buffers-faces) + +(defface helm-buffer-not-saved + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "Indianred2")) + "Face used for buffer files not already saved on disk." + :group 'helm-buffers-faces) + +(defface helm-buffer-modified + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :inherit font-lock-comment-face)) + "Face used for modified buffers." + :group 'helm-buffers-faces) + +(defface helm-no-file-buffer-modified + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "orange" :background "black")) + "Face used for modified buffers." + :group 'helm-buffers-faces) + +(defface helm-buffer-size + `((((background dark)) + ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "RosyBrown") + (((background light)) + ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "SlateGray")) + "Face used for buffer size." + :group 'helm-buffers-faces) + +(defface helm-buffer-process + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "Sienna3")) + "Face used for process status in buffer." + :group 'helm-buffers-faces) + +(defface helm-buffer-directory + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "DarkRed" :background "LightGray")) + "Face used for directories in `helm-buffers-list'." + :group 'helm-buffers-faces) + +(defface helm-buffer-file + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :inherit font-lock-builtin-face)) + "Face for buffer file names in `helm-buffers-list'." + :group 'helm-buffers-faces) + +(defface helm-buffer-archive + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "Gold")) + "Face for archive file names in `helm-buffers-list'." + :group 'helm-buffers-faces) + +(defface helm-non-file-buffer + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :inherit italic)) + "Face used for non-file buffers in `helm-buffers-list'." + :group 'helm-buffers-faces) + +(defvar helm-buffers-tick-counter nil + "Allows recording local changes to a non-file buffer. +Typical usage of this var is for modes that want to see if their +buffers have changed since last visit. +Such programs may want to record tick counter after visiting +their buffers like this: + + (setq helm-buffers-tick-counter (buffer-modified-tick)) + +See bug#1917. + +Note that this variable is buffer-local.") +(make-variable-buffer-local 'helm-buffers-tick-counter) + + +;;; Buffers keymap +;; +(defvar helm-buffer-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map helm-map) + ;; No need to have separate command for grep and zgrep + ;; as we don't use recursivity for buffers. + ;; So use zgrep for both as it is capable to handle non--compressed files. + (define-key map (kbd "M-g s") #'helm-buffer-run-zgrep) + (define-key map (kbd "C-s") #'helm-buffers-run-occur) + (define-key map (kbd "C-x C-d") #'helm-buffers-run-browse-project) + (define-key map (kbd "C-c o") #'helm-buffer-switch-other-window) + (define-key map (kbd "C-c C-o") #'helm-buffer-switch-other-frame) + (define-key map (kbd "M-g M-g") #'helm-buffer-run-goto-line) + (define-key map (kbd "C-c =") #'helm-buffer-run-ediff) + (define-key map (kbd "M-=") #'helm-buffer-run-ediff-merge) + (define-key map (kbd "C-=") #'helm-buffer-diff-persistent) + (define-key map (kbd "M-G") #'helm-buffer-revert-persistent) + (define-key map (kbd "C-c d") #'helm-buffer-run-kill-persistent) + (define-key map (kbd "M-D") #'helm-buffer-run-kill-buffers) + (define-key map (kbd "C-x C-s") #'helm-buffer-save-persistent) + (define-key map (kbd "C-x s") #'helm-buffer-run-save-some-buffers) + (define-key map (kbd "C-M-%") #'helm-buffer-run-query-replace-regexp) + (define-key map (kbd "M-%") #'helm-buffer-run-query-replace) + (define-key map (kbd "M-R") #'helm-buffer-run-rename-buffer) + (define-key map (kbd "M-e") #'helm-buffer-run-switch-to-shell) + (define-key map (kbd "C-]") #'helm-toggle-buffers-details) + (define-key map (kbd "C-c a") #'helm-buffers-toggle-show-hidden-buffers) + (define-key map (kbd "C-M-SPC") #'helm-buffers-mark-similar-buffers) + (when (fboundp 'tab-bar-mode) + (define-key map (kbd "C-c C-t") #'helm-buffers-switch-to-buffer-new-tab)) + map) + "Keymap for buffer sources in helm.") + + +(defvar helm-buffer-max-len-mode nil) +(defvar helm-buffers-in-project-p nil) +(defvar helm-source-buffers-list nil) + +(defun helm-buffers-list--init () + (require 'dired) + ;; Bug#51 Create the list before `helm-buffer' creation. + ;; We were using a global cache in the past and 'candidates was + ;; bound to this cache, this was a problem when using more than one + ;; source with a different 'buffer-list fn as the same cache was + ;; reused in each source (Bug#1907), now 'candidates attr is set + ;; directly so that each list of candidates is local to source. + (helm-set-attr 'candidates (funcall (helm-get-attr 'buffer-list))) + (let ((result (cl-loop with allbufs = (memq 'helm-shadow-boring-buffers + (helm-get-attr + 'filtered-candidate-transformer + helm-source-buffers-list)) + for b in (if allbufs + (helm-get-attr 'candidates) + (helm-skip-boring-buffers + (helm-get-attr 'candidates) + helm-source-buffers-list)) + maximize (length b) into len-buf + maximize (length (helm-buffer--format-mode-name b)) + into len-mode + finally return (cons len-buf len-mode)))) + (unless (default-value 'helm-buffer-max-length) + (helm-set-local-variable 'helm-buffer-max-length (car result))) + (unless (default-value 'helm-buffer-max-len-mode) + (helm-set-local-variable 'helm-buffer-max-len-mode (cdr result))))) + +(defclass helm-source-buffers (helm-source-sync helm-type-buffer) + ((buffer-list + :initarg :buffer-list + :initform #'helm-buffer-list + :custom function + :documentation + " A function with no arguments to create buffer list.") + (init :initform 'helm-buffers-list--init) + (multimatch :initform nil) + (match :initform 'helm-buffers-match-function) + (persistent-action :initform 'helm-buffers-list-persistent-action) + (keymap :initform 'helm-buffer-map) + (find-file-target :initform #'helm-buffers-quit-and-find-file-fn) + (migemo :initform 'nomultimatch) + (volatile :initform t) + (nohighlight :initform t) + (resume :initform (lambda () (setq helm-buffers-in-project-p nil))) + (help-message :initform 'helm-buffer-help-message))) + +(cl-defun helm-buffers-create-new-buffer-1 (candidate &optional (display-func 'switch-to-buffer)) + (let ((mjm (or (and helm-current-prefix-arg + (intern-soft (helm-comp-read + "Major-mode: " + helm-buffers-favorite-modes))) + (cl-loop for (r . m) in auto-mode-alist + when (string-match r candidate) + return m))) + (buffer (get-buffer-create candidate))) + (if mjm + (with-current-buffer buffer (funcall mjm)) + (set-buffer-major-mode buffer)) + (funcall display-func buffer))) + +(defun helm-buffers-create-new-buffer (candidate) + (helm-buffers-create-new-buffer-1 candidate)) + +(defun helm-buffers-create-new-buffer-ow (candidate) + (helm-buffers-create-new-buffer-1 candidate 'switch-to-buffer-other-window)) + +(helm-make-command-from-action helm-buffers-not-found-run-switch-ow + "Run create new buffer other window action from keymap." + 'helm-buffers-create-new-buffer-ow) + +(defun helm-buffers-create-new-buffer-of (candidate) + (helm-buffers-create-new-buffer-1 candidate 'switch-to-buffer-other-frame)) + +(helm-make-command-from-action helm-buffers-not-found-run-switch-of + "Run create new buffer other frame action from keymap." + 'helm-buffers-create-new-buffer-of) + +(defvar helm-buffer-not-found-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map helm-map) + (define-key map (kbd "C-c o") #'helm-buffers-not-found-run-switch-ow) + (define-key map (kbd "C-c C-o") #'helm-buffers-not-found-run-switch-of) + map) + "Keymap for `helm-source-buffer-not-found' source.") + +(defvar helm-source-buffer-not-found + (helm-build-dummy-source + "Create buffer" + :action (helm-make-actions + "Create buffer (C-u choose mode)" + #'helm-buffers-create-new-buffer + "Create buffer other window (C-u choose mode)" + #'helm-buffers-create-new-buffer-ow + "Create buffer other frame (C-u choose mode)" + #'helm-buffers-create-new-buffer-of) + :keymap helm-buffer-not-found-map)) + + +(defun helm-buffers-get-visible-buffers () + "Returns buffers visible on visible frames." + (let (result) + (walk-windows + (lambda (x) + (push (buffer-name (window-buffer x)) result)) + nil 'visible) + result)) + +(defun helm-buffer-list-1 (&optional visibles) + "Return list of all buffers except VISIBLES buffers." + (cl-loop for b in (buffer-list) + for bn = (buffer-name b) + unless (member bn visibles) + collect bn)) + +(defun helm-buffers-reorder-buffer-list (visibles others) + "Default function to reorder buffer-list. +Arg VISIBLES handles the buffers visibles in this frame. +Arg OTHERS handles all the other buffers. +This function returns OTHERS buffers on top and VISIBLES buffer +at the end." + (nconc others visibles)) + +(defun helm-buffer-list () + "Return the current list of buffers. +The list is reordered with `helm-buffer-list-reorder-fn'." + (let* ((visibles (helm-buffers-get-visible-buffers)) + (others (helm-buffer-list-1 visibles))) + (funcall helm-buffer-list-reorder-fn visibles others))) + +(defun helm-buffer-size (buffer) + "Return size of BUFFER." + (with-current-buffer buffer + (save-restriction + (widen) + (helm-file-human-size + (- (position-bytes (point-max)) + (position-bytes (point-min))))))) + +(defun helm-buffer--show-details (buf-name prefix help-echo + size mode dir face1 face2 + proc details type) + (append + (list + (let* ((buf-fname (buffer-file-name (get-buffer buf-name))) + (ext (if buf-fname (helm-file-name-extension buf-fname) "")) + (bmode (with-current-buffer buf-name major-mode)) + (icon (when helm-buffers-show-icons + (helm-aif (assq bmode all-the-icons-mode-icon-alist) + (apply (cadr it) (cddr it)) + (cond ((eq type 'dired) + (all-the-icons-octicon "file-directory")) + (buf-fname + (all-the-icons-icon-for-file buf-name)) + (t (all-the-icons-octicon "star" :v-adjust 0.0)))))) + (buf-name (propertize buf-name 'face face1 + 'help-echo help-echo + 'type type))) + (when (condition-case _err + (string-match (format "\\.\\(%s\\)" ext) buf-name) + (invalid-regexp nil)) + (add-face-text-property + (match-beginning 1) (match-end 1) + 'helm-ff-file-extension nil buf-name)) + (if icon + (concat icon " " prefix buf-name) + (concat prefix buf-name)))) + (and details + (list size mode + (propertize + (if proc + (format "(%s %s in `%s')" + (process-name proc) + (process-status proc) dir) + (format "(in `%s')" dir)) + 'face face2))))) + +(defun helm-buffer--format-mode-name (buf) + "Prevent using `format-mode-line' as much as possible." + (with-current-buffer buf + (helm-acond ((assq major-mode helm-buffer--pretty-names) + (cdr it)) + ((stringp mode-name) mode-name) + (t (format-mode-line mode-name nil nil (get-buffer buf)))))) + +(defun helm-buffer--details (buffer &optional details) + (require 'dired) + (let* ((mode (helm-buffer--format-mode-name buffer)) + (buf (get-buffer buffer)) + (size (propertize (helm-buffer-size buf) + 'face 'helm-buffer-size)) + (proc (get-buffer-process buf)) + (dir (with-current-buffer buffer + (helm-aif default-directory (abbreviate-file-name it)))) + (file-name (helm-aif (buffer-file-name buf) (abbreviate-file-name it))) + (name (buffer-name buf)) + (name-prefix (when (and dir (file-remote-p dir)) + (propertize "@ " 'face 'helm-ff-prefix))) + (archive-p (and (fboundp 'tramp-archive-file-name-p) + (tramp-archive-file-name-p dir)))) + (when name-prefix + ;; Remote tramp buffer names may be hexified, make them more readable. + (setq dir (helm-url-unhex-string dir) + name (helm-url-unhex-string name))) + ;; Handle tramp archive buffers specially. + (if archive-p + (helm-buffer--show-details + name name-prefix file-name size mode dir + 'helm-buffer-archive 'helm-buffer-process nil details 'filebuf) + ;; No fancy things on remote buffers. + (if (and name-prefix helm-buffer-skip-remote-checking) + (helm-buffer--show-details + name name-prefix file-name size mode dir + 'helm-buffer-file 'helm-buffer-process nil details 'filebuf) + (cond + (;; A dired buffer. + (rassoc buf dired-buffers) + (helm-buffer--show-details + name name-prefix dir size mode dir + 'helm-buffer-directory 'helm-buffer-process nil details 'dired)) + ;; A buffer file modified somewhere outside of emacs.=>red + ((and file-name + (file-exists-p file-name) + (not (verify-visited-file-modtime buf))) + (helm-buffer--show-details + name name-prefix file-name size mode dir + 'helm-buffer-saved-out 'helm-buffer-process nil details 'modout)) + ;; A new buffer file not already saved on disk (or a deleted file) .=>indianred2 + ((and file-name (not (file-exists-p file-name))) + (helm-buffer--show-details + name name-prefix file-name size mode dir + 'helm-buffer-not-saved 'helm-buffer-process nil details 'notsaved)) + ;; A buffer file modified and not saved on disk.=>orange + ((and file-name (buffer-modified-p buf)) + (helm-buffer--show-details + name name-prefix file-name size mode dir + 'helm-buffer-modified 'helm-buffer-process nil details 'mod)) + ;; A buffer file not modified and saved on disk.=>green + (file-name + (helm-buffer--show-details + name name-prefix file-name size mode dir + 'helm-buffer-file 'helm-buffer-process nil details 'filebuf)) + ;; A non-file, modified buffer See bug#1917 + ((with-current-buffer name + (and helm-buffers-tick-counter + (/= helm-buffers-tick-counter (buffer-modified-tick)))) + (helm-buffer--show-details + name (and proc name-prefix) dir size mode dir + 'helm-no-file-buffer-modified 'helm-buffer-process proc details 'nofile-mod)) + ;; Any non--file buffer.=>italic + (t + (helm-buffer--show-details + name (and proc name-prefix) dir size mode dir + 'helm-non-file-buffer 'helm-buffer-process proc details 'nofile))))))) + +(defun helm-highlight-buffers (buffers _source) + "Transformer function to highlight BUFFERS list. +Should be called after others transformers i.e. (boring +buffers)." + (cl-assert helm-fuzzy-matching-highlight-fn nil "Wrong type argument functionp: nil") + (cl-loop for i in buffers + for (name size mode meta) = (if helm-buffer-details-flag + (helm-buffer--details i 'details) + (helm-buffer--details i)) + for truncbuf = (if (> (string-width name) helm-buffer-max-length) + (helm-substring-by-width + name helm-buffer-max-length + helm-buffers-end-truncated-string) + (concat name + (make-string + (- (+ helm-buffer-max-length + (length + helm-buffers-end-truncated-string)) + (string-width name)) + ? ))) + for len = (length mode) + when (> len helm-buffer-max-len-mode) + do (setq helm-buffer-max-len-mode len) + for fmode = (concat (make-string + (- (max helm-buffer-max-len-mode len) len) ? ) + mode) + ;; The max length of a number should be 1023.9X where X is the + ;; units, this is 7 characters. + for formatted-size = (and size (format "%7s" size)) + collect (let ((helm-pattern (helm-buffers--pattern-sans-filters + (and helm-buffers-fuzzy-matching "")))) + (cons (if helm-buffer-details-flag + (concat + (funcall helm-fuzzy-matching-highlight-fn + truncbuf) + helm-buffers-column-separator + formatted-size + helm-buffers-column-separator + fmode + helm-buffers-column-separator + meta) + (funcall helm-fuzzy-matching-highlight-fn name)) + (get-buffer i))))) + +(defun helm-buffer--get-preselection (buffer) + (let* ((bufname (buffer-name buffer)) + (dispbuf (car (helm-buffer--details buffer))) + (len-dispbuf (string-width dispbuf)) + (len-prefix (- len-dispbuf (string-width bufname)))) + (when (and bufname + (file-remote-p (with-current-buffer bufname + default-directory))) + (setq bufname (concat "@ " (helm-url-unhex-string bufname)))) + (concat "^[[:multibyte:] ]*" + (if (and (null helm-buffer-details-flag) + (numberp helm-buffer-max-length) + (> len-dispbuf helm-buffer-max-length)) + (regexp-quote + (helm-substring-by-width + bufname + (- helm-buffer-max-length len-prefix) + helm-buffers-end-truncated-string)) + (concat (regexp-quote bufname) + (if helm-buffer-details-flag + "$" "[[:blank:]]+")))))) + +(defun helm-toggle-buffers-details () + (interactive) + (with-helm-alive-p + (let* ((buf (helm-get-selection)) + (preselect (helm-buffer--get-preselection buf))) + (setq helm-buffer-details-flag (not helm-buffer-details-flag)) + (helm-force-update (lambda () + (helm-awhile (re-search-forward preselect nil t) + (helm-mark-current-line) + (when (equal buf (helm-get-selection)) + (cl-return t)))))))) +(put 'helm-toggle-buffers-details 'helm-only t) + +(defun helm-buffers--pattern-sans-filters (&optional separator) + (cl-loop for p in (helm-mm-split-pattern helm-pattern) + unless (member (substring p 0 1) '("*" "/" "@" "!")) + collect p into lst + finally return (mapconcat #'identity lst (or separator " ")))) + +(defun helm-buffers-sort-transformer (candidates source) + (cl-assert helm-buffers-sort-fn nil "Wrong type argument functionp: nil") + (if (string= helm-pattern "") + candidates + (let ((helm-pattern (helm-buffers--pattern-sans-filters))) + (funcall helm-buffers-sort-fn candidates source)))) + +(defun helm-buffers-mark-similar-buffers-1 (&optional type) + (with-helm-window + (let* ((src (helm-get-current-source)) + (sel (helm-get-selection nil 'withprop src)) + (type (or type (get-text-property + (min 2 (length sel)) 'type sel)))) + (helm-map-candidates-in-source src + (lambda (_cand) (helm-make-visible-mark)) + (lambda (cand) + (and (not (helm-this-visible-mark)) + (eq (get-text-property 2 'type cand) type)))) + (helm-mark-current-line) + (helm-display-mode-line src t) + (when helm-marked-candidates + (message "%s candidates marked" (length helm-marked-candidates)) + (set-window-margins (selected-window) 1))))) + +(defun helm-buffers-mark-similar-buffers () + "Mark All buffers that have same property `type' than current. +I.e. same color." + (interactive) + (with-helm-alive-p + (let ((marked (helm-marked-candidates))) + (if (and (>= (length marked) 1) + (with-helm-window helm-visible-mark-overlays)) + (helm-unmark-all) + (helm-buffers-mark-similar-buffers-1))))) +(put 'helm-buffers-mark-similar-buffers 'helm-only t) + + +;;; match functions +;; +(defun helm-buffer--match-mjm (pattern mjm) + (when (string-match "\\`\\*" pattern) + (cl-loop with patterns = (split-string (substring pattern 1) ",") + for pat in patterns + if (string-match "\\`!" pat) + collect (string-match (substring pat 1) mjm) into neg + else collect (string-match pat mjm) into pos + finally return + (let ((neg-test (cl-loop for i in neg thereis (numberp i))) + (pos-test (cl-loop for i in pos thereis (numberp i)))) + (or + (and neg (not pos) (not neg-test)) + (and pos pos-test) + (and neg neg-test (not neg-test))))))) + +(defvar helm-buffer--memo-hash (make-hash-table :test 'equal)) +(defun helm-buffer--memo-pattern (pattern) + (or (gethash pattern helm-buffer--memo-hash) + (puthash pattern (helm--mapconcat-pattern pattern) + helm-buffer--memo-hash))) + +(defun helm-buffer--match-pattern (pattern candidate &optional nofuzzy) + (let ((bfn (if (and helm-buffers-fuzzy-matching + (not nofuzzy) + (not helm-migemo-mode) + (not (string-match "\\`\\^" pattern))) + #'helm-buffer--memo-pattern + #'identity)) + (mfn (if helm-migemo-mode + #'helm-mm-migemo-string-match #'string-match))) + (if (string-match "\\`!" pattern) + (not (funcall mfn (funcall bfn (substring pattern 1)) + candidate)) + (funcall mfn (funcall bfn pattern) candidate)))) + +(defun helm-buffers--match-from-mjm (candidate) + (let* ((cand (replace-regexp-in-string "^\\s-\\{1\\}" "" candidate)) + (buf (get-buffer cand)) + (regexp (cl-loop with pattern = helm-pattern + for p in (helm-mm-split-pattern pattern) + when (string-match "\\`\\*" p) + return p))) + (if regexp + (when buf + (with-current-buffer buf + (let ((mjm (symbol-name major-mode))) + (helm-buffer--match-mjm regexp mjm)))) + t))) + +(defun helm-buffers--match-from-pat (candidate) + (let* ((regexp-list (cl-loop with pattern = helm-pattern + for p in (helm-mm-split-pattern pattern) + unless (string-match + "\\`\\(\\*\\|/\\|@\\)" p) + collect p)) + (nofuzzy (cdr regexp-list))) + (if regexp-list + (cl-loop for re in regexp-list + always (helm-buffer--match-pattern re candidate nofuzzy)) + t))) + +(defun helm-buffers--match-from-inside (candidate) + (let* ((cand (replace-regexp-in-string "^\\s-\\{1\\}" "" candidate)) + (buf (get-buffer cand)) + (pattern (cl-loop with pat = helm-pattern + for p in (helm-mm-split-pattern pat) + when (string-match "\\`@\\(.*\\)" p) + collect (match-string 1 p) into lst + finally return (mapconcat #'identity lst " "))) + (patterns (helm-mm-3-get-patterns pattern))) + (if (and buf patterns) + (with-current-buffer buf + (save-excursion + (goto-char (point-min)) + (cl-loop for (pred . regexp) in patterns + always + (save-excursion + (funcall + pred + (if helm-migemo-mode + (helm-mm-migemo-forward regexp nil t) + (re-search-forward regexp nil t))))))) + t))) + +(defun helm-buffers--match-from-directory (candidate) + (let* ((cand (replace-regexp-in-string "^\\s-\\{1\\}" "" candidate)) + (buf (get-buffer cand)) + (buf-fname (or (buffer-file-name buf) + (car-safe (rassoc buf dired-buffers)))) + (regexps (cl-loop with pattern = helm-pattern + for p in (helm-mm-split-pattern pattern) + when (string-match "\\`/" p) + collect p))) + (if regexps + (cl-loop for re in regexps + thereis + (and buf-fname + (string-match + (substring re 1) (helm-basedir buf-fname)))) + t))) + +(defun helm-buffers-match-function (candidate) + "Default function to match buffers." + (and (helm-buffers--match-from-pat candidate) + (helm-buffers--match-from-mjm candidate) + (helm-buffers--match-from-inside candidate) + (helm-buffers--match-from-directory candidate))) + + +(defun helm-buffer-query-replace-1 (&optional regexp-flag buffers) + "Query replace in marked buffers. +If REGEXP-FLAG is given use `query-replace-regexp'." + (let ((prompt (if regexp-flag "Query replace regexp" "Query replace")) + (bufs (or buffers (helm-marked-candidates))) + (helm--reading-passwd-or-string t)) + (cl-loop with args = (query-replace-read-args prompt regexp-flag t) + for buf in bufs + do + (save-window-excursion + (switch-to-buffer buf) + (save-excursion + (let ((case-fold-search t)) + (goto-char (point-min)) + (apply #'perform-replace + (list (nth 0 args) (nth 1 args) + t regexp-flag (nth 2 args) nil + multi-query-replace-map)))))))) + +(defun helm-buffer-query-replace-regexp (_candidate) + (helm-buffer-query-replace-1 'regexp)) + +(defun helm-buffer-query-replace (_candidate) + (helm-buffer-query-replace-1)) + +(defun helm-buffer-toggle-diff (candidate) + "Toggle diff buffer CANDIDATE with it's file." + (helm-aif (get-buffer-window "*Diff*" 'visible) + (progn (kill-buffer "*Diff*") + (set-window-buffer it helm-current-buffer)) + (let ((buf (get-buffer candidate))) + (if (buffer-file-name buf) + (diff-buffer-with-file buf) + (user-error "Buffer `%s' is not associated to a file" + (buffer-name buf)))))) + +(helm-make-persistent-command-from-action helm-buffer-diff-persistent + "Toggle diff buffer without quitting helm." + 'diff-action 'helm-buffer-toggle-diff) + +(defun helm-revert-buffer (candidate) + (with-current-buffer candidate + (helm-aif (buffer-file-name) + (and (file-exists-p it) (revert-buffer t t))))) + +(defun helm-revert-marked-buffers (_ignore) + (mapc #'helm-revert-buffer (helm-marked-candidates))) + +(defun helm-buffer-revert-and-update (_candidate) + (with-helm-buffer + (let ((marked (helm-marked-candidates)) + (preselect (helm-buffers--quote-truncated-buffer + (helm-get-selection)))) + (cl-loop for buf in marked do (helm-revert-buffer buf)) + (when helm-marked-candidates (helm-unmark-all)) + (helm-force-update preselect)))) + +(helm-make-persistent-command-from-action helm-buffer-revert-persistent + "Revert buffer without quitting helm." + 'revert-action 'helm-buffer-revert-and-update) + +(defun helm-buffer-save-and-update (_candidate) + (with-helm-buffer + (let ((marked (helm-marked-candidates)) + (preselect (helm-get-selection nil t)) + (enable-recursive-minibuffers t)) + (cl-assert marked nil "No buffers need to be saved") + (cl-loop for buf in marked do + (with-current-buffer (get-buffer buf) + (when (buffer-file-name) (save-buffer)))) + (when helm-marked-candidates (helm-unmark-all)) + (helm-force-update (regexp-quote preselect))))) + +(defun helm-buffer-save-some-buffers (_candidate) + (helm-buffers-mark-similar-buffers-1 'mod) + (helm-buffer-save-and-update nil)) + +(helm-make-persistent-command-from-action helm-buffer-run-save-some-buffers + "Save unsaved file buffers without quitting Helm." + 'save-some-action 'helm-buffer-save-some-buffers) + +(helm-make-persistent-command-from-action helm-buffer-save-persistent + "Save buffer without quitting Helm." +'save-action 'helm-buffer-save-and-update) + +(defun helm-buffers-rename-buffer (candidate) + (with-current-buffer candidate + (rename-buffer (helm-read-string "New name: " (buffer-name)) t))) + +(helm-make-command-from-action helm-buffer-run-rename-buffer + "Run rename buffer action from `helm-source-buffers-list'." + 'helm-buffers-rename-buffer) + +(defun helm-switch-to-buffer-at-linum (candidate) + (let ((linum (read-number + "Line number: " + (with-current-buffer candidate + (line-number-at-pos))))) + (switch-to-buffer candidate) + (goto-char (point-min)) + (forward-line (1- linum)))) + +(helm-make-command-from-action helm-buffer-run-goto-line + "Switch to buffer at line number." + 'helm-switch-to-buffer-at-linum) + +(helm-make-persistent-command-from-action helm-buffer-run-kill-persistent + "Kill buffer without quitting Helm." + 'kill-action 'helm-buffers-persistent-kill) + +(defun helm-kill-marked-buffers (_ignore) + (let* ((bufs (helm-marked-candidates)) + (killed-bufs (cl-count-if 'kill-buffer bufs))) + (when (buffer-live-p helm-buffer) + (with-helm-buffer + (setq helm-marked-candidates nil + helm-visible-mark-overlays nil))) + (message "Killed %s buffer(s)" killed-bufs))) + +(helm-make-command-from-action helm-buffer-run-kill-buffers + "Run kill buffer action from `helm-source-buffers-list'." + 'helm-kill-marked-buffers) + +(defun helm-buffer-switch-to-shell (candidate) + (require 'helm-files) + (let ((helm-ff-default-directory + (with-current-buffer candidate + default-directory))) + (helm-ff-switch-to-shell nil))) + +(helm-make-command-from-action helm-buffer-run-switch-to-shell + "Run switch to shell action from helm-buffers-list." + 'helm-buffer-switch-to-shell) + +(helm-make-command-from-action helm-buffer-run-grep + "Run Grep action from `helm-source-buffers-list'." + 'helm-grep-buffers) + +(helm-make-command-from-action helm-buffer-run-zgrep + "Run Grep action from `helm-source-buffers-list'." + 'helm-zgrep-buffers) + +(helm-make-command-from-action helm-buffer-run-query-replace-regexp + "Run Query replace regexp action from `helm-source-buffers-list'." +'helm-buffer-query-replace-regexp) + +(helm-make-command-from-action helm-buffer-run-query-replace + "Run Query replace action from `helm-source-buffers-list'." +'helm-buffer-query-replace) + +(helm-make-command-from-action helm-buffer-switch-other-window + "Run switch to other window action from `helm-source-buffers-list'." + 'helm-buffer-switch-buffers-other-window) + +(defun helm-buffer-switch-to-buffer-other-frame (_candidate) + "Display marked buffers in other frame." + (let ((bufs (helm-marked-candidates))) + (select-frame (make-frame)) + (helm-window-show-buffers bufs))) + +(defun helm-buffers-maybe-raise-buffer-frame (candidate) + "Raise buffer frame handling buffer CANDIDATE and switch to it." + (let ((oframe (window-frame (get-buffer-window candidate 0)))) + (unless (eql oframe (selected-frame)) + (raise-frame oframe)) + (with-selected-frame oframe + (switch-to-buffer candidate)))) + +(helm-make-command-from-action helm-buffer-switch-other-frame + "Run switch to other frame action from `helm-source-buffers-list'." + 'helm-buffer-switch-to-buffer-other-frame) + +(defun helm-buffers-switch-to-buffer-other-tab (_candidate) + (when (fboundp 'switch-to-buffer-other-tab) + (let ((bufs (helm-marked-candidates))) + (cl-loop for buf in bufs + do (switch-to-buffer-other-tab buf))))) + +(helm-make-command-from-action helm-buffers-switch-to-buffer-new-tab + "Run switch to buffer in other tab action from `helm-source-buffers-list'." + 'helm-buffers-switch-to-buffer-other-tab + (cl-assert (fboundp 'tab-bar-mode) nil "Tab-bar-mode not available")) + +(defun helm-buffer-switch-buffers (_candidate) + "Switch to buffer candidates and replace current buffer. + +If more than one buffer marked switch to these buffers in +separate windows. If a prefix arg is given split windows +vertically." + (let ((buffers (helm-marked-candidates))) + (helm-window-show-buffers buffers))) + +(defun helm-buffer-switch-buffers-other-window (_candidate) + "Switch to marked buffers in other windows." + (let ((buffers (helm-marked-candidates))) + (helm-window-show-buffers buffers t))) + +(helm-make-command-from-action helm-buffer-run-ediff + "Run ediff action from `helm-source-buffers-list'." + 'helm-ediff-marked-buffers) + +(helm-make-command-from-action helm-buffer-run-ediff-merge + "Run ediff action from `helm-source-buffers-list'." + 'helm-ediff-marked-buffers-merge) + +(defun helm-buffers-persistent-kill-1 (buffer-or-name) + "Persistent action to kill buffer." + (let ((buf (get-buffer buffer-or-name)) helm-buf-or-cur) + (if (or (and (eql buf (get-buffer helm-current-buffer)) + (setq helm-buf-or-cur "helm-current-buffer")) + (and (eql buf (get-buffer helm-buffer)) + (setq helm-buf-or-cur "helm-buffer"))) + (progn + (message "Can't kill `%s' without quitting session" helm-buf-or-cur) + (sit-for 1)) + (kill-buffer buf) + (helm-delete-current-selection)))) + +(defun helm-buffers--quote-truncated-buffer (buffer) + (let ((bufname (and (bufferp buffer) + (buffer-name buffer)))) + (when (and bufname + (file-remote-p (with-current-buffer bufname + default-directory))) + (setq bufname (concat "@ " (helm-url-unhex-string bufname)))) + (when bufname + (regexp-quote + (if (and helm-buffer-max-length + helm-buffer-details-flag) + (helm-substring-by-width + bufname helm-buffer-max-length + "") + bufname))))) + +(defun helm-buffers-persistent-kill (_buffer) + (let ((marked (helm-marked-candidates)) + (sel (helm-get-selection)) + (msg "Buffer `%s' modified, please save it before kill")) + (unwind-protect + (cl-loop for b in marked + do (if (and (buffer-file-name b) (buffer-modified-p b)) + (message msg (buffer-name b)) + ;; We need to preselect each marked because + ;; helm-buffers-persistent-kill-1 is deleting + ;; current selection. + (helm-preselect + (format "^%s" + (helm-buffers--quote-truncated-buffer b))) + (helm-buffers-persistent-kill-1 b) + (message nil) + (helm--remove-marked-and-update-mode-line b))) + (with-helm-buffer + (setq helm-marked-candidates nil + helm-visible-mark-overlays nil)) + (helm-force-update (helm-buffers--quote-truncated-buffer sel))))) + +(defun helm-buffers-list-persistent-action (candidate) + (let ((current (window-buffer helm-persistent-action-display-window))) + (if (or (helm-follow-mode-p) + (eql current (get-buffer helm-current-buffer)) + (not (eql current (get-buffer candidate)))) + (display-buffer candidate) + (if (and helm-persistent-action-display-window + (window-dedicated-p + (next-window helm-persistent-action-display-window 1))) + (delete-window helm-persistent-action-display-window) + (switch-to-buffer helm-current-buffer))))) + +(defun helm-ediff-marked-buffers (_candidate &optional merge) + "Ediff 2 marked buffers or CANDIDATE and `helm-current-buffer'. +With optional arg MERGE call `ediff-merge-buffers'." + (let* ((mkd (helm-marked-candidates)) + (lg-lst (length mkd)) + buf1 buf2) + (cl-case lg-lst + (0 + (error "Error:You have to mark at least 1 buffer")) + (1 + (setq buf1 helm-current-buffer + buf2 (cl-first mkd))) + (2 + (setq buf1 (cl-first mkd) + buf2 (cl-second mkd))) + (t + (error "Error:Too many buffers marked!"))) + (if merge + (ediff-merge-buffers buf1 buf2) + (ediff-buffers buf1 buf2)))) + +(defun helm-ediff-marked-buffers-merge (candidate) + "Ediff merge `helm-current-buffer' with CANDIDATE. +See `helm-ediff-marked-buffers'." + (helm-ediff-marked-buffers candidate t)) + +(defun helm-multi-occur-as-action (_candidate) + "Multi occur action for `helm-source-buffers-list'. +Can be used by any source that list buffers." + (let ((helm-occur-always-search-in-current + (if helm-current-prefix-arg + (not helm-occur-always-search-in-current) + helm-occur-always-search-in-current)) + (buffers (helm-marked-candidates)) + (input (cl-loop for i in (split-string (or (buffer-local-value + 'helm-input-local + (get-buffer helm-buffer)) + helm-pattern) + " " t) + thereis (and (string-match "\\`@\\([^!]*\\)" i) + (match-string 1 i))))) + (helm-multi-occur-1 buffers input))) + +(helm-make-command-from-action helm-buffers-run-occur + "Run `helm-multi-occur-as-action' by key." + 'helm-multi-occur-as-action) + +(defun helm-buffers-toggle-show-hidden-buffers () + (interactive) + (with-helm-alive-p + (let ((filter-attrs (helm-get-attr 'filtered-candidate-transformer + helm-source-buffers-list)) + (sel (helm-get-selection))) + (if (memq 'helm-shadow-boring-buffers filter-attrs) + (helm-set-attr 'filtered-candidate-transformer + (cons 'helm-skip-boring-buffers + (remove 'helm-shadow-boring-buffers + filter-attrs)) + helm-source-buffers-list) + (helm-set-attr 'filtered-candidate-transformer + (cons 'helm-shadow-boring-buffers + (remove 'helm-skip-boring-buffers + filter-attrs)) + helm-source-buffers-list)) + (helm-force-update (helm-buffers--quote-truncated-buffer sel))))) +(put 'helm-buffers-toggle-show-hidden-buffers 'helm-only t) + +(defun helm-buffers-browse-project (buf) + "Browse project from buffer BUF." + (with-current-buffer buf + (helm-browse-project helm-current-prefix-arg))) + +(helm-make-command-from-action helm-buffers-run-browse-project + "Run `helm-buffers-browse-project' from key." + 'helm-buffers-browse-project + (cl-assert (not helm-buffers-in-project-p) + nil "You are already browsing this project")) + +;;;###autoload +(defun helm-buffers-quit-and-find-file-fn (source) + (let* ((sel (get-buffer (helm-get-selection nil nil source))) + (bname (and (bufferp sel) (buffer-name sel)))) + (when bname + (or (buffer-file-name sel) + (car (rassoc bname dired-buffers)) + (and (with-current-buffer bname + (eq major-mode 'org-agenda-mode)) + org-directory + (expand-file-name org-directory)) + (with-current-buffer bname + (expand-file-name default-directory)))))) + +;;; Candidate Transformers +;; +;; +(defun helm-skip-boring-buffers (buffers _source) + "Remove buffers matching `helm-boring-buffer-regexp-list' in BUFFERS. +Where BUFFERS is a list of buffer names." + (helm-skip-entries buffers + helm-boring-buffer-regexp-list + helm-white-buffer-regexp-list)) + +(defun helm-shadow-boring-buffers (buffers _source) + "Buffers matching `helm-boring-buffer-regexp' will be +displayed with the `file-name-shadow' face if available." + (helm-shadow-entries buffers helm-boring-buffer-regexp-list)) + + +;;;###autoload +(defun helm-buffers-list () + "Preconfigured `helm' to list buffers." + (interactive) + (unless helm-source-buffers-list + (setq helm-source-buffers-list + (helm-make-source "Buffers" 'helm-source-buffers))) + (helm :sources '(helm-source-buffers-list + helm-source-buffer-not-found) + :buffer "*helm buffers*" + :truncate-lines helm-buffers-truncate-lines + :left-margin-width helm-buffers-left-margin-width)) + +;;;###autoload +(defun helm-mini () + "Preconfigured `helm' displaying `helm-mini-default-sources'." + (interactive) + (require 'helm-x-files) + (unless helm-source-buffers-list + (setq helm-source-buffers-list + (helm-make-source "Buffers" 'helm-source-buffers))) + (helm :sources helm-mini-default-sources + :buffer "*helm mini*" + :ff-transformer-show-only-basename nil + :truncate-lines helm-buffers-truncate-lines + :left-margin-width helm-buffers-left-margin-width)) + +(defun helm-quit-and-helm-mini () + "Drop into `helm-mini' from `helm'." + (interactive) + (with-helm-alive-p + (helm-run-after-exit 'helm-mini))) + +(provide 'helm-buffers) + +;;; helm-buffers.el ends here diff --git a/code/elpa/helm-20240320.541/helm-color.el b/code/elpa/helm-20240320.541/helm-color.el new file mode 100644 index 0000000..03c9307 --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-color.el @@ -0,0 +1,159 @@ +;;; helm-color.el --- colors and faces -*- lexical-binding: t -*- + +;; Copyright (C) 2012 ~ 2023 Thierry Volpiatto + +;; 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 'helm) +(require 'helm-help) +(require 'helm-elisp) + +(declare-function list-colors-display "facemenu") + +;;; Customize Face +;; +;; +(defun helm-custom-faces-init () + "Initialize buffer for `helm-source-customize-face'." + (unless (helm-candidate-buffer) + (save-selected-window + (list-faces-display) + (message nil)) + (helm-init-candidates-in-buffer + 'global + (with-current-buffer (get-buffer "*Faces*") + (buffer-substring + (next-single-char-property-change (point-min) 'category) + (point-max)))) + (kill-buffer "*Faces*"))) + +(defvar helm-source-customize-face + (helm-build-in-buffer-source "Customize Face" + :init 'helm-custom-faces-init + :get-line 'buffer-substring + :persistent-action (lambda (candidate) + (helm-elisp--persistent-help + (intern (car (split-string candidate))) + 'helm-describe-face)) + :persistent-help "Describe face" + :action '(("Customize" + . (lambda (line) + (customize-face (intern (car (split-string line)))))) + ("Copy name" + . (lambda (line) + (kill-new (car (split-string line " " t))))))) + "See (info \"(emacs)Faces\")") + +;;; Colors browser +;; +;; +(defun helm-colors-init () + (require 'facemenu) + (unless (helm-candidate-buffer) + (save-selected-window + (list-colors-display) + (message nil)) + (helm-init-candidates-in-buffer + 'global + (with-current-buffer (get-buffer "*Colors*") + (buffer-string))) + (kill-buffer "*Colors*"))) + +(defun helm-color-insert-name (candidate) + (with-helm-current-buffer + (insert (helm-colors-get-name candidate)))) + +(defun helm-color-kill-name (candidate) + (kill-new (helm-colors-get-name candidate))) + +(defun helm-color-insert-rgb (candidate) + (with-helm-current-buffer + (insert (helm-colors-get-rgb candidate)))) + +(defun helm-color-kill-rgb (candidate) + (kill-new (helm-colors-get-rgb candidate))) + +(helm-make-command-from-action helm-color-run-insert-name + "Insert name of color from `helm-source-colors'." + 'helm-color-insert-name) + +(helm-make-command-from-action helm-color-run-kill-name + "Kill name of color from `helm-source-colors'." + 'helm-color-kill-name) + +(helm-make-command-from-action helm-color-run-insert-rgb + "Insert RGB of color from `helm-source-colors'." + 'helm-color-insert-rgb) + +(helm-make-command-from-action helm-color-run-kill-rgb + "Kill RGB of color from `helm-source-colors'." + 'helm-color-kill-rgb) + +(defvar helm-color-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map helm-map) + (define-key map (kbd "C-c n") #'helm-color-run-insert-name) + (define-key map (kbd "C-c N") #'helm-color-run-kill-name) + (define-key map (kbd "C-c r") #'helm-color-run-insert-rgb) + (define-key map (kbd "C-c R") #'helm-color-run-kill-rgb) + map)) + +(defvar helm-source-colors + (helm-build-in-buffer-source "Colors" + :init 'helm-colors-init + :get-line 'buffer-substring + :keymap helm-color-map + :persistent-help "Kill entry in RGB format." + :persistent-action 'helm-color-kill-rgb + :help-message 'helm-colors-help-message + :action + '(("Copy Name (C-c N)" . helm-color-kill-name) + ("Copy RGB (C-c R)" . helm-color-kill-rgb) + ("Insert Name (C-c n)" . helm-color-insert-name) + ("Insert RGB (C-c r)" . helm-color-insert-rgb)))) + +(defun helm-colors-get-name (candidate) + "Get color name." + (replace-regexp-in-string + " " "" + (with-temp-buffer + (insert (capitalize candidate)) + (goto-char (point-min)) + (search-forward-regexp "\\s-\\{2,\\}") + (delete-region (point) (point-max)) + (buffer-string)))) + +(defun helm-colors-get-rgb (candidate) + "Get color RGB." + (replace-regexp-in-string + " " "" + (with-temp-buffer + (insert (capitalize candidate)) + (goto-char (point-max)) + (search-backward-regexp "\\s-\\{2,\\}") + (delete-region (point) (point-min)) + (buffer-string)))) + +;;;###autoload +(defun helm-colors () + "Preconfigured `helm' for color." + (interactive) + (helm :sources '(helm-source-colors helm-source-customize-face) + :buffer "*helm colors*")) + +(provide 'helm-color) + +;;; helm-color.el ends here diff --git a/code/elpa/helm-20240320.541/helm-command.el b/code/elpa/helm-20240320.541/helm-command.el new file mode 100644 index 0000000..2145d64 --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-command.el @@ -0,0 +1,417 @@ +;;; helm-command.el --- Helm execute-exended-command. -*- lexical-binding: t -*- + +;; Copyright (C) 2012 ~ 2023 Thierry Volpiatto + +;; 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 'helm) +(require 'helm-help) +(require 'helm-mode) +(require 'helm-elisp) + + +(defvar helm-M-x-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map helm-comp-read-map) + (define-key map (kbd "C-u") nil) + (define-key map (kbd "C-u") #'helm-M-x-universal-argument) + (define-key map (kbd "C-]") #'helm-M-x-toggle-short-doc) + map)) + + +(defgroup helm-command nil + "Emacs command related Applications and libraries for Helm." + :group 'helm) + +(defcustom helm-M-x-always-save-history nil + "`helm-M-x' save command in `extended-command-history' even when it fails." + :type 'boolean) + +(defcustom helm-M-x-reverse-history nil + "The history source of `helm-M-x' appear in second position when non-nil." + :type 'boolean) + +(defcustom helm-M-x-fuzzy-match t + "Helm-M-x fuzzy matching when non nil." + :type 'boolean) + +(defcustom helm-M-x-show-short-doc nil + "Show short docstring of command when non nil. +This value can be toggled with +\\\\[helm-M-x-toggle-short-doc] while in helm-M-x session." + :type 'boolean) + + +;;; Faces +;; +;; +(defgroup helm-command-faces nil + "Customize the appearance of helm-command." + :prefix "helm-" + :group 'helm-command + :group 'helm-faces) + +(defface helm-M-x-key + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "orange" :box (:line-width -1))) + "Face used in helm-M-x to show keybinding." + :group 'helm-command-faces) + +(defface helm-command-active-mode + '((t :inherit font-lock-builtin-face)) + "Face used by `helm-M-x' for activated modes." + :group 'helm-command-faces) + +(defface helm-M-x-short-doc + '((t :box (:line-width -1) :foreground "DimGray")) + "Face used by `helm-M-x' for short docstring." + :group 'helm-command-faces) + +(defvar helm-M-x-input-history nil) +(defvar helm-M-x-prefix-argument nil + "Prefix argument before calling `helm-M-x'.") +(defvar helm-M-x--timer nil) +(defvar helm-M-x--unwind-forms-done nil) + +(defun helm-M-x-get-major-mode-command-alist (mode-map) + "Return alist of MODE-MAP." + (when mode-map + (cl-loop for key being the key-seqs of mode-map using (key-bindings com) + for str-key = (key-description key) + for ismenu = (string-match "" str-key) + unless ismenu collect (cons str-key com)))) + +(defun helm-get-mode-map-from-mode (mode) + "Guess the mode-map name according to MODE. +Some modes don't use conventional mode-map name so we need to +guess mode-map name. E.g. `python-mode' ==> py-mode-map. +Return nil if no mode-map found." + (cl-loop ;; Start with a conventional mode-map name. + with mode-map = (intern-soft (format "%s-map" mode)) + with mode-string = (symbol-name mode) + with mode-name = (replace-regexp-in-string "-mode" "" mode-string) + while (not mode-map) + for count downfrom (length mode-name) + ;; Return when no result after parsing entire string. + when (eq count 0) return nil + for sub-name = (substring mode-name 0 count) + do (setq mode-map (intern-soft (format "%s-map" (concat sub-name "-mode")))) + finally return mode-map)) + +(defun helm-M-x-current-mode-map-alist () + "Return mode-map alist of current `major-mode'." + (let ((map-sym (helm-get-mode-map-from-mode major-mode))) + (when (and map-sym (boundp map-sym)) + (helm-M-x-get-major-mode-command-alist (symbol-value map-sym))))) + +(defun helm-M-x-toggle-short-doc () + "Toggle short doc display in helm-M-x." + (interactive) + (setq helm-M-x-show-short-doc (not helm-M-x-show-short-doc)) + (helm-force-update (concat "^" (helm-get-selection)) (helm-get-current-source))) +(put 'helm-M-x-toggle-short-doc 'no-helm-mx t) + +(defun helm-M-x-transformer-1 (candidates &optional sort ignore-props) + "Transformer function to show bindings in emacs commands. +Show global bindings and local bindings according to current +`major-mode'. +If SORT is non nil sort list with `helm-generic-sort-fn'. +Note that SORT should not be used when fuzzy matching because +fuzzy matching is running its own sort function with a different +algorithm." + (with-helm-current-buffer + (cl-loop with local-map = (helm-M-x-current-mode-map-alist) + for cand in candidates + for local-key = (car (rassq cand local-map)) + for key = (substitute-command-keys (format "\\[%s]" cand)) + for sym = (intern (if (consp cand) (car cand) cand)) + for doc = (when helm-M-x-show-short-doc + (helm-get-first-line-documentation (intern-soft cand))) + for disp = (if (or (eq sym major-mode) + (and (memq sym minor-mode-list) + (boundp sym) + (buffer-local-value + sym helm-current-buffer))) + (propertize cand 'face 'helm-command-active-mode) + cand) + unless (and (null ignore-props) + (or (get sym 'helm-only) (get sym 'no-helm-mx))) + collect + (cons (cond ((and (string-match "^M-x" key) local-key) + (propertize + (format "%s%s%s %s" + disp + (if doc (helm-make-separator cand) "") + (if doc + (propertize + doc 'face 'helm-M-x-short-doc) + "") + (propertize + " " 'display + (propertize local-key 'face 'helm-M-x-key))) + 'match-part disp)) + ((and (string-match "^M-x" key) + (not (string= key "M-x"))) + (propertize + (format "%s%s%s" + disp + (if doc (helm-make-separator cand) "") + (if doc + (propertize + doc 'face 'helm-M-x-short-doc) + "")) + 'match-part disp)) + (t (propertize + (format "%s%s%s %s" + disp + (if doc (helm-make-separator cand) "") + (if doc + (propertize + doc 'face 'helm-M-x-short-doc) + "") + (propertize + " " 'display + (propertize key 'face 'helm-M-x-key))) + 'match-part disp))) + cand) + into ls + finally return + (if sort (sort ls #'helm-generic-sort-fn) ls)))) + +(defun helm-M-x-transformer (candidates _source) + "Transformer function for `helm-M-x' candidates." + ;; Generic sort function is handling helm-flex. + (helm-M-x-transformer-1 candidates (null helm--in-fuzzy))) + +(defun helm-M-x-transformer-no-sort (candidates _source) + "Transformer function for `helm-M-x' candidates." + (helm-M-x-transformer-1 candidates)) + +(defun helm-M-x-transformer-no-sort-no-props (candidates _source) + "Transformer function for `helm-M-x' candidates." + (helm-M-x-transformer-1 candidates nil t)) + +(defun helm-M-x--notify-prefix-arg () + ;; Notify a prefix-arg set AFTER calling M-x. + (when prefix-arg + (with-helm-window + (helm-display-mode-line (helm-get-current-source) 'force)))) + +(defun helm-cmd--get-current-function-name () + (save-excursion + (beginning-of-defun) + (cadr (split-string (buffer-substring-no-properties + (pos-bol) (pos-eol)))))) + +(defun helm-cmd--get-preconfigured-commands (&optional dir) + (let* ((helm-dir (or dir (helm-basedir (locate-library "helm")))) + (helm-autoload-file (expand-file-name "helm-autoloads.el" helm-dir)) + results) + (when (file-exists-p helm-autoload-file) + (with-temp-buffer + (insert-file-contents helm-autoload-file) + (while (re-search-forward "Preconfigured" nil t) + (push (substring (helm-cmd--get-current-function-name) 1) results)))) + results)) + +(defun helm-M-x-universal-argument () + "Same as `universal-argument' but for `helm-M-x'." + (interactive) + (if helm-M-x-prefix-argument + (progn (setq helm-M-x-prefix-argument nil) + (let ((inhibit-read-only t)) + (with-selected-window (minibuffer-window) + (save-excursion + (goto-char (point-min)) + (delete-char (- (minibuffer-prompt-width) (length "M-x ")))))) + (message "Initial prefix arg disabled")) + (setq prefix-arg (list 4)) + (universal-argument--mode))) +(put 'helm-M-x-universal-argument 'helm-only t) + +(defun helm-M-x-persistent-action (candidate) + (helm-elisp--persistent-help + candidate 'helm-describe-function)) + +(defun helm-M-x--move-selection-after-hook () + (setq current-prefix-arg nil)) + +(defun helm-M-x--before-action-hook () + (remove-hook 'helm-move-selection-after-hook + #'helm-M-x--move-selection-after-hook)) + +(defclass helm-M-x-class (helm-source-in-buffer helm-type-command) + ((requires-pattern :initform 0) + (must-match :initform t) + (filtered-candidate-transformer :initform 'helm-M-x-transformer) + (persistent-help :initform "Describe this command") + (help-message :initform 'helm-M-x-help-message) + (nomark :initform t) + (cleanup :initform #'helm-M-x--unwind-forms) + (keymap :initform 'helm-M-x-map) + (resume :initform 'helm-M-x-resume-fn))) + +(defun helm-M-x-resume-fn () + (when (and helm-M-x--timer (timerp helm-M-x--timer)) + (cancel-timer helm-M-x--timer) + (setq helm-M-x--timer nil)) + (setq helm-M-x--timer (run-at-time 1 0.1 #'helm-M-x--notify-prefix-arg)) + (setq helm--mode-line-display-prefarg t) + ;; Prevent displaying a wrong prefix arg when helm-resume is called + ;; from prefix arg. + (setq current-prefix-arg nil)) + +(defun helm-M-x-read-extended-command (collection &optional predicate history) + "Read or execute action on command name in COLLECTION or HISTORY. + +Helm completion is not provided when executing or defining kbd macros. + +Arg COLLECTION should be an `obarray'. +Arg PREDICATE is a function that default to `commandp'. +Arg HISTORY default to `extended-command-history'." + (setq helm--mode-line-display-prefarg t) + (let* ((pred (or predicate #'commandp)) + (helm-fuzzy-sort-fn (lambda (candidates _source) + ;; Sort on real candidate otherwise + ;; "symbol ()" is used when sorting. + (helm-fuzzy-matching-default-sort-fn-1 candidates t))) + (sources `(,(helm-make-source "Emacs Commands history" 'helm-M-x-class + :data (lambda () + (helm-comp-read-get-candidates + ;; History should be quoted to + ;; force `helm-comp-read-get-candidates' + ;; to use predicate against + ;; symbol and not string. + (or history 'extended-command-history) + ;; Ensure using empty string to + ;; not defeat helm matching fns [1] + pred nil nil "")) + :fuzzy-match helm-M-x-fuzzy-match) + ,(helm-make-source "Emacs Commands" 'helm-M-x-class + :data (lambda () + (helm-comp-read-get-candidates + ;; [1] Same comment as above. + collection pred nil nil "")) + :fuzzy-match helm-M-x-fuzzy-match))) + (prompt (concat (helm-acase helm-M-x-prefix-argument + (- "-") + ((guard (and (consp it) (car it))) + (if (eq guard 4) "C-u " (format "%d " guard))) + ((guard (integerp it)) (format "%d " it))) + "M-x "))) + (setq helm-M-x--timer (run-at-time 1 0.1 #'helm-M-x--notify-prefix-arg)) + ;; Fix Bug#2250, add `helm-move-selection-after-hook' which + ;; reset prefix arg to nil only for this helm session. + (add-hook 'helm-move-selection-after-hook + #'helm-M-x--move-selection-after-hook) + (add-hook 'helm-before-action-hook + #'helm-M-x--before-action-hook) + (when (and sources helm-M-x-reverse-history) + (setq sources (nreverse sources))) + (unwind-protect + (progn + (setq current-prefix-arg nil) + (helm :sources sources + :prompt prompt + :buffer "*helm M-x*" + :history 'helm-M-x-input-history + :truncate-lines t)) + (helm-M-x--unwind-forms)))) + +;; When running a command involving again helm from helm-M-x, the +;; unwind-protect UNWINDS forms are executed only once this helm +;; command exit leaving the helm-M-x timer running and other variables +;; and hooks not unset, so the timer is now in a global var and all +;; the forms that should normally run in unwind-protect are running as +;; well as soon as helm-M-x-execute-command is called. +(defun helm-M-x--unwind-forms (&optional done) + ;; helm-M-x--unwind-forms-done is non nil when it have been called + ;; once from helm-M-x-execute-command. + (unless helm-M-x--unwind-forms-done + (when (timerp helm-M-x--timer) + (cancel-timer helm-M-x--timer) + (setq helm-M-x--timer nil)) + (setq helm--mode-line-display-prefarg nil + helm-fuzzy-sort-fn (default-toplevel-value 'helm-fuzzy-sort-fn)) + ;; Be sure to remove it here as well in case of quit. + (remove-hook 'helm-move-selection-after-hook + #'helm-M-x--move-selection-after-hook) + (remove-hook 'helm-before-action-hook + #'helm-M-x--before-action-hook)) + ;; Reset helm-M-x--unwind-forms-done to nil when DONE is + ;; unspecified. + (setq helm-M-x--unwind-forms-done done)) + +(defun helm-M-x-execute-command (command) + "Execute COMMAND as an editor command. +COMMAND must be a symbol that satisfies the `commandp' predicate. +Save COMMAND to `extended-command-history'." + (helm-M-x--unwind-forms t) + (when command + ;; Avoid having `this-command' set to *exit-minibuffer. + (setq this-command command + ;; Handle C-x z (repeat) Bug#322 + real-this-command command) + ;; If helm-M-x is called with regular emacs completion (kmacro) + ;; use the value of arg otherwise use helm-current-prefix-arg. + (let ((prefix-arg (or helm-current-prefix-arg helm-M-x-prefix-argument)) + (command-name (symbol-name command))) + (condition-case-unless-debug err + (progn + (command-execute command 'record) + (add-to-history 'extended-command-history command-name)) + (error + (when helm-M-x-always-save-history + (add-to-history 'extended-command-history command-name)) + (signal (car err) (cdr err))))))) + +(defun helm-M-x--vanilla-M-x () + (helm-M-x-execute-command + (intern-soft + (if helm-mode + (unwind-protect + (progn + (helm-mode -1) + (read-extended-command)) + (helm-mode 1)) + (read-extended-command))))) + +;;;###autoload +(defun helm-M-x (_arg) + "Preconfigured `helm' for Emacs commands. +It is `helm' replacement of regular `M-x' +`execute-extended-command'. + +Unlike regular `M-x' Emacs vanilla `execute-extended-command' +command, the prefix args if needed, can be passed AFTER starting +`helm-M-x'. When a prefix arg is passed BEFORE starting +`helm-M-x', the first `C-u' while in `helm-M-x' session will +disable it. + +You can get help on each command by persistent action." + (interactive + (progn + (setq helm-M-x-prefix-argument current-prefix-arg) + (list current-prefix-arg))) + (if (or defining-kbd-macro executing-kbd-macro) + (helm-M-x--vanilla-M-x) + (helm-M-x-read-extended-command obarray))) +(put 'helm-M-x 'interactive-only 'command-execute) + +(provide 'helm-command) + +;;; helm-command.el ends here diff --git a/code/elpa/helm-20240320.541/helm-dabbrev.el b/code/elpa/helm-20240320.541/helm-dabbrev.el new file mode 100644 index 0000000..a36d7c8 --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-dabbrev.el @@ -0,0 +1,388 @@ +;;; helm-dabbrev.el --- Helm implementation of dabbrev. -*- lexical-binding: t -*- + +;; Copyright (C) 2012 ~ 2023 Thierry Volpiatto + +;; 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 'helm) +(require 'helm-lib) +(require 'helm-help) +(require 'helm-elisp) ; For show-completion. + +(defgroup helm-dabbrev nil + "Dabbrev related Applications and libraries for Helm." + :group 'helm) + +(defcustom helm-dabbrev-always-search-all t + "Always search in all buffers when non--nil. +Note that even if nil, a search in all buffers will occur if the +length of candidates is <= than +`helm-dabbrev-max-length-result'." + :type 'boolean) + +(defcustom helm-dabbrev-candidates-number-limit 1000 + "Maximum number of candidates to collect. + +The higher this number is, the slower the computation of +candidates will be. You can use safely a higher value with +emacs-26+. +Note that this have nothing to do with +`helm-candidate-number-limit', this means that computation of +candidates stop when this value is reached but only +`helm-candidate-number-limit' candidates are displayed in the +Helm buffer." + :type 'integer) + +(defcustom helm-dabbrev-ignored-buffers-regexps + '("\\*helm" "\\*Messages" "\\*Echo Area" "\\*Buffer List") + "List of regexps matching names of buffers that `helm-dabbrev' should not check." + :type '(repeat regexp)) + +(defcustom helm-dabbrev-related-buffer-fn #'helm-dabbrev--same-major-mode-p + "A function that decide if a buffer to search in its related to `current-buffer'. + +This is actually determined by comparing `major-mode' of the +buffer to search and the `current-buffer'. + +The function take one arg, the buffer which is current, look at +`helm-dabbrev--same-major-mode-p' for an example. + +When nil all buffers are considered related to `current-buffer'." + :type 'function) + +(defcustom helm-dabbrev-major-mode-assoc nil + "Major mode association alist. + +This allow helm-dabbrev searching in buffers with the associated +`major-mode'. +E.g. (emacs-lisp-mode . lisp-interaction-mode) + +will allow searching in the lisp-interaction-mode buffer when +`current-buffer' is an `emacs-lisp-mode' buffer and vice versa +i.e. no need to provide (lisp-interaction-mode . +emacs-lisp-mode) association. + +When nil check is the searched buffer has same `major-mode' than +the `current-buffer'. + +This has no effect when `helm-dabbrev-related-buffer-fn' is nil +or of course bound to a function that doesn't handle this var." + :type '(alist :key-type symbol :value-type symbol)) + +(defcustom helm-dabbrev-lineno-around 30 + "Search first in this number of lines before and after point." + :type 'integer) + +(defcustom helm-dabbrev-cycle-threshold 5 + "Number of time helm-dabbrev cycle before displaying helm completion. +When nil or 0 disable cycling." + :type '(choice (const :tag "Cycling disabled" nil) integer)) + +(defcustom helm-dabbrev-case-fold-search 'smart + "Set `case-fold-search' in `helm-dabbrev'. +Same as `helm-case-fold-search' but for `helm-dabbrev'. +Note that this is not affecting searching in Helm buffer, but the +initial search for all candidates in buffer(s)." + :type '(choice (const :tag "Ignore case" t) + (const :tag "Respect case" nil) + (other :tag "Smart" smart))) + +(defvaralias 'helm-dabbrev--regexp 'helm-dabbrev-separator-regexp) +(make-obsolete-variable 'helm-dabbrev--regexp + 'helm-dabbrev-separator-regexp "2.8.3") +;; Check for beginning of line should happen last (^\n\\|^). +(defvar helm-dabbrev-separator-regexp + "\\s-\\|\t\\|[(\\[\\{\"'`=<>$;,@.#+]\\|\\s\\\\|^\n\\|^" + "Regexp matching the start of a dabbrev candidate.") + + +(defvar helm-dabbrev-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map helm-map) + (define-key map (kbd "M-/") #'helm-next-line) + (define-key map (kbd "M-:") #'helm-previous-line) + map)) + +;; Internal +(defvar helm-dabbrev--cache nil) +(defvar helm-dabbrev--data nil) +(cl-defstruct helm-dabbrev-info dabbrev limits iterator) +(defvar helm-dabbrev--already-tried nil) +(defvar helm-dabbrev--computing-cache nil + "[INTERNAL] Flag to notify helm-dabbrev is blocked. +Do nothing when non nil.") + +(defun helm-dabbrev--buffer-list () + (cl-loop for buf in (buffer-list) + unless (cl-loop for r in helm-dabbrev-ignored-buffers-regexps + thereis (string-match r (buffer-name buf))) + collect buf)) + +(defun helm-dabbrev--same-major-mode-p (start-buffer) + "Decide if current-buffer is related to START-BUFFER." + (helm-same-major-mode-p start-buffer helm-dabbrev-major-mode-assoc)) + +(defun helm-dabbrev--collect (str limit ignore-case all) + (let* ((case-fold-search ignore-case) + (buffer1 (current-buffer)) ; start buffer. + (minibuf (minibufferp buffer1)) + results pos-before pos-after) + (catch 'break + (dolist (buf (if all (helm-dabbrev--buffer-list) + (list (current-buffer)))) + (with-current-buffer buf + (when (or minibuf ; check against all buffers when in minibuffer. + (if helm-dabbrev-related-buffer-fn + (funcall helm-dabbrev-related-buffer-fn buffer1) + t)) + (save-excursion + ;; Start searching before thing before point. + (goto-char (- (point) (length str))) + ;; Search the last 30 lines BEFORE point and set POS-BEFORE. + (cl-multiple-value-bind (res _pa pb) + (helm-dabbrev--search-and-store str -2 limit results) + (setq results res + ;; No need to set POS-AFTER here. + pos-before pb))) + (save-excursion + ;; Search the next 30 lines AFTER point and set POS-AFTER. + (cl-multiple-value-bind (res pa _pb) + (helm-dabbrev--search-and-store str 2 limit results) + (setq results res + ;; No need to set POS-BEFORE, we keep the last + ;; value found. + pos-after pa))) + (save-excursion + ;; Search all BEFORE point maybe starting from + ;; POS-BEFORE to not search again what previously found. + ;; If limit is reached in previous call of + ;; `helm-dabbrev--search-and-store' POS-BEFORE is nil and + ;; goto-char will fail, so check it. + (when pos-before (goto-char pos-before)) + (cl-multiple-value-bind (res _pa _pb) + (helm-dabbrev--search-and-store str -1 limit results) + ;; No need to set POS-BEFORE and POS-AFTER here. + (setq results res))) + (save-excursion + ;; Search all AFTER point maybe starting from POS-AFTER. + ;; Same comment as above for POS-AFTER. + (when pos-after (goto-char pos-after)) + (cl-multiple-value-bind (res _pa _pb) + (helm-dabbrev--search-and-store str 1 limit results) + ;; No need to set POS-BEFORE and POS-AFTER here. + (setq results res))))) + (when (>= (length results) limit) (throw 'break nil)))) + (nreverse results))) + +(defun helm-dabbrev--search-and-store (pattern direction limit results) + "Search words or symbols matching PATTERN in DIRECTION up to LIMIT. +Finally returns all matched candidates appended to RESULTS. +Argument DIRECTION can be: + - (1): Search forward from point. + - (-1): Search backward from point. + - (2): Search forward from the + `helm-dabbrev-lineno-around' + lines after point. + - (-2): Search backward from the + `helm-dabbrev-lineno-around' + lines before point." + (let ((res results) + after before) + (while (and (<= (length res) limit) + (cl-case direction + (1 (search-forward pattern nil t)) + (-1 (search-backward pattern nil t)) + (2 (let ((pos + (save-excursion + (forward-line + helm-dabbrev-lineno-around) + (point)))) + (setq after pos) + (search-forward pattern pos t))) + (-2 (let ((pos + (save-excursion + (forward-line + (- helm-dabbrev-lineno-around)) + (point)))) + (setq before pos) + (search-backward pattern pos t))))) + (let* ((mb (match-beginning 0)) + (replace-regexp (concat "\\(" helm-dabbrev-separator-regexp + "\\)\\'")) + (match-word (helm-dabbrev--search + pattern mb replace-regexp))) + (when (and match-word (not (member match-word res))) + (push match-word res)))) + (list res after before))) + +(defun helm-dabbrev--search (pattern beg sep-regexp) + "Search word or symbol at point matching PATTERN. +Argument BEG is corresponding to the previous `match-beginning' +search. +The search starts at (1- BEG) with a regexp starting with +`helm-dabbrev-separator-regexp' followed by PATTERN followed by a +regexp matching syntactically any word or symbol. +The possible false positives matching SEP-REGEXP at end are +finally removed." + (let ((eol (pos-eol))) + (save-excursion + (goto-char (1- beg)) + (when (re-search-forward + (concat "\\(" + helm-dabbrev-separator-regexp + "\\)" + "\\(?99:\\(" + (regexp-quote pattern) + "\\(\\sw\\|\\s_\\)+\\)\\)") + eol t) + (replace-regexp-in-string + sep-regexp "" + (match-string-no-properties 99)))))) + +(defun helm-dabbrev--get-candidates (dabbrev &optional limit) + (cl-assert dabbrev nil "[No Match]") + (helm-dabbrev--collect + dabbrev (or limit helm-dabbrev-candidates-number-limit) + (cl-case helm-dabbrev-case-fold-search + (smart (helm-set-case-fold-search-1 dabbrev)) + (t helm-dabbrev-case-fold-search)) + helm-dabbrev-always-search-all)) + +(defun helm-dabbrev-default-action (candidate) + (with-helm-current-buffer + (let* ((limits (helm-bounds-of-thing-before-point + helm-dabbrev-separator-regexp)) + (beg (car limits)) + (end (point))) + (run-with-timer + 0.01 nil + #'helm-insert-completion-at-point + beg end candidate)))) + +;;;###autoload +(cl-defun helm-dabbrev () + "Preconfigured helm for dynamic abbreviations." + (interactive) + (unless helm-dabbrev--computing-cache + (let ((dabbrev (helm-thing-before-point + nil helm-dabbrev-separator-regexp)) + (limits (helm-bounds-of-thing-before-point + helm-dabbrev-separator-regexp)) + (enable-recursive-minibuffers t) + (cycling-disabled-p (or (null helm-dabbrev-cycle-threshold) + (zerop helm-dabbrev-cycle-threshold))) + (helm-execute-action-at-once-if-one t) + (helm-quit-if-no-candidate + (lambda () + (message "[Helm-dabbrev: No expansion found]")))) + (cl-assert (and (stringp dabbrev) (not (string= dabbrev ""))) + nil "[Helm-dabbrev: Nothing found before point]") + (when (and + ;; have been called at least once. + (helm-dabbrev-info-p helm-dabbrev--data) + ;; But user have moved with some other command + ;; in the meaning time. + (not (eq last-command 'helm-dabbrev))) + (setq helm-dabbrev--data nil)) + ;; When candidates are requested in helm directly without cycling, + ;; we need them right now before running helm. + (when cycling-disabled-p + (message "Waiting for helm-dabbrev candidates...") + (setq helm-dabbrev--cache (helm-dabbrev--get-candidates dabbrev))) + (unless (or cycling-disabled-p + (helm-dabbrev-info-p helm-dabbrev--data)) + (setq helm-dabbrev--data + (make-helm-dabbrev-info + :dabbrev dabbrev + :limits limits + :iterator + (helm-iter-list + (cl-loop for i in (helm-dabbrev--get-candidates + dabbrev helm-dabbrev-cycle-threshold) + when (string-match-p + (concat "^" (regexp-quote dabbrev)) i) + collect i))))) + (let ((iter (and (helm-dabbrev-info-p helm-dabbrev--data) + (helm-dabbrev-info-iterator helm-dabbrev--data))) + deactivate-mark) + ;; Cycle until iterator is consumed. + (helm-aif (and iter (helm-iter-next iter)) + (progn + (helm-insert-completion-at-point + (car (helm-dabbrev-info-limits helm-dabbrev--data)) + ;; END is the end of the previous inserted string, not + ;; the end (apart for first insertion) of the initial string. + (cdr limits) it) + ;; Move already tried candidates to end of list. + (push it helm-dabbrev--already-tried)) + ;; Iterator is now empty, or cycling was disabled, maybe + ;; reset dabbrev to initial value and start helm completion. + (let* ((old-dabbrev (if (helm-dabbrev-info-p helm-dabbrev--data) + (helm-dabbrev-info-dabbrev helm-dabbrev--data) + dabbrev)) + (only-one (eq (length helm-dabbrev--already-tried) 1))) + (unless helm-dabbrev--cache ; Already computed when + ; cycling is disabled. + (message "Waiting for helm-dabbrev candidates...") + (setq helm-dabbrev--computing-cache t) + (setq helm-dabbrev--cache + (helm-dabbrev--get-candidates old-dabbrev)) + ;; If user continues typing M-/ while display is blocked by + ;; helm-dabbrev--get-candidates delete these events. + (setq unread-command-events nil)) + ;; If the length of candidates is only one when computed + ;; that's mean the unique matched item have already been + ;; inserted by the iterator, so no need to reinsert the old dabbrev, + ;; just let helm exiting with "No expansion found". + (unless (or only-one cycling-disabled-p) + (setq dabbrev old-dabbrev + limits (helm-dabbrev-info-limits helm-dabbrev--data)) + (setq helm-dabbrev--data nil) + (delete-region (car limits) (point)) + (insert dabbrev)) + (when (and (null cycling-disabled-p) only-one) + (setq helm-dabbrev--cache nil + helm-dabbrev--already-tried nil + helm-dabbrev--computing-cache nil) + (cl-return-from helm-dabbrev + (message "[Helm-dabbrev: No expansion found]"))) + (with-helm-show-completion (car limits) (cdr limits) + (unwind-protect + (helm :sources + (helm-build-in-buffer-source "Dabbrev Expand" + :data + (append + (cl-loop with lst = helm-dabbrev--cache + for cand in helm-dabbrev--already-tried + do (setq lst (delete cand lst)) + finally return lst) + helm-dabbrev--already-tried) + :persistent-action 'ignore + :persistent-help "DoNothing" + :keymap helm-dabbrev-map + :action 'helm-dabbrev-default-action + :group 'helm-dabbrev) + :buffer "*helm dabbrev*" + :input (concat "^" dabbrev " ") + :resume 'noresume + :allow-nest t) + (setq helm-dabbrev--computing-cache nil + helm-dabbrev--already-tried nil + helm-dabbrev--cache nil))))))))) + +(provide 'helm-dabbrev) + +;;; helm-dabbrev.el ends here diff --git a/code/elpa/helm-20240320.541/helm-easymenu.el b/code/elpa/helm-20240320.541/helm-easymenu.el new file mode 100644 index 0000000..5b04b7d --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-easymenu.el @@ -0,0 +1,84 @@ +;;; helm-easymenu.el --- Helm easymenu definitions. -*- lexical-binding: t -*- + +;; Copyright (C) 2015 ~ 2020 Thierry Volpiatto + +;; 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 'easymenu) + +(easy-menu-add-item + nil '("Tools") + '("Helm" + ["Find any Files/Buffers" helm-multi-files t] + ["Helm Everywhere (Toggle)" helm-mode t] + ["Helm resume" helm-resume t] + "----" + ("Files" + ["Find files" helm-find-files t] + ["Recent Files" helm-recentf t] + ["Locate" helm-locate t] + ["Search Files with find" helm-find t] + ["Bookmarks" helm-filtered-bookmarks t] + ["Locate library" helm-locate-library t]) + ("Buffers" + ["Find buffers" helm-buffers-list t]) + ("Projects" + ["Browse project" helm-browse-project] + ["Projects history" helm-projects-history]) + ("Commands" + ["Emacs Commands" helm-M-x t] + ["Externals Commands" helm-run-external-command t]) + ("Help" + ["Helm Apropos" helm-apropos t]) + ("Info" + ["Info at point" helm-info-at-point t] + ["Emacs Manual index" helm-info-emacs t] + ["Gnus Manual index" helm-info-gnus t] + ["Helm documentation" helm-documentation t]) + ("Elpa" + ["Elisp packages" helm-packages t]) + ("Tools" + ["Occur" helm-occur t] + ["Grep current directory with AG" helm-do-grep-ag t] + ["Gid" helm-gid t] + ["Etags" helm-etags-select t] + ["Lisp complete at point" helm-lisp-completion-at-point t] + ["Browse Kill ring" helm-show-kill-ring t] + ["Browse register" helm-register t] + ["Mark Ring" helm-all-mark-rings t] + ["Regexp handler" helm-regexp t] + ["Colors & Faces" helm-colors t] + ["Show xfonts" helm-select-xfont t] + ["Ucs Symbols" helm-ucs t] + ["Imenu" helm-imenu t] + ["Imenu all" helm-imenu-in-all-buffers t] + ["Semantic or Imenu" helm-semantic-or-imenu t] + ["Google Suggest" helm-google-suggest t] + ["Eval expression" helm-eval-expression-with-eldoc t] + ["Calcul expression" helm-calcul-expression t] + ["Man pages" helm-man-woman t] + ["Top externals process" helm-top t] + ["Emacs internals process" helm-list-emacs-process t]) + "----" + ["Preferred Options" helm-configuration t]) + "Spell Checking") + +(easy-menu-add-item nil '("Tools") '("----") "Spell Checking") + + +(provide 'helm-easymenu) + +;;; helm-easymenu.el ends here diff --git a/code/elpa/helm-20240320.541/helm-elisp.el b/code/elpa/helm-20240320.541/helm-elisp.el new file mode 100644 index 0000000..1107330 --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-elisp.el @@ -0,0 +1,1167 @@ +;;; helm-elisp.el --- Elisp symbols completion for helm. -*- lexical-binding: t -*- + +;; Copyright (C) 2012 ~ 2023 Thierry Volpiatto + +;; 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 'helm) +(require 'helm-lib) +(require 'helm-help) +(require 'helm-types) +(require 'helm-utils) +(require 'helm-info) +(require 'helm-eval) +(require 'helm-files) + +(declare-function helm-describe-function "helm-lib") +(declare-function helm-describe-variable "helm-lib") +(declare-function helm-describe-face "helm-lib") +(declare-function helm-read-file-name "helm-mode") +(declare-function helm-comp-read "helm-mode") +(declare-function helm-M-x-transformer-no-sort-no-props "helm-command") +(defvar helm-M-x-show-short-doc) +(defvar helm-completions-detailed) + + +;;; Customizable values + +(defgroup helm-elisp nil + "Elisp related Applications and libraries for Helm." + :group 'helm) + +(defcustom helm-turn-on-show-completion t + "Display candidate in `current-buffer' while moving selection when non--nil." + :group 'helm-elisp + :type 'boolean) + +(defcustom helm-show-completion-min-window-height 7 + "Minimum completion window height used in show completion. +This is used in macro `with-helm-show-completion'." + :group 'helm-elisp + :type 'integer) + +(defcustom helm-lisp-quoted-function-list + '(funcall apply mapc cl-mapc mapcar cl-mapcar + callf callf2 cl-callf cl-callf2 fset + fboundp fmakunbound symbol-function) + "List of function where quoted function completion happen. +E.g. give only function names after (funcall \\='." + :group 'helm-elisp + :type '(repeat (choice symbol))) + +(defcustom helm-lisp-unquoted-function-list + '(function defadvice) + "List of function where unquoted function completion happen. +E.g. give only function names after (function ." + :group 'helm-elisp + :type '(repeat (choice symbol))) + +(defcustom helm-apropos-fuzzy-match nil + "Enable fuzzy matching for `helm-apropos' when non-nil." + :group 'helm-elisp + :type 'boolean) + +(defcustom helm-lisp-fuzzy-completion nil + "Enable fuzzy matching in emacs-lisp completion when non-nil. +NOTE: This enables fuzzy matching in Helm native implementation of +elisp completion, but not on helmized elisp completion, i.e. fuzzy +completion is not available in `completion-at-point'." + :group 'helm-elisp + :type 'boolean) + +(defcustom helm-apropos-function-list '(helm-def-source--emacs-commands + helm-def-source--emacs-functions + helm-def-source--eieio-classes + helm-def-source--eieio-generic + helm-def-source--emacs-variables + helm-def-source--emacs-faces) + "A list of functions that build helm sources to use in `helm-apropos'." + :group 'helm-elisp + :type '(repeat (choice symbol))) + +(defcustom helm-apropos-defaut-info-lookup-sources '(helm-source-info-elisp + helm-source-info-cl + helm-source-info-eieio) + "A list of sources to look into when searching info page of a symbol." + :group 'helm-elisp + :type '(repeat (choice symbol))) + +(defcustom helm-show-completion-display-function + (if (display-graphic-p) + #'helm-display-buffer-in-own-frame + #'helm-show-completion-default-display-function) + "The function used to display helm completion buffer. + +This function is used by `with-helm-show-completion', when nil +fallback to `helm-default-display-buffer'. + +Default is to use a separate frame on graphic display and +`helm-show-completion-default-display-function' on non graphic +display." + :group 'helm-elisp + :type 'function) + +;;; Faces +;; +;; +(defgroup helm-elisp-faces nil + "Customize the appearance of helm-elisp." + :prefix "helm-" + :group 'helm-elisp + :group 'helm-faces) + +(defface helm-lisp-show-completion + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :background "DarkSlateGray")) + "Face used for showing candidates in `helm-lisp-completion'." + :group 'helm-elisp-faces) + +(defface helm-lisp-completion-info + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "red")) + "Face used for showing info in `helm-lisp-completion'." + :group 'helm-elisp-faces) + +(defcustom helm-elisp-help-function + 'helm-elisp-show-help + "Function for displaying help for Lisp symbols." + :group 'helm-elisp + :type '(choice (function :tag "Open help for the symbol." + helm-elisp-show-help) + (function :tag "Show one liner in modeline." + helm-elisp-show-doc-modeline))) + +(defcustom helm-locate-library-fuzzy-match t + "Enable fuzzy-matching in `helm-locate-library' when non--nil." + :type 'boolean + :group 'helm-elisp) + + +;;; Show completion. +;; +;; Provide show completion with macro `with-helm-show-completion'. + +(defvar helm-show-completion-overlay nil) + +;; Called each time cursor move in helm-buffer. +(defun helm-show-completion () + (with-helm-current-buffer + (helm-aif (helm-get-selection) + (overlay-put helm-show-completion-overlay + 'display (substring-no-properties it))))) + +(defun helm-show-completion-init-overlay (beg end) + (setq helm-show-completion-overlay (make-overlay beg end)) + (overlay-put helm-show-completion-overlay + 'face 'helm-lisp-show-completion)) + +(defun helm-show-completion-default-display-function (buffer &rest _args) + "A special resized Helm window is used depending on position in BUFFER." + (with-selected-window (selected-window) + (if (window-dedicated-p) + (helm-default-display-buffer buffer) + (let* ((screen-size (+ (count-screen-lines (window-start) (point) t) + 1 ; mode-line + (if header-line-format 1 0))) ; header-line + (def-size (- (window-height) + helm-show-completion-min-window-height)) + (upper-height (max window-min-height (min screen-size def-size))) + split-window-keep-point) + (recenter -1) + (set-window-buffer (if (active-minibuffer-window) + (minibuffer-selected-window) + (split-window nil upper-height + helm-split-window-default-side)) + buffer))))) + +(defmacro with-helm-show-completion (beg end &rest body) + "Show Helm candidate in an overlay at point. +BEG and END are the beginning and end position of the current +completion in `helm-current-buffer'. +BODY is an Helm call where we want to enable show completion. +If `helm-turn-on-show-completion' is nil do nothing." + (declare (indent 2) (debug t)) + `(unwind-protect + (if helm-turn-on-show-completion + (let ((helm-move-selection-after-hook + (append (list 'helm-show-completion) + helm-move-selection-after-hook)) + (helm-split-window-default-side + (if (eq helm-split-window-default-side 'same) + 'below helm-split-window-default-side)) + helm-split-window-inside-p + helm-reuse-last-window-split-state) + (helm-set-local-variable + 'helm-display-function + (or helm-show-completion-display-function + 'helm-default-display-buffer)) + (with-helm-after-update-hook + ;; Show immediately first candidate as soon as helm popup. + (helm-show-completion)) + (helm-show-completion-init-overlay ,beg ,end) + ,@body) + ,@body) + (when (and helm-show-completion-overlay + (overlayp helm-show-completion-overlay)) + (delete-overlay helm-show-completion-overlay)))) + + +;;; Lisp symbol completion. +;; +;; +(defun helm-lisp-completion--predicate-at-point (beg) + ;; Return a predicate for `all-completions'. + (let ((fn-sym-p (lambda () + (or + (and (eq (char-before) ?\ ) + (save-excursion + (skip-syntax-backward " " (pos-bol)) + (memq (symbol-at-point) + helm-lisp-unquoted-function-list))) + (and (eq (char-before) ?\') + (save-excursion + (forward-char -1) + (eq (char-before) ?\#))))))) + (save-excursion + (goto-char beg) + (if (or + ;; Complete on all symbols in non--lisp modes (logs mail etc..) + (not (memq major-mode '(emacs-lisp-mode + lisp-interaction-mode + inferior-emacs-lisp-mode))) + (not (or (funcall fn-sym-p) + (and (eq (char-before) ?\') + (save-excursion + (forward-char (if (funcall fn-sym-p) -2 -1)) + (skip-syntax-backward " " (pos-bol)) + (memq (symbol-at-point) + helm-lisp-quoted-function-list))) + (eq (char-before) ?\())) ; no paren before str. + ;; Looks like we are in a let statement. + (condition-case nil + (progn (up-list -2) (forward-char 1) + (eq (char-after) ?\()) + (error nil))) + (lambda (sym) + (or (boundp sym) (fboundp sym) (symbol-plist sym))) + #'fboundp)))) + +(defun helm-thing-before-point (&optional limits regexp) + "Return symbol name before point. +If REGEXP is specified return what REGEXP find before point. +By default match the beginning of symbol before point. +With LIMITS arg specified return the beginning and end position +of symbol before point." + (save-excursion + (let (beg + (end (point)) + (boundary (field-beginning nil nil (pos-bol)))) + (if (re-search-backward (or regexp "\\_<") boundary t) + (setq beg (match-end 0)) + (setq beg boundary)) + (unless (= beg end) + (if limits + (cons beg end) + (buffer-substring-no-properties beg end)))))) + +(defun helm-bounds-of-thing-before-point (&optional regexp) + "Get the beginning and end position of `helm-thing-before-point'. +Return a cons (beg . end)." + (helm-thing-before-point 'limits regexp)) + +(defun helm-insert-completion-at-point (beg end str) + ;; When there is no space after point + ;; we are completing inside a symbol or + ;; after a partial symbol with the next arg aside + ;; without space, in this case mark the region. + ;; deleting it would remove the + ;; next arg which is unwanted. + (delete-region beg end) + (insert str) + (let ((pos (cdr (or (bounds-of-thing-at-point 'symbol) + ;; needed for helm-dabbrev. + (bounds-of-thing-at-point 'filename))))) + (when (and pos (< (point) pos)) + (push-mark pos t t)))) + +;;;###autoload +(defun helm-lisp-completion-at-point () + "Preconfigured Helm for Lisp symbol completion at point." + (interactive) + (let* ((target (helm-thing-before-point)) + (beg (car (helm-bounds-of-thing-before-point))) + (end (point)) + (pred (and beg (helm-lisp-completion--predicate-at-point beg))) + (loc-vars (and (fboundp 'elisp--local-variables) + (ignore-errors + (mapcar #'symbol-name (elisp--local-variables))))) + (glob-syms (and target pred (all-completions target obarray pred))) + (candidates (append loc-vars glob-syms)) + (helm-quit-if-no-candidate t) + (helm-execute-action-at-once-if-one t) + (enable-recursive-minibuffers t)) + (if candidates + (with-helm-show-completion beg end + ;; Overlay is initialized now in helm-current-buffer. + (helm + :sources (helm-build-in-buffer-source "Lisp completion" + :data candidates + :persistent-action `(helm-lisp-completion-persistent-action . + ,(and (eq helm-elisp-help-function + 'helm-elisp-show-doc-modeline) + 'never-split)) + :nomark t + :match-part (lambda (c) (car (split-string c))) + :fuzzy-match helm-lisp-fuzzy-completion + :persistent-help (helm-lisp-completion-persistent-help) + :filtered-candidate-transformer + #'helm-lisp-completion-transformer + :action (lambda (candidate) + (with-helm-current-buffer + (run-with-timer + 0.01 nil + #'helm-insert-completion-at-point + beg end candidate)))) + :input (if helm-lisp-fuzzy-completion + target (concat target " ")) + :resume 'noresume + :truncate-lines t + :buffer "*helm lisp completion*" + :allow-nest t)) + (message "[No Match]")))) + +(defun helm-lisp-completion-persistent-action (candidate &optional name) + "Show documentation for the function. +Documentation is shown briefly in mode-line or completely in +other window according to the value of +`helm-elisp-help-function'." + (funcall helm-elisp-help-function candidate name)) + +(defun helm-lisp-completion-persistent-help () + "Return persistent-help according to the value of `helm-elisp-help-function'" + (cl-ecase helm-elisp-help-function + (helm-elisp-show-doc-modeline "Show brief doc in mode-line") + (helm-elisp-show-help "Toggle show help for the symbol"))) + +(defun helm-elisp--show-help-1 (candidate &optional name) + (helm-acase (intern-soft candidate) + ((guard (and (fboundp it) (boundp it))) + (if (member name `(,helm-describe-function-function + ,helm-describe-variable-function)) + (funcall (intern (format "helm-%s" name)) it) + ;; When there is no way to know what to describe + ;; prefer describe-function. + (helm-describe-function it))) + ((guard (fboundp it)) (helm-describe-function it)) + ((guard (boundp it)) (helm-describe-variable it)) + ((guard (facep it)) (helm-describe-face it)))) + +(defun helm-elisp-show-help (candidate &optional name) + "Show full help for the function CANDIDATE. +Arg NAME specifies the name of the top level function calling +Helm generic completion (e.g., \"describe-function\") which +allows calling the right function when CANDIDATE symbol refers at +the same time to variable and a function." + (helm-elisp--persistent-help + candidate 'helm-elisp--show-help-1 name)) + +(defun helm-elisp-show-doc-modeline (candidate &optional name) + "Show brief documentation for the function in the mode-line." + (let ((cursor-in-echo-area t) + mode-line-in-non-selected-windows) + (helm-show-info-in-mode-line + (propertize + (helm-get-first-line-documentation + (intern candidate) name) + 'face 'helm-lisp-completion-info)))) + +(defun helm-lisp-completion-transformer (candidates _source) + "Helm candidates transformer for Lisp completion." + (cl-loop for c in candidates + for sym = (intern c) + for annot = (helm-acase sym + ((guard (commandp it)) " (Com)") + ((guard (class-p it)) " (Class)") + ((guard (cl-generic-p it)) " (Gen)") + ((guard (fboundp it)) " (Fun)") + ((guard (boundp it)) " (Var)") + ((guard (facep it)) " (Face)")) + collect (cons (concat c (helm-make-separator c) annot) c) into lst + finally return (sort lst #'helm-generic-sort-fn))) + +;;;###autoload +(cl-defun helm-get-first-line-documentation (sym &optional + (name "describe-function") + (end-column 72)) + "Return first line documentation of symbol SYM truncated at END-COLUMN. +If SYM is not documented, return \"Not documented\". +Argument NAME allows specifiying what function to use to display +documentation when SYM name is the same for function and variable." + (let ((doc (condition-case _err + (helm-acase sym + ((guard (class-p it)) + (cl--class-docstring (cl--find-class it))) + ((guard (and (fboundp it) (boundp it))) + (if (string= name "describe-variable") + (documentation-property it 'variable-documentation t) + (documentation it t))) + ((guard (custom-theme-p it)) + (documentation-property it 'theme-documentation t)) + ((guard (helm-group-p it)) + (documentation-property it 'group-documentation t)) + ((guard (fboundp it)) + (documentation it t)) + ((guard (boundp it)) + (documentation-property it 'variable-documentation t)) + ((guard (facep it)) (face-documentation it))) + (void-function "Void function -- Not documented")))) + (if (and doc (not (string= doc "")) + ;; `documentation' return "\n\n(args...)" + ;; for CL-style functions. + (not (string-match-p "\\`\n\n" doc))) + ;; Some commands specify key bindings in their first line. + (truncate-string-to-width + (substitute-command-keys (car (split-string doc "\n"))) + end-column nil nil t) + (if (or (symbol-function sym) (boundp sym) (facep sym) (helm-group-p sym)) + "Not documented" + ;; Symbol exist but has no definition yet e.g. + ;; (advice-add 'foo-test :override (lambda () (message "invalid + ;; function"))) and foo-test is not already defined. + "Not already defined or loaded")))) + +;;; File completion. +;; +;; Complete file name at point. + +;;;###autoload +(defun helm-complete-file-name-at-point (&optional force) + "Preconfigured Helm to complete file name at point." + (interactive) + (require 'helm-mode) + (let* ((tap (or (thing-at-point 'filename t) "")) + beg + (init (and tap + (or force + (save-excursion + (end-of-line) + (search-backward tap (pos-bol) t) + (setq beg (point)) + (looking-back "[^'`( ]" (1- (point))))) + (expand-file-name tap))) + (end (point)) + (helm-quit-if-no-candidate t) + (helm-execute-action-at-once-if-one t) + completion) + (with-helm-show-completion beg end + (setq completion (helm-read-file-name "FileName: " + :initial-input init))) + (when (and completion (not (string= completion ""))) + (delete-region beg end) (insert (if (string-match "^~" tap) + (abbreviate-file-name completion) + completion))))) +(make-obsolete 'helm-complete-file-name-at-point 'helm-find-files "3.9.6") + +;;;###autoload +(defun helm-lisp-indent () + ;; It is meant to use with `helm-define-multi-key' which + ;; does not support args for functions yet, so use `current-prefix-arg' + ;; for now instead of (interactive "P"). + (interactive) + (let ((tab-always-indent (or (eq tab-always-indent 'complete) + tab-always-indent))) + (indent-for-tab-command current-prefix-arg))) + + +;;; Apropos +;; +;; +(defvar helm-apropos-history nil) + +(defcustom helm-apropos-show-short-doc nil + "Show short docstring of symbols when non nil. + +NOTE: When displaying helm-apropos in a frame, i.e. when +`helm-apropos' is member of `helm-commands-using-frame' setting this +to non nil have no effect, you have first to remove `helm-apropos' +from `helm-commands-using-frame'." + :group 'helm-elisp + :type 'boolean) + +(defvar helm-apropos-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map helm-map) + (define-key map (kbd "C-]") #'helm-apropos-toggle-details) + map)) + +(defun helm-apropos-init (test default &optional fn) + "Setup `helm-candidate-buffer' for `helm-apropos' sources. +A list of symbols fetched with FN is inserted in +`helm-candidate-buffer', if FN is not provided symbols are fetched +against obarray with predicate TEST. When FN is provided predicate TEST +is only used to test DEFAULT." + (require 'helm-help) + (helm-init-candidates-in-buffer 'global + (let ((default-symbol (and (stringp default) + (intern-soft default))) + (symbols (if fn (funcall fn) (all-completions "" obarray test)))) + (if (and default-symbol (funcall test default-symbol)) + (cons default-symbol symbols) + symbols)))) + +(defun helm-apropos-short-doc-transformer (candidates _source) + (if helm-apropos-show-short-doc + (cl-loop for cand in candidates + for doc = (helm-get-first-line-documentation (intern-soft cand)) + collect (cons (format "%s%s%s" + cand + (if doc + (helm-make-separator cand) + "") + (if doc + (propertize + doc 'face 'helm-M-x-short-doc) + "")) + cand)) + candidates)) + +(defun helm-apropos-default-sort-fn (candidates _source) + (if (string= helm-pattern "") + candidates + (sort candidates #'helm-generic-sort-fn))) + +(defun helm-apropos-clean-history-variable (candidate) + (with-helm-current-buffer ; var is maybe local + (let* ((sym (intern-soft candidate)) + (cands (symbol-value sym)) + (mkds (and (listp cands) + (helm-comp-read "Delete entry: " + cands :marked-candidates t)))) + (cl-assert (listp mkds) nil "Variable value is not a list") + (cl-loop for elm in mkds do + (if (local-variable-p sym) + (set (make-local-variable sym) + (setq cands (delete elm cands))) + (set sym (setq cands (delete elm cands)))))))) + +(defun helm-apropos-clean-ring (candidate) + (with-helm-current-buffer ; var is maybe local + (let* ((sym (intern-soft candidate)) + (val (symbol-value sym)) + (cands (and (ring-p val) (ring-elements val))) + (mkds (and cands (helm-comp-read + "Delete entry: " + cands :marked-candidates t)))) + (when mkds + (cl-loop for elm in mkds do + (ring-remove + val (helm-position + elm + (ring-elements val) + :test 'equal)) + and do (if (local-variable-p sym) + (set (make-local-variable sym) val) + (set sym val))))))) + +(defun helm-apropos-action-transformer (actions candidate) + (let* ((sym (helm-symbolify candidate)) + (val (with-helm-current-buffer (symbol-value sym)))) + (cond ((custom-variable-p sym) + (append + actions + (let ((standard-value (eval (car (get sym 'standard-value)) t))) + (unless (equal standard-value (symbol-value sym)) + `(("Reset Variable to default value" + . ,(lambda (candidate) + (let ((sym (helm-symbolify candidate))) + (set sym standard-value))))))) + '(("Customize variable" . + (lambda (candidate) + (customize-option (helm-symbolify candidate))))))) + ((and val (with-helm-current-buffer (ring-p (symbol-value sym)))) + (append actions + '(("Clean ring" . helm-apropos-clean-ring)))) + ((and (string-match-p "history" candidate) (listp val)) + (append actions + '(("Clean variable" . + helm-apropos-clean-history-variable)))) + (t actions)))) + +(defun helm-def-source--emacs-variables (&optional default) + (helm-build-in-buffer-source "Variables" + :init (lambda () + (helm-apropos-init + (lambda (x) + (and (boundp x) (not (keywordp x)) (not (class-p x)))) + default)) + :fuzzy-match helm-apropos-fuzzy-match + :filtered-candidate-transformer + (delq nil (list (and (null helm-apropos-fuzzy-match) + 'helm-apropos-default-sort-fn) + (and (null (memq 'helm-apropos helm-commands-using-frame)) + #'helm-apropos-short-doc-transformer))) + :nomark t + :persistent-action (lambda (candidate) + (helm-elisp--persistent-help + candidate 'helm-describe-variable)) + :persistent-help "Toggle describe variable" + :keymap helm-apropos-map + :action '(("Describe variable" . helm-describe-variable) + ("Find variable" . helm-find-variable) + ("Info lookup" . helm-info-lookup-symbol) + ("Set variable" . helm-set-variable)) + :action-transformer 'helm-apropos-action-transformer)) + +(defun helm-def-source--emacs-faces (&optional default) + "Create `helm' source for faces to be displayed with +`helm-apropos'." + (helm-build-in-buffer-source "Faces" + :init (lambda () (helm-apropos-init 'facep default #'face-list)) + :fuzzy-match helm-apropos-fuzzy-match + :filtered-candidate-transformer + (delq nil (list + (and (null helm-apropos-fuzzy-match) + #'helm-apropos-default-sort-fn) + (lambda (candidates _source) + (cl-loop for c in candidates + collect (propertize c 'face (intern c)))) + (and (null (memq 'helm-apropos helm-commands-using-frame)) + #'helm-apropos-short-doc-transformer))) + :persistent-action (lambda (candidate) + (helm-elisp--persistent-help + candidate 'helm-describe-face)) + :persistent-help "Toggle describe face" + :keymap helm-apropos-map + :action '(("Describe face" . helm-describe-face) + ("Find face" . helm-find-face-definition) + ("Customize face" . (lambda (candidate) + (customize-face (helm-symbolify candidate))))))) + +(defun helm-def-source--emacs-commands (&optional default) + (require 'helm-command) + (helm-build-in-buffer-source "Commands" + :init (lambda () + (helm-apropos-init 'commandp default)) + :fuzzy-match helm-apropos-fuzzy-match + :filtered-candidate-transformer + (append (list #'helm-M-x-transformer-no-sort-no-props) + (and (null helm-apropos-fuzzy-match) + '(helm-apropos-default-sort-fn))) + :display-to-real 'helm-symbolify + :nomark t + :persistent-action (lambda (candidate) + (helm-elisp--persistent-help + candidate 'helm-describe-function)) + :persistent-help "Toggle describe command" + :keymap helm-apropos-map + :action 'helm-type-function-actions)) + +(defun helm-def-source--emacs-functions (&optional default) + (helm-build-in-buffer-source "Functions" + :init (lambda () + (helm-apropos-init (lambda (x) + (and (fboundp x) + (not (commandp x)) + (not (cl-generic-p x)) + (not (class-p x)))) + default)) + :fuzzy-match helm-apropos-fuzzy-match + :filtered-candidate-transformer + (delq nil (list (and (null helm-apropos-fuzzy-match) + 'helm-apropos-default-sort-fn) + (and (null (memq 'helm-apropos helm-commands-using-frame)) + #'helm-apropos-short-doc-transformer))) + :display-to-real 'helm-symbolify + :persistent-action (lambda (candidate) + (helm-elisp--persistent-help + candidate 'helm-describe-function)) + :persistent-help "Toggle describe function" + :keymap helm-apropos-map + :nomark t + :action 'helm-type-function-actions)) + +(defun helm-def-source--eieio-classes (&optional default) + (helm-build-in-buffer-source "Classes" + :init (lambda () + (helm-apropos-init (lambda (x) + (class-p x)) + default)) + :fuzzy-match helm-apropos-fuzzy-match + :filtered-candidate-transformer + (delq nil (list (and (null helm-apropos-fuzzy-match) + 'helm-apropos-default-sort-fn) + (and (null (memq 'helm-apropos helm-commands-using-frame)) + #'helm-apropos-short-doc-transformer))) + :nomark t + :persistent-action (lambda (candidate) + (helm-elisp--persistent-help + candidate 'helm-describe-class)) + :persistent-help "Toggle describe class" + :keymap helm-apropos-map + :action '(("Describe Class" . helm-describe-class) + ("Find Class (C-u for source)" . helm-find-function) + ("Info lookup" . helm-info-lookup-symbol)))) + +(defun helm-def-source--eieio-generic (&optional default) + (helm-build-in-buffer-source "Generic functions" + :init (lambda () + (helm-apropos-init (lambda (x) + (cl-generic-p x)) + default)) + :fuzzy-match helm-apropos-fuzzy-match + :filtered-candidate-transformer + (delq nil (list (and (null helm-apropos-fuzzy-match) + 'helm-apropos-default-sort-fn) + (and (null (memq 'helm-apropos helm-commands-using-frame)) + #'helm-apropos-short-doc-transformer))) + :nomark t + :persistent-action (lambda (candidate) + (helm-elisp--persistent-help + candidate 'helm-describe-function)) + :persistent-help "Toggle describe generic function" + :keymap helm-apropos-map + :action '(("Describe function" . helm-describe-function) + ("Find function (C-u for source)" . helm-find-function) + ("Info lookup" . helm-info-lookup-symbol)))) + +(defun helm-info-lookup-fallback-source (candidate) + (cl-multiple-value-bind (fn src-name) + (helm-acase (helm-symbolify candidate) + ((guard (class-p it)) + (list #'helm-describe-function + "Describe class")) + ((guard (cl-generic-p it)) + (list #'helm-describe-function + "Describe generic function")) + ((guard (fboundp it)) + (list #'helm-describe-function + "Describe function")) + ((guard (facep it)) + (list #'helm-describe-face + "Describe face")) + (t + (list #'helm-describe-variable + "Describe variable"))) + (helm-build-sync-source src-name + :candidates (list candidate) + :persistent-action (lambda (candidate) + (helm-elisp--persistent-help + candidate fn)) + :persistent-help src-name + :nomark t + :action fn))) + +(defun helm-info-lookup-symbol-1 (c) + (let ((helm-execute-action-at-once-if-one 'current-source)) + (helm :sources (append helm-apropos-defaut-info-lookup-sources + (list (helm-info-lookup-fallback-source c))) + :resume 'noresume + :buffer "*helm lookup*" + :input (helm-stringify c)))) + +(defun helm-info-lookup-symbol (candidate) + ;; ???:Running an idle-timer allows not catching RET when exiting + ;; with the fallback source. + ;; (run-with-idle-timer 0.01 nil #'helm-info-lookup-symbol-1 candidate) + (helm-info-lookup-symbol-1 candidate)) + +(defun helm-apropos-toggle-details () + "Toggle details in `helm-apropos'." + (interactive) + (with-helm-buffer + (unless (memq 'helm-apropos helm-commands-using-frame) + (setq helm-M-x-show-short-doc (not helm-M-x-show-short-doc) + helm-apropos-show-short-doc (not helm-apropos-show-short-doc)) + (helm-force-update (concat "^" (helm-stringify (helm-get-selection))) + (helm-get-current-source))))) + +(defun helm-apropos-get-default () + (with-syntax-table emacs-lisp-mode-syntax-table + (symbol-name (intern-soft (thing-at-point 'symbol))))) + +;;;###autoload +(defun helm-apropos (default) + "Preconfigured Helm to describe commands, functions, variables and faces. +In non interactives calls DEFAULT argument should be provided as +a string, i.e. the `symbol-name' of any existing symbol." + (interactive (list (helm-apropos-get-default))) + (let ((helm-M-x-show-short-doc + (and helm-apropos-show-short-doc + (null (memq 'helm-apropos helm-commands-using-frame))))) + (helm :sources + (mapcar (lambda (func) + (funcall func default)) + helm-apropos-function-list) + :history 'helm-apropos-history + :buffer "*helm apropos*" + :preselect (and default (concat "^\\_<" (regexp-quote default) "\\_>")) + :truncate-lines t))) + + +;;; Advices +;; +;; +(defvar ad-advised-functions) +(defvar ad-advice-classes) +(declare-function ad-make-single-advice-docstring "advice") +(declare-function ad-get-advice-info-field "advice") +(declare-function ad-advice-set-enabled "advice") +(declare-function ad-advice-set-enabled "advice") +(declare-function ad-advice-enabled "advice") + +(defvar helm-source-advice + (helm-build-sync-source "Function Advice" + :init (lambda () (require 'advice)) + :candidates 'helm-advice-candidates + :action (helm-make-actions "Toggle Enable/Disable" 'helm-advice-toggle) + :persistent-action 'helm-advice-persistent-action + :nomark t + :multiline t + :persistent-help "Toggle describe function / C-u C-j: Toggle advice")) + +(defun helm-advice-candidates () + (cl-loop for fname in ad-advised-functions + for function = (intern fname) + append + (cl-loop for class in ad-advice-classes append + (cl-loop for advice in (ad-get-advice-info-field function class) + for enabled = (ad-advice-enabled advice) + collect + (cons (format + "%s %s %s" + (if enabled "Enabled " "Disabled") + (propertize fname 'face 'font-lock-function-name-face) + (ad-make-single-advice-docstring advice class nil)) + (list function class advice)))))) + +(defun helm-advice-persistent-action (func-class-advice) + (if current-prefix-arg + (helm-advice-toggle func-class-advice) + (describe-function (car func-class-advice)))) + +(defun helm-advice-toggle (func-class-advice) + (cl-destructuring-bind (function _class advice) func-class-advice + (cond ((ad-advice-enabled advice) + (ad-advice-set-enabled advice nil) + (message "Disabled")) + (t + (ad-advice-set-enabled advice t) + (message "Enabled"))) + (ad-activate function) + (and helm-in-persistent-action + (helm-advice-update-current-display-string)))) + +(defun helm-advice-update-current-display-string () + (helm-edit-current-selection + (let ((newword (cond ((looking-at "Disabled") "Enabled") + ((looking-at "Enabled") "Disabled")))) + (when newword + (delete-region (point) (progn (forward-word 1) (point))) + (insert newword))))) + +;;;###autoload +(defun helm-manage-advice () + "Preconfigured `helm' to disable/enable function advices." + (interactive) + (helm-other-buffer 'helm-source-advice "*helm advice*")) + + +;;; Locate elisp library +;; +;; +(defvar helm--locate-library-cache nil) +(defvar helm--locate-library-doc-cache (make-hash-table :test 'equal)) +(defun helm-locate-library-scan-list () + (cl-loop for dir in load-path + when (file-directory-p dir) + nconc (directory-files + dir nil (concat (regexp-opt (find-library-suffixes)) "\\'")))) + +;;;###autoload +(defun helm-locate-library (&optional arg) + "Preconfigured helm to locate elisp libraries. + +When `completions-detailed' or `helm-completions-detailed' is non +nil, a description of libraries is provided. The libraries are +partially cached in the variables +`helm--locate-library-doc-cache' and +`helm--locate-library-cache'. TIP: You can make these vars +persistent for faster start with the psession package, using M-x +psession-make-persistent-variable. NOTE: The caches affect as +well `find-libray' and `locate-library' when `helm-mode' is +enabled and `completions-detailed' is non nil. There is no need +to refresh the caches, they will be updated automatically if some +new libraries are found, however when a library update its +headers and the description change you can reset the caches with +a prefix arg." + (interactive "P") + (let (done) + (when arg + (setq helm--locate-library-cache nil) + (clrhash helm--locate-library-doc-cache)) + (helm :sources + (helm-build-in-buffer-source "Elisp libraries (Scan)" + :data #'helm-locate-library-scan-list + :fuzzy-match helm-locate-library-fuzzy-match + :keymap helm-generic-files-map + :candidate-transformer + (lambda (candidates) + (cl-loop with reporter = (unless done + (make-progress-reporter + "Scanning libraries..." 0 (length candidates))) + with lgst = (helm-in-buffer-get-longest-candidate) + for c in candidates + for count from 0 + for bn = (helm-basename c 2) + for sep = (helm-make-separator bn lgst) + for path = (or (assoc-default bn helm--locate-library-cache) + ;; A lock file in LOAD-PATH (bug#2626). + (unless (string-match "\\`\\.#" bn) + (let ((p (find-library-name bn))) + (push (cons bn p) helm--locate-library-cache) + p))) + for doc = (and path + (or completions-detailed helm-completions-detailed) + (or (gethash bn helm--locate-library-doc-cache) + (puthash bn (helm-locate-lib-get-summary path) + helm--locate-library-doc-cache))) + for disp = (and path + (if (and doc + (or completions-detailed helm-completions-detailed)) + (helm-aand (propertize doc 'face 'font-lock-warning-face) + (propertize " " 'display (concat sep it)) + (concat bn it)) + bn)) + when (and disp path) + collect (cons disp path) + when reporter do (progress-reporter-update reporter count) + finally do (setq done t))) + :action (helm-actions-from-type-file)) + :buffer "*helm locate library*"))) + + +;;; Modify variables from Helm +;; +;; +(defun helm-set-variable (var) + "Set VAR value interactively." + (let* ((sym (helm-symbolify var)) + (val (default-value sym)) + (strv (prin1-to-string val))) + (if (> (length strv) 25) + (helm-edit-variable var) + (set-default sym (eval-minibuffer + (format "Set `%s': " var) + (if (or (arrayp val) + (memq val '(nil t)) + (numberp val)) + strv + (format "'%s" strv))))))) + +(defvar helm-edit-variable-mode-map + (let ((map (make-sparse-keymap))) + (define-key map (kbd "C-c C-c") 'helm-set-variable-from-pp-buffer) + (define-key map (kbd "C-c C-k") 'helm-edit-variable-quit) + (define-key map (kbd "C-c =") 'helm-edit-variable-toggle-diff) + map)) + +(define-derived-mode helm-edit-variable-mode + emacs-lisp-mode "helm-edit-variable" + "A mode to edit variables values. + +Special commands: +\\{helm-edit-variable-mode-map}") + +(defvar helm-pretty-print-temp-file-name + (expand-file-name "helm-edit-variable.el" temporary-file-directory)) +(defvar helm-pretty-print-buffer-name "*pretty print output*") +(defvar helm-pretty-print-current-symbol nil) +(defun helm-edit-variable (var) + (let* ((sym (intern-soft var)) + (val (symbol-value sym)) + (pp (pp-to-string val)) + start) + (with-current-buffer (get-buffer-create helm-pretty-print-buffer-name) + (erase-buffer) + (helm-edit-variable-mode) + (setq start (point)) + ;; Any number of lines starting with ";;;" + one empty line. + (insert (format ";;; Edit variable `%s' and hit C-c C-c when done\n" sym) + ";;; Abort with C-c C-k\n\n") + (add-text-properties start (1- (point)) '(read-only t)) + (add-text-properties (1- (point)) (point) '(read-only t rear-nonsticky t)) + (set (make-local-variable 'helm-pretty-print-current-symbol) sym) + (add-hook 'kill-buffer-hook + (lambda () + (when (file-exists-p helm-pretty-print-temp-file-name) + (delete-file helm-pretty-print-temp-file-name))) + nil t) + (save-excursion (insert pp)) + (write-region + (point-min) (point-max) helm-pretty-print-temp-file-name nil 1) + (setq buffer-file-name helm-pretty-print-temp-file-name)) + (display-buffer helm-pretty-print-buffer-name))) + +(defun helm-edit-variable-toggle-diff () + "Show diff in edit variable buffer." + (interactive) + (if (get-buffer-window "*Diff*" 'visible) + (kill-buffer "*Diff*") + (diff-buffer-with-file))) + +(defun helm-set-variable-from-pp-buffer () + "Set variable associated with buffer to buffer contents. + +The associated variable is the local variable +`helm-pretty-print-current-symbol'." + (interactive) + (with-current-buffer helm-pretty-print-buffer-name + (goto-char (point-min)) + (when (re-search-forward "^$" nil t) + (forward-line 1)) + (let ((val (symbol-value helm-pretty-print-current-symbol))) + (save-excursion + (if (or (arrayp val) + (memq val '(nil t)) + (numberp val) + (looking-at "[`']")) + (set-default helm-pretty-print-current-symbol + (read (current-buffer))) + (set-default helm-pretty-print-current-symbol + `(,@(read (current-buffer)))))) + (if (equal val (symbol-value helm-pretty-print-current-symbol)) + (message "No changes done") + (message "`%s' value modified" helm-pretty-print-current-symbol)) + (helm-edit-variable-quit)))) + +(defun helm-edit-variable-quit () + "Quit edit variable buffer." + (interactive) + (set-buffer-modified-p nil) + (quit-window t) + (helm-aif (get-buffer-window "*Diff*" 'visible) + (quit-window t it))) + + +;;; Elisp Timers. +;; +;; +(defclass helm-absolute-time-timers-class (helm-source-sync helm-type-timers) + ((candidates :initform 'timer-list) + (allow-dups :initform t) + (candidate-transformer + :initform + (lambda (candidates) + (cl-loop for timer in candidates + collect (cons (helm-elisp--format-timer timer) timer)))))) + +(defvar helm-source-absolute-time-timers + (helm-make-source "Absolute Time Timers" 'helm-absolute-time-timers-class)) + +(defclass helm-idle-time-timers-class (helm-source-sync helm-type-timers) + ((candidates :initform 'timer-idle-list) + (allow-dups :initform t) + (candidate-transformer + :initform + (lambda (candidates) + (cl-loop for timer in candidates + collect (cons (helm-elisp--format-timer timer) timer)))))) + +(defvar helm-source-idle-time-timers + (helm-make-source "Idle Time Timers" 'helm-idle-time-timers-class)) + +(defun helm-elisp--format-timer (timer) + (format "%s repeat=%s %s(%s)" + (let ((time (timer--time timer))) + (if (timer--idle-delay timer) + (format "idle-for=[%s]" + (format-seconds "%dd %hh %mmin %z%,3ss" + (time-to-seconds time))) + (format-time-string "%m/%d %T" time))) + (or (timer--repeat-delay timer) "nil") + (mapconcat #'identity (split-string + (prin1-to-string (timer--function timer)) + "\n") + " ") + (mapconcat #'prin1-to-string (timer--args timer) " "))) + +;;;###autoload +(defun helm-timers () + "Preconfigured `helm' for timers." + (interactive) + (helm :sources '(helm-source-absolute-time-timers + helm-source-idle-time-timers) + :buffer "*helm timers*")) + + +;;; Complex command history +;; +;; + +(defvar helm-sexp--last-sexp nil) +;; This wont work compiled. +(defun helm-sexp-eval-1 () + (interactive) + (unwind-protect + (progn + ;; Trick called-interactively-p into thinking that `cand' is + ;; an interactive call, See `repeat-complex-command'. + (add-hook 'called-interactively-p-functions + #'helm-complex-command-history--called-interactively-skip) + (eval (read helm-sexp--last-sexp) t)) + (remove-hook 'called-interactively-p-functions + #'helm-complex-command-history--called-interactively-skip))) + +(defun helm-complex-command-history--called-interactively-skip (i _frame1 frame2) + (and (eq 'eval (cadr frame2)) + (eq 'helm-sexp-eval-1 + (cadr (backtrace-frame (+ i 2) #'called-interactively-p))) + 1)) + +(defun helm-sexp-eval (_candidate) + (call-interactively #'helm-sexp-eval-1)) + +(defvar helm-source-complex-command-history + (helm-build-sync-source "Complex Command History" + :candidates (lambda () + ;; Use cdr to avoid adding + ;; `helm-complex-command-history' here. + (cl-loop for i in command-history + unless (equal i '(helm-complex-command-history)) + collect (prin1-to-string i))) + :action (helm-make-actions + "Eval" (lambda (candidate) + (and (boundp 'helm-sexp--last-sexp) + (setq helm-sexp--last-sexp candidate)) + (let ((command (read candidate))) + (unless (equal command (car command-history)) + (setq command-history (cons command command-history)))) + (run-with-timer 0.1 nil #'helm-sexp-eval candidate)) + "Edit and eval" (lambda (candidate) + (edit-and-eval-command "Eval: " (read candidate)))) + :persistent-action #'helm-sexp-eval + :multiline t)) + +;;;###autoload +(defun helm-complex-command-history () + "Preconfigured `helm' for complex command history." + (interactive) + (helm :sources 'helm-source-complex-command-history + :buffer "*helm complex commands*")) + +(provide 'helm-elisp) + +;;; helm-elisp.el ends here diff --git a/code/elpa/helm-20240320.541/helm-epa.el b/code/elpa/helm-20240320.541/helm-epa.el new file mode 100644 index 0000000..dc6c431 --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-epa.el @@ -0,0 +1,258 @@ +;;; helm-epa.el --- helm interface for epa/epg -*- lexical-binding: t; -*- + +;; Copyright (C) 2012 ~ 2023 Thierry Volpiatto + +;; 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 'helm) + +(eval-when-compile (require 'epg)) +(defvar epa-protocol) +(defvar epa-last-coding-system-specified) +(defvar epg-key-validity-alist) +(defvar mail-header-separator) +(declare-function epg-list-keys "epg") +(declare-function epg-make-context "epg") +(declare-function epg-key-sub-key-list "epg") +(declare-function epg-sub-key-id "epg") +(declare-function epg-key-user-id-list "epg") +(declare-function epg-user-id-string "epg") +(declare-function epg-user-id-validity "epg") +(declare-function epa-sign-region "epa") +(declare-function epa--read-signature-type "epa") +(declare-function epa-display-error "epa") +(declare-function epg-export-keys-to-string "epg") +(declare-function epg-context-armor "epg") +(declare-function epg-context-set-armor "epg") +(declare-function epg-delete-keys "epg") +(declare-function helm-read-file-name "helm-mode") + +(defvar helm-epa--list-only-secrets nil + "[INTERNAL] Used to pass MODE argument to `epg-list-keys'.") + +(defcustom helm-epa-actions '(("Show key" . epa--show-key) + ("encrypt file with key" . helm-epa-encrypt-file) + ("Copy keys to kill ring" . helm-epa-kill-keys-armor) + ("Delete keys" . helm-epa-delete-keys)) + "Actions for `helm-epa-list-keys'." + :type '(alist :key-type string :value-type symbol) + :group 'helm-misc) + +(defclass helm-epa (helm-source-sync) + ((init :initform (lambda () + (require 'epg) + (require 'epa))) + (candidates :initform 'helm-epa-get-key-list) + (keymap :initform 'helm-comp-read-map) + (mode-line :initform 'helm-comp-read-mode-line)) + "Allow building helm sources for GPG keys.") + +(defun helm-epa-get-key-list (&optional keys) + "Build candidate list for `helm-epa-list-keys'." + (cl-loop with all-keys = (or keys (epg-list-keys (epg-make-context epa-protocol) + nil helm-epa--list-only-secrets)) + for key in all-keys + for sublist = (car (epg-key-sub-key-list key)) + for subkey-id = (epg-sub-key-id sublist) + for uid-list = (epg-key-user-id-list key) + for uid = (epg-user-id-string (car uid-list)) + for validity = (epg-user-id-validity (car uid-list)) + collect (cons (format " %s %s %s" + (helm-aif (rassq validity epg-key-validity-alist) + (string (car it)) + "?") + (propertize + subkey-id + 'face (cl-case validity + (none 'epa-validity-medium) + ((revoked expired) + 'epa-validity-disabled) + (t 'epa-validity-high))) + (propertize + uid 'face 'font-lock-warning-face)) + key))) + +(cl-defun helm-epa--select-keys (prompt keys) + "A helm replacement for `epa--select-keys'." + (let ((result (helm :sources (helm-make-source "Epa select keys" 'helm-epa + :candidates (lambda () + (helm-epa-get-key-list keys)) + :action (lambda (_candidate) + (helm-marked-candidates))) + :prompt (and prompt (helm-epa--format-prompt prompt)) + :buffer "*helm epa*"))) + (if (or (equal result "") (null result)) + (cl-return-from helm-epa--select-keys + (error "No keys selected, aborting")) + result))) + +(defun helm-epa--format-prompt (prompt) + (let ((split (split-string prompt "\n"))) + (if (cdr split) + (format "%s\n(%s): " + (replace-regexp-in-string "\\.[\t ]*\\'" "" (car split)) + (replace-regexp-in-string "\\.[\t ]*\\'" "" (cadr split))) + (format "%s: " (replace-regexp-in-string "\\.[\t ]*\\'" "" (car split)))))) + +(defun helm-epa--read-signature-type () + "A helm replacement for `epa--read-signature-type'." + (let ((answer (helm-read-answer "Signature type: +(n - Create a normal signature) +(c - Create a cleartext signature) +(d - Create a detached signature)" + '("n" "c" "d")))) + (helm-acase answer + ("n" 'normal) + ("c" 'clear) + ("d" 'detached)))) + +(defun helm-epa-collect-keys-from-candidates (candidates) + (cl-loop for c in candidates + collect (epg-sub-key-id + (car (epg-key-sub-key-list c))))) + +(defun helm-epa-collect-id-from-candidates (candidates) + (cl-loop for c in candidates + collect (epg-user-id-string + (car (epg-key-user-id-list c))))) + +(defun helm-epa-success-message (str keys ids) + (message str + (mapconcat (lambda (pair) + (concat (car pair) " " (cdr pair))) + (cl-loop for k in keys + for i in ids + collect (cons k i)) + "\n"))) + +;;;###autoload +(define-minor-mode helm-epa-mode + "Enable helm completion on gpg keys in epa functions." + :group 'helm-misc + :global t + (require 'epa) + (if helm-epa-mode + (progn + (advice-add 'epa--select-keys :override #'helm-epa--select-keys) + (advice-add 'epa--read-signature-type :override #'helm-epa--read-signature-type)) + (advice-remove 'epa--select-keys #'helm-epa--select-keys) + (advice-remove 'epa--read-signature-type #'helm-epa--read-signature-type))) + +(defun helm-epa-action-transformer (actions _candidate) + "Helm epa action transformer function." + (cond ((with-helm-current-buffer + (derived-mode-p 'message-mode 'mail-mode)) + (helm-append-at-nth + actions '(("Sign mail with key" . helm-epa-mail-sign) + ("Encrypt mail with key" . helm-epa-mail-encrypt)) + 3)) + (t actions))) + +(defun helm-epa-delete-keys (_candidate) + "Delete gpg marked keys from helm-epa." + (let ((context (epg-make-context epa-protocol)) + (keys (helm-marked-candidates))) + (message "Deleting gpg keys..") + (condition-case error + (epg-delete-keys context keys) + (error + (epa-display-error context) + (signal (car error) (cdr error)))) + (message "Deleting gpg keys done"))) + +(defun helm-epa-encrypt-file (_candidate) + "Select a file to encrypt with key CANDIDATE." + (let* ((file (helm-read-file-name "Encrypt file: ")) + (cands (helm-marked-candidates)) + (keys (helm-epa-collect-keys-from-candidates cands)) + (ids (helm-epa-collect-id-from-candidates cands))) + (epa-encrypt-file file cands) + (helm-epa-success-message "File encrypted with key(s):\n %s" + keys ids))) + +(defun helm-epa-kill-keys-armor (_candidate) + "Copy marked keys to kill ring." + (let ((keys (helm-marked-candidates)) + (context (epg-make-context epa-protocol))) + (with-no-warnings + (setf (epg-context-armor context) t)) + (condition-case error + (kill-new (epg-export-keys-to-string context keys)) + (error + (epa-display-error context) + (signal (car error) (cdr error)))))) + +(defun helm-epa-mail-sign (candidate) + "Sign email with key CANDIDATE." + (let ((key (epg-sub-key-id (car (epg-key-sub-key-list candidate)))) + (id (epg-user-id-string (car (epg-key-user-id-list candidate)))) + start end mode) + (save-excursion + (goto-char (point-min)) + (if (search-forward mail-header-separator nil t) + (forward-line)) + (setq epa-last-coding-system-specified + (or coding-system-for-write + (select-safe-coding-system (point) (point-max)))) + (let ((verbose current-prefix-arg)) + (setq start (point) + end (point-max) + mode (if verbose + (epa--read-signature-type) + 'clear)))) + ;; TODO Make non-interactive functions to replace epa-sign-region + ;; and epa-encrypt-region and inline them. + (with-no-warnings + (epa-sign-region start end candidate mode)) + (message "Mail signed with key `%s %s'" key id))) + +(defun helm-epa-mail-encrypt (_candidate) + "Encrypt email with key CANDIDATE." + (let ((cands (helm-marked-candidates)) + start end) + (save-excursion + (goto-char (point-min)) + (when (search-forward mail-header-separator nil t) + (forward-line)) + (setq start (point) + end (point-max)) + (setq epa-last-coding-system-specified + (or coding-system-for-write + (select-safe-coding-system start end)))) + ;; Don't let some read-only text stop us from encrypting. + (let ((inhibit-read-only t) + (keys (helm-epa-collect-keys-from-candidates cands)) + (ids (helm-epa-collect-id-from-candidates cands))) + (with-no-warnings + (epa-encrypt-region start end cands nil nil)) + (helm-epa-success-message "Mail encrypted with key(s):\n %s" + keys ids)))) + +;;;###autoload +(defun helm-epa-list-keys () + "List all gpg keys. +This is the helm interface for `epa-list-keys'." + (interactive) + (helm :sources + (helm-make-source "Epg list keys" 'helm-epa + :action-transformer 'helm-epa-action-transformer + :action 'helm-epa-actions) + :buffer "*helm epg list keys*")) + +(provide 'helm-epa) + +;;; helm-epa.el ends here diff --git a/code/elpa/helm-20240320.541/helm-eshell.el b/code/elpa/helm-20240320.541/helm-eshell.el new file mode 100644 index 0000000..fae99c3 --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-eshell.el @@ -0,0 +1,494 @@ +;;; helm-eshell.el --- pcomplete and eshell completion for helm. -*- lexical-binding: t -*- + +;; Copyright (C) 2012 ~ 2023 Thierry Volpiatto + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: +;; +;; Enable like this in .emacs: +;; (add-hook 'eshell-mode-hook +;; (lambda () +;; (eshell-cmpl-initialize) +;; (define-key eshell-mode-map [remap eshell-pcomplete] 'helm-esh-pcomplete) +;; (define-key eshell-mode-map (kbd "M-s f") 'helm-eshell-prompts-all))) +;; (define-key eshell-mode-map (kbd "M-r") 'helm-eshell-history))) + + +;;; Code: +(require 'cl-lib) +(require 'helm) +(require 'helm-lib) +(require 'helm-help) +(require 'helm-elisp) + +(declare-function eshell-read-aliases-list "em-alias") +(declare-function eshell-send-input "esh-mode" (&optional use-region queue-p no-newline)) +(declare-function eshell-bol "esh-mode") +(declare-function eshell-parse-arguments "esh-arg" (beg end)) +(declare-function eshell-backward-argument "esh-mode" (&optional arg)) +(declare-function helm-quote-whitespace "helm-lib") +(declare-function eshell-skip-prompt "em-prompt") +(defvar eshell-special-chars-outside-quoting) + + +(defgroup helm-eshell nil + "Helm completion and history for Eshell." + :group 'helm) + + +(defcustom helm-eshell-fuzzy-match nil + "Enable fuzzy matching in `helm-esh-pcomplete' when non-nil." + :type 'boolean) + + +(defvar helm-eshell-history-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map helm-map) + (define-key map (kbd "M-p") #'helm-next-line) + map) + "Keymap for `helm-eshell-history'.") + +(defvar helm-esh-completion-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map helm-map) + (define-key map (kbd "TAB") #'helm-next-line) + map) + "Keymap for `helm-esh-pcomplete'.") + +(defvar helm-eshell--quit-flag nil) + + +;; Internal. +(defvar helm-ec-target "") +(defun helm-ec-insert (_candidate) + "Replace text at point with CANDIDATE. +The function that call this should set `helm-ec-target' to thing +at point." + (set (make-local-variable 'comint-file-name-quote-list) + eshell-special-chars-outside-quoting) + (let ((pt (point))) + (when (and helm-ec-target + (search-backward helm-ec-target nil t) + (string= (buffer-substring (point) pt) helm-ec-target)) + (delete-region (point) pt))) + (when (string-match "\\`\\*" helm-ec-target) (insert "*")) + (let ((marked (helm-marked-candidates))) + (prog1 t ;; Makes helm returns t on action. + (insert + (mapconcat + (lambda (x) + (cond ((string-match "\\`~/" helm-ec-target) + ;; Strip out the first escape char added by + ;; `comint-quote-filename' before "~" (Bug#1803). + (substring (comint-quote-filename (abbreviate-file-name x)) 1)) + ((string-match "\\`/" helm-ec-target) + (comint-quote-filename x)) + (t + (concat (and (string-match "\\`[.]/" helm-ec-target) "./") + (comint-quote-filename + (file-relative-name x)))))) + marked " ") + (or (helm-aand (car (last marked)) + (string-match-p "/\\'" it) + "") + " "))))) + +(defun helm-esh-transformer (candidates _sources) + (cl-loop + for i in candidates + collect + (cond ((string-match "\\`~/?" helm-ec-target) + (abbreviate-file-name i)) + ((string-match "\\`/" helm-ec-target) i) + (t + (file-relative-name i))) + into lst + finally return (sort lst #'helm-generic-sort-fn))) + +(defclass helm-esh-source (helm-source-sync) + ((init :initform (lambda () + (setq pcomplete-current-completions nil + pcomplete-last-completion-raw nil) + ;; Eshell-command add this hook in all minibuffers + ;; Remove it for the helm one. (Fixed in Emacs24) + (remove-hook 'minibuffer-setup-hook 'eshell-mode))) + (candidates :initform 'helm-esh-get-candidates) + ;(nomark :initform t) + (persistent-action :initform 'ignore) + (nohighlight :initform t) + (filtered-candidate-transformer :initform #'helm-esh-transformer) + (action :initform 'helm-ec-insert)) + "Helm class to define source for Eshell completion.") + +(defun helm-esh-get-candidates () + "Get candidates for Eshell completion using `pcomplete'." + (catch 'pcompleted + (with-helm-current-buffer + (let* ((pcomplete-stub) + pcomplete-seen pcomplete-norm-func + pcomplete-args pcomplete-last pcomplete-index + (pcomplete-autolist pcomplete-autolist) + (pcomplete-suffix-list pcomplete-suffix-list) + (table (pcomplete-completions)) + (entry (or (try-completion helm-pattern + (pcomplete-entries)) + helm-pattern))) + (cl-loop ;; expand entry too to be able to compare it with file-cand. + with exp-entry = (and (stringp entry) + (not (string= entry "")) + (file-name-as-directory + (expand-file-name entry default-directory))) + with comps = (all-completions pcomplete-stub table) + unless comps return (prog1 nil + ;; Don't add final space when + ;; there is no completion (Bug#1990). + (setq helm-eshell--quit-flag t) + (message "No completions of %s" pcomplete-stub)) + for i in comps + ;; Transform the relative names to abs names. + for file-cand = (and exp-entry + (if (file-remote-p i) i + (expand-file-name + i (file-name-directory + (if (directory-name-p pcomplete-stub) + entry + (directory-file-name entry)))))) + ;; Compare them to avoid dups. + for file-entry-p = (and (stringp exp-entry) + (stringp file-cand) + ;; Fix :/tmp/foo/ $ cd foo + (not (file-directory-p file-cand)) + (file-equal-p exp-entry file-cand)) + if (and file-cand (or (file-remote-p file-cand) + (file-exists-p file-cand)) + (not file-entry-p)) + collect file-cand into ls + else + ;; Avoid adding entry here. + unless file-entry-p collect i into ls + finally return + (if (and exp-entry + (file-directory-p exp-entry) + ;; If the car of completion list is + ;; an executable, probably we are in + ;; command completion, so don't add a + ;; possible file related entry here. + (and ls (not (executable-find (car ls)))) + ;; Don't add entry if already in prompt. + (not (file-equal-p exp-entry pcomplete-stub))) + (append (list exp-entry) + ;; Entry should not be here now but double check. + (remove entry ls)) + ls)))))) + +;;; Eshell history. +;; +;; +(defclass helm-eshell-history-source (helm-source-sync) + ((init :initform + (lambda () + ;; Same comment as in `helm-source-esh'. + (remove-hook 'minibuffer-setup-hook 'eshell-mode))) + (candidates + :initform + (lambda () + (with-helm-current-buffer + (cl-loop for c from 0 to (ring-length eshell-history-ring) + for elm = (eshell-get-history c) + unless (and (member elm lst) + eshell-hist-ignoredups) + collect elm into lst + finally return lst)))) + (nomark :initform t) + (multiline :initform t) + (keymap :initform 'helm-eshell-history-map) + (candidate-number-limit :initform 9999) + (action :initform (lambda (candidate) + (eshell-kill-input) + (insert candidate)))) + "Helm class to define source for Eshell history.") + + +(defun helm-esh-pcomplete-input (target users-comp last) + (if (and (stringp last) + (not (string= last "")) + (not users-comp) + ;; Fix completion on "../" see Bug#1832. + (or (file-exists-p last) + (helm-aand + (file-name-directory last) + (file-directory-p it)))) + (if (and (file-directory-p last) + (string-match "\\`[~.]*.*/[.]\\'" target)) + ;; Fix completion on "~/.", "~/[...]/.", and "../." + (expand-file-name + (concat (helm-basedir (file-name-as-directory last)) + (regexp-quote (helm-basename target)))) + (expand-file-name last)) + ;; Don't add "~" to input to provide completion on all users instead of only + ;; on current $HOME (#1832). + (unless users-comp last))) + +(defun helm-esh-pcomplete-default-source () + "Make and return the default source for Eshell completion." + (helm-make-source "Eshell completions" 'helm-esh-source + :fuzzy-match helm-eshell-fuzzy-match + :keymap helm-esh-completion-map)) + +(defvar helm-esh-pcomplete-build-source-fn #'helm-esh-pcomplete-default-source + "Function that builds a source or a list of sources.") + +(defun helm-esh-pcomplete--make-helm (&optional input) + (helm :sources (funcall helm-esh-pcomplete-build-source-fn) + :buffer "*helm pcomplete*" + :resume 'noresume + :input input)) + +;;;###autoload +(defun helm-esh-pcomplete () + "Preconfigured `helm' to provide Helm completion in Eshell." + (interactive) + (let* ((helm-quit-if-no-candidate t) + (helm-execute-action-at-once-if-one t) + (end (point-marker)) + (beg (save-excursion (eshell-bol) (point))) + (args (catch 'eshell-incomplete + (eshell-parse-arguments beg end))) + (target + (or (and (looking-back " " (1- (point))) " ") + (buffer-substring-no-properties + (save-excursion + (eshell-backward-argument 1) (point)) + end))) + (users-comp (string= target "~")) + (first (car args)) ; Maybe lisp delimiter "(". + last ; Will be the last but parsed by pcomplete. + del-space + del-dot) + (setq helm-ec-target (or target " ") + end (point) + ;; Reset beg for `with-helm-show-completion'. + beg (or (and target (not (string= target " ")) + (- end (length target))) + ;; Nothing at point. + (progn (insert " ") (setq del-space t) (point)))) + (when (string-match "\\`[~.]*.*/[.]\\'" target) + ;; Fix completion on + ;; "~/.", "~/[...]/.", and "../." + (delete-char -1) (setq del-dot t) + (setq helm-ec-target (substring helm-ec-target 0 (1- (length helm-ec-target))))) + (cond ((eq first ?\() + (helm-lisp-completion-at-point)) + ;; In eshell `pcomplete-parse-arguments' is called + ;; with `pcomplete-parse-arguments-function' + ;; locally bound to `eshell-complete-parse-arguments' + ;; which is calling `lisp-complete-symbol', + ;; calling it before would popup the + ;; *completions* buffer. + (t (setq last (replace-regexp-in-string + "\\`\\*" "" + (car (last (ignore-errors + (pcomplete-parse-arguments)))))) + ;; Set helm-eshell--quit-flag to non-nil only on + ;; quit, this tells to not add final suffix when quitting + ;; helm. + (add-hook 'helm-quit-hook #'helm-eshell--quit-hook-fn) + (with-helm-show-completion beg end + (unwind-protect + (or (helm-esh-pcomplete--make-helm + (helm-esh-pcomplete-input target users-comp last)) + ;; Delete removed dot on quit + (and del-dot (prog1 t (insert "."))) + ;; A space is needed to have completion, remove + ;; it when nothing found. + (and del-space (looking-back "\\s-" (1- (point))) + (delete-char -1)) + (if (and (null helm-eshell--quit-flag) + (and (stringp last) (file-directory-p last)) + (looking-back "\\([.]\\{1,2\\}\\|[^/]\\)\\'" + (1- (point)))) + (prog1 t (insert "/")) + ;; We need another flag for space here, but + ;; global to pass it to `helm-quit-hook', this + ;; space is added when point is just after + ;; previous completion and there is no + ;; more completion, see Bug#1832. + (unless (or helm-eshell--quit-flag + (looking-back "/\\'" (1- (point)))) + (prog1 t (insert " "))) + (when (and helm-eshell--quit-flag + (string-match-p "[.]\\{2\\}\\'" last)) + (insert "/")))) + (remove-hook 'helm-quit-hook #'helm-eshell--quit-hook-fn) + (setq helm-eshell--quit-flag nil))))))) + +(defun helm-eshell--quit-hook-fn () + (setq helm-eshell--quit-flag t)) + +;;;###autoload +(defun helm-eshell-history () + "Preconfigured Helm for Eshell history." + (interactive) + (let* ((end (point)) + (beg (save-excursion (eshell-bol) (point))) + (input (buffer-substring beg end)) + flag-empty) + (when (eq beg end) + (insert " ") + (setq flag-empty t) + (setq end (point))) + (unwind-protect + (with-helm-show-completion beg end + (helm :sources (helm-make-source "Eshell history" + 'helm-eshell-history-source + :fuzzy-match helm-eshell-fuzzy-match) + :buffer "*helm eshell history*" + :resume 'noresume + :input input)) + (when (and flag-empty + (looking-back " " (1- (point)))) + (delete-char -1))))) + + +;;; Eshell prompts +;; +(defface helm-eshell-prompts-promptidx + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "cyan")) + "Face used to highlight Eshell prompt index.") + +(defface helm-eshell-prompts-buffer-name + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "green")) + "Face used to highlight Eshell buffer name.") + +(defcustom helm-eshell-prompts-promptidx-p t + "Show prompt number." + :type 'boolean) + +(defvar helm-eshell-prompts-keymap + (let ((map (make-sparse-keymap))) + (set-keymap-parent map helm-map) + (define-key map (kbd "C-c o") #'helm-eshell-prompts-other-window) + (define-key map (kbd "C-c C-o") #'helm-eshell-prompts-other-frame) + map) + "Keymap for `helm-eshell-prompt-all'.") + +(defvar eshell-prompt-regexp) +(defvar eshell-highlight-prompt) + +(defun helm-eshell-prompts-list (&optional buffer) + "List the prompts in Eshell BUFFER. + +Return a list of (\"prompt\" (point) (buffer-name) prompt-index)) +E.g. (\"ls\" 162 \"*eshell*\" 3). +If BUFFER is nil, use current buffer." + (with-current-buffer (or buffer (current-buffer)) + (when (eq major-mode 'eshell-mode) + (save-excursion + (goto-char (point-min)) + (let (result (count 1)) + (helm-awhile (re-search-forward eshell-prompt-regexp nil t) + (when (or (and eshell-highlight-prompt + (get-text-property (match-beginning 0) 'read-only)) + (null eshell-highlight-prompt)) + (push (list (buffer-substring-no-properties + it (pos-eol)) + it (buffer-name) count) + result) + (setq count (1+ count)))) + (nreverse result)))))) + +(defun helm-eshell-prompts-list-all () + "List the prompts of all Eshell buffers. +See `helm-eshell-prompts-list'." + (cl-loop for b in (buffer-list) + append (helm-eshell-prompts-list b))) + +(defun helm-eshell-prompts-transformer (candidates &optional all) + ;; ("ls" 162 "*eshell*" 3) => ("*eshell*:3:ls" . ("ls" 162 "*eshell*" 3)) + (cl-loop for (prt pos buf id) in candidates + collect `(,(concat + (when all + (concat (propertize + buf + 'face 'helm-eshell-prompts-buffer-name) + ":")) + (when helm-eshell-prompts-promptidx-p + (concat (propertize + (number-to-string id) + 'face 'helm-eshell-prompts-promptidx) + ":")) + prt) + . ,(list prt pos buf id)))) + +(defun helm-eshell-prompts-all-transformer (candidates) + (helm-eshell-prompts-transformer candidates t)) + +(cl-defun helm-eshell-prompts-goto (candidate &optional (action 'switch-to-buffer)) + ;; Candidate format: ("ls" 162 "*eshell*" 3) + (let ((buf (nth 2 candidate))) + (unless (and (string= (buffer-name) buf) + (eq action 'switch-to-buffer)) + (funcall action buf)) + (goto-char (nth 1 candidate)) + (recenter))) + +(defun helm-eshell-prompts-goto-other-window (candidate) + (helm-eshell-prompts-goto candidate 'switch-to-buffer-other-window)) + +(defun helm-eshell-prompts-goto-other-frame (candidate) + (helm-eshell-prompts-goto candidate 'switch-to-buffer-other-frame)) + +(helm-make-command-from-action helm-eshell-prompts-other-window + "Switch to eshell prompt in other window." + 'helm-eshell-prompts-goto-other-window) + +(helm-make-command-from-action helm-eshell-prompts-other-frame + "Switch to eshell prompt in other frame." + 'helm-eshell-prompts-goto-other-frame) + +;;;###autoload +(defun helm-eshell-prompts () + "Pre-configured `helm' to browse the prompts of the current Eshell." + (interactive) + (if (eq major-mode 'eshell-mode) + (helm :sources + (helm-build-sync-source "Eshell prompts" + :candidates (helm-eshell-prompts-list) + :candidate-transformer 'helm-eshell-prompts-transformer + :action '(("Go to prompt" . helm-eshell-prompts-goto))) + :buffer "*helm Eshell prompts*") + (message "Current buffer is not an Eshell buffer"))) + +;;;###autoload +(defun helm-eshell-prompts-all () + "Pre-configured `helm' to browse the prompts of all Eshell sessions." + (interactive) + (helm :sources + (helm-build-sync-source "All Eshell prompts" + :candidates (helm-eshell-prompts-list-all) + :candidate-transformer 'helm-eshell-prompts-all-transformer + :action '(("Go to prompt" . helm-eshell-prompts-goto) + ("Go to prompt in other window `C-c o`" . + helm-eshell-prompts-goto-other-window) + ("Go to prompt in other frame `C-c C-o`" . + helm-eshell-prompts-goto-other-frame)) + :keymap helm-eshell-prompts-keymap) + :buffer "*helm Eshell all prompts*")) + +(provide 'helm-eshell) + +;;; helm-eshell ends here diff --git a/code/elpa/helm-20240320.541/helm-eval.el b/code/elpa/helm-20240320.541/helm-eval.el new file mode 100644 index 0000000..b7c7d9c --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-eval.el @@ -0,0 +1,221 @@ +;;; helm-eval.el --- eval expressions from helm. -*- lexical-binding: t -*- + +;; Copyright (C) 2012 ~ 2023 Thierry Volpiatto + +;; 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 'helm) +(require 'helm-help) +(require 'eldoc) +(require 'edebug) + +(declare-function helm-lisp-completion-at-point "helm-elisp.el") +(declare-function helm-elisp-show-doc-modeline "helm-elisp.el") +(defvar helm-elisp-help-function) + +(defgroup helm-eval nil + "Eval related Applications and libraries for Helm." + :group 'helm) + +(defcustom helm-eldoc-in-minibuffer-show-fn + 'helm-show-info-in-mode-line + "A function to display eldoc info. +Should take one arg: the string to display." + :group 'helm-eval + :type 'symbol) + +(defcustom helm-show-info-in-mode-line-delay 12 + "Eldoc will show info in mode-line during this delay if user is idle." + :type 'integer + :group 'helm-eval) + + +;;; Eldoc compatibility between emacs-24 and emacs-25 +;; +(if (require 'elisp-mode nil t) ; emacs-25 + ;; Maybe the eldoc functions have been + ;; already aliased by eldoc-eval. + (cl-loop for (f . a) in '((eldoc-current-symbol . + elisp--current-symbol) + (eldoc-fnsym-in-current-sexp . + elisp--fnsym-in-current-sexp) + (eldoc-get-fnsym-args-string . + elisp-get-fnsym-args-string) + (eldoc-get-var-docstring . + elisp-get-var-docstring)) + unless (fboundp f) + do (defalias f a)) + ;; Emacs-24. + (declare-function eldoc-current-symbol "eldoc") + (declare-function eldoc-get-fnsym-args-string "eldoc" (sym &optional index)) + (declare-function eldoc-get-var-docstring "eldoc" (sym)) + (declare-function eldoc-fnsym-in-current-sexp "eldoc")) + +;;; Evaluation Result +;; +;; +;; Internal +(defvar helm-eldoc-active-minibuffers-list nil) + +(defvar helm-eval-expression-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map helm-map) + (define-key map (kbd "") #'helm-eval-new-line-and-indent) + (define-key map (kbd "") #'lisp-indent-line) + (define-key map (kbd "") #'helm-lisp-completion-at-point) + (define-key map (kbd "C-p") #'previous-line) + (define-key map (kbd "C-n") #'next-line) + (define-key map (kbd "") #'previous-line) + (define-key map (kbd "") #'next-line) + (define-key map (kbd "") #'forward-char) + (define-key map (kbd "") #'backward-char) + map)) + +(defclass helm-evaluation-result-class (helm-source-dummy) + ((echo-input-in-header-line + :initarg :echo-input-in-header-line + :initform 'never))) + +(defun helm-build-evaluation-result-source () + (helm-make-source "Evaluation Result" 'helm-evaluation-result-class + :multiline t + :mode-line "C-RET: nl-and-indent, M-tab: reindent, C-tab:complete, C-p/n: next/prec-line." + :filtered-candidate-transformer + (lambda (_candidates _source) + (list + (condition-case nil + (with-helm-current-buffer + (pp-to-string + (if edebug-active + (edebug-eval-expression + (read helm-pattern)) + (eval (read helm-pattern) t)))) + (error "Error")))) + :nohighlight t + :keymap helm-eval-expression-map + :action '(("Copy result to kill-ring" . (lambda (candidate) + (kill-new + (replace-regexp-in-string + "\n" "" candidate)) + (message "Result copied to kill-ring"))) + ("copy sexp to kill-ring" . (lambda (_candidate) + (kill-new helm-input) + (message "Sexp copied to kill-ring")))))) + +(defun helm-eval-new-line-and-indent () + (interactive) + (newline) (lisp-indent-line)) + +(defun helm-eldoc-store-minibuffer () + "Store minibuffer buffer name in `helm-eldoc-active-minibuffers-list'." + (with-selected-window (minibuffer-window) + (push (current-buffer) helm-eldoc-active-minibuffers-list))) + +;; From emacs-28.1: As the eldoc API is nowaday a pain to use, try to +;; provide some eldoc in mode-line the best as possible (may break at +;; some point). +(defun helm-eldoc-show-in-eval () + "Return eldoc in mode-line for current minibuffer input." + (let ((buf (window-buffer (active-minibuffer-window)))) + (condition-case err + (when (member buf helm-eldoc-active-minibuffers-list) + (with-current-buffer buf + (let* ((info-fn (eldoc-fnsym-in-current-sexp)) + (vsym (eldoc-current-symbol)) + (sym (car info-fn)) + (vardoc (eldoc-get-var-docstring vsym)) + (doc (or vardoc + (eldoc-get-fnsym-args-string + sym (cadr info-fn)))) + (all (format "%s: %s" + (propertize + (symbol-name (if vardoc vsym sym)) + 'face (if vardoc + 'font-lock-variable-name-face + 'font-lock-function-name-face)) + doc))) + (when doc (funcall helm-eldoc-in-minibuffer-show-fn all))))) + (error (message "Eldoc in minibuffer error: %S" err) nil)))) + +(defun helm-show-info-in-mode-line (str) + "Display string STR in mode-line." + (save-selected-window + (with-helm-window + (let ((mode-line-format (concat " " str))) + (force-mode-line-update) + (sit-for helm-show-info-in-mode-line-delay)) + (force-mode-line-update)))) + +;;; Calculation Result +;; +;; +(defvar helm-source-calculation-result + (helm-build-dummy-source "Calculation Result" + :filtered-candidate-transformer (lambda (_candidates _source) + (list + (condition-case err + (let ((result (calc-eval helm-pattern))) + (if (listp result) + (error "At pos %s: %s" + (car result) (cadr result)) + result)) + (error (cdr err))))) + :nohighlight t + :action '(("Copy result to kill-ring" . (lambda (candidate) + (kill-new candidate) + (message "Result \"%s\" copied to kill-ring" + candidate))) + ("Copy operation to kill-ring" . (lambda (_candidate) + (kill-new helm-input) + (message "Calculation copied to kill-ring")))))) + +;;;###autoload +(defun helm-eval-expression (arg) + "Preconfigured `helm' for `helm-source-evaluation-result'." + (interactive "P") + (let ((helm-elisp-help-function #'helm-elisp-show-doc-modeline)) + (helm :sources (helm-build-evaluation-result-source) + :input (when arg (thing-at-point 'sexp)) + :buffer "*helm eval*" + :echo-input-in-header-line nil + :history 'read-expression-history))) + +(defvar eldoc-idle-delay) +;;;###autoload +(defun helm-eval-expression-with-eldoc () + "Preconfigured `helm' for `helm-source-evaluation-result' with `eldoc' support." + (interactive) + (let ((timer (run-with-idle-timer + eldoc-idle-delay 'repeat + #'helm-eldoc-show-in-eval))) + (unwind-protect + (minibuffer-with-setup-hook + #'helm-eldoc-store-minibuffer + (call-interactively 'helm-eval-expression)) + (and timer (cancel-timer timer)) + (setq helm-eldoc-active-minibuffers-list + (cdr helm-eldoc-active-minibuffers-list))))) + +;;;###autoload +(defun helm-calcul-expression () + "Preconfigured `helm' for `helm-source-calculation-result'." + (interactive) + (helm :sources 'helm-source-calculation-result + :buffer "*helm calcul*")) + +(provide 'helm-eval) + +;;; helm-eval.el ends here diff --git a/code/elpa/helm-20240320.541/helm-external.el b/code/elpa/helm-20240320.541/helm-external.el new file mode 100644 index 0000000..08b624e --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-external.el @@ -0,0 +1,264 @@ +;;; helm-external.el --- Run Externals commands within Emacs with helm completion. -*- lexical-binding: t -*- + +;; Copyright (C) 2012 ~ 2023 Thierry Volpiatto + +;; 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 'helm) +(require 'helm-help) +(require 'helm-net) + +(declare-function helm-comp-read "helm-mode") + + +(defgroup helm-external nil + "External related Applications and libraries for Helm." + :group 'helm) + +(defcustom helm-raise-command nil + "A shell command to jump to a window running specific program. +Need external program wmctrl. +This will be use with `format', so use something like \"wmctrl -xa %s\"." + :type 'string + :group 'helm-external) + +(defcustom helm-external-programs-associations nil + "Alist to store externals programs associated with file extension. +This variable overhide setting in .mailcap file. +E.g.: \\='((\"jpg\" . \"gqview\") (\"pdf\" . \"xpdf\")) " + :type '(alist :key-type string :value-type string) + :group 'helm-external) + +(defcustom helm-default-external-file-browser "nautilus" + "Default external file browser for your system. +Directories will be opened externally with it when opening file +externally in `helm-find-files'. +Set to nil if you do not have an external file browser or do not +want to use it. +Windows users should set that to \"explorer.exe\"." + :group 'helm-external + :type 'string) + +(defvar helm-open-file-externally-after-hook nil + "Hook that run after opening a file with external program.") + +(defvar helm-open-file-externally-after-finish-hook nil + "Hook that run after external program finish.") + +;;; Internals +(defvar helm-external-command-history nil) +(defvar helm-external-commands-list nil + "A list of all external commands the user can execute. +If this variable is not set by the user, it will be calculated +automatically.") + +(defun helm-external-commands-list-1 (&optional sort) + "Return a list of all external commands the user can execute. +If `helm-external-commands-list' is non-nil it will return its +contents. Else it calculates all external commands and sets +`helm-external-commands-list'." + (or helm-external-commands-list + (setq helm-external-commands-list + (cl-loop for dir in (split-string (getenv "PATH") path-separator) + when (and (file-exists-p dir) + (file-accessible-directory-p dir)) + for lsdir = (cl-loop for i in (directory-files dir t) + for bn = (file-name-nondirectory i) + when (and (not (member bn completions)) + (not (file-directory-p i)) + (file-executable-p i)) + collect bn) + append lsdir into completions + finally return + (if sort (sort completions 'string-lessp) completions))))) + +(defun helm-run-or-raise (exe &optional files detached) + "Run asynchronously EXE or jump to the application window. +If EXE is already running just jump to his window if +`helm-raise-command' is non-nil. +When FILES argument is provided run EXE with FILES. +When argument DETACHED is non nil, detach process from Emacs." + (let* ((proc-name (replace-regexp-in-string + "(" "" (car (split-string exe)))) + (fmt-file (lambda (file) + (shell-quote-argument + (if (eq system-type 'windows-nt) + (helm-w32-prepare-filename file) + (expand-file-name file))))) + (file-arg (and files (mapconcat fmt-file files " "))) + process-connection-type proc) + (when (and files detached (not (string-match "%s &)\\'" exe))) + (setq exe (format "(%s &)" exe))) + (when (member proc-name helm-external-commands-list) + ;; Allow adding more files to the current process if it is + ;; already running (i.e. Don't just raise it without sending + ;; files) we assume program doesn't start a new + ;; process (like firefox, transmission etc...). + (if files + (cond ((string-match "%s &)\\'" exe) + (message "Starting and detaching `%s' from Emacs" proc-name) + (call-process-shell-command (format exe file-arg))) + (t + (message "Starting %s..." proc-name) + (setq proc + (start-process-shell-command + proc-name nil (if (string-match "%s" exe) + (format exe file-arg) + (format "%s %s" exe file-arg)))))) + ;; Just jump to the already running program instance or start + ;; a new process. + (if (get-process proc-name) + (if helm-raise-command + (run-at-time 0.1 nil #'shell-command + (format helm-raise-command proc-name)) + (error "Error: %s is already running" proc-name)) + (if (and detached (not (memq system-type '(windows-nt ms-dos)))) + (progn + (message "Starting and detaching `%s' from Emacs" proc-name) + (call-process-shell-command (format "(%s &)" exe))) + (when detached + (user-error "Detaching programs not supported on `%s'" system-type)) + (setq proc (start-process-shell-command proc-name nil exe))))) + (when proc + (set-process-sentinel + proc + (lambda (process event) + (when (and (string= event "finished\n") + helm-raise-command + (not (helm-get-pid-from-process-name proc-name))) + (run-hooks 'helm-open-file-externally-after-finish-hook) + (shell-command (format helm-raise-command "emacs"))) + (message "%s process...Finished." process)))) + ;; Move command on top list. + (setq helm-external-commands-list + (cons proc-name + (delete proc-name helm-external-commands-list)))))) + +(defun helm-get-mailcap-for-file (filename) + "Get the command to use for FILENAME from mailcap files." + (mailcap-parse-mailcaps) + (let* ((ext (file-name-extension filename)) + (mime (when ext (mailcap-extension-to-mime ext))) + (result (when mime (mailcap-mime-info mime)))) + ;; If elisp file have no associations in .mailcap + ;; `mailcap-maybe-eval' is returned, in this case just return nil. + (when (stringp result) (helm-basename result)))) + +(defun helm-get-default-program-for-file (filename) + "Try to find a default program to open FILENAME. +Try first in `helm-external-programs-associations' and then in +mailcap file. If nothing found return nil." + (let* ((ext (file-name-extension filename)) + (def-prog (assoc-default ext helm-external-programs-associations))) + (cond ((and def-prog (not (string= def-prog ""))) def-prog) + ((and helm-default-external-file-browser (file-directory-p filename)) + helm-default-external-file-browser) + (t (helm-get-mailcap-for-file filename))))) + +(defun helm-open-file-externally (_file) + "Open FILE with an external program. +Try to guess which program to use with +`helm-get-default-program-for-file'. +If not found or a prefix arg is given query the user which tool +to use." + (let* ((files (helm-marked-candidates :with-wildcard t)) + (fname (expand-file-name (car files))) + (collection (helm-external-commands-list-1 'sort)) + (def-prog (helm-get-default-program-for-file fname)) + (program (if (or helm-current-prefix-arg (not def-prog)) + ;; Prefix arg or no default program. + (prog1 + (helm-comp-read + "Program: " collection + :must-match t + :name "Open file Externally" + :history 'helm-external-command-history) + ;; Always prompt to set this program as default. + (setq def-prog nil)) + ;; No prefix arg or default program exists. + def-prog))) + (unless (or def-prog ; Association exists, no need to record it. + ;; Don't try to record non--filenames associations (e.g urls). + (not (file-exists-p fname))) + (when + (y-or-n-p + (format + "Do you want to make `%s' the default program for this kind of files? " + program)) + (helm-aif (assoc (file-name-extension fname) + helm-external-programs-associations) + (setq helm-external-programs-associations + (delete it helm-external-programs-associations))) + (push (cons (file-name-extension fname) + (helm-read-string + "Program (Add args maybe and confirm): " program)) + helm-external-programs-associations) + (customize-save-variable 'helm-external-programs-associations + helm-external-programs-associations))) + (helm-run-or-raise program files) + (run-hooks 'helm-open-file-externally-after-hook) + (setq helm-external-command-history + (cl-loop for i in helm-external-command-history + when (executable-find i) collect i)))) + +(defun helm-run-external-command-action (candidate &optional detached) + (helm-run-or-raise candidate nil detached) + (setq helm-external-command-history + (cons candidate + (delete candidate + helm-external-command-history)))) + +(defclass helm-external-commands (helm-source-in-buffer) + ((filtered-candidate-transformer + :initform (lambda (candidates _source) + (cl-loop for c in candidates + if (get-process c) + collect (propertize c 'face 'font-lock-type-face) + else collect c))) + (must-match :initform t) + (nomark :initform t) + (action :initform + (helm-make-actions + "Run program" 'helm-run-external-command-action + (lambda () + (unless (memq system-type '(windows-nt ms-dos)) + "Run program detached")) + (lambda (candidate) + (helm-run-external-command-action candidate 'detached)))))) + +;;;###autoload +(defun helm-run-external-command () + "Preconfigured `helm' to run External PROGRAM asyncronously from Emacs. +If program is already running try to run `helm-raise-command' if +defined otherwise exit with error. You can set your own list of +commands with `helm-external-commands-list'." + (interactive) + (helm :sources `(,(helm-make-source "External Commands history" 'helm-external-commands + :data helm-external-command-history) + ,(helm-make-source "External Commands" 'helm-external-commands + :data (helm-external-commands-list-1 'sort))) + :buffer "*helm externals commands*" + :prompt "RunProgram: ") + ;; Remove from history no more valid executables. + (setq helm-external-command-history + (cl-loop for i in helm-external-command-history + when (executable-find i) collect i))) + + +(provide 'helm-external) + +;;; helm-external ends here diff --git a/code/elpa/helm-20240320.541/helm-fd.el b/code/elpa/helm-20240320.541/helm-fd.el new file mode 100644 index 0000000..4f76bb7 --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-fd.el @@ -0,0 +1,144 @@ +;;; helm-fd.el --- helm interface for fd command line tool. -*- lexical-binding: t -*- + +;; Copyright (C) 2012 ~ 2023 Thierry Volpiatto + +;; 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 'helm) +(require 'helm-types) + +(declare-function ansi-color-apply "ansi-color.el") +(declare-function split-string-shell-command "shell.el") + +(defvar helm-fd-executable "fd" + "The fd shell command executable.") + +(defcustom helm-fd-switches '("--no-ignore" "--hidden" "--type" "f" "--type" "d" "--color" "always") + "A list of options to pass to fd shell command." + :type '(repeat string) + :group 'helm-files) + +(defcustom helm-fd-mode-line-function 'helm-fd-default-mode-line + "Function called when `fd' process is finished to format mode-line." + :type 'function + :group 'helm-files) + +(defface helm-fd-finish + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "Green")) + "Face used in mode line when fd process ends." + :group 'helm-grep-faces) + +(defvar helm-fd-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map helm-generic-files-map) + (define-key map (kbd "C-]") 'undefined) + (define-key map (kbd "DEL") 'helm-delete-backward-no-update) + (define-key map (kbd "M-") 'helm-fd-next-directory) + (define-key map (kbd "M-") 'helm-fd-previous-directory) + map)) + +(defun helm-fd-next-directory-1 (arg) + (with-helm-window + (let ((cur-dir (helm-basedir (helm-get-selection)))) + (while (equal cur-dir (helm-basedir (helm-get-selection))) + (if (> arg 0) + (helm-next-line) + (helm-previous-line)))))) + +(defun helm-fd-next-directory () + "Move to next directory in a helm-fd source." + (interactive) + (with-helm-alive-p + (helm-fd-next-directory-1 1))) + +(defun helm-fd-previous-directory () + "Move to previous directory in a helm-fd source." + (interactive) + (with-helm-alive-p + (helm-fd-next-directory-1 -1))) + +(defclass helm-fd-class (helm-source-async) + ((candidates-process :initform 'helm-fd-process) + (requires-pattern :initform 2) + (candidate-number-limit :initform 20000) + (nohighlight :initform t) + (help-message :initform 'helm-fd-help-message) + (filtered-candidate-transformer :initform 'helm-fd-fct) + (action :initform 'helm-type-file-actions) + (keymap :initform 'helm-fd-map))) + +(defun helm-fd-process () + "Initialize fd process in an helm async source." + (let* (process-connection-type + (cmd (append helm-fd-switches + (or (and (fboundp #'split-string-shell-command) + (split-string-shell-command helm-pattern)) + (split-string helm-pattern)))) + (proc (apply #'start-process "fd" nil helm-fd-executable cmd)) + (start-time (float-time)) + (fd-version (replace-regexp-in-string + "\n" "" + (shell-command-to-string + (concat helm-fd-executable " --version"))))) + (helm-log "helm-fd-process" "Fd command:\nfd %s" + (mapconcat 'identity cmd " ")) + (helm-log "helm-fd-process" "VERSION: %s" fd-version) + (prog1 + proc + (set-process-sentinel + proc (lambda (_process event) + (if (string= event "finished\n") + (with-helm-window + (when helm-fd-mode-line-function + (funcall helm-fd-mode-line-function start-time fd-version) + (force-mode-line-update))) + (helm-log "helm-fd-process sentinel" "Error: Fd %s" + (replace-regexp-in-string "\n" "" event)))))))) + +(defun helm-fd-default-mode-line (start-time fd-version) + "Format mode-line with START-TIME and FD-VERSION, as well as `fd' results." + (setq mode-line-format + `(" " mode-line-buffer-identification " " + (:eval (format "L%s" (helm-candidate-number-at-point))) " " + (:eval (propertize + (format + "[%s process finished in %.2fs - (%s results)] " + ,fd-version + ,(- (float-time) start-time) + (helm-get-candidate-number)) + 'face 'helm-fd-finish))))) + +(defun helm-fd-fct (candidates _source) + "The filtered-candidate-transformer function for helm-fd." + (cl-loop for i in candidates + collect (ansi-color-apply i))) + +(defun helm-fd-1 (directory) + "Run fd shell command on DIRECTORY with helm interface." + (cl-assert (executable-find helm-fd-executable) nil "Could not find fd executable") + (cl-assert (not (file-remote-p directory)) nil "Fd not supported on remote directories") + (let ((default-directory directory)) + (helm :sources (helm-make-source + (format "fd (%s)" + (abbreviate-file-name default-directory)) + 'helm-fd-class) + :buffer "*helm fd*"))) + + +(provide 'helm-fd) + +;;; helm-fd.el ends here diff --git a/code/elpa/helm-20240320.541/helm-files.el b/code/elpa/helm-20240320.541/helm-files.el new file mode 100644 index 0000000..6b99b91 --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-files.el @@ -0,0 +1,7014 @@ +;;; helm-files.el --- helm file browser and related. -*- lexical-binding: t -*- + +;; Copyright (C) 2012 ~ 2023 Thierry Volpiatto + +;; 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 'helm) +(require 'helm-types) +(require 'helm-utils) +(require 'helm-grep) +(require 'helm-help) +(require 'helm-locate) +(require 'helm-tags) +(require 'helm-buffers) +(require 'tramp) +(eval-when-compile + (require 'thingatpt) + (require 'ffap) + (require 'dired-aux) + (require 'dired-x)) +(require 'filenotify) +(require 'image-mode) +(require 'image-dired) + +(declare-function find-library-name "find-func.el" (library)) +(declare-function w32-shell-execute "ext:w32fns.c" (operation document &optional parameters show-flag)) +(declare-function gnus-dired-attach "ext:gnus-dired.el" (files-to-attach)) +(declare-function eshell-read-aliases-list "em-alias") +(declare-function eshell-send-input "esh-mode" (&optional use-region queue-p no-newline)) +(declare-function eshell-kill-input "esh-mode") +(declare-function eshell-bol "esh-mode") +(declare-function eshell-reset "esh-mode.el") +(declare-function eshell/cd "em-dirs.el") +(declare-function eshell-next-prompt "em-prompt.el") +(declare-function eshell-resume-eval "esh-cmd") +(declare-function helm-ls-git "ext:helm-ls-git") +(declare-function helm-hg-find-files-in-project "ext:helm-ls-hg") +(declare-function helm-gid "helm-id-utils.el") +(declare-function helm-find-1 "helm-find") +(declare-function helm-fd-1 "helm-fd") +(declare-function helm-get-default-program-for-file "helm-external") +(declare-function helm-open-file-externally "helm-external") +(declare-function helm-comp-read "helm-mode") +(declare-function helm-read-file-name "helm-mode") +(declare-function term-line-mode "term") +(declare-function term-char-mode "term") +(declare-function term-send-input "term") +(declare-function term-next-prompt "term") +(declare-function term-process-mark "term") +(declare-function bookmark-prop-get "bookmark") +(declare-function comint-next-prompt "comint") +(declare-function comint-delete-input "comint") +(declare-function comint-send-input "comint") +(declare-function comint-goto-process-mark "comint") +(declare-function tramp-dissect-file-name "tramp") +(declare-function tramp-get-completion-function "tramp") +(declare-function seconds-to-time "time-date") +(declare-function ffap-fixup-url "ffap") +(declare-function ffap-url-at-point "ffap") +(declare-function ffap-file-at-point "ffap") +(declare-function dired-create-files "dired-aux") +(declare-function dired-goto-file "dired") +(declare-function dired-move-to-filename "dired") +(declare-function dired-move-to-end-of-filename "dired") +(declare-function dired-get-filename "dired") +(declare-function dired-get-marked-files "dired") +(declare-function tramp-list-connections "tramp-cache") +(declare-function tramp-get-connection-process "tramp") +(declare-function tramp-buffer-name "tramp") +(declare-function tramp-make-tramp-file-name "tramp") +(declare-function tramp-cleanup-connection "tramp-cmds") +(declare-function dired-async-processes "ext:dired-async.el") +(declare-function dired-async-mode-line-message "ext:dired-async.el") +(declare-function dired-async--modeline-mode "ext:dired-async.el") +(declare-function all-the-icons-icon-for-file "ext:all-the-icons.el") +(declare-function all-the-icons-octicon "ext:all-the-icons.el") +(declare-function all-the-icons-match-to-alist "ext:all-the-icons.el") +(declare-function all-the-icons-material "ext:all-the-icons.el") +(declare-function helm-adaptive-sort "ext:helm-adaptive.el") +(declare-function wfnames-setup-buffer "ext:wfnames.el") + +(defvar all-the-icons-dir-icon-alist) +(defvar term-char-mode-point-at-process-mark) +(defvar term-char-mode-buffer-read-only) +(defvar recentf-list) +(defvar helm-mm-matching-method) +(defvar dired-async-mode) +(defvar org-directory) +(defvar eshell-current-command) +(defvar eshell-debug-command) +(defvar eshell-current-command) +(defvar tramp-archive-enabled) +(defvar tramp-tolerate-tilde) +(defvar password-cache) +(defvar helm-fd-executable) +(defvar wfnames-buffer) + +;;; Internal vars +;; +(defvar helm-ff-last-expanded-candidate-regexp "^[[:multibyte:] ]*%s" + "Regexp that retrieve previous candidate when going up one level. +The default value matching a multibyte char at bol allows +prefixing candidate with an icon. The format part will be +replaced by the display part of the candidate regexp quoted. +This should be used for all preselection code for helm-find-files +to handle icons.") + +(defvar helm-find-files-doc-header " (\\\\[helm-find-files-up-one-level]: Go up one level)" + "*The doc that is inserted in the Name header of a find-files or dired source.") +(defvar helm-ff-auto-update-flag nil + "Internal, flag to turn on/off auto-update in `helm-find-files'. +Don't set it directly, use instead `helm-ff-auto-update-initial-value'.") +(defvar helm-ff-last-expanded nil + "Store last expanded directory or file.") +(defvar helm-ff-default-directory nil) +(defvar helm-ff-history nil) +(defvar helm-ff-url-regexp + "\\`\\(news\\(post\\)?:\\|nntp:\\|mailto:\\|file:\\|\\(ftp\\|https?\\|telnet\\|gopher\\|www\\|wais\\):/?/?\\).*" + "Same as `ffap-url-regexp' but match earlier possible url.") +;; helm-tramp-file-name-regexp is based on old version of +;; tramp-file-name-regexp i.e. "\\`/\\([^[/:]+\\|[^/]+]\\):" but it +;; seems it is wrong and a simpler regexp is enough, let's try it and +;; watch out! +(defvar helm-tramp-file-name-regexp "\\`/\\([^/:|]+\\):") +(defvar helm-ff-tramp-method-regexp "[/|]:\\([^:]*\\)") +(defvar helm-ff--auto-update-state nil) +(defvar helm-ff--deleting-char-backward nil) +(defvar helm-multi-files--toggle-locate nil) +(defvar helm-ff--move-to-first-real-candidate t) +(defvar helm-find-files--toggle-bookmark nil) +(defvar helm-ff--tramp-methods nil) +(defvar helm-ff--directory-files-length (make-hash-table :test 'equal) + "Used to count number of candidates in directory. +candidate-number-limit is set to this value if this value is bigger +than `helm-candidate-number-limit'.") +(defvar helm-ff--list-directory-cache (make-hash-table :test 'equal) + "Cache for `helm-find-files' candidates.") +(defvar helm-ff--file-notify-watchers (make-hash-table :test 'equal) + "File-notify watchers for `helm-find-files' are stored here.") +(defvar helm-ff-history-buffer-name "*helm-find-files history*") +(defvar helm-rsync-command-history nil) +(defvar helm-rsync--last-progress-bar-alist nil + "Used to store last valid rsync progress bar.") +(defvar helm-rsync-process-buffer "*helm-rsync*") +(defvar helm-rsync-progress-str-alist nil) +(defvar helm-ff--trash-directory-regexp "\\.?Trash[/0-9]+files/?\\'") +(defvar helm-ff--show-directories-only nil) +(defvar helm-ff--show-files-only nil) +(defvar helm-ff--trashed-files nil + "[INTERNAL] Files already trashed are stored here during file deletion. +This is used only as a let binding.") +(defvar helm-ff--show-thumbnails nil) +(defvar helm-ff--thumbnailed-directories nil) +(defvar helm-source-find-files nil + "The main source to browse files. +Should not be used among other sources.") +(defvar helm-ff-icon-mode nil) + +;;; Helm-find-files - The helm file browser. +;; +;; Keymaps + +(defvar helm-find-files-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map helm-map) + (define-key map (kbd "RET") 'helm-ff-RET) + (define-key map (kbd "C-]") 'helm-ff-run-toggle-basename) + (define-key map (kbd "C-x C-f") 'helm-ff-run-locate) + (define-key map (kbd "C-x C-d") 'helm-ff-run-browse-project) + (define-key map (kbd "C-x r m") 'helm-ff-bookmark-set) + (define-key map (kbd "C-x r b") 'helm-find-files-switch-to-bookmark) + (define-key map (kbd "C-x C-q") 'helm-ff-run-edit-marked-files) + (define-key map (kbd "C-s") 'helm-ff-run-grep) + (define-key map (kbd "M-g s") 'helm-ff-run-grep) + (define-key map (kbd "M-g p") 'helm-ff-run-pdfgrep) + (define-key map (kbd "M-g z") 'helm-ff-run-zgrep) + (define-key map (kbd "M-g a") 'helm-ff-run-grep-ag) + (define-key map (kbd "M-g g") 'helm-ff-run-git-grep) + (define-key map (kbd "M-g i") 'helm-ff-run-gid) + (define-key map (kbd "M-.") 'helm-ff-run-etags) + (define-key map (kbd "M-R") 'helm-ff-run-rename-file) + (define-key map (kbd "M-C") 'helm-ff-run-copy-file) + (define-key map (kbd "M-k") 'helm-ff-run-kill-default-directory) + (when (executable-find "rsync") + (define-key map (kbd "M-V") 'helm-ff-run-rsync-file)) + (define-key map (kbd "C-M-SPC") 'helm-ff-mark-similar-files) + (define-key map (kbd "C-c C-SPC") 'helm-ff-mark-similar-files) + (define-key map (kbd "C-M-c") 'helm-ff-run-mcp) + (define-key map (kbd "M-B") 'helm-ff-run-byte-compile-file) + (define-key map (kbd "M-L") 'helm-ff-run-load-file) + (define-key map (kbd "M-S") 'helm-ff-run-symlink-file) + (define-key map (kbd "M-Y") 'helm-ff-run-relsymlink-file) + (define-key map (kbd "M-H") 'helm-ff-run-hardlink-file) + (define-key map (kbd "M-D") 'helm-ff-run-delete-file) + (define-key map (kbd "M-K") 'helm-ff-run-kill-buffer-persistent) + (define-key map (kbd "M-T") 'helm-ff-run-touch-files) + (define-key map (kbd "M-M") 'helm-ff-run-chmod) + (define-key map (kbd "C-c z") 'helm-ff-persistent-compress) + (define-key map (kbd "M-Z") 'helm-ff-run-compress-marked-files) + (define-key map (kbd "M-c") 'helm-ff-run-compress-to) + (define-key map (kbd "C-c d") 'helm-ff-persistent-delete) + (define-key map (kbd "M-e") 'helm-ff-run-switch-to-shell) + (define-key map (kbd "C-c i") 'helm-ff-run-complete-fn-at-point) + (define-key map (kbd "C-c o") 'helm-ff-run-switch-other-window) + (define-key map (kbd "C-c C-o") 'helm-ff-run-switch-other-frame) + (define-key map (kbd "C-c C-x") 'helm-ff-run-open-file-externally) + (define-key map (kbd "C-c C-v") 'helm-ff-run-preview-file-externally) + (define-key map (kbd "C-c X") 'helm-ff-run-open-file-with-default-tool) + (define-key map (kbd "C-c t") 'helm-ff-toggle-thumbnails) + (define-key map (kbd "M-!") 'helm-ff-run-eshell-command-on-file) + (define-key map (kbd "M-@") 'helm-ff-run-query-replace-fnames-on-marked) + (define-key map (kbd "M-%") 'helm-ff-run-query-replace) + (define-key map (kbd "C-M-%") 'helm-ff-run-query-replace-regexp) + (define-key map (kbd "C-c =") 'helm-ff-run-ediff-file) + (define-key map (kbd "M-=") 'helm-ff-run-ediff-merge-file) + (define-key map (kbd "M-p") 'helm-find-files-history) + (define-key map (kbd "C-c h") 'helm-ff-file-name-history) + (define-key map (kbd "M-i") 'helm-ff-properties-persistent) + (define-key map (kbd "C-}") 'helm-narrow-window) + (define-key map (kbd "C-{") 'helm-enlarge-window) + (define-key map (kbd "C-") 'helm-ff-run-toggle-auto-update) + (define-key map (kbd "C-c ") 'helm-ff-run-toggle-auto-update) + (define-key map (kbd "C-c C-a") 'helm-ff-run-mail-attach-files) + (define-key map (kbd "C-c p") 'helm-ff-run-print-file) + (define-key map (kbd "C-c /") 'helm-ff-run-find-sh-command) + (define-key map (kbd "C-/") 'helm-ff-run-fd) + ;; Next 2 have no effect if candidate is not an image file. + (define-key map (kbd "M-l") 'helm-ff-rotate-left-persistent) + (define-key map (kbd "M-r") 'helm-ff-rotate-right-persistent) + (define-key map (kbd "M-+") 'helm-ff-increase-image-size-persistent) + (define-key map (kbd "M--") 'helm-ff-decrease-image-size-persistent) + (define-key map (kbd "C-l") 'helm-find-files-up-one-level) + (define-key map (kbd "C-:") 'helm-ff-complete-tramp-methods) + (define-key map (kbd "C-_") 'helm-ff-undo) + (define-key map (kbd "C-r") 'helm-find-files-down-last-level) + (define-key map (kbd "C-c r") 'helm-ff-run-find-file-as-root) + (define-key map (kbd "C-x C-v") 'helm-ff-run-find-alternate-file) + (define-key map (kbd "C-c @") 'helm-ff-run-insert-org-link) + (define-key map (kbd "S-") 'helm-ff-sort-alpha) + (define-key map (kbd "S-") 'helm-ff-sort-by-newest) + (define-key map (kbd "S-") 'helm-ff-sort-by-size) + (define-key map (kbd "S-") 'helm-ff-toggle-dirs-only) + (define-key map (kbd "S-") 'helm-ff-toggle-files-only) + (define-key map (kbd "S-") 'helm-ff-sort-by-ext) + (helm-define-key-with-subkeys map (kbd "DEL") ?\d 'helm-ff-delete-char-backward + '((C-backspace . helm-ff-run-toggle-auto-update) + ([C-c DEL] . helm-ff-run-toggle-auto-update)) + nil 'helm-ff-delete-char-backward--exit-fn) + (when (fboundp 'tab-bar-mode) + (define-key map (kbd "C-c C-t") 'helm-ff-find-file-other-tab)) + map) + "Keymap for `helm-find-files'.") + +(defvar helm-read-file-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map helm-map) + (define-key map (kbd "") 'helm-cr-empty-string) + (define-key map (kbd "M-RET") 'helm-cr-empty-string) + (define-key map (kbd "C-]") 'helm-ff-run-toggle-basename) + (define-key map (kbd "C-.") 'helm-find-files-up-one-level) + (define-key map (kbd "C-l") 'helm-find-files-up-one-level) + (define-key map (kbd "C-:") 'helm-ff-complete-tramp-methods) + (define-key map (kbd "C-_") 'helm-ff-undo) + (define-key map (kbd "C-r") 'helm-find-files-down-last-level) + (define-key map (kbd "C-c h") 'helm-ff-file-name-history) + (define-key map (kbd "C-") 'helm-ff-run-toggle-auto-update) + (define-key map (kbd "C-c ") 'helm-ff-run-toggle-auto-update) + (define-key map (kbd "C-c t") 'helm-ff-toggle-thumbnails) + (define-key map (kbd "S-") 'helm-ff-sort-alpha) + (define-key map (kbd "S-") 'helm-ff-sort-by-newest) + (define-key map (kbd "S-") 'helm-ff-sort-by-size) + (define-key map (kbd "S-") 'helm-ff-sort-by-ext) + (define-key map (kbd "RET") 'helm-ff-RET) + (helm-define-key-with-subkeys map (kbd "DEL") ?\d 'helm-ff-delete-char-backward + '((C-backspace . helm-ff-run-toggle-auto-update) + ([C-c DEL] . helm-ff-run-toggle-auto-update)) + nil 'helm-ff-delete-char-backward--exit-fn) + map) + "Keymap for `helm-read-file-name'.") + +;;; User variables +;; +(defgroup helm-files nil + "Files applications and libraries for Helm." + :group 'helm) + +(defcustom helm-tramp-verbose 0 + "Just like `tramp-verbose' but specific to Helm. +When set to 0 don't show tramp messages in Helm. +If you want to have the default tramp messages set it to 3." + :type 'integer) + +(defcustom helm-ff-auto-update-initial-value nil + "Auto update when only one candidate directory is matched. +Default value when starting `helm-find-files' is nil to not +confuse new users. +For a better experience with `helm-find-files' set this to +non-nil and use C- to toggle it." + :type 'boolean) + +(defcustom helm-ff-history-max-length 100 + "Number of elements shown in `helm-find-files' history." + :type 'integer) + +(defcustom helm-ff-fuzzy-matching t + "Enable fuzzy matching for `helm-find-files' when non--nil. +See `helm-ff--transform-pattern-for-completion' for more info." + :type 'boolean) + +(defcustom helm-ff-exif-data-program "exiftran" + "Program used to extract exif data of an image file." + :type 'string) + +(defcustom helm-ff-exif-data-program-args "-d" + "Arguments used for `helm-ff-exif-data-program'." + :type 'string) + +(defcustom helm-ff-newfile-prompt-p t + "Whether Prompt or not when creating new file. +This set `ffap-newfile-prompt'." + :type 'boolean) + +(defcustom helm-ff-avfs-directory "~/.avfs" + "The default avfs directory, usually \\='~/.avfs'. +When this is set you will be able to expand archive filenames +with `C-j' inside an avfs directory mounted with mountavfs. +See ." + :type 'string) + +(defcustom helm-ff-file-compressed-list '("gz" "bz2" "zip" "7z") + "Minimal list of compressed files extension." + :type '(repeat (choice string))) + +(defcustom helm-ff-printer-list nil + "A list of available printers on your system. +When non-nil let you choose a printer to print file. +Otherwise when nil the variable `printer-name' will be used. +On Unix based systems (lpstat command needed) you don't need to +set this, `helm-ff-find-printers' will find a list of available +printers for you." + :type '(repeat (choice string))) + +(defcustom helm-ff-transformer-show-only-basename t + "Show only basename of candidates in `helm-find-files'. +This can be toggled at anytime from `helm-find-files' with \ +\\\\[helm-ff-run-toggle-basename]." + :type 'boolean) + +(defcustom helm-ff-signal-error-on-dot-files t + "Signal error when file is `.' or `..' on file deletion when non-nil. +Default is non-nil. +WARNING: Setting this to nil is unsafe and can cause deletion of +a whole tree." + :type 'boolean) + +(defcustom helm-ff-search-library-in-sexp nil + "Search for library in `require' and `declare-function' sexp." + :type 'boolean) + +(defcustom helm-tooltip-hide-delay 25 + "Hide tooltips automatically after this many seconds." + :type 'integer) + +(defcustom helm-ff-file-name-history-use-recentf nil + "Use `recentf-list' instead of `file-name-history' in `helm-find-files'." + :type 'boolean) + +(defcustom helm-ff-skip-boring-files nil + "Non-nil to skip boring files. +I.e. the files matching regexps in `helm-boring-file-regexp-list'. +This takes effect in `helm-find-files' and file completion used by +`helm-mode' i.e. `helm-read-file-name'. +Note that when non-nil this will slow down slightly `helm-find-files'." + :type 'boolean) + +(defcustom helm-ff-skip-git-ignored-files nil + "Non-nil to skip git ignored files. +This take effect only in `helm-find-files'. +Check is not done on remote files. +Note that when non-nil this will slow down slightly +`helm-find-files'." + :type 'boolean) + +(defcustom helm-ff-candidate-number-limit 5000 + "The `helm-candidate-number-limit' for `helm-find-files' and friends. +Note that when going one level up with +`\\\\[helm-find-files-up-one-level]' the +length of directory will be used instead if it is higher than +this value. This is to avoid failing to preselect the previous +directory/file if this one is situated lower than +`helm-ff-candidate-number-limit' num candidate." + :type 'integer) + +(defcustom helm-ff-preselect-ignore-large-dirs nil + "Preselect directory belonging to current-buffer even if large." + :type 'boolean) + +(defcustom helm-ff-up-one-level-preselect t + "Always preselect previous directory when going one level up. + +When non-nil `candidate-number-limit' source value is modified +dynamically when going one level up if the position of previous +candidate in its directory is > to +`helm-ff-candidate-number-limit'. + +It can be helpful to disable this and reduce +`helm-ff-candidate-number-limit' if you often navigate across +very large directories." + :type 'boolean) + +(defcustom helm-files-save-history-extra-sources + '("Find" "Locate" "Recentf" + "Files from Current Directory" "File Cache") + "Extras source that save candidate to `file-name-history'." + :type '(repeat (choice string))) + +(defcustom helm-find-files-before-init-hook nil + "Hook that run before initialization of `helm-find-files'." + :type 'hook) + +(defcustom helm-find-files-after-init-hook nil + "Hook that run after initialization of `helm-find-files'." + :type 'hook) + +(defcustom helm-find-files-bookmark-prefix nil + "bookmark name prefix of `helm-find-files' sessions." + :type 'string) + +(defcustom helm-ff-guess-ffap-filenames nil + "Use ffap to guess local filenames at point in `helm-find-files'. +This doesn't disable url or mail at point, see +`helm-ff-guess-ffap-urls' for this." + :type 'boolean) + +(defcustom helm-ff-guess-ffap-urls t + "Use ffap to guess local urls at point in `helm-find-files'. +This doesn't disable guessing filenames at point, see +`helm-ff-guess-ffap-filenames' for this. +See also `ffap-url-unwrap-remote' that may override this +variable." + :type 'boolean) + +(defcustom helm-ff-no-preselect nil + "When non-nil `helm-find-files' starts at root of current directory." + :type 'boolean) + +(defcustom helm-ff-allow-non-existing-file-at-point nil + "Use non existing file-at-point as initial input in `helm-find-files'." + :type 'boolean) + +(defcustom helm-find-files-ignore-thing-at-point nil + "Use only `default-directory' as default input in `helm-find-files'. +I.e. text under cursor in `current-buffer' is ignored. +Note that when non-nil you will be unable to complete filename at +point in `current-buffer'." + :type 'boolean) + +(defcustom helm-substitute-in-filename-stay-on-remote nil + "Don't switch back to local filesystem when expanding pattern with / or ~/." + :type 'boolean) + +(defcustom helm-ff-goto-first-real-dired-exceptions '(dired-goto-file) + "Dired commands that are allowed moving to first real candidate." + :type '(repeat (choice symbol))) + +(defcustom helm-mounted-network-directories nil + "A list of directories used for mounting remotes filesystem. + +When nil `helm-file-on-mounted-network-p' always return nil +otherwise check if a file is in one of these directories. + +Remote filesystem are generally mounted with sshfs." + :type '(repeat string)) + +(defcustom helm-browse-project-default-find-files-fn + (cond ((or (executable-find "fd") + (executable-find "fdfind")) + #'helm-browse-project-fd-find-files) + ((executable-find "rg") + #'helm-browse-project-rg-find-files) + ((executable-find "ag") + #'helm-browse-project-ag-find-files) + (t #'helm-browse-project-walk-directory)) + "The default function to retrieve files in a non-vc directory. + +A function that takes a directory name as only arg." + :type 'function) + +(defcustom helm-ff-kill-or-find-buffer-fname-fn + #'helm-ff-kill-or-find-buffer-fname + "Default function used to expand non-directory filenames in `helm-find-files'. + +This variable will take effect only in `helm-find-files'. It +affects the behavior of persistent-action on filenames and +non-existing filenames. + +The default is to expand filename on first hit on +\\\\[helm-execute-persistent-action], pop buffer in +other window on second hit and finally kill this buffer on third +hit. This is very handy to create several new buffers, or when +navigating, show quickly the buffer of file to see its contents +briefly before killing it and continue navigating. + +However some users may not want this, so to disable this behaviour +just set this to `ignore' function. + +Of course you can also write your own function to do something +else." + :type 'function) + +(defcustom helm-modes-using-escaped-strings + '(eshell-mode shell-mode term-mode) + "Modes that requires string's insertion to be escaped." + :type '(repeat symbol)) + +(defcustom helm-ff-allow-recursive-deletes nil + "When \\='always don't prompt for recursive deletion of directories. +When nil, will ask for recursive deletion. +Note that when deleting multiple directories you can answer ! +when prompted to avoid being asked for next directories, so it +is probably better to not modify this variable." + :type '(choice + (const :tag "Delete non-empty directories" t) + (const :tag "Confirm for each directory" nil))) + +(defcustom helm-ff-delete-files-function #'helm-delete-marked-files + "The function to use by default to delete files. + +Default is to delete files synchronously, other choice is to +delete files asynchronously. + +BE AWARE that when deleting async you will not be warned about +recursive deletion of directories, IOW non-empty directories will +be deleted with no warnings in background!!! + +It is the function that will be used when using +`\\\\[helm-ff-run-delete-file]' from +`helm-find-files'." + :type '(choice (function :tag "Delete files synchronously." + helm-delete-marked-files) + (function :tag "Delete files asynchronously." + helm-delete-marked-files-async))) + +(defcustom helm-trash-remote-files nil + "Allow trashing remote files when non-nil. + +Trashing remote files with tramp doesn't work out of the box +unless the \\='trash-cli' package is installed. This is why trashing +remote files from Helm is disabled by default. + +Tramp is using external \\='trash' command in its `delete-file' and +`delete-directory' handlers when using +`delete-by-moving-to-trash', which is documented nowhere in +Emacs. + +If you want to enable this you will have to install the \\='trash' +command on remote (and/or locally if you want to trash as root). +On Ubuntu-based distributions it is \\='trash-cli'." + :type 'boolean) + +(defcustom helm-list-directory-function + (cl-case system-type + (gnu/linux #'helm-list-dir-external) + (berkeley-unix #'helm-list-dir-lisp) + (windows-nt #'helm-list-dir-lisp) + (t #'helm-list-dir-lisp)) + "The function used in `helm-find-files' to list remote directories. + +Actually Helm provides two functions to do this: +`helm-list-dir-lisp' and `helm-list-dir-external'. + +Using `helm-list-dir-external' will provide a similar display to +what is provided with local files i.e. colorized symlinks, +executables files etc., whereas using `helm-list-dir-lisp' will +allow colorizing only directories but it is more portable. + +NOTE: `helm-list-dir-external' needs ls and awk as dependencies. +Also the ls version installed on the remote side should support +the same arguments as the GNU/ls version, which are -A -1 -F -b +and -Q. So even if you are using a GNU/ls version locally and you +want to connect e.g. on a Freebsd server, you may have failures +due to the incompatible ls version installed on remote server. In +such case use `helm-list-dir-lisp' which works everywhere but is +slower and less featured (only directories colorized)." + :type 'function) + +(defcustom helm-ff-initial-sort-method nil + "Sort method to use when initially listing a directory. + +It is better to keep this nil globally and turn it on only when needed +otherwise it may be slightly slower specially with `ext' method which +BTW is not provided on remote files (helm will fallback on nil in such +case). +Note that this have no effect as soon as you start narrowing directory +i.e. filtering filenames inside directory." + :type '(choice + (const :tag "alphabetically" nil) + (const :tag "newest" newest) + (const :tag "size" size) + (const :tag "extensions" ext))) + +(defcustom helm-ff-rotate-image-program "exiftran" + "External program used to rotate images. +When nil and `helm-ff-display-image-native' is enabled, fallback to +`image-rotate' without modification of exif data i.e. rotation is not +persistent otherwise an error is returned when not using +`helm-ff-display-image-native' i.e. using image-dired." + :type '(choice + (const :tag "Mogrify" "mogrify") + (const :tag "Exiftran" "exiftran") + (const :tag "Jpegtran" "jpegtran"))) + +(defcustom helm-ff-rotate-image-switch '("-i") + "Options used with `helm-ff-rotate-image-program'. +If you are using Mogrify or Jpegtran mandatory option is +\"-rotate\", with Exiftran mandatory option is \"-i\"." + :type '(repeat string)) + +(defcustom helm-ff-preferred-shell-mode 'eshell-mode + "Shell to use to switch to a shell buffer from `helm-find-files'. +Possible values are `shell-mode', `eshell-mode' and `term-mode'. +This affects `\\\\[helm-ff-run-switch-to-shell]' keybinding." + :type '(choice + (const :tag "Use Eshell" eshell-mode) + (const :tag "Use Shell" shell-mode) + (const :tag "Use Term" term-mode))) + +(defcustom helm-rsync-no-mode-line-update nil + "When non nil don't update mode-line when rsync is running. +This is useful if you display the progress bar somewhere else, +e.g. with minibuffer-line in minibuffer, in this case updating +mode-line may create flickering in other frame's mode-line." + :type 'boolean) + +(defcustom helm-rsync-switches '("-a" "-z" "-h" "-s" "--info=all2") + "Rsync options to use with HFF Rsync action. +Note: Using \"--info=all2\" allows having the name of the file +currently transfered in an help-echo in mode-line, if you use +\"--info=progress2\" you will not have this information." + :type '(repeat string)) + +(defcustom helm-rsync-percent-sign "%" + "Percentage unicode sign to use in Rsync reporter." + :type 'string) + +(defcustom helm-ff-rsync-progress-bar-style (if (display-graphic-p) 'bar 'text) + "Style of progress-bar for rsync action. +Value can be either bar or text. +Progress bar is inaccurate on non graphic displays, use text instead." + :type '(choice + (const :tag "Progress bar as a bar" bar) + (const :tag "Progress bar with text" text))) + +(defcustom helm-ff-rsync-progress-bar-info '(percent) + "Infos shown at end of Rsync progress bar. + +Valid value is a list containing one or more elements from +percent, size, speed and remain. When set to nil show nothing at end of +progress bar. +This Has no effect when `helm-ff-rsync-progress-bar-style' is text." + :type '(set :tag "Check zero or more items to show at end of Rsync progress bar" + (const :tag "Show the amount of data copied" size) + (const :tag "Show the percentage of data copied" percent) + (const :tag "Show the current speed of transfer" speed) + (const :tag "Show the time remaining" remain))) + +(defcustom helm-trash-default-directory nil + "The default trash directory. +You probably don't need to set this when using a Linux system using +standard settings. +Should be the directory file name i.e. don't add final slash. +When nil helm will compute a default value according to freedesktop +specs. +It is generally \"~/.local/share/Trash\"." + :type 'string) + +(defcustom helm-ff-lynx-style-map t + "Use arrow keys to navigate with `helm-find-files'. +Note that if you define this variable with `setq' your change +will have no effect, use customize instead." + :type 'boolean + :set (lambda (var val) + (set var val) + (if val + (progn + (define-key helm-find-files-map (kbd "") 'helm-execute-persistent-action) + (define-key helm-find-files-map (kbd "") 'helm-find-files-up-one-level) + (define-key helm-read-file-map (kbd "") 'helm-execute-persistent-action) + (define-key helm-read-file-map (kbd "") 'helm-find-files-up-one-level)) + (define-key helm-find-files-map (kbd "") nil) + (define-key helm-find-files-map (kbd "") nil) + (define-key helm-read-file-map (kbd "") nil) + (define-key helm-read-file-map (kbd "") nil)))) + +(defcustom helm-ff-DEL-up-one-level-maybe nil + "Use DEL to maybe go up one level when non nil. + +Going up one level works only when pattern is a directory endings +with \"/\", otherwise this command deletes char backward. + +When nil always delete char backward." + :type 'boolean) + +(defcustom helm-ff-display-image-native t + "Use native `image-mode' when non nil. + +You should use this only with Emacs>= 27 and `image-auto-resize' +enabled to have images resized properly. When this is enabled, +you have new commands to zoom in/out images. See +`image-transform-resize' and `image-auto-resize'. Otherwise, +when nil `image-dired' is used, using imagemagick as backend. +NOTE: On Emacs-29 `image-dired' is no more using external program +image-magick to display image, so this is used inconditionally even +when value is nil." + :type 'boolean) + +(defcustom helm-ff-reset-filters-on-update t + "Reset filter variables when changing directory. +When filtering directories/files only, switch back to a \"show all\" view +when moving out of directory when non nil." + :type 'boolean) + +(defcustom helm-ff-eshell-unwanted-aliases nil + "A list of eshell aliases to not display." + :type '(repeat string)) + +(defcustom helm-eshell-on-file-reverse-history t + "History source in *eshell-command-on-file appears on top when non nil." + :type 'boolean) + +(defcustom helm-find-files-actions + (helm-make-actions + "Find File" 'helm-find-file-or-marked + "Find file in Dired" 'helm-point-file-in-dired + "View file" 'view-file + "Query replace fnames on marked `M-@'" 'helm-ff-query-replace-fnames-on-marked + "Marked files in dired `C-x C-q'" 'helm-ff-edit-marked-files + "Query replace contents on marked `M-%'" 'helm-ff-query-replace + "Query replace regexp contents on marked `C-M-%'" 'helm-ff-query-replace-regexp + "Attach file(s) to mail buffer `C-c C-a'" 'helm-ff-mail-attach-files + "Serial rename files" 'helm-ff-serial-rename + "Serial rename by symlinking files" 'helm-ff-serial-rename-by-symlink + "Serial rename by copying files" 'helm-ff-serial-rename-by-copying + "Open file with default tool" 'helm-open-file-with-default-tool + "Find file in hex dump" 'hexl-find-file + "Browse project `C-x C-d'" 'helm-ff-browse-project + "Complete at point `C-c i'" 'helm-insert-file-name-completion-at-point + "Insert as org link `C-c @'" 'helm-files-insert-as-org-link + "Find shell command `C-c /'" 'helm-ff-find-sh-command + "Fd shell command (C-/)" 'helm-ff-fd + "Find files in file" 'helm-find-files-in-file + "Add marked files to file-cache" 'helm-ff-cache-add-file + "Open file externally `C-c C-x, C-u to choose'" 'helm-open-file-externally + "Grep File(s) `C-s, C-u Recurse'" 'helm-find-files-grep + "Grep current directory with AG `M-g a, C-u select type'" 'helm-find-files-ag + "Git grep `M-g g, C-u from root'" 'helm-ff-git-grep + "Zgrep File(s) `M-g z, C-u Recurse'" 'helm-ff-zgrep + "Pdf Grep File(s)" 'helm-ff-pdfgrep + "Gid `M-g i'" 'helm-ff-gid + "Switch to Eshell `M-e'" 'helm-ff-switch-to-shell + "Etags `M-., C-u reload tag file'" 'helm-ff-etags-select + "Eshell command on file(s) `M-!, C-u take all marked as arguments.'" + 'helm-find-files-eshell-command-on-file + "Find file as root `C-c r'" 'helm-find-file-as-root + "Find alternate file `C-x C-v'" 'find-alternate-file + "Ediff File `C-c ='" 'helm-find-files-ediff-files + "Ediff Merge File `M-='" 'helm-find-files-ediff-merge-files + (lambda () (format "Delete File(s)%s `M-D' (C-u reverse trash)" + (if (eq helm-ff-delete-files-function + 'helm-delete-marked-files-async) + " async" ""))) + 'helm-ff-delete-files + "Touch File(s) `M-T'" 'helm-ff-touch-files + "Copy file(s) `M-C, C-u to follow'" 'helm-find-files-copy + (lambda () + (and (executable-find "rsync") + "Rsync file(s) `M-V' (C-u edit command)")) + 'helm-find-files-rsync + "Rename file(s) `M-R, C-u to follow'" 'helm-find-files-rename + "Backup files" 'helm-find-files-backup + "Copy file to dir(s) `C-M-c'" 'helm-ff-mcp + "Symlink files(s) `M-S, C-u to follow'" 'helm-find-files-symlink + "Relsymlink file(s) `M-Y, C-u to follow'" 'helm-find-files-relsymlink + "Hardlink file(s) `M-H, C-u to follow'" 'helm-find-files-hardlink + "Compress file(s) to archive `M-c'" 'helm-find-files-compress-to + "Compress or uncompress file(s) `M-z'" 'helm-ff-compress-marked-files + "Change mode on file(s) `M-M'" 'helm-ff-chmod + "Find file other window `C-c o'" 'helm-find-files-other-window + "Find file other frame `C-c C-o'" 'find-file-other-frame + (lambda () (and (fboundp 'tab-bar-mode) + "Find file other tab `C-c C-t'")) + 'find-file-other-tab + "Print File `C-c p, C-u to refresh'" 'helm-ff-print + "Locate `C-x C-f, C-u to specify locate db'" 'helm-ff-locate) + "Actions for `helm-find-files'." + :type '(alist :key-type string :value-type function)) + +(defcustom helm-dwim-target nil + "Default target directory for file actions. + +Define the directory where you want to start navigating for the +target directory when copying, renaming, etc.. You can use the +`default-directory' of `next-window', the visited directory, the +current `default-directory' or have completion on all the +directories belonging to each visible windows." + :type '(radio :tag "Define default target directory for file actions." + (const :tag "Directory belonging to next window" + next-window) + (const :tag "Completion on directories belonging to each window" + completion) + (const :tag "Use initial directory or `default-directory'" + default-directory) + (const :tag "Use visited directory" + nil))) + +(defcustom helm-ff-use-notify t + "Watch directories visited with `helm-find-files' when non nil. +If your system have no file notification package available turn this +to nil to avoid error messages when using `helm-find-files'." + :type 'boolean + :set (lambda (var val) + (set-default var val) + (unless (symbol-value var) + (cl-loop for dir being the hash-keys of helm-ff--file-notify-watchers + do (remhash dir helm-ff--list-directory-cache))))) + +(defcustom helm-ff-inotify-unsupported-methods '("adb") + "Tramp methods unsupported by file-notify." + :type '(repeat string)) + +(defcustom helm-ff-image-cache-max-len 5 + "The last seen image number to keep in cache." + :type 'integer) + +(defcustom helm-ff-image-cache-max-len 5 + "The last seen image number to keep in cache." + :type 'integer) + +(defcustom helm-ff-slideshow-default-delay 3 + "Delay in seconds between each image in slideshow." + :type 'integer) + +(defcustom helm-file-name-history-hide-deleted nil + "Hide deleted files in file-name-history when non nil. + +This can be toggled at any time from `helm-ff-file-name-history' with \ +\\\\[helm-file-name-history-show-or-hide-deleted]." + :type 'boolean) + +(defcustom helm-file-name-history-max-length 72 + "Max length of candidates in helm file name history before truncating." + :type 'integer) + +(defcustom helm-ff-follow-blacklist-file-exts '("gpg" "doc" "docx" "mp3" "ogg") + "File extensions we don't want to follow when helm-follow-mode is enabled. +Note that image files are always followed even if their extensions is +present in this list." + :type '(repeat string)) + +(defcustom helm-ff-nohighlight-matches t + "Highlight matches in `helm-find-files' when nil." + :type 'boolean + :initialize 'custom-initialize-changed + :set (lambda (var val) + (set var val) + ;; Force rebuilding the source to remove the highlight match FCT. + (setq helm-source-find-files nil))) + +(defcustom helm-ff-edit-marked-files-fn #'helm-ff-wfnames + "A function to edit filenames in a special buffer. + +By default `wfnames' package is used to avoid wdired which +doesn't always work with all emacs versions and also is quite +clumsy about default-directory among other things. If you still +want to use it, helm is still providing +`helm-marked-files-in-dired'." + :type '(choice (function :tag "Use Wfnames package to edit filenames." + helm-ff-wfnames) + (function :tag "Use Wdired package to edit filenames." + helm-marked-files-in-dired))) + +(defcustom helm-ff-ignore-following-on-directory nil + "In follow mode ignore silently directories when non nil." + :type 'boolean) + +;;; Faces +;; +;; +(defgroup helm-files-faces nil + "Customize the appearance of helm-files." + :prefix "helm-" + :group 'helm-files + :group 'helm-faces) + +(defface helm-ff-prefix + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :background "yellow" :foreground "black")) + "Face used to prefix new file or url paths in `helm-find-files'." + :group 'helm-files-faces) + +(defface helm-ff-executable + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "green")) + "Face used for executable files in `helm-find-files'." + :group 'helm-files-faces) + +(defface helm-ff-suid + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :background "red" :foreground "white")) + "Face used for suid files in `helm-find-files'." + :group 'helm-files-faces) + +(defface helm-ff-directory + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "DarkRed" :background "LightGray")) + "Face used for directories in `helm-find-files'." + :group 'helm-files-faces) + +(defface helm-ff-dotted-directory + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "black" :background "DimGray")) + "Face used for dotted directories in `helm-find-files'." + :group 'helm-files-faces) + +(defface helm-ff-dotted-symlink-directory + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "DarkOrange" :background "DimGray")) + "Face used for dotted symlinked directories in `helm-find-files'." + :group 'helm-files-faces) + +(defface helm-ff-symlink + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :inherit font-lock-comment-face)) + "Face used for symlinks in `helm-find-files'." + :group 'helm-files-faces) + +(defface helm-ff-invalid-symlink + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "black" :background "red")) + "Face used for invalid symlinks in `helm-find-files'." + :group 'helm-files-faces) + +(defface helm-ff-denied + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "red" :background "black")) + "Face used for non accessible files in `helm-find-files'." + :group 'helm-files-faces) + +(defface helm-ff-file + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :inherit font-lock-builtin-face)) + "Face used for file names in `helm-find-files'." + :group 'helm-files-faces) + +(defface helm-ff-nofile + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :inherit helm-ff-file)) + "Face used for file names in `helm-find-files'." + :group 'helm-files-faces) + +(defface helm-ff-truename + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :inherit font-lock-string-face)) + "Face used for symlink truenames in `helm-find-files'." + :group 'helm-files-faces) + +(defface helm-ff-dirs + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :inherit font-lock-function-name-face)) + "Face used for file names in recursive dirs completion in `helm-find-files'." + :group 'helm-files-faces) + +(defface helm-ff-socket + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "DeepPink")) + "Face used for socket files in `helm-find-files'." + :group 'helm-files-faces) + +(defface helm-ff-pipe + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "yellow" :background "black")) + "Face used for named pipes and character device files in `helm-find-files'." + :group 'helm-files-faces) + +(defface helm-ff-file-extension + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "magenta")) + "Face used for file extensions in `helm-find-files'." + :group 'helm-files-faces) + +(defface helm-ff-backup-file + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "DimGray")) + "Face used for backup files in `helm-find-files'." + :group 'helm-files-faces) + +(defface helm-history-deleted + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :inherit helm-ff-invalid-symlink)) + "Face used for deleted files in `file-name-history'." + :group 'helm-files-faces) + +(defface helm-history-remote + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "Indianred1")) + "Face used for remote files in `file-name-history'." + :group 'helm-files-faces) + +(defface helm-delete-async-message + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "yellow")) + "Face used for mode-line message." + :group 'helm-files-faces) + +(defface helm-ff-rsync-progress + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :inherit font-lock-warning-face)) + "Face used for rsync mode-line indicator." + :group 'helm-files-faces) + +(defface helm-ff-rsync-progress-1 + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :background "CadetBlue" :foreground "black")) + "Face used for rsync progress bar percentage and proc name." + :group 'helm-files-faces) + +(defface helm-ff-rsync-progress-2 + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :background "orange")) + "Face used for rsync progress bar progress." + :group 'helm-files-faces) + +(defface helm-ff-rsync-progress-3 + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :background "white")) + "Face used for rsync progress bar background." + :group 'helm-files-faces) + + + +;;; Helm-find-files +;; +;; +(defclass helm-source-ffiles (helm-source-sync) + ((header-name + :initform (lambda (name) + (concat name (substitute-command-keys + helm-find-files-doc-header)))) + (init + :initform (lambda () + (setq helm-ff-auto-update-flag + helm-ff-auto-update-initial-value) + (setq helm-ff--auto-update-state + helm-ff-auto-update-flag) + (helm-set-local-variable 'bookmark-make-record-function + #'helm-ff-make-bookmark-record) + (require 'helm-external))) + (candidates :initform 'helm-find-files-get-candidates) + (update :initform (lambda () + (remhash helm-ff-default-directory + helm-ff--list-directory-cache))) + (match-on-real :initform t) + (filtered-candidate-transformer + :initform '(helm-ff-fct + helm-ff-maybe-show-thumbnails + ;; These next two have to be called after + ;; `helm-ff-fct' as they use only cons cell candidates. + helm-ff-directories-only + helm-ff-files-only + helm-ff-sort-candidates)) + (persistent-action-if :initform 'helm-find-files-persistent-action-if) + (persistent-help :initform "Hit1 Expand Candidate, Hit2 or (C-u) Find file") + (help-message :initform 'helm-ff-help-message) + (mode-line :initform (list "File(s)" helm-mode-line-string)) + (volatile :initform t) + (cleanup :initform 'helm-find-files-cleanup) + (migemo :initform t) + (nohighlight :initform (progn helm-ff-nohighlight-matches)) + (keymap :initform 'helm-find-files-map) + (candidate-number-limit :initform 'helm-ff-candidate-number-limit) + (suspend-follow-in-update + :initarg :suspend-follow-in-update + :initform t + :documentation "Prevent following candidate when updating.") + (completing-file-name + :initarg :completing-file-name :initform t + :documentation "Flag to notify `helm-resume' we are completing filenames.") + (action-transformer + :initform 'helm-find-files-action-transformer) + (action :initform 'helm-find-files-actions) + (before-init-hook :initform 'helm-find-files-before-init-hook) + (after-init-hook :initform 'helm-find-files-after-init-hook) + (group :initform 'helm-files))) + +;; Bookmark handlers. +;; +(defun helm-ff-make-bookmark-record () + "The `bookmark-make-record-function' for `helm-find-files'." + (with-helm-buffer + `((filename . ,helm-ff-default-directory) + (presel . ,(helm-get-selection)) + (handler . helm-ff-bookmark-jump)))) + +(defun helm-ff-bookmark-jump (bookmark) + "bookmark handler for `helm-find-files'." + (let ((fname (bookmark-prop-get bookmark 'filename)) + (presel (bookmark-prop-get bookmark 'presel))) + ;; Force tramp connection with `file-directory-p' before lauching + ;; hff otherwise the directory name is inserted on top before + ;; tramp starts and display candidates. FNAME is here always a + ;; directory. + (when (file-directory-p fname) + (helm-find-files-1 fname + (format helm-ff-last-expanded-candidate-regexp + (if helm-ff-transformer-show-only-basename + (regexp-quote (helm-basename presel)) + (regexp-quote presel))))))) + +(defun helm-ff-bookmark-set () + "Record `helm-find-files' session in bookmarks." + (interactive) + (with-helm-alive-p + (with-helm-buffer + (bookmark-set + (concat helm-find-files-bookmark-prefix + (abbreviate-file-name helm-ff-default-directory)))) + (message "Helm find files session bookmarked! "))) +(put 'helm-ff-bookmark-set 'helm-only t) + +(defun helm-dwim-target-directory () + "Try to return a suitable directory according to `helm-dwim-target'." + (with-selected-window (or + ;; Try next-window if current-buffer has been + ;; killed during this session probably by C-d. + (get-buffer-window helm-current-buffer) + (next-window (helm-window) 1)) + (let ((wins (remove (get-buffer-window helm-marked-buffer-name) + (window-list)))) + (expand-file-name + (cond (;; Provide completion on all the directory belonging to + ;; visible windows if some. + (and (cdr wins) + (eq helm-dwim-target 'completion)) + (helm-comp-read "Browse target starting from: " + (append (list (or (car-safe helm-ff-history) + default-directory) + default-directory) + (cl-loop for w in wins collect + (with-selected-window w + default-directory))))) + ;; Use default-directory of next-window. + ((and (cdr wins) + (eq helm-dwim-target 'next-window)) + (with-selected-window (next-window) + default-directory)) + ;; Always use default-directory when only one window. + ((and (null (cdr wins)) + (eq helm-dwim-target 'default-directory)) + default-directory) + ;; Use the visited directory. + ((or (null (cdr wins)) + (null helm-dwim-target)) + ;; Using the car of *ff-history allow + ;; staying in the directory visited instead of + ;; current. + (or (car-safe helm-ff-history) default-directory))))))) + +(defsubst helm-ff--file-directory-p (file) + (if (file-remote-p file) + (get-text-property 1 'helm-ff-dir file) + (file-directory-p file))) + +(defun helm-ff--count-and-collect-dups (files) + (cl-loop with dups = (make-hash-table :test 'equal) + for f in files + for file = (if (helm-ff--file-directory-p f) + (concat (helm-basename f) "/") + (helm-basename f)) + for count = (gethash file dups) + if count do (puthash file (1+ count) dups) + else do (puthash file 1 dups) + finally return (cl-loop for k being the hash-keys in dups + using (hash-value v) + if (> v 1) + collect (format "%s(%s)" k v) + else + collect k))) + +(defun helm-find-files-do-action (action &optional target) + "Generic function for creating actions from `helm-source-find-files'. +ACTION can be `rsync' or any action supported by `helm-dired-action'." + (require 'dired-async) + (when (eq action 'rsync) + (cl-assert (executable-find "rsync") nil "No command named rsync")) + (let* ((rsync-switches + (when (and (eq action 'rsync) + helm-current-prefix-arg) + (cdr (split-string + (read-string "Run rsync like this: " + (mapconcat + 'identity + (cons "rsync" helm-rsync-switches) " ") + 'helm-rsync-command-history))))) + (ifiles (mapcar 'expand-file-name ; Allow modify '/foo/.' -> '/foo' + (helm-marked-candidates :with-wildcard t))) + (cand (unless (cdr ifiles) (helm-get-selection))) ; preselection. + (prefarg helm-current-prefix-arg) + (prompt (format "%s %s file(s) %s: " + (if (and (and (fboundp 'dired-async-mode) + dired-async-mode) + (not (eq action 'rsync)) + (null prefarg)) + (concat "Async " (symbol-name action)) + (capitalize (symbol-name action))) + (length ifiles) + (if (memq action '(symlink relsymlink hardlink)) + "from" "to"))) + (cdir (and (eq action 'compress) + (helm-common-dir ifiles))) + helm-ff--move-to-first-real-candidate + helm-display-source-at-screen-top ; prevent setting window-start. + helm-ff-auto-update-initial-value + ;; It is not possible to rename a file to a boring name when + ;; helm-ff-skip-boring-files is enabled + helm-ff-skip-boring-files + ;; If HFF is using a frame use a frame as well. + (helm-actions-inherit-frame-settings t) + helm-use-frame-when-more-than-two-windows + (dest (or target + (with-helm-display-marked-candidates + helm-marked-buffer-name + (if cdir + (mapcar (lambda (f) + (file-relative-name f cdir)) + ifiles) + (helm-ff--count-and-collect-dups ifiles)) + (with-helm-current-buffer + (helm-read-file-name + prompt + :preselect + (when cand + (format helm-ff-last-expanded-candidate-regexp + (regexp-quote + (if helm-ff-transformer-show-only-basename + (helm-basename cand) cand)))) + :default (and cdir + (expand-file-name + (format "%s.tar.gz" (if cand + (helm-basename cand) + "new_archive")) + cdir)) + :must-match (and cdir (lambda (f) (not (file-directory-p f)))) + :initial-input (or cdir (helm-dwim-target-directory)) + :history (helm-find-files-history nil :comp-read nil)))))) + (dest-dir-p (file-directory-p dest)) + (dest-dir (if dest-dir-p dest (helm-basedir dest)))) + ;; We still need to handle directory creation for Emacs version < 27.1 that + ;; doesn't have `dired-create-destination-dirs' and for rsync as well. + (unless (or (and (boundp 'dired-create-destination-dirs) + (null (eq action 'rsync))) + dest-dir-p + (file-directory-p dest-dir)) + (when (y-or-n-p (format "Create directory `%s'? " dest-dir)) + ;; When saying No here with rsync, `helm-rsync-copy-files' will raise an + ;; error about dest not existing. + (make-directory dest-dir t))) + (helm-acase action + (rsync (helm-rsync-copy-files ifiles dest rsync-switches)) + (compress (helm-do-compress-to ifiles dest)) + (t (helm-dired-action + dest :files ifiles :action action :follow prefarg))))) + +;; Rsync +;; +(defun helm-rsync-remote2rsync (file) + (if (file-remote-p file) + (let ((localname (directory-file-name + (expand-file-name (file-remote-p file 'localname)))) + (user (file-remote-p file 'user)) + ;; Tramp name may contain port e.g. /ssh:host#2222:/foo. + (host (replace-regexp-in-string + "#[0-9]+" "" (file-remote-p file 'host)))) + (if user + (format "%s@%s:%s" user host (shell-quote-argument localname)) + (format "%s:%s" host (shell-quote-argument localname)))) + (shell-quote-argument + (directory-file-name + (expand-file-name file))))) + +(defun helm-rsync-format-mode-line-str (proc) + (helm-aif (and (process-live-p proc) + (assoc-default proc helm-rsync-progress-str-alist)) + (progn + ;; When rsync progress bar stop for some reason (e.g. rsync + ;; takes time to finalize writing file to disk), no output is + ;; coming from filter process, as a result the progress bar + ;; disapear for a while giving no information to user while + ;; the rsync process continues, so keep printing the last valid + ;; progress bar (stored in `helm-rsync--last-progress-bar-alist') + ;; instead of sending empty string. + (unless (equal it "") + (push (cons proc it) helm-rsync--last-progress-bar-alist)) + (if (eq helm-ff-rsync-progress-bar-style 'text) + (format " [%s]" (propertize + (or (assoc-default proc helm-rsync--last-progress-bar-alist) + ;; Avoid (wrong-type-argument stringp + ;; nil) when process is not ready. + "") + 'face 'helm-ff-rsync-progress)) + (format " %s" (or (assoc-default proc helm-rsync--last-progress-bar-alist) + ;; Avoid (wrong-type-argument stringp + ;; nil) when process is not ready. + "")))))) + +(defun helm-ff--rsync-progress-bar (progbar proc) + ;; progbar == " 2,83G 92% 98,65MB/s 0:00:02 " + (let ((infos (split-string + (replace-regexp-in-string + "%" helm-rsync-percent-sign + progbar) + " " t)) + percent info) + (if (eq helm-ff-rsync-progress-bar-style 'text) + (mapconcat 'identity infos " ") + (setq info + (mapconcat (lambda (x) + (helm-acase x + (size (nth 0 infos)) + (percent (nth 1 infos)) + (speed (nth 2 infos)) + (remain (nth 3 infos)))) + (helm-mklist helm-ff-rsync-progress-bar-info) + ", ")) + (when (string-match "\\([0-9]+\\)%" progbar) + (setq percent (string-to-number + (match-string 1 progbar)))) + (if percent + (format "%s%s%s%s" + (propertize (capitalize (replace-regexp-in-string + "<\\([0-9]+\\)>" "(\\1)" + (process-name proc))) + 'display '(height 0.9) + 'face 'helm-ff-rsync-progress-1) + (propertize " " 'display `(space :width ,(list percent)) + 'face 'helm-ff-rsync-progress-2) + (propertize " " 'display `(space :width ,(list (- 100 percent))) + 'face 'helm-ff-rsync-progress-3) + (propertize info + 'display '(height 0.9) + 'face 'helm-ff-rsync-progress-1)) + "")))) + +(defun helm-rsync-mode-line (proc) + "Add Rsync progress to the mode line." + (or global-mode-string (setq global-mode-string '(""))) + (unless (member `(:eval (helm-rsync-format-mode-line-str ,proc)) + global-mode-string) + (setq global-mode-string + (append global-mode-string + `((:eval (helm-rsync-format-mode-line-str ,proc))))))) + +(defun helm-rsync-restore-mode-line (proc) + "Restore the mode line when Rsync finishes." + (setq global-mode-string + (remove `(:eval (helm-rsync-format-mode-line-str ,proc)) + global-mode-string)) + (setq helm-rsync--last-progress-bar-alist nil) + (force-mode-line-update)) + +(defun helm-rsync-copy-files (files dest &optional switches) + "Send FILES to DEST using Rsync with SWITCHES as arguments. + +DEST must be a directory. SWITCHES when unspecified default to +`helm-rsync-switches'." + (cl-assert (file-directory-p dest) t) + (setq files (cl-loop for f in files + collect (helm-rsync-remote2rsync f)) + dest (helm-rsync-remote2rsync dest)) + (let* ((buf (generate-new-buffer-name helm-rsync-process-buffer)) + (host (file-remote-p dest 'host)) + (port (when (and host (string-match "#\\([0-9]+\\)" host)) + (match-string 1 host))) + (proc (start-process-shell-command + "rsync" buf + (format "rsync %s" + (mapconcat + 'identity + (append (or switches helm-rsync-switches) + (and port + ;; Add automatically port + ;; specified in tramp name + ;; unless user already specified + ;; it himself with the -e option + ;; by editing command. + switches + (cl-loop for arg in switches never + (string-match-p + "\\`-e" arg)) + (list (format "-e 'ssh -p %s'" + port))) + files (list dest)) + " "))))) + (helm-rsync-mode-line proc) + (set-process-sentinel + proc (lambda (process event) + (cond ((string= event "finished\n") + (message "%s copied %s files" + (capitalize (process-name process)) + (length files))) + (t (error "Process %s %s with code %s" + (process-name process) + (process-status process) + (process-exit-status process)))) + (setq helm-rsync-progress-str-alist + (delete (assoc process helm-rsync-progress-str-alist) + helm-rsync-progress-str-alist)) + (helm-rsync-restore-mode-line process) + (force-mode-line-update))) + (set-process-filter proc #'helm-rsync-process-filter))) + +(defun helm-rsync-process-filter (proc output) + "Filter process function used by `helm-rsync-copy-files'." + (let ((inhibit-read-only t) + fname progbar) + (with-current-buffer (process-buffer proc) + (when (string-match comint-password-prompt-regexp output) + ;; FIXME: Fully not tested and + ;; use an agent or auth-source + ;; or whatever to get password if + ;; available. + (process-send-string + proc (concat (read-passwd (match-string 0 output)) "\n"))) + ;; Extract the progress bar. + (with-temp-buffer + (insert output) + (when (re-search-backward "[[:cntrl:]]" nil t) + (setq progbar (buffer-substring-no-properties + (match-end 0) (point-max))))) + ;; Insert the text, advancing the process marker. + (save-excursion + (goto-char (process-mark proc)) + (insert output) + (set-marker (process-mark proc) (point))) + (goto-char (process-mark proc)) + ;; Extract the file name currently + ;; copied (Imply --info=all2 or all1). + (save-excursion + (when (re-search-backward "^[^[:cntrl:]]" nil t) + (setq fname (helm-basename + (buffer-substring-no-properties + (point) (pos-eol)))))) + ;; Now format the string for the mode-line. + (let ((ml-str (helm-ff--rsync-progress-bar progbar proc))) + (setq ml-str (propertize ml-str 'help-echo + (format "%s->%s" (process-name proc) fname))) + ;; Now associate the formatted + ;; progress-bar string with process. + (helm-aif (assoc proc helm-rsync-progress-str-alist) + (setcdr it ml-str) + (setq helm-rsync-progress-str-alist + (push (cons proc ml-str) helm-rsync-progress-str-alist))))) + ;; Finally update mode-line. + (unless helm-rsync-no-mode-line-update + (force-mode-line-update t)))) + +(defun helm-ff-kill-rsync-process (process) + "Kill rsync process PROCESS. + +When called interactively prompt user with completion when more than +one process." + (interactive (list (get-process + (helm-comp-read + "Kill rsync process: " + (mapcar (lambda (x) + (process-name (car x))) + helm-rsync-progress-str-alist) + :exec-when-only-one t)))) + (with-current-buffer (process-buffer process) + (delete-process process) + (kill-buffer)) + (setq helm-rsync-progress-str-alist + (delete (assoc process helm-rsync-progress-str-alist) + helm-rsync-progress-str-alist))) + +(defun helm-find-files-rsync (_candidate) + "Rsync files from `helm-find-files'." + (helm-find-files-do-action 'rsync)) + +(defun helm-find-files-copy (_candidate) + "Copy files from `helm-find-files'." + (helm-find-files-do-action 'copy)) + +(defun helm-find-files-backup (_candidate) + "Backup files from `helm-find-files'. +This reproduce the behavior of \"cp --backup=numbered from to\"." + (cl-assert (and (fboundp 'dired-async-mode) dired-async-mode) nil + "Backup only available when `dired-async-mode' is enabled") + (helm-find-files-do-action 'backup)) + +(defun helm-find-files-rename (_candidate) + "Rename files from `helm-find-files'." + (helm-find-files-do-action 'rename)) + +(defun helm-find-files-symlink (_candidate) + "Symlink files from `helm-find-files'." + (helm-find-files-do-action 'symlink)) + +(defun helm-find-files-relsymlink (_candidate) + "Relsymlink files from `helm-find-files'." + (helm-find-files-do-action 'relsymlink)) + +(defun helm-find-files-hardlink (_candidate) + "Hardlink files from `helm-find-files'." + (helm-find-files-do-action 'hardlink)) + +(defun helm-find-files-compress-to (_candidate) + "Compress to archive from `helm-find-files'." + (helm-find-files-do-action 'compress)) + +(defun helm-ff-compress-marked-files (_candidate) + "Compress or uncompress marked files with `dired-compress-file'." + (require 'dired-async) + (let* ((files (helm-marked-candidates :with-wildcard t))) + (if (not (with-helm-display-marked-candidates + helm-marked-buffer-name + (mapcar #'abbreviate-file-name files) + (y-or-n-p (format "Compress or uncompress *%s File(s)" (length files))))) + (message "(No (un)compression performed)") + (process-put + (async-start + `(lambda () + (require 'dired-aux) + (let ((len 0)) + (dolist (i ',files) + (let ((default-directory (file-name-directory i))) + (when (dired-compress-file i) + (cl-incf len)))) + len)) + (lambda (result) + (unless (dired-async-processes 'helm-async-compress) + (helm-ff--compress-async-modeline-mode -1)) + (message "%s File(s) (un)compressed" result) + (run-with-timer + 0.1 nil + (lambda (len flist) + (dired-async-mode-line-message + "%s %d/%d file(s) done" + 'helm-delete-async-message + "(Un)compressing" + len (length flist))) + result files))) + 'helm-async-compress t) + (helm-ff--compress-async-modeline-mode 1)))) + +(helm-make-command-from-action helm-ff-run-compress-marked-files + "Compress or uncompress marked files." + 'helm-ff-compress-marked-files) + +(defun helm-ff-chmod (_candidate) + "Set file mode on marked files. +If no mode is specified in prompt, default mode will be the mode of +the car of marked files i.e. the first marked file." + (let* ((mkd (helm-marked-candidates)) + (model (car mkd)) + (default (helm-file-attributes model :octal t)) + (mode (read-file-modes nil model)) + (smode (file-modes-number-to-symbolic mode)) + (candidates (if (string= default (format "%o" mode)) + (cdr mkd) mkd))) + (with-helm-display-marked-candidates + helm-marked-buffer-name + (helm-ff--count-and-collect-dups candidates) + (when (y-or-n-p (format "Change file mode to `%s'? " smode)) + (dolist (f candidates) + (unless (file-symlink-p f) + ;; For now don't use the FLAG arg 'nofollow of `set-file-modes' for + ;; Emacs-26 compatibility. + (set-file-modes f mode))) + (message "Changed file mode to `%s' on %s file(s)" + smode (length candidates)))))) + +(defun helm-find-files-other-window (_candidate) + "Keep current-buffer and open files in separate windows. +When a prefix arg is detected files are opened in a vertical +windows layout." + (let* ((files (helm-marked-candidates)) + (buffers (mapcar 'find-file-noselect files))) + (helm-window-show-buffers buffers t))) + +(defun helm-find-files-byte-compile (_candidate) + "Byte compile elisp files from `helm-find-files'." + (let ((files (helm-marked-candidates :with-wildcard t)) + (parg helm-current-prefix-arg)) + (cl-loop for fname in files + do (condition-case _err + (with-no-warnings + (byte-compile-file fname parg)) + (wrong-number-of-arguments + ;; Emacs-28 accepts only one arg. + (byte-compile-file fname) + (when parg (load fname))))))) + +(defun helm-find-files-load-files (_candidate) + "Load elisp files from `helm-find-files'." + (let ((files (helm-marked-candidates :with-wildcard t))) + (cl-loop for fname in files + do (load fname)))) + +(defun helm-find-files-ediff-files-1 (candidate &optional merge) + "Generic function to ediff/merge files in `helm-find-files'." + (let* ((helm-dwim-target 'next-window) + (bname (helm-basename candidate)) + (marked (helm-marked-candidates :with-wildcard t)) + (prompt (if merge "Ediff Merge `%s' With File: " + "Ediff `%s' With File: ")) + (fun (if merge 'ediff-merge-files 'ediff-files)) + (input (helm-dwim-target-directory)) + (presel (if helm-ff-transformer-show-only-basename + (helm-basename candidate) + (expand-file-name + (helm-basename candidate) + input)))) + (if (= (length marked) 2) + (funcall fun (car marked) (cadr marked)) + (funcall fun candidate (helm-read-file-name + (format prompt bname) + :initial-input input + :preselect presel))))) + +(defun helm-find-files-ediff-files (candidate) + (helm-find-files-ediff-files-1 candidate)) + +(defun helm-find-files-ediff-merge-files (candidate) + (helm-find-files-ediff-files-1 candidate 'merge)) + +(defun helm-find-files-grep (_candidate) + "Default action to grep files from `helm-find-files'." + (helm-do-grep-1 (helm-marked-candidates :with-wildcard t) + helm-current-prefix-arg)) + +(defun helm-ff-git-grep (_candidate) + "Default action to git-grep `helm-ff-default-directory'." + (helm-grep-git-1 helm-ff-default-directory helm-current-prefix-arg)) + +(defun helm-find-files-ag (_candidate) + (helm-grep-ag helm-ff-default-directory + helm-current-prefix-arg)) + +(defun helm-ff-zgrep (_candidate) + "Default action to zgrep files from `helm-find-files'." + (helm-ff-zgrep-1 (helm-marked-candidates :with-wildcard t) helm-current-prefix-arg)) + +(defun helm-ff-pdfgrep (_candidate) + "Default action to pdfgrep files from `helm-find-files'." + (let* ((recurse nil) + (cands (cl-loop for file in (helm-marked-candidates :with-wildcard t) + for dir = (file-directory-p file) + when dir do (setq recurse t) + when (or dir + (string= (file-name-extension file) "pdf") + (string= (file-name-extension file) "PDF")) + collect file))) + (when cands + (helm-do-pdfgrep-1 cands recurse)))) + +(defun helm-ff-etags-select (candidate) + "Default action to jump to etags from `helm-find-files'." + (when (get-buffer helm-action-buffer) + (kill-buffer helm-action-buffer)) + (let* ((source-name (assoc-default 'name (helm-get-current-source))) + (default-directory (if (string= source-name "Find Files") + helm-ff-default-directory + (file-name-directory candidate)))) + (helm-etags-select helm-current-prefix-arg))) + +;;; Eshell command on file +;; +(defvar eshell-command-aliases-list nil) +(defvar helm-eshell-command-on-file-input-history nil) +(defvar helm-eshell-command-on-file-history nil) +(cl-defun helm-find-files-eshell-command-on-file-1 (&optional map) + "Run `eshell-command' on CANDIDATE or marked candidates. +This is done possibly with an Eshell alias. If no alias found, +you can type in an Eshell command. + +Only aliases accepting a file as argument at the end of command +line are collected, i.e. aliases ending with \"$1\" or \"$*\". + +Basename of CANDIDATE can be a wild-card. +E.g. you can do \"eshell-command command *.el\" +Where \"*.el\" is the CANDIDATE. + +It is possible to do eshell-command command like this: \"command %s some more args\". + +If MAP is given run `eshell-command' on all marked files at once, +Otherwise, run `eshell-command' on each marked files. +In other terms, with a prefix arg do on the three marked files +\"foo\" \"bar\" \"baz\": + +\"eshell-command command foo bar baz\" + +otherwise do + +\"eshell-command command foo\" +\"eshell-command command bar\" +\"eshell-command command baz\" + +Note: +You have to setup some aliases in Eshell with the `alias' command +or by editing yourself the file `eshell-aliases-file' to make +this working." + (require 'helm-adaptive) + (require 'em-alias) (eshell-read-aliases-list) + (unless (> emacs-major-version 27) + ;; This advice have been merged in emacs-28. + (advice-add 'eshell-eval-command :override #'helm--advice-eshell-eval-command)) + (when (or eshell-command-aliases-list + (y-or-n-p "No eshell aliases found, run eshell-command without alias anyway? ")) + (let* ((cand-list (helm-marked-candidates :with-wildcard t)) + (default-directory (or helm-ff-default-directory + ;; If candidate is an url *-ff-default-directory is nil + ;; so keep value of default-directory. + default-directory)) + helm-display-source-at-screen-top + (helm-actions-inherit-frame-settings t) + helm-use-frame-when-more-than-two-windows + (command + (with-helm-display-marked-candidates + helm-marked-buffer-name + (helm-ff--count-and-collect-dups + (mapcar 'helm-basename cand-list)) + (with-helm-current-buffer + (helm-comp-read + "Command: " + (cl-loop with len = 0 + with aliases = + (cl-loop for (a c) in (eshell-read-aliases-list) + for len-key = (length a) + when + (and (string-match + "\\(\\$1\\|\\$\\*\\)" + c) + (not (member a helm-ff-eshell-unwanted-aliases))) + do (when (> len-key len) (setq len len-key)) + and collect (list a c)) + for (a c) in aliases + collect (cons + (concat (propertize + a 'face 'font-lock-keyword-face) + (make-string (1+ (- len (length a))) ? ) + c) + a)) + :fc-transformer #'helm-adaptive-sort + :buffer "*helm eshell on file*" + :name "Eshell command" + :mode-line + '("Eshell alias" + "C-h m: Help, \\[universal-argument]: Insert output at point") + :help-message 'helm-esh-help-message + :history 'helm-eshell-command-on-file-history + :raw-history t + :reverse-history helm-eshell-on-file-reverse-history + :input-history + 'helm-eshell-command-on-file-input-history)))) + (alias-value (car (assoc-default command eshell-command-aliases-list))) + cmd-line) + (if (or (equal helm-current-prefix-arg '(16)) + (equal map '(16))) + ;; Two time C-u from `helm-comp-read' mean print to current-buffer. + ;; i.e `eshell-command' will use this value. + (setq current-prefix-arg '(16)) + ;; Else reset the value of `current-prefix-arg' + ;; to avoid printing in current-buffer. + (setq current-prefix-arg nil)) + (if (and (or + ;; One prefix-arg have been passed before `helm-comp-read'. + ;; If map have been set with C-u C-u (value == '(16)) + ;; ignore it. + (and map (equal map '(4))) + ;; One C-u from `helm-comp-read'. + (equal helm-current-prefix-arg '(4)) + ;; An alias that finish with $* + (and alias-value + ;; If command is an alias be sure it accept + ;; more than one arg i.e $*. + (string-match "\\$\\*" alias-value))) + (cdr cand-list) + (and alias-value + ;; Command is an alias and accept only one arg. + (not (string-match "\\$1" alias-value)))) + + ;; Run eshell-command with ALL marked files as argument. + ;; This wont work on remote files, because tramp handlers depend + ;; on `default-directory' (limitation). + (let ((mapfiles (mapconcat 'shell-quote-argument cand-list " "))) + (if (string-match "%s" command) + (setq cmd-line (format command mapfiles)) ; See [1] + (setq cmd-line (format "%s %s" command mapfiles))) + (eshell-command cmd-line)) + + ;; Run eshell-command sequencially on EACH marked files. + ;; To work with tramp handler we have to call + ;; COMMAND on basename of each file, using + ;; its basedir as `default-directory'. + (unwind-protect + (progn + (cl-loop for f in cand-list + for n from 1 + for dir = (and (not (string-match helm--url-regexp f)) + (helm-basedir f)) + ;; We can use basename here as the command will run + ;; under default-directory. + ;; This allows running e.g. + ;; "tar czvf test.tar.gz %s/*" without creating + ;; an archive expanding from /home. + for file = (shell-quote-argument + (if (string-match helm--url-regexp f) + f (helm-basename f))) + ;; \@ => placeholder for file without extension. + ;; \# => placeholder for incremental number. + for fcmd = (helm-aand command + (replace-regexp-in-string + "\\\\#" (format "%03d" n) + it t t) + (replace-regexp-in-string + "\\\\@" + (regexp-quote + (file-name-sans-extension file)) + it t t)) + for com = (if (string-match "%s" fcmd) + ;; [1] This allows to enter other args AFTER filename + ;; i.e + (format fcmd file) + (format "%s %s" fcmd file)) + do (let ((default-directory (or dir default-directory))) + (eshell-command com)))) + ;; Async process continues running but doesn't need anymore + ;; the advice at this point (see the `eshell-eval-command' + ;; call in `eshell-command'). + (unless (> emacs-major-version 27) + (advice-remove 'eshell-eval-command #'helm--advice-eshell-eval-command))))))) + +(defun helm--advice-eshell-eval-command (command &optional input) + "Fix return value when command ends with \"&\"." + ;; Fix this emacs commit which is plain wrong as it returns + ;; either nil or an error (double because format spec doesn't + ;; always match specifier) whereas it should return either a + ;; single element (CAR DELIM) or DELIM itself if the car of + ;; DELIM is a process. + ;; This prevent running eshell-command async when needed i.e. when + ;; command ends with "&". + ;; + ;; UPDATE: This have now been merged in Emacs-28. + ;; + ;; 6b6f91b357f6fe2f1e0d72f046a1b8d8a2d6d8c3 + ;; Author: John Wiegley + ;; AuthorDate: Fri May 27 02:57:18 2005 +0000 + ;; Commit: John Wiegley + ;; CommitDate: Fri May 27 02:57:18 2005 +0000 + (if eshell-current-command + ;; we can just stick the new command at the end of the current + ;; one, and everything will happen as it should + (setcdr (last (cdr eshell-current-command)) + (list `(let ((here (and (eobp) (point)))) + ,(and input + `(insert-and-inherit ,(concat input "\n"))) + (if here + (eshell-update-markers here)) + (eshell-do-eval ',command)))) + (and eshell-debug-command + (with-current-buffer (get-buffer-create "*eshell last cmd*") + (erase-buffer) + (insert "command: \"" input "\"\n"))) + (setq eshell-current-command command) + (let* ((delim (catch 'eshell-incomplete + (eshell-resume-eval))) + (val (car-safe delim))) + ;; If the return value of `eshell-resume-eval' is wrapped in a + ;; list, it indicates that the command was run asynchronously. + ;; In that case, unwrap the value before checking the delimiter + ;; value. + (if (and val + (not (processp val)) + (not (eq val t))) + (error "Unmatched delimiter: %S" val) + ;; Eshell-command expect a list like () to know if the + ;; command should be async or not. + (or (and (processp val) delim) val))))) + +(defun helm-find-files-eshell-command-on-file (_candidate) + "Run `eshell-command' on CANDIDATE or marked candidates. +See `helm-find-files-eshell-command-on-file-1' for more info." + (helm-find-files-eshell-command-on-file-1 helm-current-prefix-arg)) + +(defun helm-ff--shell-interactive-buffer-p (buffer &optional mode) + (with-current-buffer buffer + (when (eq major-mode (or mode 'eshell-mode)) + (let ((next-prompt-fn (cl-case major-mode + (shell-mode #'comint-next-prompt) + (eshell-mode #'eshell-next-prompt) + (term-mode #'term-next-prompt)))) + (save-excursion + (goto-char (point-min)) + (funcall next-prompt-fn 1) + (null (eql (point) (point-min)))))))) + +(defun helm-ff-switch-to-shell (_candidate) + "Switch to a shell buffer and cd to `helm-ff-default-directory'. +Set your preferred shell mode in `helm-ff-preferred-shell-mode'. + +With a numeric prefix arg switch to numbered shell buffer, if no +prefix arg provided and more than one shell buffer exists, provide +completions on those buffers. If only one shell buffer exists, +switch to this one, if no shell buffer exists or if the numeric +prefix arg shell buffer doesn't exists, create it and switch to it." + ;; Reproduce the Emacs-25 behavior to be able to edit and send + ;; command in term buffer. + (let (term-char-mode-buffer-read-only ; Emacs-25 behavior. + term-char-mode-point-at-process-mark ; Emacs-25 behavior. + (cd-eshell (lambda () + (eshell/cd helm-ff-default-directory) + (eshell-reset))) + (cd-shell + (lambda () + (goto-char (point-max)) + (when (eq helm-ff-preferred-shell-mode 'shell-mode) + (comint-delete-input)) + (insert (format "cd %s" + (shell-quote-argument + (or (file-remote-p + helm-ff-default-directory 'localname) + helm-ff-default-directory)))) + (cl-case helm-ff-preferred-shell-mode + (shell-mode (comint-send-input)) + (term-mode (progn (term-char-mode) (term-send-input)))))) + (bufs (cl-loop for b in (mapcar 'buffer-name (buffer-list)) + when (helm-ff--shell-interactive-buffer-p + b helm-ff-preferred-shell-mode) + collect b))) + ;; Jump to a shell buffer or open a new session. + (helm-aif (and (not helm-current-prefix-arg) + (if (cdr bufs) + (helm-comp-read "Switch to shell buffer: " bufs + :must-match t) + (car bufs))) + ;; Display in same window by default to preserve the + ;; historical behaviour + (pop-to-buffer it '(display-buffer-same-window)) + (cl-case helm-ff-preferred-shell-mode + (eshell-mode + (eshell helm-current-prefix-arg)) + (shell-mode + (shell (helm-aif (and helm-current-prefix-arg + (prefix-numeric-value + helm-current-prefix-arg)) + (format "*shell<%s>*" it)))) + (term-mode + (progn + (ansi-term (getenv "SHELL") + (helm-aif (and helm-current-prefix-arg + (prefix-numeric-value + helm-current-prefix-arg)) + (format "*ansi-term<%s>*" it))) + (term-line-mode))))) + ;; Now cd into directory. + (helm-aif (and (memq major-mode '(shell-mode term-mode)) + (get-buffer-process (current-buffer))) + (accept-process-output it 0.1)) + (unless (helm-ff-shell-alive-p major-mode) + (funcall + (if (eq major-mode 'eshell-mode) cd-eshell cd-shell))))) + +(defun helm-ff-shell-alive-p (mode) + "Returns non nil when a process is running inside `shell-mode' buffer." + (cl-ecase mode + (shell-mode + (save-excursion + (comint-goto-process-mark) + (or (null comint-last-prompt) + (not (eql (point) + (marker-position (cdr comint-last-prompt))))))) + (eshell-mode + (get-buffer-process (current-buffer))) + (term-mode + (save-excursion + (goto-char (term-process-mark)) + (not (looking-back "\\$ " (- (point) 2))))))) + +(defun helm-ff-touch-files (_candidate) + "The touch files action for helm-find-files." + (let* ((files (helm-marked-candidates)) + (split (cl-loop for f in files + for spt = (unless helm-current-prefix-arg + (cons (helm-basedir f) + (split-string f ", ?"))) + if spt + append (cl-loop with dir = (car spt) + for ff in (cdr spt) + collect (expand-file-name ff dir)) + else collect f)) + (timestamp (helm-comp-read + "Timestamp (default Now): " + (cl-loop for f in split + for time = (file-attributes f) + for date = (and time + (format-time-string + "%Y-%m-%d %H:%M:%S" + (nth 5 time))) + when date + collect (cons (format "%s: %s" + (helm-basename f) date) + date)) + :default + (format-time-string "%Y-%m-%d %H:%M:%S" + (current-time)))) + (failures + (cl-loop with default-directory = helm-ff-default-directory + for f in split + for file = (or (file-remote-p f 'localname) f) + when (> (process-file + "touch" nil nil nil "-d" timestamp file) + 0) + collect f))) + (when failures + (message "Failed to touch *%s files:\n%s" + (length failures) + (mapconcat (lambda (f) (format "- %s\n" f)) failures ""))))) + +(helm-make-command-from-action helm-ff-run-touch-files + "Used to interactively run touch file action from keyboard." + 'helm-ff-touch-files) + +(defun helm-ff-sort-by-size () + (interactive) + (let ((helm-ff-initial-sort-method 'size)) + (helm-force-update + (concat (regexp-quote (helm-get-selection + nil helm-ff-transformer-show-only-basename)) + "$")) + (message "Sorting by size"))) +(put 'helm-ff-sort-by-size 'helm-only t) + +(defun helm-ff-sort-by-newest () + (interactive) + (let ((helm-ff-initial-sort-method 'newest)) + (helm-force-update + (concat (regexp-quote (helm-get-selection + nil helm-ff-transformer-show-only-basename)) + "$")) + (message "Sorting by newest"))) +(put 'helm-ff-sort-by-newest 'helm-only t) + +(defun helm-ff-sort-by-ext () + (interactive) + (let ((helm-ff-initial-sort-method 'ext)) + (helm-force-update + (concat (regexp-quote (helm-get-selection + nil helm-ff-transformer-show-only-basename)) + "$")) + (message "Sorting by extensions"))) +(put 'helm-ff-sort-by-ext 'no-helm-mx t) + +(defun helm-ff-sort-alpha () + (interactive) + (let ((helm-ff-initial-sort-method nil)) + (helm-force-update + (concat (regexp-quote (helm-get-selection + nil helm-ff-transformer-show-only-basename)) + "$")) + (message "Sorting alphabetically"))) +(put 'helm-ff-sort-alpha 'helm-only t) + +(defun helm-ff-directories-only (candidates _source) + (if helm-ff--show-directories-only + (cl-loop for (d . r) in candidates + when (file-directory-p r) + ;; We can use this as long as this filtering function + ;; is called after `helm-ff-fct' otherwise candidates + ;; may not be cons cell at first call [1]. + collect (cons d r)) + candidates)) + +(defun helm-ff-files-only (candidates _source) + (if helm-ff--show-files-only + (cl-loop for (d . r) in candidates + unless (file-directory-p r) + ;; Same comment as in [1] above. + collect (cons d r)) + candidates)) + +(defun helm-ff-toggle-dirs-only () + "Show only directories in helm-find-files." + (interactive) + (with-helm-alive-p + (setq helm-ff--show-directories-only (not helm-ff--show-directories-only)) + (setq helm-ff--show-files-only nil) + (helm-update (helm-get-selection nil t)))) +(put 'helm-ff-toggle-dirs-only 'helm-only t) + +(defun helm-ff-toggle-files-only () + "Show only files in helm-find-files." + (interactive) + (with-helm-alive-p + (setq helm-ff--show-files-only (not helm-ff--show-files-only)) + (setq helm-ff--show-directories-only nil) + (helm-update (helm-get-selection nil t)))) +(put 'helm-ff-toggle-files-only 'helm-only t) + +(defun helm-ff-after-persistent-show-all () + (when helm-ff-reset-filters-on-update + (setq helm-ff--show-directories-only nil + helm-ff--show-files-only nil))) + +(defun helm-ff-serial-rename-action (method) + "Rename all marked files in `helm-ff-default-directory' with METHOD. +See `helm-ff-serial-rename-1'." + (let* ((helm--reading-passwd-or-string t) + (cands (helm-marked-candidates :with-wildcard t)) + (def-name (car cands)) + (name (helm-read-string "NewName: " + (replace-regexp-in-string + "[0-9]+$" "" + (helm-basename + def-name + (file-name-extension def-name))))) + (start (read-number "StartAtNumber: ")) + (extension (helm-read-string "Extension: " + (file-name-extension (car cands)))) + (dir (expand-file-name + (helm-read-file-name + "Serial Rename to directory: " + :initial-input + (expand-file-name helm-ff-default-directory) + :test 'file-directory-p + :must-match t))) + done) + (with-helm-display-marked-candidates + helm-marked-buffer-name (helm-ff--count-and-collect-dups cands) + (if (y-or-n-p + (format "Rename %s file(s) to <%s> like this ?\n%s " + (length cands) dir (format "%s <-> %s%s.%s" + (helm-basename (car cands)) + name start extension))) + (progn + (helm-ff-serial-rename-1 + dir cands name start extension :method method) + (setq done t) + (message nil)))) + (if done + (with-helm-current-buffer (helm-find-files-1 dir)) + (message "Operation aborted")))) + +(defun helm-ff-member-directory-p (file directory) + (let ((dir-file (expand-file-name + (file-name-as-directory (file-name-directory file)))) + (cur-dir (expand-file-name (file-name-as-directory directory)))) + (string= dir-file cur-dir))) + +(cl-defun helm-ff-serial-rename-1 + (directory collection new-name start-at-num extension &key (method 'rename)) + "Rename files in COLLECTION to DIRECTORY with the prefix name NEW-NAME. +Rename start at number START-AT-NUM - ex: prefixname-01.jpg. +EXTENSION is the file extension to use. In empty prompt, reuse +the original extension of file. +METHOD can be one of rename, copy or symlink. +Files will be renamed if they are files of current directory, +otherwise they will be treated with METHOD. +Default METHOD is rename." + ;; Maybe remove directories selected by error in collection. + (setq collection (cl-remove-if 'file-directory-p collection)) + (let* ((tmp-dir (file-name-as-directory + (concat (file-name-as-directory directory) + (symbol-name (cl-gensym "tmp"))))) + (fn (cl-case method + (copy 'copy-file) + (symlink 'make-symbolic-link) + (rename 'rename-file) + (t (error "Error: Unknown method %s" method))))) + (make-directory tmp-dir) + (unwind-protect + (progn + ;; Rename all files to tmp-dir with new-name. + ;; If files are not from start directory, use method + ;; to move files to tmp-dir. + (cl-loop for i in collection + for count from start-at-num + for fnum = (if (< count 10) "0%s" "%s") + for nname = (concat tmp-dir new-name (format fnum count) + (if (not (string= extension "")) + (format ".%s" (replace-regexp-in-string + "[.]" "" extension)) + (file-name-extension i 'dot))) + do (if (helm-ff-member-directory-p i directory) + (rename-file i nname) + (funcall fn i nname))) + ;; Now move all from tmp-dir to destination. + (cl-loop with dirlist = (directory-files + tmp-dir t directory-files-no-dot-files-regexp) + for f in dirlist do + (if (file-symlink-p f) + (make-symbolic-link (file-truename f) + (concat (file-name-as-directory directory) + (helm-basename f))) + (rename-file f directory)))) + (delete-directory tmp-dir t)))) + +(defun helm-ff-serial-rename (_candidate) + "Serial rename all marked files to `helm-ff-default-directory'. +Rename only file of current directory, and symlink files coming from +other directories. +See `helm-ff-serial-rename-1'." + (helm-ff-serial-rename-action 'rename)) + +(defun helm-ff-serial-rename-by-symlink (_candidate) + "Serial rename all marked files to `helm-ff-default-directory'. +Rename only file of current directory, and symlink files coming +from other directories. +See `helm-ff-serial-rename-1'." + (helm-ff-serial-rename-action 'symlink)) + +(defun helm-ff-serial-rename-by-copying (_candidate) + "Serial rename all marked files to `helm-ff-default-directory'. +Rename only file of current directory, and copy files coming from +other directories. +See `helm-ff-serial-rename-1'." + (helm-ff-serial-rename-action 'copy)) + +(defvar helm-ff-query-replace-fnames-history-from nil) +(defvar helm-ff-query-replace-fnames-history-to nil) +(defun helm-ff-query-replace-on-filenames (candidates) + "Query replace on filenames of CANDIDATES. +This doesn't replace inside the files, only modify filenames." + (with-helm-display-marked-candidates + helm-marked-buffer-name + (mapcar 'helm-basename candidates) + (let* ((regexp (read-string "Replace regexp on filename(s): " + nil 'helm-ff-query-replace-history-from + (helm-basename (car candidates)))) + (rep (read-string (format "Replace regexp `%s' with: " regexp) + nil 'helm-ff-query-replace-history-to))) + (cl-loop with query = "y" + with count = 0 + for old in candidates + for new = (helm-ff--query-replace-in-fname-set-new-name + old regexp rep count) + ;; If `regexp' is not matched in `old' + ;; `replace-regexp-in-string' will + ;; return `old' unmodified. + unless (string= old new) + do (progn + (when (file-exists-p new) + (setq new (concat (file-name-sans-extension new) + (format "(%s)" count) + (file-name-extension new t)))) + (unless (string= query "!") + (setq query (helm-read-answer (format + "Replace `%s' by `%s' [!,y,n,q]" + (helm-basename old) + (helm-basename new)) + '("y" "n" "!" "q")))) + (when (string= query "q") + (cl-return (message "Operation aborted"))) + (unless (string= query "n") + (rename-file old new) + (cl-incf count))) + finally (message "%d Files renamed" count)))) + ;; This fix the emacs bug where "Emacs-Lisp:" is sent + ;; in minibuffer (not the echo area). + (sit-for 0.1) + (with-current-buffer (window-buffer (minibuffer-window)) + (delete-minibuffer-contents))) + +(defun helm-ff--query-replace-in-fname-set-new-name (old regexp rep count) + "Setup a new name for OLD replacing part matching REGEXP with REP. +COUNT is used for incrementing new name if needed." + (let (subexp target) + (concat (helm-basedir old) + (helm--replace-regexp-in-buffer-string + (save-match-data + (cond ((string= regexp "%.") + (setq subexp 1) + (helm-ff--prepare-str-with-regexp + (setq target (helm-basename old t)))) + ((string= regexp ".%") + (setq subexp 1) + (helm-ff--prepare-str-with-regexp + (setq target (file-name-extension old)))) + ((string= regexp "%") + (regexp-quote + (setq target (helm-basename old)))) + ((string-match "%:\\([0-9]+\\):\\([0-9]+\\)" regexp) + (setq subexp 1) + (let ((beg (match-string 1 regexp)) + (end (match-string 2 regexp)) + (str (helm-basename old))) + (setq target (substring str + (string-to-number beg) + (string-to-number end))) + (helm-ff--prepare-str-with-regexp str beg end))) + (t regexp))) + (save-match-data + (cond (;; Handle incremental + ;; replacement with \# in + ;; search and replace + ;; feature in placeholder \@. + (string-match + "\\\\@/\\(.*\\)/\\(\\(?99:.*\\)\\\\#\\)/" + rep) + (replace-regexp-in-string + (match-string 1 rep) + (concat (match-string 99 rep) + (format "%03d" (1+ count))) + target)) + ;; Incremental replacement + ;; before or after \@. + ((and (string-match-p "\\\\#" rep) + (string-match "\\\\@" rep)) + (replace-regexp-in-string + "\\\\#" (format "%03d" (1+ count)) + (replace-match target t t rep))) + ;; Simple incremental replacement. + ((string-match "\\\\#" rep) + (replace-match + (format "%03d" (1+ count)) t t rep)) + ;; Substring replacement in placeholder. + ((string-match + "\\\\@:\\([0-9]*\\):\\([0-9]*\\)" rep) + (replace-match (substring + target + (string-to-number + (match-string 1 rep)) + (helm-acase (match-string 2 rep) + ((guard (string= it "")) + (length target)) + (t (string-to-number it)))) + t t rep)) + ;; Search and replace in + ;; placeholder. Doesn't + ;; handle incremental here. + ((string-match "\\\\@/\\(.*\\)/\\(.*\\)/" rep) + (replace-match (replace-regexp-in-string + (match-string 1 rep) + (match-string 2 rep) + target t) + t t rep)) + ;; Simple replacement by placeholder. + ((string-match "\\\\@" rep) + (replace-match target t t rep)) + ;; Replacement with + ;; upcase, downcase or + ;; capitalized text. + ((string= rep "%u") #'upcase) + ((string= rep "%d") #'downcase) + ((string= rep "%c") #'capitalize) + ;; Simple replacement with + ;; whole replacement regexp. + (t rep))) + (helm-basename old) t nil subexp)))) + +(defun helm-ff--prepare-str-with-regexp (str &optional rep1 rep2) + ;; This is used in `helm-ff-query-replace-on-filenames' to prepare + ;; STR when REGEXP is specified as substring e.g %:1:3 in this case + ;; substring from 1 to 3 in STR will be enclosed with parenthesis to + ;; match this substring as a subexp e.g %:1:3 on string "emacs" will + ;; be replaced by "e\\(ma\\)cs" using subexp 1 like this: + ;; (helm--replace-regexp-in-buffer-string "e\\(ma\\)cs" "fo" "emacs" nil t 1) + ;; => "efocs" + ;; ^^ + ;; Where "1" and "3" will be strings extracted with match-string + ;; from regexp and refered respectively in this function as REP1 and + ;; REP2. + (let* ((from (or (and rep1 (string-to-number rep1)) 0)) + (to (or (and rep2 (string-to-number rep2)) (length str))) + (subexp (concat "\\(" (regexp-quote (substring str from to)) "\\)")) + (before-str (unless (zerop from) + (regexp-quote (substring str 0 from)))) + (after-str (unless (= to (length str)) + (regexp-quote (substring str to (length str)))))) + (concat before-str subexp after-str))) + +;; The action. +(defun helm-ff-query-replace-fnames-on-marked (_candidate) + (let ((marked (helm-marked-candidates :with-wildcard t))) + (helm-ff-query-replace-on-filenames marked))) + +;; The command for `helm-find-files-map'. +(helm-make-command-from-action helm-ff-run-query-replace-fnames-on-marked + "Run query-replace on filenames from HFF." + 'helm-ff-query-replace-fnames-on-marked) + +(defun helm-ff-query-replace (_candidate) + (let ((bufs (cl-loop for f in (helm-marked-candidates :with-wildcard t) + collect (buffer-name (find-file-noselect f))))) + (helm-buffer-query-replace-1 nil bufs))) + +(helm-make-command-from-action helm-ff-run-query-replace + "Run query-replace from HFF." + 'helm-ff-query-replace) + +(defun helm-ff-query-replace-regexp (_candidate) + (let ((bufs (cl-loop for f in (helm-marked-candidates :with-wildcard t) + collect (buffer-name (find-file-noselect f))))) + (helm-buffer-query-replace-1 'regexp bufs))) + +(helm-make-command-from-action helm-ff-run-query-replace-regexp + "Run query-replace regexp from HFF." + 'helm-ff-query-replace-regexp) + +(defun helm-ff-toggle-auto-update () + (if helm-ff--deleting-char-backward + (progn + (message "[Auto expansion disabled]") + (sit-for 1) (message nil) + (setq helm-ff--auto-update-state nil)) + (setq helm-ff-auto-update-flag (not helm-ff-auto-update-flag)) + (setq helm-ff--auto-update-state helm-ff-auto-update-flag) + (message "[Auto expansion %s]" + (if helm-ff-auto-update-flag "enabled" "disabled")))) + +(defun helm-ff-run-toggle-auto-update () + (interactive) + (with-helm-alive-p + (helm-ff-toggle-auto-update))) +(put 'helm-ff-run-toggle-auto-update 'helm-only t) + +(defun helm-ff-delete-char-backward () + "Go up one level or disable HFF auto update and delete char backward. + +Going up one level works only when pattern is a directory endings +with \"/\", otherwise this command deletes char backward. + +Going up one level can be disabled if necessary by deleting \"/\" +at end of pattern using \\\\[backward-char] and +\\[helm-delete-minibuffer-contents]." + (interactive) + (with-helm-alive-p + (if (and helm-ff-DEL-up-one-level-maybe + (string-match "/\\'" helm-pattern) + (file-directory-p helm-pattern)) + (call-interactively 'helm-find-files-up-one-level) + (setq helm-ff-auto-update-flag nil) + (setq helm-ff--deleting-char-backward t) + (call-interactively + (lookup-key (current-global-map) + (read-kbd-macro "DEL"))) + (helm--update-header-line)))) +(put 'helm-ff-delete-char-backward 'helm-only t) + +(defun helm-ff-delete-char-backward--exit-fn () + (setq helm-ff-auto-update-flag helm-ff--auto-update-state) + (setq helm-ff--deleting-char-backward nil)) + +(defvar helm-ff--RET-disabled nil) +(defun helm-ff-RET-1 (&optional must-match) + "Used for RET action in `helm-find-files'. +See `helm-ff-RET' for details. +If MUST-MATCH is specified exit with +`helm-confirm-and-exit-minibuffer' which handle must-match mechanism." + (let ((sel (helm-get-selection)) + ;; Ensure `file-directory-p' works on remote files. + non-essential) + (cl-assert sel nil "Trying to exit with no candidates") + (if (and (or (file-directory-p sel) + (helm-ff--invalid-tramp-name-p sel)) + ;; Allows exiting with default action when a prefix arg + ;; is specified. + (null current-prefix-arg) + (null helm-ff--RET-disabled) + (or (and (file-remote-p sel) + (string= "." (helm-basename sel)) + (string-match-p "\\`[/].*:.*:\\'" + helm-pattern)) + (not (string= "." (helm-basename sel))))) + (helm-execute-persistent-action) + (if must-match + (helm-confirm-and-exit-minibuffer) + (helm-maybe-exit-minibuffer))))) + +(defun helm-ff-RET () + "Default action for RET in `helm-find-files'. + +Behave differently depending on `helm-selection': + +- candidate basename is \".\" => open it in dired. +- candidate is a directory => expand it. +- candidate is a file => open it." + (interactive) + (helm-ff-RET-1)) +(put 'helm-ff-RET 'helm-only t) + +(defun helm-ff-TAB-1 (&optional force-menu) + "Used for TAB action in `helm-find-files'." + (let ((sel (helm-get-selection))) + (if (and (null force-menu) + (file-directory-p sel) + (not (string= "." (helm-basename sel)))) + (helm-execute-persistent-action) + (helm-select-action)))) + +(defun helm-ff-TAB (arg) + "Default action for TAB in `helm-find-files'. + +Behave differently depending on `helm-selection': + +- candidate basename is \".\" => open the action menu. +- candidate is a directory => expand it. +- candidate is a file => open action menu. + +Called with a prefix arg open menu unconditionally." + (interactive "P") + (helm-ff-TAB-1 arg)) +(put 'helm-ff-TAB 'helm-only t) + +(defun helm-ff-RET-must-match () + "Same as `helm-ff-RET' but used in must-match map." + (interactive) + (helm-ff-RET-1 t)) + +(helm-make-command-from-action helm-ff-run-grep + "Run Grep action from `helm-source-find-files'." + 'helm-find-files-grep) + +(helm-make-command-from-action helm-ff-run-git-grep + "Run git-grep action from `helm-source-find-files'." + 'helm-ff-git-grep) + +(helm-make-command-from-action helm-ff-run-grep-ag + "Run grep AG action from `helm-source-find-files'." + 'helm-find-files-ag) + +(helm-make-command-from-action helm-ff-run-pdfgrep + "Run Pdfgrep action from `helm-source-find-files'." + 'helm-ff-pdfgrep) + +(helm-make-command-from-action helm-ff-run-zgrep + "Run Grep action from `helm-source-find-files'." + 'helm-ff-zgrep) + +(helm-make-command-from-action helm-ff-run-copy-file + "Run Copy file action from `helm-source-find-files'." + 'helm-find-files-copy) + +(helm-make-command-from-action helm-ff-run-rsync-file + "Run Rsync file action from `helm-source-find-files'." + 'helm-find-files-rsync) + +(helm-make-command-from-action helm-ff-run-rename-file + "Run Rename file action from `helm-source-find-files'." + 'helm-find-files-rename) + +(helm-make-command-from-action helm-ff-run-byte-compile-file + "Run Byte compile file action from `helm-source-find-files'." + 'helm-find-files-byte-compile) + +(helm-make-command-from-action helm-ff-run-load-file + "Run Load file action from `helm-source-find-files'." + 'helm-find-files-load-files) + +(helm-make-command-from-action helm-ff-run-eshell-command-on-file + "Run eshell command on file action from `helm-source-find-files'." + 'helm-find-files-eshell-command-on-file) + +(helm-make-command-from-action helm-ff-run-ediff-file + "Run Ediff file action from `helm-source-find-files'." + 'helm-find-files-ediff-files) + +(helm-make-command-from-action helm-ff-run-ediff-merge-file + "Run Ediff merge file action from `helm-source-find-files'." + 'helm-find-files-ediff-merge-files) + +(helm-make-command-from-action helm-ff-run-symlink-file + "Run Symlink file action from `helm-source-find-files'." + 'helm-find-files-symlink) + +(helm-make-command-from-action helm-ff-run-relsymlink-file + "Run Symlink file action from `helm-source-find-files'." + 'helm-find-files-relsymlink) + +(helm-make-command-from-action helm-ff-run-hardlink-file + "Run Hardlink file action from `helm-source-find-files'." + 'helm-find-files-hardlink) + +(helm-make-command-from-action helm-ff-run-compress-to + "Run Compress to archive action from `helm-source-find-files'." + 'helm-find-files-compress-to) + +(helm-make-command-from-action helm-ff-run-chmod + "Run chmod action from `helm-source-find-files'." + 'helm-ff-chmod) + +(defun helm-ff-delete-files (candidate) + "Delete files default action." + (funcall helm-ff-delete-files-function candidate)) + +(helm-make-command-from-action helm-ff-run-delete-file + "Run Delete file action from `helm-source-find-files'." + 'helm-ff-delete-files) + +(helm-make-command-from-action helm-ff-run-complete-fn-at-point + "Run complete file name action from `helm-source-find-files'." + 'helm-insert-file-name-completion-at-point) + +(helm-make-command-from-action helm-ff-run-switch-to-shell + "Run switch to eshell action from `helm-source-find-files'." + 'helm-ff-switch-to-shell) + +(helm-make-command-from-action helm-ff-run-switch-other-window + "Run switch to other window action from `helm-source-find-files'. +When a prefix arg is provided, split is done vertically." + 'helm-find-files-other-window) + +(helm-make-command-from-action helm-ff-run-switch-other-frame + "Run switch to other frame action from `helm-source-find-files'." + 'find-file-other-frame) + +(helm-make-command-from-action helm-ff-run-open-file-externally + "Run open file externally command action from `helm-source-find-files'." + 'helm-open-file-externally) + +(helm-make-command-from-action helm-ff-run-open-file-with-default-tool + "Run open file externally command action from `helm-source-find-files'." + 'helm-open-file-with-default-tool) + +(defun helm-ff-locate (candidate) + "Locate action function for `helm-find-files'." + (helm-locate-set-command) + (let ((default (concat (helm-basename + (expand-file-name + candidate + helm-ff-default-directory)) + (unless (or + ;; "-b" is already added when fuzzy matching. + helm-locate-fuzzy-match + ;; The locate '-b' option doesn't exists + ;; in everything (es). + (and (eq system-type 'windows-nt) + (string-match "^es" helm-locate-command))) + " -b")))) + (helm-locate-1 helm-current-prefix-arg nil 'from-ff default))) + +(helm-make-command-from-action helm-ff-run-locate + "Run locate action from `helm-source-find-files'." + 'helm-ff-locate) + +(defun helm-files-insert-as-org-link (candidate) + (insert (format "[[%s][]]" candidate)) + (goto-char (- (point) 2))) + +(helm-make-command-from-action helm-ff-run-insert-org-link + "Run insert org link from HFF." + 'helm-files-insert-as-org-link) + +(helm-make-command-from-action helm-ff-run-find-file-as-root + "Run find file as root from HFF." + 'helm-find-file-as-root) + +(helm-make-command-from-action helm-ff-run-find-alternate-file + "Run `find-alternate-file' from HFF." + 'find-alternate-file) + +(helm-make-command-from-action helm-ff-run-mail-attach-files + "Run mail attach files command action from `helm-source-find-files'." + 'helm-ff-mail-attach-files) + +(helm-make-command-from-action helm-ff-run-etags + "Run Etags command action from `helm-source-find-files'." + 'helm-ff-etags-select) + +(defvar lpr-printer-switch) +(defun helm-ff-print (_candidate) + "Print marked files. + +You may to set in order variables `lpr-command',`lpr-switches' +and/or `printer-name', but with no settings Helm should detect +your printer(s) and print with the default `lpr' settings. + +NOTE: DO NOT set the \"-P\" flag in `lpr-switches'. If you really +have to modify this, do it in `lpr-printer-switch'. + +Same as `dired-do-print' but for Helm." + (require 'lpr) + (when (or helm-current-prefix-arg + (not helm-ff-printer-list)) + (setq helm-ff-printer-list + (helm-ff-find-printers))) + (let* ((file-list (helm-marked-candidates :with-wildcard t)) + (len (length file-list)) + (printer-name (if helm-ff-printer-list + (helm-comp-read + "Printer: " helm-ff-printer-list) + printer-name)) + (lpr-switches + (if (and (stringp printer-name) + (string< "" printer-name)) + (cons (concat lpr-printer-switch " " printer-name) + lpr-switches) + lpr-switches)) + (command (helm-read-string + (format "Print *%s File(s):\n%s with: " + len + (mapconcat + (lambda (f) (format "- %s\n" f)) + file-list "")) + (when (and lpr-command lpr-switches) + (mapconcat 'identity + (cons lpr-command + (if (stringp lpr-switches) + (list lpr-switches) + lpr-switches)) + " ")))) + (file-args (mapconcat #'shell-quote-argument + file-list " ")) + (cmd-line (concat command " " file-args))) + (if command + (start-process-shell-command "helm-print" nil cmd-line) + (error "Error: Please verify your printer settings in Emacs.")))) + +(helm-make-command-from-action helm-ff-run-print-file + "Run Print file action from `helm-source-find-files'." + 'helm-ff-print) + +(defun helm-ff-checksum (file) + "Calculate the checksum of FILE. +The checksum is copied to `kill-ring'. +Checksum is calculated with the md5sum, sha1sum, sha224sum, +sha256sum, sha384sum and sha512sum when available, otherwise the +Emacs function `secure-hash' is used but it is slow and may crash +Emacs and even the whole system as it eats all memory." + (cl-assert (file-regular-p file) + nil "`%s' is not a regular file" file) + (let* ((algo (intern (helm-comp-read + "Algorithm: " + '(md5 sha1 sha224 sha256 sha384 sha512)))) + (cmd (concat (symbol-name algo) "sum")) + (bn (helm-basename file)) + proc) + (message "Calculating %s checksum for %s..." algo bn) + (if (executable-find cmd) + (progn + (set-process-filter + (setq proc (start-file-process cmd nil cmd "-b" file)) + (lambda (_process output) + (when output (kill-new output)))) + (set-process-sentinel + proc + `(lambda (_process event) + (when (string= event "finished\n") + (message "Calculating %s checksum for `%s' done and copied to kill-ring" + ,(symbol-name algo) ,bn))))) + (async-let ((sum (with-temp-buffer + (insert-file-contents-literally file) + (secure-hash algo (current-buffer))))) + (kill-new sum) + (message "Calculating %s checksum for `%s' done and copied to kill-ring" + algo bn))))) + +(defun helm-ff-toggle-basename () + (with-helm-buffer + (setq helm-ff-transformer-show-only-basename + (not helm-ff-transformer-show-only-basename)) + (let* ((cand (helm-get-selection)) + (target (if helm-ff-transformer-show-only-basename + (helm-basename cand) cand))) + (helm-force-update + (format helm-ff-last-expanded-candidate-regexp + (regexp-quote target)))))) + +(defun helm-ff-run-toggle-basename () + (interactive) + (with-helm-alive-p + (unless (helm-empty-source-p) + (helm-ff-toggle-basename)))) +(put 'helm-ff-run-toggle-basename 'helm-only t) + +(defun helm-ff-mark-similar-files-1 () + "Mark similar files. +Files are considered similar if they have the same face and same +extension." + (with-helm-window + (let* ((src (helm-get-current-source)) + (file (helm-get-selection nil 'withprop src)) + (face (get-text-property (min 2 (length file)) 'face file)) + (ext (file-name-extension file))) + (helm-map-candidates-in-source src + (lambda (_cand) (helm-make-visible-mark)) + (lambda (cand) + (and (not (helm-this-visible-mark)) + (eq (get-text-property (min 2 (length cand)) 'face cand) face) + (equal ext (file-name-extension cand))))) + (helm-mark-current-line) + (helm-display-mode-line src t) + (when helm-marked-candidates + (message "%s candidates marked" (length helm-marked-candidates)) + (set-window-margins (selected-window) 1))))) + +(defun helm-ff-mark-similar-files () + "Mark all files similar to selection." + (interactive) + (with-helm-alive-p + (let ((marked (helm-marked-candidates))) + (if (and (>= (length marked) 1) + (with-helm-window helm-visible-mark-overlays)) + (helm-unmark-all) + (helm-ff-mark-similar-files-1))))) +(put 'helm-ff-mark-similar-files 'helm-only t) + +(defun helm-reduce-file-name-1 (fname level) + ;; This is the old version of helm-reduce-file-name, we still use it + ;; with ftp fnames as expand-file-name is not working as expected + ;; with ftp fnames (emacs bug). + (cl-loop with result + with iter = (helm-iter-reduce-fname (expand-file-name fname)) + repeat level do (setq result (helm-iter-next iter)) + finally return (or result (expand-file-name "/")))) + +(defun helm-reduce-file-name-2 (fname level) + ;; This version comes from Bug#2004 (UNC paths) and should fix + ;; it. It works with local files and remote files as well but not + ;; with ftp, see helm-reduce-file-name-1. + (while (> level 0) + (unless (or (string= fname "/") + (string= (file-remote-p fname 'localname) "/")) + (setq fname (expand-file-name + (concat (expand-file-name fname) "/../")))) + (setq level (1- level))) + fname) + +(defun helm-reduce-file-name (fname level) + "Reduce FNAME by number LEVEL from end." + (if (helm-aand (file-remote-p fname 'method) + (string= it "ftp")) + (helm-reduce-file-name-1 fname level) + (helm-reduce-file-name-2 fname level))) + +(defun helm-iter-reduce-fname (fname) + "Yield FNAME reduced by one level at each call." + (let ((split (split-string fname "/" t))) + (unless (or (null split) + (string-match "\\`\\(~\\|[[:alpha:]]:\\)" (car split))) + (setq split (cons "/" split))) + (lambda () + (when (and split (cdr split)) + (cl-loop for i in (setq split (butlast split)) + concat (if (string= i "/") i (concat i "/"))))))) + +(defvar helm-find-files--level-tree nil) +(defvar helm-find-files--level-tree-iterator nil) +(defun helm-find-files-up-one-level (arg) + "Go up one level like unix command `cd ..'. +If prefix numeric arg is given go ARG level up." + (interactive "p") + (with-helm-alive-p + (helm-ff-after-persistent-show-all) + (let ((src (helm-get-current-source))) + (when (and (helm-file-completion-source-p src) + (not (helm-ff--invalid-tramp-name-p))) + (with-helm-window + (when (helm-follow-mode-p) + (helm-follow-mode -1) (message nil))) + ;; When going up one level we want to be at the line + ;; corresponding to actual directory, so store this info + ;; in `helm-ff-last-expanded'. + (let ((cur-cand (helm-get-selection nil nil src)) + (new-pattern (helm-reduce-file-name helm-pattern arg))) + ;; Ensure visibility on all candidates for preselection. + (unless (helm-empty-source-p) + ;; We may have an empty source in read-file-name when a + ;; predicate is used e.g. images and the default is a non + ;; file image. + (helm-set-attr 'candidate-number-limit + (if helm-ff-up-one-level-preselect + (max (gethash new-pattern + helm-ff--directory-files-length + helm-ff-candidate-number-limit) + helm-ff-candidate-number-limit) + helm-ff-candidate-number-limit))) + (cond ((file-directory-p helm-pattern) + (setq helm-ff-last-expanded helm-ff-default-directory)) + ((file-exists-p helm-pattern) + (setq helm-ff-last-expanded helm-pattern)) + ((and cur-cand (file-exists-p cur-cand)) + (setq helm-ff-last-expanded cur-cand))) + (unless helm-find-files--level-tree + (setq helm-find-files--level-tree + (cons helm-ff-default-directory + helm-find-files--level-tree))) + (setq helm-find-files--level-tree-iterator nil) + (push new-pattern helm-find-files--level-tree) + (setq helm-ff--show-thumbnails + (member new-pattern helm-ff--thumbnailed-directories)) + (helm-set-pattern new-pattern helm-suspend-update-flag) + (with-helm-after-update-hook (helm-ff-retrieve-last-expanded))))))) +(put 'helm-find-files-up-one-level 'helm-only t) + +(defun helm-find-files-down-last-level () + "Retrieve previous paths reached by `C-l' in helm-find-files." + (interactive) + (with-helm-alive-p + (when (and (helm-file-completion-source-p) + (not (helm-ff--invalid-tramp-name-p))) + (unless helm-find-files--level-tree-iterator + (setq helm-find-files--level-tree-iterator + (helm-iter-list (cdr helm-find-files--level-tree)))) + (setq helm-find-files--level-tree nil) + (helm-aif (helm-iter-next helm-find-files--level-tree-iterator) + (progn + (setq helm-ff--show-thumbnails + (member it helm-ff--thumbnailed-directories)) + (helm-set-pattern it)) + (setq helm-find-files--level-tree-iterator nil))))) +(put 'helm-find-files-down-last-level 'helm-only t) + +(defun helm-find-files--reset-level-tree () + (setq helm-find-files--level-tree-iterator nil + helm-find-files--level-tree nil)) + +(add-hook 'helm-cleanup-hook 'helm-find-files--reset-level-tree) +(add-hook 'post-self-insert-hook 'helm-find-files--reset-level-tree) +(add-hook 'helm-after-persistent-action-hook 'helm-find-files--reset-level-tree) + +(defun helm-ff-retrieve-last-expanded () + "Move overlay to last visited directory `helm-ff-last-expanded'. +This happen after using `helm-find-files-up-one-level', or +hitting C-j on \"..\"." + (when helm-ff-last-expanded + (let ((presel (if helm-ff-transformer-show-only-basename + (helm-basename + (directory-file-name helm-ff-last-expanded)) + (directory-file-name helm-ff-last-expanded)))) + (with-helm-window + (when (re-search-forward + (format helm-ff-last-expanded-candidate-regexp + (regexp-quote presel)) + nil t) + (forward-line 0) + (helm-mark-current-line))) + (setq helm-ff-last-expanded nil)))) + +(defun helm-ff-move-to-first-real-candidate () + "When candidate is an incomplete file name move to first real candidate." + (let* ((src (helm-get-current-source)) + (name (assoc-default 'name src)) + ;; Ensure `helm-file-completion-source-p' returns nil on + ;; `helm-read-file-name' history. + minibuffer-completing-file-name) + (helm-aif (and (helm-file-completion-source-p src) + (not (helm-empty-source-p)) + ;; Prevent dired commands moving to first real + ;; (Bug#910). + (or (memq (intern-soft name) + helm-ff-goto-first-real-dired-exceptions) + (not (string-match "\\`[Dd]ired-" name))) + helm-ff--move-to-first-real-candidate + (helm-get-selection nil nil src)) + (unless (or (not (stringp it)) + (and (string-match helm-tramp-file-name-regexp it) + (not (file-remote-p it nil t))) + (string-match helm-ff-tramp-method-regexp it) + (file-exists-p it)) + (helm-next-line))))) + +(defun helm-ff-undo () + "Undo minibuffer in `helm-find-files'. +Ensure disabling `helm-ff-auto-update-flag' before undoing." + (interactive) + (let ((old--flag helm-ff-auto-update-flag)) + (setq helm-ff-auto-update-flag nil) + (setq helm-ff--auto-update-state nil) + (unwind-protect + (progn + (undo) + (helm-check-minibuffer-input)) + (setq helm-ff-auto-update-flag old--flag) + (setq helm-ff--auto-update-state helm-ff-auto-update-flag)))) +(put 'helm-ff-undo 'helm-only t) + +;;; Auto-update - helm-find-files auto expansion of directories. +;; +;; +(defun helm-ff-update-when-only-one-matched () + "Expand to directory when sole completion. +When only one candidate is remaining and it is a directory, +expand to this directory. +This happen only when `helm-ff-auto-update-flag' is non-nil or +when `helm-pattern' is equal to \"~/\"." + (let ((src (helm-get-current-source))) + (when (and (helm-file-completion-source-p src) + (not (get-buffer-window helm-action-buffer 'visible)) + (not (helm-ff--invalid-tramp-name-p)) + (not (string-match-p "\\`[.]\\{2\\}[^/]+" + (helm-basename helm-pattern)))) + (with-helm-buffer + (let* ((history-p (string= (assoc-default 'name src) + "Read File Name History")) + (pat (helm-ff-set-pattern helm-pattern)) + ;; Try to shut up persistent tramp error with adb method when + ;; adding tilde to path. + (tramp-tolerate-tilde (equal (file-remote-p pat 'method) + tramp-adb-method)) + (completed-p (helm-aand (expand-file-name + (substitute-in-file-name pat)) + (string= (file-name-as-directory it) + helm-ff-default-directory))) + (candnum (helm-get-candidate-number)) + (lt2-p (and (<= candnum 2) + (>= (string-width (helm-basename helm-pattern)) 2))) + (cur-cand (prog2 + (unless (or completed-p + (file-exists-p pat) + history-p (null lt2-p)) + ;; Only one non--existing candidate + ;; and one directory candidate, move to it, + ;; but not when renaming, copying etc..., + ;; so for this use + ;; `helm-ff-move-to-first-real-candidate' + ;; instead of `helm-next-line' (Bug#910). + (helm-ff-move-to-first-real-candidate)) + (helm-get-selection nil nil src))) + expand-to) + (when (and (or (and helm-ff-auto-update-flag + (null helm-ff--deleting-char-backward) + ;; Bug#295 + ;; File predicates are returning t + ;; with paths like //home/foo. + ;; So check it is not the case by regexp + ;; to allow user to do C-a / to start e.g + ;; entering a tramp method e.g /sudo::. + (not (string-match "\\`//" helm-pattern)) + (not (eq last-command 'helm-yank-text-at-point))) + ;; Fix Bug#542. + (string= helm-pattern "~/") + ;; Only one remaining directory, expand it. + (and (= candnum 1) + helm-ff--auto-update-state + (file-accessible-directory-p pat) + (null helm-ff--deleting-char-backward))) + (or + ;; Only one candidate remaining + ;; and at least 2 char in basename. + lt2-p + ;; Already completed. + completed-p) + (not history-p) ; Don't try to auto complete in history. + (stringp cur-cand) + (file-accessible-directory-p cur-cand)) + (if (and (not (helm-ff-dot-file-p cur-cand)) ; [1] + ;; Maybe we are here because completed-p is true + ;; but check this again to be sure. (Windows fix) + (<= candnum 2)) ; [2] + ;; If after going to next line the candidate + ;; is not one of "." or ".." [1] + ;; and only one candidate is remaining [2], + ;; assume candidate is a new directory to expand, and do it. + (progn + (setq expand-to (file-name-as-directory + (substring-no-properties cur-cand))) + (setq helm-ff--show-thumbnails + (member expand-to helm-ff--thumbnailed-directories)) + (helm-set-pattern expand-to) + ;; Reset flags to show all when changing dir. + (helm-ff-after-persistent-show-all)) + ;; The candidate is one of "." or ".." + ;; that mean we have entered the last letter of the directory name + ;; in prompt, so expansion is already done, just add the "/" at end + ;; of name unless helm-pattern ends with "." + ;; (i.e we are writing something starting with ".") + (unless (string-match "\\`.*[.]\\{1\\}\\'" helm-pattern) + ;; Need to expand-file-name to avoid e.g /ssh:host:./ in prompt. + (setq expand-to (expand-file-name (file-name-as-directory helm-pattern))) + (setq helm-ff--show-thumbnails + (member expand-to helm-ff--thumbnailed-directories)) + (helm-set-pattern expand-to))) + ;; When typing pattern in minibuffer, helm + ;; expand very fast to a directory matching pattern and + ;; don't let undo the time to set a boundary, the result + ;; is when e.g. going to root with "//" and undoing, undo + ;; doesn't undo to previous input. One fix for this is to + ;; advice `undo-auto--boundary-ensure-timer' so that it is + ;; possible to modify its delay (use a value of 1s for + ;; helm), a second fix is to run directly here `undo-boundary' + ;; inside a timer. + (run-at-time helm-input-idle-delay nil #'undo-boundary) + (helm-check-minibuffer-input))))))) + +(cl-defun helm-ff-auto-expand-to-home-or-root (&optional (pattern helm-pattern spattern)) + "Allow expanding to $HOME or \"/\" or text yanked after pattern. + +Argument PATTERN default to `helm-pattern' and should _not_ be used for +other purpose than debugging the second cond clause of this function. +When PATTERN is specified, specific helm functions are not called to +avoid errors when called outside helm for debugging purpose." + (when (or spattern + (and (helm-file-completion-source-p) + (with-current-buffer (window-buffer (minibuffer-window)) (eolp)) + (not (string-match helm-ff-url-regexp pattern)))) + (cond ((and (not (file-remote-p pattern)) + (null (file-exists-p pattern)) + (string-match-p + "\\`\\([.]\\)\\{2\\}[^/]+" + (helm-basename pattern)) + (string-match-p "/\\'" pattern) + (null spattern)) + (helm-ff-recursive-dirs pattern) + (helm-ff--maybe-set-pattern-and-update)) + ((string-match + "\\(?:\\`~/\\)\\|/?\\$.*/\\|/\\./\\|/\\.\\./\\|/~.*/\\|//\\|\\(/[[:alpha:]]:/\\)" + pattern) + (let* ((match (match-string 0 pattern)) + (input (cond ((string= match "/./") + (expand-file-name default-directory)) + ((string= pattern "/../") "/") + ((string-match-p "\\`/\\$" match) + (let ((sub (substitute-in-file-name match))) + (if (file-directory-p sub) + sub (replace-regexp-in-string "/\\'" "" sub)))) + (t (helm-ff--expand-substitued-pattern pattern))))) + ;; `file-directory-p' returns t on "/home/me/." (Bug#1844). + (if (and (file-directory-p input) + (not (string-match-p "[^.]\\.\\'" input))) + (progn + (setq helm-ff-default-directory + (setq input (file-name-as-directory input))) + ;; When changing directory ensure to show all. + (helm-ff-after-persistent-show-all)) + (setq helm-ff-default-directory (file-name-as-directory + (file-name-directory input)))) + (if spattern input (helm-ff--maybe-set-pattern-and-update input)))) + ((and (string-match "\\`/\\(-\\):.*" pattern) (null spattern)) + (helm-ff--maybe-set-pattern-and-update + (replace-match tramp-default-method t t pattern 1)))))) + +(defun helm-ff--maybe-set-pattern-and-update (&optional str) + (with-helm-window + (when str (helm-set-pattern str)) + (helm-check-minibuffer-input))) + +(defun helm-ff--expand-file-name-no-dot (name &optional directory) + "Prevent expanding \"/home/user/.\" to \"/home/user\"." + ;; Bug#1844 - If user enter "~/." to type an hidden filename + ;; don't expand to /home/him e.g. + ;; (expand-file-name "~/.") =>"/home/thierry" + ;; (helm-ff--expand-substitued-pattern "~/.") =>"/home/thierry/." + (concat (expand-file-name name directory) + (and (string-match "[^.]\\.\\'" name) "/."))) + +(defun helm-ff--expand-substitued-pattern (pattern) + ;; [Windows] On UNC paths "/" expand to current machine, + ;; so use the root of current Drive. (i.e "C:/") + (let* ((directory (and (memq system-type '(windows-nt ms-dos)) + (getenv "SystemDrive"))) + (subst (helm-substitute-in-filename pattern)) + ;; On Windows use a simple call to `expand-file-name' to + ;; avoid Bug#2004. + (expand-fn (if directory + #'expand-file-name + #'helm-ff--expand-file-name-no-dot))) + ;; Fix Bug#2223 with tilde in directory names e.g. "~/tmp/~test/". + (funcall expand-fn (if (string-match-p "\\`~[^/]" subst) + pattern subst) + ;; directory is nil on Nix. + directory))) + +(defun helm-substitute-in-filename (fname) + "Substitute all parts of FNAME from start up to \"~/\" or \"/\". +On windows system substitute from start up to \"/[[:lower:]]:/\". +This function is needed for `helm-ff-auto-expand-to-home-or-root' +and should be used carefully elsewhere, or not at all, using +`substitute-in-file-name' instead." + (cond ((and helm--url-regexp + (string-match-p helm--url-regexp fname)) + fname) + ((and (file-remote-p fname) + helm-substitute-in-filename-stay-on-remote) + (let ((sub (substitute-in-file-name fname))) + (if (file-directory-p sub) + sub (replace-regexp-in-string "/\\'" "" sub)))) + (t + (with-temp-buffer + (insert fname) + (goto-char (point-min)) + (when (memq system-type '(windows-nt ms-dos)) + (skip-chars-forward "/")) ;; Avoid infloop in UNC paths Bug#424 + (if (re-search-forward "~.*/?\\|//\\|/[[:alpha:]]:/" nil t) + (let ((match (match-string 0))) + (goto-char (if (or (string= match "//") + (string-match-p "/[[:alpha:]]:/" match)) + (1+ (match-beginning 0)) + (match-beginning 0))) + (buffer-substring-no-properties (point) (pos-eol))) + fname))))) + +(defun helm-point-file-in-dired (file) + "Put point on filename FILE in dired buffer." + (unless (and helm--url-regexp + (string-match-p helm--url-regexp file)) + (let ((target (expand-file-name (helm-substitute-in-filename file)))) + (dired (file-name-directory target)) + (dired-goto-file target)))) + +(defun helm-marked-files-in-dired (_candidate) + "Open a dired buffer with only marked files. + +With a prefix arg toggle dired buffer to wdired mode. + +Note: This function works only in Emacs-29+ because Wdired doesn't support +editing absolute fnames in previous Emacs versions." + (let* ((marked (helm-marked-candidates :with-wildcard t)) + (current (car marked))) + (unless (and helm--url-regexp + (string-match-p helm--url-regexp current)) + (let ((target (expand-file-name (helm-substitute-in-filename current)))) + (dired (cons helm-ff-default-directory marked)) + (dired-goto-file target) + (when (or helm-current-prefix-arg current-prefix-arg) + (call-interactively 'wdired-change-to-wdired-mode)))))) + +(defun helm-ff-wfnames (_candidate) + "Edit marked fnames with `Wfnames' package." + (cl-assert (require 'wfnames nil t) nil "Wfnames package not found") + (let ((marked (helm-marked-candidates :with-wildcard t))) + (wfnames-setup-buffer + marked #'switch-to-buffer (buffer-live-p (get-buffer wfnames-buffer))))) + +(defun helm-ff-edit-marked-files (candidate) + "Edit marked files with `helm-ff-edit-marked-files-fn' fn." + (funcall helm-ff-edit-marked-files-fn candidate)) + +(helm-make-command-from-action helm-ff-run-edit-marked-files + "Execute `helm-ff-edit-marked-files' interactively." + 'helm-ff-edit-marked-files) + +(defun helm-ff--create-tramp-name (fname) + "Build filename from `helm-pattern' like /su:: or /sudo::." + ;; `tramp-make-tramp-file-name' takes 7 args on emacs-26 whereas it + ;; takes only 5 args in emacs-24/25. + (apply #'tramp-make-tramp-file-name + ;; `tramp-dissect-file-name' returns a list in emacs-26 + ;; whereas in 24.5 it returns a vector, thus the car is a + ;; symbol (`tramp-file-name') which is not needed as argument + ;; for `tramp-make-tramp-file-name' so transform the cdr in + ;; vector, and for 24.5 use directly the returned value. + (cl-loop with v = (helm-ff--tramp-cons-or-vector + (tramp-dissect-file-name fname)) + for i across v collect i))) + +(defun helm-ff--tramp-cons-or-vector (vector-or-cons) + "Return VECTOR-OR-CONS as a vector." + (helm-acase vector-or-cons + ((guard (and (consp it) (cdr it))) (vconcat guard)) + ((guard (vectorp it)) it) + (t (error "Wrong type argument: %s" it)))) + +(defun helm-ff--get-tramp-methods () + "Return a list of the car of `tramp-methods'." + (or helm-ff--tramp-methods + (setq helm-ff--tramp-methods (mapcar 'car tramp-methods)))) + +(defun helm-ff--previous-mh-tramp-method (str) + (save-match-data + (with-temp-buffer + (insert str) + (when (re-search-backward + (concat "\\([|]\\)\\(" + (mapconcat 'identity (helm-ff--get-tramp-methods) "\\|") + "\\):") + nil t) + (list + (buffer-substring-no-properties (pos-bol) (match-beginning 2)) + (buffer-substring-no-properties (match-beginning 2) (match-end 2))))))) + +(defun helm-ff--get-host-from-tramp-invalid-fname (fname) + "Extract hostname from an incomplete tramp file name. +Return nil on valid file name remote or not." + ;; Check first if whole file is remote (file-remote-p is inefficient + ;; in this case) otherwise we are matching e.g. /home/you/ssh:foo/ + ;; which is not a remote name. + ;; FIXME this will not work with a directory or a file named like + ;; "ssh:foo" and located at root (/) but it seems there is no real + ;; solution apart disabling tramp-mode when a file/dir located at / + ;; is matching helm-tramp-file-name-regexp; This would prevent usage + ;; of tramp if one have such a directory at / (who would want to + ;; have such a dir at / ???) See emacs-bug#31489. + (when (string-match-p helm-tramp-file-name-regexp fname) + (let* ((bn (helm-basename fname)) + (bd (replace-regexp-in-string (regexp-quote bn) "" fname)) + (split (split-string bn ":" t)) + (meth (car (member (car split) + (helm-ff--get-tramp-methods))))) + (and meth (string= bd "/") (car (last split)))))) + +(cl-defun helm-ff--tramp-hostnames (&optional (pattern helm-pattern)) + "Get a list of hosts for tramp method found in `helm-pattern'. +Argument PATTERN default to `helm-pattern'. It is here only for +debugging purpose." + (when (string-match helm-tramp-file-name-regexp pattern) + (let* ((mh-method (helm-ff--previous-mh-tramp-method pattern)) + (method (or (cadr mh-method) (match-string 1 pattern)))) + (cl-loop with all-methods = (helm-ff--get-tramp-methods) + for (f . h) in (tramp-get-completion-function method) + append (cl-loop for e in (funcall f (car h)) + for host = (and (consp e) (cadr e)) + ;; On emacs-27 host may be + ;; ("root" t) in sudo method. + when (and (stringp host) + (not (member host all-methods))) + collect (helm-ff-filter-candidate-one-by-one + (concat (or (car mh-method) "/") + method ":" host))) + into comps + finally return + (helm-fast-remove-dups comps :test 'equal))))) + +(defun helm-ff-before-action-hook-fn () + "Exit Helm when user try to execute action on an invalid tramp fname." + (let* ((src (helm-get-current-source)) + (cand (helm-get-selection nil nil src))) + (when (and (helm-file-completion-source-p src) + (stringp cand) + (helm-ff--invalid-tramp-name-p cand) ; Check candidate. + (helm-ff--invalid-tramp-name-p)) ; check helm-pattern. + (error "Error: Unknown file or directory `%s'" cand)))) +(add-hook 'helm-before-action-hook 'helm-ff-before-action-hook-fn) + +(cl-defun helm-ff--invalid-tramp-name-p (&optional (pattern helm-pattern)) + "Return non-nil when PATTERN is an invalid tramp filename." + (or (string= (helm-ff-set-pattern pattern) + "@@TRAMP@@") + ;; Tramp methods completion. + (string-match helm-ff-tramp-method-regexp pattern))) + +(defun helm-ff--tramp-postfixed-p (str) + "Return non nil when tramp path STR is complete." + ;; E.g.: + ;; (helm-ff--tramp-postfixed-p "/ssh:foo") + ;; => nil + ;; (helm-ff--tramp-postfixed-p "/ssh:foo:") + ;; => 10 + ;; (helm-ff--tramp-postfixed-p "/ssh:foo|sudo:") + ;; => nil + ;; (helm-ff--tramp-postfixed-p "/ssh:foo|sudo::") + ;; => 16 + (let ((methods (helm-ff--get-tramp-methods)) + result) + (save-match-data + (with-temp-buffer + (save-excursion (insert str)) + (helm-awhile (search-forward ":" nil t) + (if (save-excursion + (forward-char -1) + (or (looking-back "[/|]" (1- (point))) + (looking-back + (mapconcat (lambda (m) (format "[/|]%s" m)) methods "\\|") + (pos-bol)))) + (setq result nil) + (setq result it))))) + result)) + +(defun helm-ff--tramp-multihops-p (name) + (cl-loop for m in (helm-ff--get-tramp-methods) + thereis (string-match (format "\\`\\(/%s:.*[|]\\).*" m) name))) + +(defun helm-ff-complete-tramp-methods () + "Completion on tramp methods in a nested helm session." + (interactive) + (with-helm-alive-p + (let* (initial-input + (str helm-pattern) + (pattern (with-temp-buffer + (insert str) + (let ((end (point)) beg) + (when (re-search-backward "[/|]" nil t) + (setq beg (1+ (point))) + (unless (= beg end) + (setq initial-input + (buffer-substring beg end)) + (delete-region beg end)) + (buffer-string))))) + (collection (helm-ff--get-tramp-methods)) + (method (helm-comp-read + "Tramp methods: " + (sort collection #'string<) + :initial-input initial-input + :fc-transformer + (lambda (candidates _source) + (cl-loop for c in candidates + collect (propertize c 'face 'helm-ff-file))) + :allow-nest t + :must-match t))) + (helm-set-pattern (concat pattern method ":"))))) +(put 'helm-ff-complete-tramp-methods 'no-helm-mx t) + +(defun helm-ff-set-pattern (pattern) + "Handle tramp filenames in `helm-pattern'." + (let* ((methods (helm-ff--get-tramp-methods)) + ;; Returns the position of last ":" entered. + (postfixed (helm-ff--tramp-postfixed-p pattern)) + (reg "\\`/\\([^[/:]+\\|[^/]+]\\):.*:") + cur-method tramp-name) + (when (string-match "\\`/\\(-\\):" pattern) + (setq pattern (replace-match tramp-default-method t t pattern 1))) + ;; In some rare cases tramp can return a nil input, + ;; so be sure pattern is a string for safety (Bug#476). + (unless pattern (setq pattern "")) + (cond ((string-match helm-ff-url-regexp pattern) pattern) + ((string-match "\\`\\$" pattern) + (substitute-in-file-name pattern)) + ((string= pattern "") "") + ((string-match "\\`[.]\\{1,2\\}/\\'" pattern) + (expand-file-name pattern)) + ;; Directories ending by a dot (Bug#1940) + ((string-match "[^/][.]/\\'" pattern) + (expand-file-name pattern)) + ((string-match ".*\\(~?/?[.]\\{1\\}/\\)\\'" pattern) + (expand-file-name default-directory)) + ((string-match ".*\\(~//\\|//\\)\\'" pattern) + (expand-file-name "/")) ; Expand to "/" or "c:/" + ((string-match "\\`\\(~/\\|.*/~/\\)\\'" pattern) + (expand-file-name "~/")) + ((string-match "\\`~/" pattern) + (expand-file-name pattern)) + ((string-match helm-ff-tramp-method-regexp pattern) + pattern) + ;; Match "/method:maybe_hostname:~" + ((and (string-match (concat reg "~") pattern) + postfixed + (setq cur-method (match-string 1 pattern)) + (member cur-method methods)) + (setq tramp-name (expand-file-name + (helm-ff--create-tramp-name + (match-string 0 pattern)))) + (replace-match tramp-name nil t pattern)) + ;; Match "/method:maybe_hostname:" + ((and (string-match reg pattern) + postfixed + (setq cur-method (match-string 1 pattern)) + (member cur-method methods)) + (setq tramp-name (helm-ff--create-tramp-name + (match-string 0 pattern))) + (replace-match tramp-name nil t pattern)) + ;; Match "/hostname:" + ((and (string-match helm-tramp-file-name-regexp pattern) + postfixed + (setq cur-method (match-string 1 pattern)) + (and cur-method (not (member cur-method methods)))) + (setq tramp-name (helm-ff--create-tramp-name + (match-string 0 pattern))) + (replace-match tramp-name nil t pattern)) + ;; Match "/method:" in this case don't try to connect. + ((and (null postfixed) + (string-match helm-tramp-file-name-regexp pattern) + (member (match-string 1 pattern) methods)) + ;; A flag to notify tramp name is incomplete. + "@@TRAMP@@") + ;; Return PATTERN unchanged. + (t pattern)))) + +(defun helm-find-files-get-candidates (&optional require-match) + "Create candidate list for `helm-source-find-files'." + (let* ((path (helm-ff-set-pattern helm-pattern)) + (dir-p (file-accessible-directory-p path)) + basedir + invalid-basedir + non-essential + (tramp-verbose helm-tramp-verbose)) ; No tramp message when 0. + ;; Tramp check if path is valid without waiting a valid + ;; connection and may send a file-error. + (setq helm--ignore-errors (file-remote-p path)) + (set-text-properties 0 (length path) nil path) + ;; Bug#118 allow creation of newdir+newfile. + (unless (or + ;; A tramp file name not completed. + (string= path "@@TRAMP@@") + ;; An empty pattern + (string= path "") + (and (string-match-p ":\\'" path) + (helm-ff--tramp-postfixed-p path)) + ;; Check if base directory of PATH is valid. + (helm-aif (file-name-directory path) + ;; If PATH is a valid directory IT=PATH, + ;; else IT=basedir of PATH. + (file-directory-p it))) + ;; BASEDIR is invalid, that's mean user is starting + ;; to write a non--existing path in minibuffer + ;; probably to create a 'new_dir' or a 'new_dir+new_file'. + (setq invalid-basedir t)) + ;; Don't set now `helm-pattern' if `path' == "@@TRAMP@@" + ;; like that the actual value (e.g /ssh:) is passed to + ;; `helm-ff--tramp-hostnames'. + (unless (or (string= path "@@TRAMP@@") + invalid-basedir) ; Leave helm-pattern unchanged. + (setq helm-ff-auto-update-flag ; [1] + ;; Unless auto update is disabled start auto updating only + ;; at third char. + (unless (or (null helm-ff--auto-update-state) + ;; But don't enable auto update when + ;; deleting backward. + helm-ff--deleting-char-backward + (and dir-p (not (string-match-p "/\\'" path)))) + (or (>= (length (helm-basename path)) 3) dir-p))) + ;; At this point the tramp connection is triggered. + (helm-log + "helm-find-files-get-candidates" + "Pattern=%S" + (setq helm-pattern (if (string-match helm-ff-tramp-method-regexp path) + ;; A tramp method, don't modify pattern. + helm-pattern + (helm-ff--transform-pattern-for-completion path)))) + ;; This have to be set after [1] to allow deleting char backward. + (setq basedir (or (helm-aand + (if (and dir-p helm-ff-auto-update-flag) + ;; Add the final "/" to path + ;; when `helm-ff-auto-update-flag' is enabled. + (file-name-as-directory path) + (if (string= path "") + "/" (file-name-directory path))) + (expand-file-name it)) + default-directory)) + (setq helm-ff-default-directory + (if (string= helm-pattern "") + (expand-file-name "/") ; Expand to "/" or "c:/" + ;; If path is an url *default-directory have to be nil. + (unless (or (string-match helm-ff-url-regexp path) + (and helm--url-regexp + (string-match helm--url-regexp path))) + basedir)))) + (when (and (string-match ":\\'" path) + (file-remote-p basedir nil t)) + (setq helm-pattern basedir)) + (cond ((string-match helm-ff-tramp-method-regexp path) ; Tramp methods + (mapcar (lambda (method) + (helm-ff-filter-candidate-one-by-one + (concat "/" ":" method))) + (helm-ff--get-tramp-methods))) + ((string= path "@@TRAMP@@") + (helm-ff--tramp-hostnames)) ; Hostnames completion. + ((or (and (file-regular-p path) + (eq last-repeatable-command 'helm-execute-persistent-action)) + ;; `ffap-url-regexp' don't match until url is complete. + (string-match helm-ff-url-regexp path) + invalid-basedir + (and (not (file-exists-p path)) (string-match "/$" path)) + (and helm--url-regexp (string-match helm--url-regexp path))) + ;; Do NOT filter boring files here (Bug#2330). + (list (helm-ff-filter-candidate-one-by-one path nil t))) + ((string= path "") (helm-ff-directory-files "/")) + ;; Check here if directory is accessible (not working on Windows). + ((and (file-directory-p path) (not (file-readable-p path))) + ;; Prefix error message with @@@@ for safety + ;; (some files may match file-error See bug#2400) + (list (cons (format "@@@@file-error: Opening directory permission denied `%s'" path) + path))) + ;; A fast expansion of PATH is made only if `helm-ff-auto-update-flag' + ;; is enabled. + ((and dir-p helm-ff-auto-update-flag) + (helm-ff-directory-files path)) + (t (append (unless (or (eq require-match t) + ;; Check here if path is an existing + ;; file before adding it to + ;; candidates, it was previously done + ;; in the sort function but this + ;; create a bug with remote files + ;; when path is at the same time a + ;; pattern matching a candidate and a + ;; real candidate e.g. ack and + ;; ack-grep in /usr/bin. This is due + ;; presumably to a latency more + ;; important with remote files which + ;; lead to a confusion with the + ;; pattern matching one candidate and + ;; the real candidate which is same + ;; as pattern. + (file-exists-p path) + ;; When `helm-ff-auto-update-flag' has been + ;; disabled, whe don't want PATH to be added on top + ;; if it is a directory. + dir-p) + ;; Do NOT filter boring files here (Bug#2330). + (list (helm-ff-filter-candidate-one-by-one path nil t))) + (helm-ff-directory-files basedir)))))) + +(defun helm-list-directory (directory &optional sel) + "List directory DIRECTORY. + +If DIRECTORY is remote use `helm-list-directory-function', +otherwise use `directory-files'. +SEL argument is only here for debugging purpose, it default to +`helm-get-selection'." + (let* ((remote (file-remote-p directory 'method)) + (helm-list-directory-function + (cond ((and remote (string= remote "ftp")) + #'helm-list-dir-lisp) + ((and remote (string= remote "adb")) + #'helm-list-dir-adb) + (t helm-list-directory-function))) + (remote-fn-p (eq helm-list-directory-function + 'helm-list-dir-external)) + (sort-method (cl-case helm-ff-initial-sort-method + (newest (if (and remote remote-fn-p) + "-t" #'file-newer-than-file-p)) + (size (if (and remote remote-fn-p) + "-S" #'helm-ff-file-larger-that-file-p)) + (ext (unless (and remote remote-fn-p) + #'helm-group-candidates-by)) + (t nil)))) + (cond (remote + (ignore-errors + (funcall helm-list-directory-function directory sort-method))) + ((memq helm-ff-initial-sort-method '(newest size)) + (sort (directory-files + directory t directory-files-no-dot-files-regexp) + sort-method)) + ((eq helm-ff-initial-sort-method 'ext) + (funcall sort-method + (directory-files + directory t directory-files-no-dot-files-regexp) + #'file-name-extension + (or sel (helm-get-selection) ""))) + (t (directory-files + directory t directory-files-no-dot-files-regexp))))) + +(defsubst helm-ff-file-larger-that-file-p (f1 f2) + (let ((attr1 (file-attributes f1)) + (attr2 (file-attributes f2))) + (> (nth 7 attr1) (nth 7 attr2)))) + +(defun helm-list-dir-lisp (directory &optional sort-method) + "List DIRECTORY with `file-name-all-completions' as backend. + +Add a `helm-ff-dir' property on each fname ending with \"/\"." + ;; NOTE: `file-name-all-completions' and `directory-files' and most + ;; tramp file handlers don't handle cntrl characters in fnames, so + ;; the displayed files will be plain wrong in this case, even worst + ;; the filenames will be splitted in two or more filenames. + (cl-loop for f in (sort (file-name-all-completions "" directory) + (or sort-method 'string-lessp)) + unless (or (string= f "") + (member f '("./" "../" "." ".."))) + if (and (helm--dir-name-p f) + (helm--dir-file-name f directory)) + collect (propertize it 'helm-ff-dir t) + else collect (propertize (expand-file-name f directory) + 'helm-ff-file t))) + +(defun helm-file-name-all-completions-internal (directory) + (let ((switches "-1F")) + (with-temp-buffer + (insert-directory (format "%s*" + (file-name-as-directory directory)) + switches t) + (split-string + (buffer-substring-no-properties (point-min) (point-max)) + "\n" t)))) + +(defun helm-list-dir-adb (directory &optional sort-method) + "List DIRECTORY with `helm-file-name-all-completions-internal' as backend. + +This is used for tramp adb backend. + +Add a `helm-ff-dir' property on each fname ending with \"/\"." + (cl-loop with files = (helm-file-name-all-completions-internal directory) + for f in (sort files (or sort-method 'string-lessp)) + for split = (split-string f "->" t) + for fname = (replace-regexp-in-string " $" "" (car split)) + for truename = (cadr split) + collect (cond ((string-match "/\\'" fname) + (propertize (helm--dir-file-name fname directory) + 'helm-ff-dir t)) + (truename + (propertize (expand-file-name + (substring fname 0 (1- (length fname))) + directory) + 'helm-ff-sym truename)) + (t (propertize (expand-file-name fname directory) + 'helm-ff-file t))))) + +(defun helm-list-dir-external (dir &optional sort-method) + "List directory DIR with external shell command as backend. + +This function is fast enough to be used for remote files and save +the type of files at the same time in a property for using it +later in the transformer." + (let ((default-directory (file-name-as-directory + (expand-file-name dir)))) + (with-temp-buffer + (when (eq (process-file-shell-command + (format + ;; -A remove dot files, -F append [*=@|/>] at eof + ;; and -Q quote the real filename. If not using -Q, + ;; there is no way to distinguish if foo* is a real + ;; file or if it is foo the executable file so with + ;; -Q we have "foo"* for the executable file foo and + ;; "foo*" for the real file foo. The downside is + ;; that we need an extra step to remove the quotes + ;; at the end which impact performances. + "ls -A -1 -F -b -Q %s | awk -v dir=%s '{print dir $0}'" + (or sort-method "") + (shell-quote-argument default-directory)) + nil t nil) + 0) + (goto-char (point-min)) + (save-excursion + (while (re-search-forward "[*=@|/>]$" nil t) + ;; A line looks like /home/you/"foo"@ + (helm-acase (match-string 0) + ("*" (replace-match "") + (put-text-property + (pos-bol) (pos-eol) 'helm-ff-exe t)) + ("@" (replace-match "") + (put-text-property + (pos-bol) (pos-eol) 'helm-ff-sym t)) + ("/" (replace-match "") + (put-text-property + (pos-bol) (pos-eol) 'helm-ff-dir t)) + (("=" "|" ">") (replace-match ""))))) + (while (re-search-forward "[\"]" nil t) + (replace-match "")) + (add-text-properties (point-min) (point-max) '(helm-ff-file t)) + (split-string (buffer-string) "\n" t))))) + +;; This is to fix issue with file-notify.el no more following symlinks +;; on emacs-29 (regression) with inotify backend at least. Also it +;; seems inotify is not configured to follow symlinks on other systems +;; (MacOS) so this should fix as well this issue on such systems see +;; bug#2542. +;; Store here associations of (truename . symlink) when opening a +;; symlinked directory, then add the watch to the truename; When the +;; watcher ring on the truename remove the symlinked directory from cache. +(defvar helm-ff--list-directory-links nil) + +(defun helm-ff-directory-files (directory &optional force-update) + "List contents of DIRECTORY. +Argument FULL mean absolute path. +It is same as `directory-files' but always returns the dotted +filename \\='.' and \\='..' even on root directories in Windows +systems. +When FORCE-UPDATE is non nil recompute candidates even if DIRECTORY is +in cache." + (let* ((method (file-remote-p directory 'method)) + (dfn (directory-file-name directory)) + (truename (and (file-symlink-p dfn) (file-truename dfn)))) + (setq directory (file-name-as-directory + (expand-file-name directory))) + (when truename + (cl-pushnew (cons truename directory) + helm-ff--list-directory-links :test 'equal)) + (or (and (not force-update) + (gethash directory helm-ff--list-directory-cache)) + (let* (file-error + (ls (condition-case err + (helm-list-directory directory) + ;; Handle file-error from here for Windows + ;; because predicates like `file-readable-p' and friends + ;; seem broken on emacs for Windows systems (always returns t). + ;; This should never be called on GNU/Linux/Unix + ;; as the error is properly intercepted in + ;; `helm-find-files-get-candidates' by `file-readable-p'. + (file-error + (prog1 + ;; Prefix error message with @@@@ for safety + ;; (some files may match file-error See bug#2400) + (list (format "@@@@%s:%s" + (car err) + (mapconcat 'identity (cdr err) " "))) + (setq file-error t))))) + (dot (concat directory ".")) + (dot2 (concat directory "..")) + (candidates (append (and (not file-error) (list dot dot2)) ls)) + watcher) + (puthash directory (+ (length ls) 2) helm-ff--directory-files-length) + (prog1 + (puthash directory + (cl-loop for f in candidates + when (helm-ff-filter-candidate-one-by-one f) + collect it) + helm-ff--list-directory-cache) + ;; Put an inotify watcher to check directory modifications. + (unless (or (null helm-ff-use-notify) + (member method helm-ff-inotify-unsupported-methods) + (helm-aand (setq watcher (gethash + directory + helm-ff--file-notify-watchers)) + ;; [1] If watcher is invalid enter + ;; next and delete it. + (file-notify-valid-p it))) + (condition-case-unless-debug err + (let ((to-watch (or truename directory))) + (when watcher + ;; If watcher is still in cache and we are here, + ;; that's mean test [1] above fails and watcher + ;; is invalid, so delete it. + (file-notify-rm-watch watcher) + (remhash directory helm-ff--file-notify-watchers)) + ;; Keep adding DIRECTORY to + ;; helm-ff--file-notify-watchers but watch on the + ;; truename and not the symlink as before bug#2542. + (puthash directory + (file-notify-add-watch + to-watch + '(change attribute-change) + (helm-ff--inotify-make-callback to-watch)) + helm-ff--file-notify-watchers)) + (file-notify-error (user-error "Error: %S %S" (car err) (cdr err)))))))))) + +(defun helm-ff--inotify-make-callback (directory) + "Return a callback for `file-notify-add-watch'." + (lambda (event) + (let ((desc (cadr event)) + (target directory)) ; Either truename or directory. + (helm-log "Inotify callback" "Event %S called on %S" event directory) + ;; `attribute-changed' means permissions have changed, not + ;; file modifications like file changes, visit + ;; etc... AFAIU the desc for this is `changed' and for our + ;; use case we don't care of this. Elemnts of + ;; `helm-ff--list-directory-links' are of the form + ;; (truename . visited-symlink-directory) + (when (memq desc '(created deleted renamed attribute-changed)) + ;; Watched directory is the truename which is not in the + ;; cache, so remove its associated directory (the symlink) + ;; from the cache bug#2542. + (helm-aif (assoc directory helm-ff--list-directory-links) + (progn + (setq target (cdr it)) + (setq helm-ff--list-directory-links + (delete it helm-ff--list-directory-links)))) + ;; When TARGET is modified remove it from cache. + (helm-log "Inotify callback" + "Removing %S from `helm-ff--list-directory-cache'" target) + (remhash target helm-ff--list-directory-cache))))) + +(defun helm-ff-tramp-cleanup-hook (vec) + "Remove remote directories related to VEC in helm-ff* caches. +Remove as well all related file-notify watchers. + +This is meant to run in `tramp-cleanup-connection-hook'." + (cl-loop for key being the hash-keys in helm-ff--list-directory-cache + when (equal (file-remote-p key 'method) (cadr vec)) + do (remhash key helm-ff--list-directory-cache)) + (cl-loop for key being the hash-keys in helm-ff--file-notify-watchers + when (equal (file-remote-p key 'method) (cadr vec)) + do (progn + (file-notify-rm-watch + (gethash key helm-ff--file-notify-watchers)) + (remhash key helm-ff--file-notify-watchers)))) +(add-hook 'tramp-cleanup-connection-hook #'helm-ff-tramp-cleanup-hook) + +(defun helm-ff-handle-backslash (fname) + ;; Allow creation of filenames containing a backslash. + (cl-loop with bad = '((92 . "")) + for i across fname + if (assq i bad) concat (cdr it) + else concat (string i))) + +(defun helm-ff-fuzzy-matching-p () + (and helm-ff-fuzzy-matching + (not (memq helm-mm-matching-method '(multi1 multi3p))))) + +(defun helm-ff--transform-pattern-for-completion (pattern) + "Maybe return PATTERN with it's basename modified as a regexp. +This happens only when `helm-ff-fuzzy-matching' is enabled. +This provides a similar behavior as `ido-enable-flex-matching'. +See also `helm--mapconcat-pattern'. +If PATTERN is an url return it unmodified. +When PATTERN contains a space fallback to multi-match. +If basename contains one or more space fallback to multi-match. +If PATTERN is a valid directory name, return PATTERN unchanged." + ;; handle bad filenames containing a backslash (no more needed in + ;; emacs-26, also prevent regexp matching with e.g. "\|"). + ;; (setq pattern (helm-ff-handle-backslash pattern)) + (let ((bn (helm-basename pattern)) + (bd (or (helm-basedir pattern) "")) + ;; Trigger tramp connection with file-directory-p. + (dir-p (file-directory-p pattern)) + (tramp-p (cl-loop for (m . f) in tramp-methods + thereis (string-match m pattern)))) + ;; Always regexp-quote base directory name to handle + ;; crap dirnames such e.g bookmark+ + (cond + ((or (and dir-p tramp-p (string-match ":\\'" pattern)) + (string= pattern "") + (and dir-p (<= (length bn) 2)) + ;; Fix Bug#541 when BD have a subdir similar + ;; to BN, don't switch to match plugin + ;; which will match both. + (and dir-p (string-match (regexp-quote bn) bd))) + ;; Use full PATTERN on e.g "/ssh:host:". + (regexp-quote pattern)) + ;; Prefixing BN with a space call multi-match completion. + ;; This allow showing all files/dirs matching BN (Bug#518). + ;; FIXME: some multi-match methods may not work here. + (dir-p (concat (regexp-quote bd) " " (regexp-quote bn))) + ((or (not (helm-ff-fuzzy-matching-p)) + (string-match "[ !]" bn)) ; Fall back to multi-match. + (concat (regexp-quote bd) " " bn)) + ((or (string-match "[*][.]?.*" bn) ; Allow entering wildcard. + (string-match "/\\'" pattern) ; Allow mkdir. + (string-match helm-ff-url-regexp pattern) + (and (string= helm-ff-default-directory "/") tramp-p)) + ;; Don't treat wildcards ("*") as regexp char. + ;; (e.g ./foo/*.el => ./foo/\\*\\.el) or ./foo/*.[ch] => + ;; ./foo/\\*\\.\\[ch] + (concat (regexp-quote bd) + ;; We were previously using + ;; (replace-regexp-in-string "[*]" "[*]" bn) but this + ;; doesn't handle wilcards like *.[ch], so regexp-quote + ;; bn as well. + (regexp-quote bn))) + (t (concat (regexp-quote bd) + (if (>= (length bn) 2) ; wait 2nd char before concating. + (helm--mapconcat-pattern bn) + (concat ".*" (regexp-quote bn)))))))) + +(defalias 'helm-dir-is-dot 'helm-ff-dot-file-p) +(make-obsolete 'helm-dir-is-dot 'helm-ff-dot-file-p "3.8.8") + +(defun helm-ff-save-history () + "Store the last value of `helm-ff-default-directory' in `helm-ff-history'. +Note that only existing directories are saved here." + (when (and helm-ff-default-directory + (helm-file-completion-source-p) + (file-directory-p helm-ff-default-directory)) + (set-text-properties 0 (length helm-ff-default-directory) + nil helm-ff-default-directory) + (push helm-ff-default-directory helm-ff-history))) +(add-hook 'helm-cleanup-hook 'helm-ff-save-history) + +(defun helm-ff-valid-symlink-p (file &optional link) + "Returns the truename of FILE if it exists. +If we already know the truename of FILE we can pass it with LINK arg +to avoid an unnecessary call to `file-truename'." + (helm-aif (condition-case-unless-debug nil + ;; `file-truename' send error + ;; on cyclic symlinks (Bug#692). + (or link (file-truename file)) + (error nil)) + (and (file-exists-p it) it))) + +(defun helm-get-default-mode-for-file (filename) + "Return the default mode to open FILENAME." + (let ((mode (cl-loop for (r . m) in auto-mode-alist + thereis (and (string-match r filename) m)))) + (or (and (symbolp mode) mode) "Fundamental"))) + +(defun helm-ff-properties (candidate) + "Show file properties of CANDIDATE in a tooltip or message." + (require 'helm-external) ; For `helm-get-default-program-for-file'. + (helm-aif (helm-file-attributes candidate) + (let* ((dired-line (helm-file-attributes-dired-line it t)) + (type (cl-getf it :type)) + (mode-type (cl-getf it :mode-type)) + (owner (cl-getf it :uid)) + (owner-right (cl-getf it :user t)) + (group (cl-getf it :gid)) + (group-right (cl-getf it :group)) + (other-right (cl-getf it :other)) + (octal (cl-getf it :octal)) + (trash (and (helm-ff-trash-file-p candidate) + (helm-ff--get-dest-file-from-trash + (helm-ff-trash-list) + (replace-regexp-in-string + "\\.trashinfo\\'" "" candidate)))) + (size (helm-file-human-size (cl-getf it :size))) + (modif (cl-getf it :modif-time)) + (access (cl-getf it :access-time)) + (ext (helm-get-default-program-for-file candidate)) + (tooltip-hide-delay (or helm-tooltip-hide-delay tooltip-hide-delay))) + (if (and (display-graphic-p) tooltip-mode) + (tooltip-show + (concat + (helm-basename candidate) "\n" + dired-line "\n" + (format "Mode: %s\n" (helm-get-default-mode-for-file candidate)) + (format "Ext prog: %s\n" (or (and ext (replace-regexp-in-string + " %s" "" ext)) + "Not defined")) + (format "Type: %s: %s\n" type mode-type) + (when (string= type "symlink") + (format "True name: '%s'\n" + (cond ((string-match "^\\.#" (helm-basename candidate)) + "Autosave symlink") + ((helm-ff-valid-symlink-p candidate)) + (t "Invalid Symlink")))) + (format "Owner: %s: %s\n" owner owner-right) + (format "Group: %s: %s\n" group group-right) + (format "Others: %s\n" other-right) + (format "NumMode: %s\n" octal) + (format "Size: %s\n" size) + (when (string= type "directory") + (format "Size used in directory: %s\n" + (helm-directory-size + candidate current-prefix-arg t))) + (format "Modified: %s\n" modif) + (format "Accessed: %s\n" access) + (and (stringp trash) + (format "Trash: %s\n" + (abbreviate-file-name trash))))) + (message dired-line) (sit-for 5))) + (message "Permission denied, file not readable"))) + +(helm-make-persistent-command-from-action helm-ff-properties-persistent + "Show properties without quitting helm." + 'properties-action 'helm-ff-properties) + +(helm-make-persistent-command-from-action helm-ff-persistent-delete + "Delete current candidate without quitting." + 'quick-delete 'helm-ff-quick-delete) + +(defun helm-ff-kill-default-directory (_candidate) + (with-helm-window + (kill-new helm-ff-default-directory) + (message "`%s' copied to kill-ring" helm-ff-default-directory))) + +(helm-make-persistent-command-from-action helm-ff-run-kill-default-directory + "Kill `helm-ff-default-directory'." + 'kill-default-directory + 'helm-ff-kill-default-directory) + +(defun helm-ff-dot-file-p (file) + "Check if FILE is `.' or `..'." + (member (helm-basename file) '("." ".."))) + +(defun helm-ff-kill-buffer-fname (candidate) + (let* ((buf (get-file-buffer candidate)) + (buf-name (buffer-name buf))) + (cond ((and buf (eq buf (get-buffer helm-current-buffer))) + (user-error + "Can't kill `helm-current-buffer' without quitting session")) + (buf (kill-buffer buf) (message "Buffer `%s' killed" buf-name)) + (t (message "No buffer to kill"))))) + +(defun helm-ff-kill-or-find-buffer-fname (candidate) + "Find file CANDIDATE or kill its buffer if it is visible. +Never kill `helm-current-buffer'. +Never kill buffer modified. +This is called normally on third hit of \ +\\\\[helm-execute-persistent-action] +in `helm-find-files-persistent-action-if'." + (let* ((buf (get-file-buffer candidate)) + (buf-name (buffer-name buf)) + (win (get-buffer-window buf)) + (helm--reading-passwd-or-string t) + ;; Prevent tramp from asking yes-or-no-p for + ;; `tramp-allow-unsafe-temporary-files'. + auto-save-default) + (cond ((and buf win (eql buf (get-buffer helm-current-buffer))) + (user-error + "Can't kill `helm-current-buffer' without quitting session")) + ((and buf win (buffer-modified-p buf)) + (message "Can't kill modified buffer, please save it before")) + ((and buf win) + (kill-buffer buf) + (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)) + (message "Buffer `%s' killed" buf-name)) + (t (find-file candidate))))) + +(helm-make-persistent-command-from-action helm-ff-run-kill-buffer-persistent + "Execute `helm-ff-kill-buffer-fname' without quitting." + 'kill-buffer-fname 'helm-ff-kill-buffer-fname) + +;; Preview with external tool +(defun helm-ff-persistent-open-file-externally (file) + (require 'helm-external) + (if (helm-get-default-program-for-file file) + (helm-open-file-externally file) + (message "Please configure an external program for `*%s' file in `helm-external-programs-associations'" + (file-name-extension file t)))) + +(helm-make-persistent-command-from-action helm-ff-run-preview-file-externally + "Run open file externally without quitting helm." + 'open-file-externally 'helm-ff-persistent-open-file-externally) + +(defun helm-ff-prefix-filename (disp fname &optional new-file) + "Return DISP maybe prefixed with a string or an icon. + +Arg FNAME is the real filename whereas DISP is the display part of candidate. + +Icons are used when `helm-ff-icon-mode' is enabled. + +When NEW-FILE is non nil, returns a string prefixed with +[+] or [@] or a special icon, otherwise DISP is +returned prefixed with its icon or unchanged." + (let (prefix-new prefix-url) + (cond ((and new-file + (or (string-match helm-ff-url-regexp disp) + (and helm--url-regexp + (string-match helm--url-regexp disp)))) + (setq prefix-url + (if helm-ff-icon-mode + (helm-acase (match-string 1 disp) + ("mailto:" + (all-the-icons-octicon "mail")) + (t (all-the-icons-octicon "link-external"))) + (propertize + " " 'display + (propertize "[@]" 'face 'helm-ff-prefix)))) + (add-text-properties 0 1 '(helm-url t) prefix-url) + (concat prefix-url " " disp)) + (new-file + (setq prefix-new + (if helm-ff-icon-mode + (if (string-match "/\\'" disp) + (all-the-icons-material "create_new_folder") + (all-the-icons-material "note_add")) + (propertize + " " 'display + (propertize "[+]" 'face 'helm-ff-prefix)))) + (add-text-properties 0 1 '(helm-new-file t) prefix-new) + (concat prefix-new " " disp)) + (t (concat (helm-ff-get-icon disp fname) disp))))) + +(defun helm-ff-score-candidate-for-pattern (real disp pattern) + (cond ((member real '("." "..")) 900000) + ((and (string-match-p "\\`\\s-\\{2\\}" disp) + (string= real (substring-no-properties disp 2))) + ;; Incomplete filenames are prefixed with two spaces, the + ;; first one beeing propertized with a 'display prop + ;; i.e. "[+] foo". + 900001) + (t (helm-score-candidate-for-pattern real pattern)))) + +(defun helm-ff-sort-candidates-1 (candidates input) + "Sort function for `helm-source-find-files'. +Return candidates prefixed with basename of INPUT first." + (if (or (and (file-directory-p input) + (string-match "/\\'" input)) + (string-match "\\`\\$" input) + (null candidates)) + candidates + (let* ((memo-src (make-hash-table :test 'equal)) + (all (sort candidates + (lambda (s1 s2) + (let* ((score (lambda (disp real) + (helm-ff-score-candidate-for-pattern + disp real (helm-basename input)))) + ;; Reals + (r1 (helm-basename (if (consp s1) (cdr s1) s1))) + (r2 (helm-basename (if (consp s2) (cdr s2) s2))) + ;; Displays + (d1 (helm-basename (if (consp s1) (car s1) s1))) + (d2 (helm-basename (if (consp s2) (car s2) s2))) + (sc1 (or (gethash r1 memo-src) + (puthash r1 (funcall score r1 d1) memo-src))) + (sc2 (or (gethash r2 memo-src) + (puthash r2 (funcall score r2 d2) memo-src)))) + (cond ((= sc1 sc2) + (< (string-width r1) + (string-width r2))) + ((> sc1 sc2)))))))) + all))) + +(defun helm-ff-sort-candidates (candidates _source) + "Sort function for `helm-source-find-files'. +Return candidates prefixed with basename of `helm-input' first." + (helm-ff-sort-candidates-1 candidates helm-input)) + +(defun helm-ff-boring-file-p (file) + "Returns non nil when FILE is matching boring regexps." + ;; Prevent user doing silly thing like + ;; adding the dotted files to boring regexps (#924). + (and helm-ff-skip-boring-files + (not (string-match "\\.$" file)) + (string-match helm-ff--boring-regexp file))) + +(defvar helm-ff--git-found-p nil) +(defun helm-ff-git-ignored-p (file) + "Returns non nil when FILE is matched in \".gitignore\" file." + (and helm-ff-skip-git-ignored-files + (not (file-remote-p file)) + (or helm-ff--git-found-p + (setq helm-ff--git-found-p (executable-find "git"))) + (zerop (call-process "git" nil nil nil "check-ignore" "-q" file)))) + +(defun helm-ff-fct (candidates _source) + "Filter in charge of displaying basename or full path in HFF. +Because CANDIDATES are directly stored as (basename . full_path), when +`helm-ff-transformer-show-only-basename' is non nil do nothing and +return directly CANDIDATES." + (if (null helm-ff-transformer-show-only-basename) + (cl-loop for (_disp . real) in candidates + for fc = (helm-ff-filter-candidate-one-by-one real 'reverse) + when fc collect fc) + candidates)) + +(defun helm-ff-filter-candidate-one-by-one (file &optional reverse skip-boring-check) + "Transform file in a cons cell like (DISPLAY . REAL). +DISPLAY is shown as basename of FILE and REAL as full path of FILE. +If REVERSE is non nil DISPLAY is shown as full path. +If SKIP-BORING-CHECK is non nil don't filter boring files." + (let* ((basename (helm-basename file)) + (dot (helm-ff-dot-file-p file)) + (urlp (string-match-p helm-ff-url-regexp file)) + (tramp-invalid-fname (helm-ff--get-host-from-tramp-invalid-fname file)) + (disp (or tramp-invalid-fname + ;; Filename with cntrl chars e.g. foo^J + (replace-regexp-in-string + "[[:cntrl:]]" "?" + (if (or reverse urlp) file basename)))) + (len (length disp)) + (backup (backup-file-name-p disp))) + (when (string-match "/\\'" file) + (setq disp (concat disp "/") + len (1+ len))) + ;; We want to filter boring files only on the files coming + ;; from the output of helm-ff-directory-files not on single + ;; candidate (Bug#2330). + (unless (and (not skip-boring-check) + (or (helm-ff-boring-file-p basename) + (helm-ff-git-ignored-p file))) + ;; Highlight extensions. + (helm-aif (and (not backup) + (not urlp) + (helm-file-name-extension disp)) + (when (condition-case _err + (string-match (format "\\.\\(%s\\)\\'" it) disp) + (invalid-regexp nil)) + (add-face-text-property + (match-beginning 1) (match-end 1) + 'helm-ff-file-extension t disp))) + ;; Handle tramp files with minimal highlighting. + (if (and (or (string-match-p helm-tramp-file-name-regexp helm-pattern) + (helm-file-on-mounted-network-p helm-pattern))) + (helm-acond (;; Dot directories . and .. + dot + (cons (helm-ff-prefix-filename + (propertize file 'face 'helm-ff-dotted-directory) + file) + file)) + ;; Directories. + ((get-text-property 1 'helm-ff-dir file) + (cons (helm-ff-prefix-filename + (propertize disp 'face 'helm-ff-directory) + file) + file)) + ;; Backup files. + (backup + (cons (helm-ff-prefix-filename + (propertize disp 'face 'helm-ff-backup-file) + file) + file)) + ;; Executable files. + ((get-text-property 1 'helm-ff-exe file) + (add-face-text-property 0 len 'helm-ff-executable t disp) + (cons (helm-ff-prefix-filename disp file) file)) + ;; Symlinks. + ((get-text-property 1 'helm-ff-sym file) + (add-face-text-property 0 len 'helm-ff-symlink t disp) + (if (stringp it) ; adb method. + (progn + (add-face-text-property 0 (length it) 'helm-ff-truename nil it) + (cons (propertize disp 'display (concat disp " ->" it)) file)) + (cons (helm-ff-prefix-filename disp file) file))) + ;; Regular files. + ((get-text-property 1 'helm-ff-file file) + (add-face-text-property 0 len 'helm-ff-file t disp) + (cons (helm-ff-prefix-filename disp file) file)) + ;; Tramp methods. + ((string-match helm-ff-tramp-method-regexp file) + (let ((method (match-string 1 file)) + (mh (helm-ff--tramp-multihops-p helm-pattern))) + (cons (propertize (concat (if mh "" "/") method) 'face 'helm-ff-file) + (if mh + (concat (match-string 1 helm-pattern) ":" method) + (concat "/:" method))))) + ;; non existing files. + (t + (add-face-text-property 0 len 'helm-ff-file t disp) + (when tramp-invalid-fname + (add-text-properties 0 len `(host ,tramp-invalid-fname) disp)) + (cons (helm-ff-prefix-filename + disp + file + (unless tramp-invalid-fname 'new-file)) + file))) + + ;; Highlight local files showing everything, symlinks, exe, + ;; dirs etc... + (let* ((attr (condition-case err + (file-attributes file) + (file-error + ;; Possible error not happening during listing + ;; but when calling file-attributes see error + ;; with sshfs bug#2405 + (message "%s:%s" (car err) (cdr err)) nil))) + (type (car attr)) + x-bit) + (cond (;; Not a file but the message error printed in + ;; helm-buffer. Such a message should not have a + ;; subdir so matching on bol should suffice, but to + ;; be sure use @@@@ as prefix in file-error message + ;; to be safe bug#2400. + (string-match "\\`@@@@file-error:" file) file) + (;; A dead symlink. + (and (stringp type) + (not (helm-ff-valid-symlink-p file)) + (not (string-match "^\\.#" basename))) + (add-face-text-property 0 len 'helm-ff-invalid-symlink t disp) + (cons (helm-ff-prefix-filename disp file) file)) + ;; A dotted directory symlinked. + ((and dot (stringp type)) + (cons (helm-ff-prefix-filename + (propertize file 'face 'helm-ff-dotted-symlink-directory) + file) + file)) + ;; A dotted directory. + (dot + (cons (helm-ff-prefix-filename + (propertize file 'face 'helm-ff-dotted-directory) + file) + file)) + ;; Backup files. + (backup + (cons (helm-ff-prefix-filename + (propertize disp 'face 'helm-ff-backup-file) + file) + file)) + ;; A symlink. + ((stringp type) + (let* ((abbrev (abbreviate-file-name type)) + (len-abbrev (length abbrev))) + (helm-aif (helm-file-name-extension abbrev) + (when (string-match (format "\\.\\(%s\\)\\'" it) abbrev) + (add-face-text-property + (match-beginning 1) (match-end 1) + 'helm-ff-file-extension t abbrev))) + (add-face-text-property 0 len-abbrev 'helm-ff-truename t abbrev) + ;; Colorize extension only on truename. + (add-face-text-property 0 len 'helm-ff-symlink nil disp) + ;; As we use match-on-real we can use this safely, + ;; abbrev will not be matched. + (cons (concat (helm-ff-prefix-filename disp file) " -> " abbrev) + file))) + ;; A directory. + ((eq t type) + (cons (helm-ff-prefix-filename + (propertize disp 'face 'helm-ff-directory) + file) + file)) + ;; A character device file. + ((and attr (string-match + "\\`[cp]" (setq x-bit (substring (nth 8 attr) 0 4)))) + (add-face-text-property 0 len 'helm-ff-pipe t disp) + (cons (helm-ff-prefix-filename disp file) file)) + ;; A socket file. + ((and attr (string-match "\\`[s]" x-bit)) + (add-face-text-property 0 len 'helm-ff-socket t disp) + (cons (helm-ff-prefix-filename disp file) file)) + ;; An executable file. + ((and attr (string-match "x\\'" x-bit)) + (add-face-text-property 0 len 'helm-ff-executable t disp) + (cons (helm-ff-prefix-filename disp file) file)) + ;; An executable file with suid + ((and attr (string-match "s\\'" x-bit)) + (add-face-text-property 0 len 'helm-ff-suid t disp) + (cons (helm-ff-prefix-filename disp file) file)) + ;; A file. + ((and attr (null type)) + (add-face-text-property 0 len 'helm-ff-file t disp) + (cons (helm-ff-prefix-filename disp file) file)) + ;; A tramp method + ;; At this point no need to handle multi hops syntax + ;; which is considered remote and handled in first + ;; cond before. + ((string-match helm-ff-tramp-method-regexp file) + (cons (propertize (concat "/" (match-string 1 file)) + 'face 'helm-ff-nofile) + (concat "/:" (match-string 1 file)))) + ;; A non--existing file. + (t + (add-face-text-property 0 len 'helm-ff-nofile t disp) + (cons (helm-ff-prefix-filename disp file 'new-file) + file)))))))) + +(defun helm-ff-get-icon (disp file) + "Get icon from all-the-icons for FILE. +Arg DISP is the display part of the candidate. +Arg FILE is the real part of candidate, a filename with no props." + (when helm-ff-icon-mode + (let ((icon (helm-acond (;; Non symlink directories. + (helm-ff--is-dir-from-disp disp) + (helm-aif (all-the-icons-match-to-alist + (helm-basename file) + all-the-icons-dir-icon-alist) + (apply (car it) (cdr it)) + (all-the-icons-octicon "file-directory"))) + (;; All files, symlinks may be symlink directories. + (helm-ff--is-file-from-disp disp) + ;; Detect symlink directories. We must call + ;; `file-directory-p' here but it is + ;; limited to symlinks, so it should not + ;; degrade too much performances. + (if (and (memq it '(helm-ff-symlink + helm-ff-dotted-symlink-directory)) + (file-directory-p file)) + (all-the-icons-octicon "file-symlink-directory") + (all-the-icons-icon-for-file (helm-basename file))))))) + (when icon (concat icon " "))))) + +(defun helm-ff--is-dir-from-disp (disp) + "Return the face used for candidate when candidate is a directory." + (cl-loop with faces = (helm-mklist (get-text-property 0 'face disp)) + for face in '(helm-ff-directory helm-ff-dotted-directory) + thereis (memq face faces))) + +(defun helm-ff--is-file-from-disp (disp) + "Return the face used for file's candidate or dotted-symlink dirs." + (cl-loop with faces = (helm-mklist (get-text-property 0 'face disp)) + for face in '(helm-ff-file + helm-ff-suid + helm-ff-executable + helm-ff-socket + helm-ff-pipe + helm-ff-symlink + helm-ff-dotted-symlink-directory + helm-ff-backup-file) + when (memq face faces) + return face)) + +;;;###autoload +(define-minor-mode helm-ff-icon-mode + "Display icons from `all-the-icons' package in HFF when enabled." + :global t + :group 'helm-files + (when helm-ff-icon-mode + (unless (require 'all-the-icons nil t) + (setq helm-ff-icon-mode nil) + (message "All The Icons package is not installed"))) + (clrhash helm-ff--list-directory-cache)) + +(defun helm-find-files-action-transformer (actions candidate) + "Action transformer for `helm-source-find-files'." + (let ((str-at-point (with-helm-current-buffer + (buffer-substring-no-properties + (pos-bol) (pos-eol))))) + (when (file-regular-p candidate) + (setq actions (helm-append-at-nth + actions '(("Checksum File" . helm-ff-checksum)) 4))) + (cond ((and (file-exists-p candidate) + (string-match helm-ff--trash-directory-regexp + (helm-basedir (expand-file-name candidate))) + (not (member (helm-basename candidate) '("." ".."))) + (executable-find "trash")) + (helm-append-at-nth + actions + '(("Restore file(s) from trash" . helm-restore-file-from-trash) + ("Delete file(s) from trash" . helm-ff-trash-rm)) + 1)) + ((and helm--url-regexp + (not (string-match-p helm--url-regexp str-at-point)) + (not (with-helm-current-buffer (eq major-mode 'dired-mode))) + (string-match-p ":\\([0-9]+:?\\)" str-at-point)) + (append '(("Find file to line number" . helm-ff-goto-linum)) + actions)) + ((string-match (image-file-name-regexp) candidate) + (helm-append-at-nth + actions + '(("Rotate image right `M-r'" . helm-ff-rotate-image-right) + ("Rotate image left `M-l'" . helm-ff-rotate-image-left) + ("Start slideshow with marked" . helm-ff-start-slideshow-on-marked)) + 3)) + ((string-match "\\.el\\'" candidate) + (helm-append-at-nth + actions + '(("Byte compile lisp file(s) `M-B, C-u to load'" + . helm-find-files-byte-compile) + ("Load File(s) `M-L'" . helm-find-files-load-files)) + 2)) + ((string-match (concat (regexp-opt load-suffixes) "\\'") candidate) + (helm-append-at-nth + actions + '(("Load File(s) `M-L'" . helm-find-files-load-files)) + 2)) + ((and (string-match "\\.html?$" candidate) + (file-exists-p candidate)) + (helm-append-at-nth + actions '(("Browse url file" . browse-url-of-file)) 2)) + (t actions)))) + +;;; Trashing files +;; +(defun helm-ff-trash-action (fn names &rest args) + "Execute a trash action FN on marked files. + +Arg NAMES is a list of strings to pass to messages. +E.g. \\='(\"delete\" \"deleting\") + +ARGS are other arguments to be passed to FN." + (let ((mkd (helm-marked-candidates)) + errors aborted) + (with-helm-display-marked-candidates + helm-marked-buffer-name + (if (and args (string= (car names) "restore")) + (cl-loop for f in mkd + for bd = (helm-basename f) + for assoc = (assoc bd (car args)) + when assoc + collect (concat (truncate-string-to-width + (car assoc) 40 nil nil t) + " -> " + (truncate-string-to-width + (helm-basedir (cdr assoc)) 40 nil nil t))) + (helm-ff--count-and-collect-dups (mapcar 'helm-basename mkd))) + (if (y-or-n-p (format "%s %s files from trash? " + (capitalize (car names)) + (length mkd))) + (progn + (message "%s files from trash..." (capitalize (cadr names))) + (cl-loop for f in mkd do + (condition-case err + (apply fn f args) + (error (push (format "%s" (cadr err)) errors) + nil)))) + (message "%s files from trash aborted" (capitalize (cadr names))) + (setq aborted t))) + ;; Handle errors from outside the + ;; with-helm-display-marked-candidates block otherwise warning is + ;; never displayed. + (if errors + (progn + (display-warning 'helm + (with-temp-buffer + (insert (format-time-string "%Y-%m-%d %H:%M:%S\n" + (current-time))) + (insert (format + "Failed to %s %s/%s files from trash\n" + (car names) (length errors) (length mkd))) + (insert (mapconcat 'identity errors "\n") "\n ") + (buffer-string)) + :error + "*helm restore warnings*") + (message "%s files from trash aborted" (capitalize (cadr names)))) + (unless aborted + (message "%s %s files from trash done" + (capitalize (cadr names)) (length mkd)))))) + +(defun helm-ff-trash-rm (_candidate) + "Delete marked-files from a Trash directory. + +The Trash directory should be a directory compliant with + and each +file should have its \\='*.trashinfo' correspondent file in +Trash/info directory." + (helm-ff-trash-action 'helm-ff-trash-rm-1 '("delete" "deleting"))) + +(defun helm-ff-trash-rm-1 (file) + (let ((info-file (concat (helm-reduce-file-name file 2) + "info/" (helm-basename file "trashinfo") + ".trashinfo"))) + (cl-assert (file-exists-p file) + nil (format "No such file or directory `%s'" + file)) + (cl-assert (file-exists-p info-file) + nil (format "No such file or directory `%s'" + info-file)) + (if (file-directory-p file) + (delete-directory file t) + (delete-file file)) + (delete-file info-file))) + +(defun helm-restore-file-from-trash (_candidate) + "Restore marked-files from a Trash directory. + +The Trash directory should be a directory compliant with + and each +file should have its \\='*.trashinfo' corresponding file in +Trash/info directory." + (let* ((default-directory (file-name-as-directory + helm-ff-default-directory)) + (trashed-files (helm-ff-trash-list))) + (helm-ff-trash-action 'helm-restore-file-from-trash-1 + '("restore" "restoring") + trashed-files))) + +(defun helm-restore-file-from-trash-1 (file trashed-files) + "Restore FILE from a trash directory. +Arg TRASHED-FILES is an alist of (fname_in_trash . dest) obtained +with `helm-ff-trash-list'." + ;; Emacs trash duplicate files with a unique name + .trashinfo in + ;; the filename which is wrong, only files in info directory should + ;; end with .trashinfo, so fix the filename before looking for dest name. + (let* ((fname (replace-regexp-in-string "\\.trashinfo\\'" "" file)) + (info-file (concat (helm-reduce-file-name fname 2) + "info/" + (helm-basename fname) + ".trashinfo")) + (dest-file (helm-ff--get-dest-file-from-trash + trashed-files fname))) + (cl-assert (not (file-exists-p dest-file)) nil + (format "File `%s' already exists" dest-file)) + (cl-assert dest-file nil "No such file in trash") + (message "Restoring %s to %s..." (helm-basename file) (helm-basedir dest-file)) + (rename-file file dest-file) + (message "Restoring %s to %s done" (helm-basename file) (helm-basedir dest-file)) + (delete-file info-file))) + +(defun helm-ff-trash-file-p (file) + "Return t when FILE is a trashed file." + (and (file-exists-p file) + (string-match helm-ff--trash-directory-regexp (helm-basedir file)) + (not (member (helm-basename file) '("." ".."))))) + +(defun helm-ff--get-dest-file-from-trash (trashed-files file) + (assoc-default (helm-basename file) trashed-files)) + +(cl-defun helm-ff-trash-list (&optional (trash-dir nil strash-dir)) + "Return an alist of trashed files basename and dest name. +Assume the trash system in use is freedesktop compatible, see + +This function is intended to be used from a trash directory i.e. it +use `helm-ff-default-directory', but it may be used elsewhere by +specifying the trash directory with TRASH-DIR arg." + (unless (or (fboundp 'system-move-file-to-trash) + (and strash-dir (null trash-dir))) + ;; Files owned by root are trashed in /root/.local/share/Trash. + ;; Files owned by user and trashed by root are trashed in + ;; /home/.Trash. + ;; Files owned by user and trashed by user are trashed in + ;; ~/.local/share/Trash. + (cl-loop for f in (directory-files + (expand-file-name + ;; helm-ff-default-directory is actually the + ;; trash directory. + "info" (helm-basedir (directory-file-name + (or trash-dir helm-ff-default-directory)))) + t directory-files-no-dot-files-regexp) + collect (cons (helm-basename (replace-regexp-in-string "\\.trashinfo\\'" "" f)) + (with-temp-buffer + (save-excursion + (insert-file-contents f)) + (when (re-search-forward "^path=" nil t) + (let ((path (helm-url-unhex-string + (buffer-substring-no-properties + (point) (pos-eol))))) + (if (string-match "\\`/" path) + ;; path is absolute + path + ;; When path is relative, assume the + ;; trash directory is located at + ;; /home/.Trash and path is the + ;; relative name of file from /home. + (expand-file-name path "/home"))))))))) + +(defun helm-ff-goto-linum (candidate) + "Find file CANDIDATE and maybe jump to line number found in fname at point. +Line number should be added at end of fname preceded with \":\". +E.g. \"foo:12\"." + (let ((linum (with-helm-current-buffer + (let ((str (buffer-substring-no-properties + (pos-bol) (pos-eol)))) + (when (string-match ":\\([0-9]+:?\\)" str) + (match-string 1 str)))))) + (find-file candidate) + (and linum (not (string= linum "")) + (helm-goto-line (string-to-number linum) t)))) + +(defun helm-ff-mail-attach-files (_candidate) + "Run `mml-attach-file' on `helm-marked-candidates'." + (require 'mml) + (let ((flist (helm-marked-candidates :with-wildcard t)) + (dest-buf (and (derived-mode-p 'message-mode 'mail-mode) + (current-buffer))) + bufs) + (unless dest-buf + (setq bufs (cl-loop for b in (buffer-list) + when (with-current-buffer b + (derived-mode-p 'message-mode 'mail-mode)) + collect (buffer-name b))) + (if (and bufs (y-or-n-p "Attach files to existing mail composition buffer? ")) + (setq dest-buf + (if (cdr bufs) + (helm-comp-read "Attach to buffer: " bufs :nomark t) + (car bufs))) + (compose-mail) + (setq dest-buf (current-buffer)))) + (switch-to-buffer dest-buf) + (save-restriction + (widen) + (save-excursion + (goto-char (point-max)) + (cl-loop for f in flist + do (mml-attach-file f (or (mm-default-file-encoding f) + "application/octet-stream"))))))) + +(defvar image-dired-display-image-buffer) +(defun helm-ff-rotate-current-image-1 (file angle) + "Rotate current image at ANGLE degrees." + (cl-assert (and (file-exists-p file) + (string-match (image-file-name-regexp) file)) + nil "Can't rotate non image file") + (setq file (file-truename file)) ; For symlinked images. + (let ((default-directory (file-name-directory file)) + (basename (helm-basename file)) + ;; convert ANGLE to a suitable value for exiftran. + (num-arg (if (string= helm-ff-rotate-image-program "exiftran") + (cl-case angle + (90 "-9") ; 90 clockwise + (270 "-2")) ; 270 clockwise == -90 + (number-to-string angle))) + rotation-failed) + ;; Try to rotate image with exiftran even with helm-ff-display-image-native. + (if (and helm-ff-rotate-image-program + (executable-find helm-ff-rotate-image-program)) + (apply #'process-file helm-ff-rotate-image-program nil nil nil + (append helm-ff-rotate-image-switch + (list num-arg basename))) + (setq rotation-failed t)) + ;; Display image in image-mode. + (if (helm-ff-display-image-native-p) + (if rotation-failed + ;; When rotation fails fallback to `image-rotate' with no + ;; transformation of file. + (with-selected-window (helm-persistent-action-display-window) + (condition-case _err + (with-no-warnings (image-rotate angle)) + (wrong-number-of-arguments (image-rotate)))) + (helm-ff--display-image-native file)) + ;; Use image-dired to display image. + (when rotation-failed + (error "%s not found" (or helm-ff-rotate-image-program + "`helm-ff-rotate-image-program'"))) + (when (buffer-live-p image-dired-display-image-buffer) + (kill-buffer image-dired-display-image-buffer)) + (image-dired-display-image basename) + (message nil) + (display-buffer (get-buffer image-dired-display-image-buffer))))) + +(defun helm-ff-rotate-image-left (candidate) + "Rotate image file CANDIDATE left. +This affects directly file CANDIDATE." + (helm-ff-rotate-current-image-1 candidate 270)) + +(defun helm-ff-rotate-image-right (candidate) + "Rotate image file CANDIDATE right. +This affects directly file CANDIDATE." + (helm-ff-rotate-current-image-1 candidate 90)) + +(defun helm-ff-rotate-left-persistent () + "Rotate image left without quitting helm." + (interactive) + (with-helm-alive-p + (helm-set-attr 'image-action1 'helm-ff-rotate-image-left) + (helm-execute-persistent-action 'image-action1))) +(put 'helm-ff-rotate-left-persistent 'helm-only t) + +(defun helm-ff-rotate-right-persistent () + "Rotate image right without quitting helm." + (interactive) + (with-helm-alive-p + (helm-set-attr 'image-action2 'helm-ff-rotate-image-right) + (helm-execute-persistent-action 'image-action2))) +(put 'helm-ff-rotate-right-persistent 'helm-only t) + +(defun helm-ff-resize-image-1 (arg) + ;; `image-decrease-size' and `image-increase-size' are not usable + ;; because they run directly `image--change-size' in a timer without + ;; taking care of the selected-window. + (cl-assert (and (fboundp 'image--change-size) + (helm-ff-display-image-native-p)) + nil "Resizing image not available") + (if (> arg 0) + (run-with-idle-timer + 0.3 nil + (lambda () + (with-selected-window (helm-persistent-action-display-window) + (image--change-size 1.2)))) + (run-with-idle-timer + 0.3 nil + (lambda () + (with-selected-window (helm-persistent-action-display-window) + (image--change-size 0.8)))))) + +(defun helm-ff-increase-image-size (_candidate) + (helm-ff-resize-image-1 1)) + +(defun helm-ff-decrease-image-size (_candidate) + (helm-ff-resize-image-1 -1)) + +(defun helm-ff-increase-image-size-persistent () + "Increase image size without quitting helm." + (interactive) + (with-helm-alive-p + (helm-set-attr 'image-action3 'helm-ff-increase-image-size) + (helm-execute-persistent-action 'image-action3))) +(put 'helm-ff-increase-image-size-persistent 'helm-only t) + +(defun helm-ff-decrease-image-size-persistent () + "Decrease image size without quitting helm." + (interactive) + (with-helm-alive-p + (helm-set-attr 'image-action4 'helm-ff-decrease-image-size) + (helm-execute-persistent-action 'image-action4))) +(put 'helm-ff-decrease-image-size-persistent 'helm-only t) + +(defun helm-ff-exif-data (candidate) + "Extract exif data from file CANDIDATE using `helm-ff-exif-data-program'." + (if (and helm-ff-exif-data-program + (executable-find helm-ff-exif-data-program)) + (shell-command-to-string (format "%s %s %s" + helm-ff-exif-data-program + helm-ff-exif-data-program-args + candidate)) + (format "No program %s found to extract exif" + helm-ff-exif-data-program))) + +(defvar helm-ff-image-native-buffer "*image-native-display*") + +(defvar helm-ff-sound-file-extensions '("wav" "au")) + +(defun helm-ff--maybe-follow (candidate) + (let ((file (if helm-ff-ignore-following-on-directory + (file-exists-p candidate) + (file-regular-p candidate))) + (image (string-match-p (image-file-name-regexp) candidate)) + (ext (file-name-extension candidate))) + (and file + (or image (not (member ext helm-ff-follow-blacklist-file-exts)))))) + +(cl-defun helm-find-files-persistent-action-if (candidate) + "Open subtree CANDIDATE without quitting helm. +If CANDIDATE is not a directory expand CANDIDATE filename. +If CANDIDATE is alone, open file CANDIDATE filename. +That means: +First hit on C-j expands CANDIDATE, second hit opens file. +If a prefix arg is given or `helm-follow-mode' is on, then open +file." + (let* ((follow (or (helm-follow-mode-p) + helm--temp-follow-flag)) + (image-cand (string-match-p (image-file-name-regexp) candidate)) + (sound-cand (member (file-name-extension candidate) + helm-ff-sound-file-extensions)) + (selection (helm-get-selection)) + (insert-in-minibuffer (lambda (fname) + (with-selected-window (or (active-minibuffer-window) + (minibuffer-window)) + (unless follow + (delete-minibuffer-contents) + (set-text-properties 0 (length fname) + nil fname) + (insert fname)))))) + (helm-set-attr 'candidate-number-limit helm-ff-candidate-number-limit) + (unless (helm-ff--maybe-follow candidate) + (when follow + (helm-follow-mode -1) (message nil) + (cl-return-from helm-find-files-persistent-action-if + (prog1 + #'ignore + (user-error "Can't follow this kind of file"))))) + (cond (;; Tramp methods completion. + (string-match helm-ff-tramp-method-regexp candidate) + (let ((method (match-string 1 candidate))) + (cons (lambda (candidate) + (funcall insert-in-minibuffer + (if (helm-ff--tramp-multihops-p candidate) + (concat (match-string 1 candidate) method ":") + (concat "/" method ":")))) + 'never-split))) + ((and (helm-ff--invalid-tramp-name-p) + (string-match helm-tramp-file-name-regexp candidate)) + (cons (lambda (_candidate) + ;; First hit insert hostname and + ;; second hit insert ":" and expand. + (if (string= candidate helm-pattern) + (funcall insert-in-minibuffer (concat candidate ":")) + (funcall insert-in-minibuffer candidate))) + 'never-split)) + (;; A symlink directory, expand it but not to its truename + ;; unless a prefix arg is given. + (and (file-directory-p candidate) (file-symlink-p candidate)) + (cons (lambda (_candidate) + (helm-ff-after-persistent-show-all) + (let ((new-dir (file-name-as-directory + (if current-prefix-arg + (file-truename (expand-file-name candidate)) + (expand-file-name candidate))))) + (setq helm-ff--show-thumbnails + (member new-dir helm-ff--thumbnailed-directories)) + (funcall insert-in-minibuffer new-dir))) + 'never-split)) + ;; A directory, open it. + ((file-directory-p candidate) + (cons (lambda (_candidate) + (helm-ff-after-persistent-show-all) + (when (string= (helm-basename candidate) "..") + (setq helm-ff-last-expanded helm-ff-default-directory)) + (let ((new-dir (file-name-as-directory + (expand-file-name candidate)))) + (setq helm-ff--show-thumbnails + (member new-dir helm-ff--thumbnailed-directories)) + (funcall insert-in-minibuffer new-dir)) + (with-helm-after-update-hook (helm-ff-retrieve-last-expanded))) + 'never-split)) + ;; A symlink file, expand to it's true name. (first hit) + ((and (file-symlink-p candidate) (not current-prefix-arg) (not follow)) + (cons (lambda (_candidate) + (funcall insert-in-minibuffer (file-truename candidate)) + (helm-check-minibuffer-input)) ; Force update. + 'never-split)) + ;; A regular file, expand it, (first hit) + ((and (not (file-equal-p selection helm-pattern)) + (not current-prefix-arg) (not follow)) + (cons (lambda (_candidate) + (funcall insert-in-minibuffer selection) + (helm-check-minibuffer-input)) ; Force update. + 'never-split)) + (sound-cand (lambda (candidate) (play-sound-file candidate))) + ;; An image file and it is the second hit on C-j, display it. + (image-cand + (if (helm-ff-display-image-native-p) + #'helm-ff--display-or-kill-image-native + (lambda (_candidate) + (require 'image-dired) + (let* ((win (get-buffer-window + image-dired-display-image-buffer 'visible)) + (fname (and win + (with-selected-window win + (get-text-property (point-min) + 'original-file-name)))) + (remove-buf-only (and win + fname + (with-helm-buffer + (file-equal-p candidate fname))))) + (when remove-buf-only + (with-helm-window + (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 image-dired-display-image-buffer)) + (kill-buffer image-dired-display-image-buffer)) + (unless remove-buf-only + ;; Fix emacs bug never fixed upstream. + (unless (file-directory-p image-dired-dir) + (make-directory image-dired-dir)) + (switch-to-buffer image-dired-display-image-buffer) + (message "Resizing image...") + (cl-letf (((symbol-function 'message) #'ignore)) + (image-dired-display-image candidate)) + (message "Resizing image done") + (with-current-buffer image-dired-display-image-buffer + (let ((exif-data (helm-ff-exif-data candidate))) + (setq default-directory helm-ff-default-directory) + (image-dired-update-property 'help-echo exif-data)))))))) + ;; Allow browsing archive on avfs fs. + ;; Assume volume is already mounted with mountavfs. + ((helm-aand helm-ff-avfs-directory + (file-name-directory candidate) + (string-match + (regexp-quote (expand-file-name helm-ff-avfs-directory)) + it) + (helm-ff-file-compressed-p candidate)) + (cons (lambda (_candidate) + (funcall insert-in-minibuffer (concat candidate "#/"))) + 'never-split)) + ;; File doesn't exists and basename starts with ".." or " ", + ;; Start a recursive search for directories. + ((and (not (file-exists-p candidate)) + (not (file-remote-p candidate)) + (string-match-p "\\`\\([.]\\|\\s-\\)\\{2\\}[^/]+" + (helm-basename candidate))) + ;; As soon as the final "/" is added the job is passed + ;; to `helm-ff-auto-expand-to-home-or-root'. + (cons (lambda (_candidate) + (funcall insert-in-minibuffer (concat candidate "/"))) + 'never-split)) + ;; File is not existing and have no basedir, typically when + ;; user hit C-k (minibuffer is empty) and then write foo and + ;; hit C-j. This make clear that when no basedir, helm will + ;; create the file in default-directory. + ((and (not (file-exists-p candidate)) + (not (helm-basedir candidate))) + (cons (lambda (_candidate) + (funcall insert-in-minibuffer + (expand-file-name candidate default-directory))) + 'never-split)) + ;; On second hit we open file. + ;; On Third hit we kill it's buffer maybe. + (t + (lambda (candidate) + (funcall helm-ff-kill-or-find-buffer-fname-fn candidate)))))) + +;; Native image display (with image-mode). +;; +(defvar helm-ff--image-cache nil) + +(defun helm-ff-display-image-native-p () + "Use `helm-ff-display-image-native' when returns `t'." + (or helm-ff-display-image-native + ;; Image-dired in emacs-29 uses image-mode but + ;; display is no more working with our old + ;; image-dired code, so force usage of + ;; helm-ff-display-image-native. + (fboundp 'image-dired-display-image-mode))) + +(defun helm-ff--display-or-kill-image-native (candidate) + ;; Display images in same buffer + ;; `helm-ff-image-native-buffer'. + (if (and (buffer-live-p (get-buffer helm-ff-image-native-buffer)) + (file-equal-p (buffer-file-name + (get-buffer helm-ff-image-native-buffer)) + candidate) + ;; Allow redisplaying + ;; `helm-ff-image-native-buffer' when it + ;; already exists and display same image as candidate. + (get-buffer-window helm-ff-image-native-buffer 'visible)) + (progn + (set-window-buffer + helm-persistent-action-display-window helm-current-buffer) + (kill-buffer helm-ff-image-native-buffer)) + (helm-ff--display-image-native candidate))) + +(defun helm-ff-clean-image-cache () + (when helm-ff--image-cache + (cl-loop for img in helm-ff--image-cache + do (clear-image-cache img) + finally do (setq helm-ff--image-cache nil)))) + +(defun helm-ff--display-image-native (candidate) + (when (buffer-live-p (get-buffer helm-ff-image-native-buffer)) + (kill-buffer helm-ff-image-native-buffer)) + ;; Avoid hight memory consumption see + ;; https://lists.gnu.org/archive/html/bug-gnu-emacs/2021-11/msg00879.html. + (when (> (length helm-ff--image-cache) + (* helm-ff-image-cache-max-len 2)) + ;; Only keep the last `helm-ff-image-cache-max-len' images in cache. + (cl-loop for img in (butlast helm-ff--image-cache + (1+ helm-ff-image-cache-max-len)) + do (clear-image-cache img) + (setq helm-ff--image-cache + (delete img helm-ff--image-cache)))) + (cl-letf* (((symbol-function 'message) #'ignore) + (buf (find-file-noselect candidate t))) + ;; When going back reuse the cached images. + (unless (member candidate helm-ff--image-cache) + (setq helm-ff--image-cache + (append helm-ff--image-cache + (list (expand-file-name candidate))))) + (with-current-buffer buf + (rename-buffer helm-ff-image-native-buffer)) + (display-buffer buf))) + +;;; Slideshow action +;; +(defvar helm-ff--slideshow-iterator nil) +(defvar helm-ff--slideshow-sequence nil) +(defvar helm-ff--slideshow-in-pause nil) +(defvar helm-ff-slideshow-helper + "Type `\\[helm-ff-slideshow-pause-or-restart]' to %s, \ +`\\[helm-ff-slideshow-next]' for next, `\\[helm-ff-slideshow-previous]' for previous, \ +`\\[helm-ff-slideshow-quit]' to quit") + +(defvar helm-slideshow-mode-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map image-mode-map) + (define-key map (kbd "SPC") 'helm-ff-slideshow-pause-or-restart) + (define-key map (kbd "q") 'helm-ff-slideshow-quit) + (define-key map (kbd "n") 'helm-ff-slideshow-next) + (define-key map (kbd "p") 'helm-ff-slideshow-previous) + map)) + +(define-derived-mode helm-slideshow-mode + image-mode "helm-image-mode" + "Mode to display images from helm-find-files. + +Special commands: +\\{helm-slideshow-mode-map} +") +(put 'helm-slideshow-mode 'no-helm-mx t) + +(defun helm-ff-slideshow-help-string (counter-string state) + (concat counter-string + (substitute-command-keys + (format helm-ff-slideshow-helper state)))) + +(defun helm-ff-start-slideshow-on-marked (_candidate) + "Start a slideshow on marked files." + (let ((marked (helm-marked-candidates :with-wildcard t))) + (cl-assert (cdr marked) nil "Can't start a slideshow on a single file") + (setq helm-ff--slideshow-sequence marked) + (setq helm-ff--slideshow-iterator (helm-iter-circular marked)) + (helm-ff--display-image-native (helm-iter-next helm-ff--slideshow-iterator)) + (delete-other-windows (get-buffer-window helm-ff-image-native-buffer)) + (cl-letf (((symbol-function 'message) #'ignore)) + (helm-slideshow-mode)) + (setq mode-line-format (helm-ff-slideshow-help-string + (format "(1/%s) " (length marked)) "pause")) + (helm-ff-slideshow-loop helm-ff--slideshow-iterator))) + +(defun helm-ff-slideshow-state () + (format "(%s/%s) " + (1+ (cl-position + (buffer-file-name) helm-ff--slideshow-sequence + :test 'equal)) + (length helm-ff--slideshow-sequence))) + +(defun helm-ff-slideshow-sequence-from-current (&optional reverse) + (helm-reorganize-sequence-from-elm + helm-ff--slideshow-sequence (buffer-file-name) reverse)) + +(defun helm-ff-slideshow-loop (iterator &optional restart) + (while (sit-for helm-ff-slideshow-default-delay) + (helm-ff--display-image-native (helm-iter-next iterator)) + (delete-other-windows (get-buffer-window helm-ff-image-native-buffer)) + (cl-letf (((symbol-function 'message) #'ignore)) + (helm-slideshow-mode)) + (when restart + (message "Helm Slideshow started") + (sit-for 1) + (message nil) + (setq restart nil)) + (setq mode-line-format + (helm-ff-slideshow-help-string + (helm-ff-slideshow-state) "pause")))) + +(defun helm-ff-slideshow-pause-or-restart () + (interactive) + (setq helm-ff--slideshow-in-pause (not helm-ff--slideshow-in-pause)) + (if helm-ff--slideshow-in-pause + (setq mode-line-format (helm-ff-slideshow-help-string nil "restart")) + (message "Helm Slideshow restarting...") + (setq helm-ff--slideshow-iterator + (helm-iter-circular (helm-ff-slideshow-sequence-from-current))) + (helm-ff-slideshow-loop helm-ff--slideshow-iterator 'restart))) +(put 'helm-ff-slideshow-pause-or-restart 'no-helm-mx t) + +(defun helm-ff-slideshow-next () + (interactive) + (setq helm-ff--slideshow-in-pause t) + (setq helm-ff--slideshow-iterator nil) + (helm-ff--display-image-native + (car (helm-ff-slideshow-sequence-from-current))) + (delete-other-windows (get-buffer-window helm-ff-image-native-buffer)) + (cl-letf (((symbol-function 'message) #'ignore)) + (helm-slideshow-mode)) + (message (concat (helm-ff-slideshow-state) + (substitute-command-keys + (format helm-ff-slideshow-helper "restart"))))) +(put 'helm-ff-slideshow-next 'no-helm-mx t) + +(defun helm-ff-slideshow-previous () + (interactive) + (setq helm-ff--slideshow-in-pause t) + (setq helm-ff--slideshow-iterator nil) + (helm-ff--display-image-native + (car (helm-ff-slideshow-sequence-from-current 'reverse))) + (delete-other-windows (get-buffer-window helm-ff-image-native-buffer)) + (cl-letf (((symbol-function 'message) #'ignore)) + (helm-slideshow-mode)) + (message (concat (helm-ff-slideshow-state) + (substitute-command-keys + (format helm-ff-slideshow-helper "restart"))))) +(put 'helm-ff-slideshow-previous 'no-helm-mx t) + +(defun helm-ff-slideshow-quit () + (interactive) + (setq helm-ff--slideshow-iterator nil) + (setq helm-ff--slideshow-in-pause nil) + (helm-ff-clean-image-cache) + (quit-window)) +(put 'helm-ff-slideshow-quit 'no-helm-mx t) + +;;; Thumbnails view +;; +(defun helm-ff-maybe-show-thumbnails (candidates _source) + (require 'image-dired) + (if (and helm-ff--show-thumbnails + (null (file-remote-p helm-ff-default-directory))) + (prog1 + (cl-loop for (disp . img) in candidates + for type = (helm-acase (file-name-extension img) + ((guard (and (member it '("png" "jpg" "jpeg")) + (memq image-dired-thumbnail-storage + '(standard standard-large)))) + 'png) + (("jpg" "jpeg") 'jpeg) + ("png" 'png)) + if type collect + (let ((thumbnail (plist-get + (cdr (helm-ff--image-dired-get-thumbnail-image img)) + :file))) + ;; When icons are displayed the leading space handling disp + ;; prop is already here, just replace icon with the thumbnail. + (unless helm-ff-icon-mode (setq disp (concat " " disp))) + (add-text-properties 0 1 `(display (image + :type ,type + :margin 5 + :file ,thumbnail) + rear-nonsticky '(display)) + disp) + (cons disp img)) + else collect (cons disp img)) + ;; Ensure this is done AFTER previous clause otherwise thumb files will + ;; never be created if they don't already exist. + (cl-pushnew helm-ff-default-directory + helm-ff--thumbnailed-directories :test 'equal)) + candidates)) + +;; Same as `image-dired-get-thumbnail-image' but use +;; `helm-ff--image-dired-thumb-name' which cache thumbnails for further use. +(defun helm-ff--image-dired-get-thumbnail-image (file) + "Return the image descriptor for a thumbnail of image file FILE." + (unless (string-match-p (image-file-name-regexp) file) + (error "%s is not a valid image file" file)) + (let* ((thumb-file (helm-ff--image-dired-thumb-name file)) + thumb-attr) + ;; Don't check status of files with `file-attributes' if it has already been + ;; done in this session. + (when (and (not (member helm-ff-default-directory + helm-ff--thumbnailed-directories)) + (or (not (setq thumb-attr (file-attributes thumb-file))) + (time-less-p (file-attribute-modification-time thumb-attr) + (file-attribute-modification-time + (file-attributes file))))) + (image-dired-create-thumb file thumb-file)) + (create-image thumb-file))) + +(defvar helm-ff-image-dired-thumbnails-cache (make-hash-table :test 'equal) + "Store associations of image_file/thumbnail_file.") +(defun helm-ff--image-dired-thumb-name (file) + (or (gethash file helm-ff-image-dired-thumbnails-cache) + (let ((thumb-name (image-dired-thumb-name file))) + (puthash file thumb-name helm-ff-image-dired-thumbnails-cache) + thumb-name))) + +(defun helm-ff-toggle-thumbnails () + (interactive) + (cl-assert (null (file-remote-p helm-ff-default-directory)) + nil "Thumbnails show not supported on remote files") + (setq helm-ff--show-thumbnails (not helm-ff--show-thumbnails)) + (when helm-ff--show-thumbnails + (message "Loading thumbnails...") + (with-helm-after-update-hook + (sit-for 1) + (message "Loading thumbnails done"))) + (when (and (null helm-ff--show-thumbnails) + (member helm-ff-default-directory + helm-ff--thumbnailed-directories)) + (setq helm-ff--thumbnailed-directories + (delete helm-ff-default-directory helm-ff--thumbnailed-directories))) + (helm-force-update (regexp-quote (replace-regexp-in-string + "\\`[[:multibyte:] ]*" "" + (helm-get-selection nil t))))) +(put 'helm-ff-toggle-thumbnails 'no-helm-mx t) + +;;;###autoload +(defun helm-ff-clear-image-dired-thumbnails-cache () + "Clear `helm-ff-image-dired-thumbnails-cache'. +You may want to do this after customizing +`image-dired-thumbnail-storage' which may change the place where +thumbnail files are stored." + (interactive) + (clrhash helm-ff-image-dired-thumbnails-cache)) + +;;;###autoload +(defun helm-ff-cleanup-image-dired-dir-and-cache () + "Cleanup `image-dired-dir' directory. +Delete all thumb files that are no more associated with an existing +image file in `helm-ff-image-dired-thumbnails-cache'." + (interactive) + (cl-loop for key being the hash-keys in helm-ff-image-dired-thumbnails-cache + using (hash-value val) + unless (file-exists-p key) do + (progn + (message "Deleting %s" val) + (delete-file val) + (remhash key helm-ff-image-dired-thumbnails-cache)))) + +;;; Recursive dirs completion +;; +(defun helm-find-files-recursive-dirs (directory &optional input) + (when (string-match "\\([.]\\)\\{2\\}" input) + (setq input (replace-match "" nil t input))) + (message "Recursively searching %s from %s ..." + input (abbreviate-file-name directory)) + ;; Ensure to not create a new frame + (let (helm-actions-inherit-frame-settings) + (helm :sources + (helm-make-source + "Recursive directories" 'helm-locate-subdirs-source + :basedir (if (string-match-p + "\\`es" helm-locate-recursive-dirs-command) + directory + (shell-quote-argument directory)) + :subdir (shell-quote-argument input) + :candidate-transformer + `((lambda (candidates) + (cl-loop for c in candidates + when (and (file-directory-p c) + (null (helm-boring-directory-p + c helm-boring-file-regexp-list)) + (string-match-p ,(regexp-quote input) + (helm-basename c))) + collect (propertize c 'face 'helm-ff-dirs))) + helm-w32-pathname-transformer + (lambda (candidates) + (helm-ff-sort-candidates-1 candidates ,input))) + :persistent-action 'ignore + :action (lambda (c) + (helm-set-pattern + (file-name-as-directory (expand-file-name c))))) + :candidate-number-limit 999999 + :allow-nest t + :resume 'noresume + :ff-transformer-show-only-basename nil + :buffer "*helm recursive dirs*"))) + +(defun helm-ff-recursive-dirs (_candidate) + "Launch a recursive search in `helm-ff-default-directory'." + (with-helm-default-directory helm-ff-default-directory + (helm-find-files-recursive-dirs + (helm-current-directory) + (helm-basename (helm-get-selection))))) + +(defun helm-ff-file-compressed-p (candidate) + "Whether CANDIDATE is a compressed file or not." + (member (file-name-extension candidate) + helm-ff-file-compressed-list)) + +(defun helm-ff--fname-at-point () + "Try to guess fname at point." + (let ((end (point)) + (limit (helm-aif (bounds-of-thing-at-point 'filename) + (car it) + (point)))) + (save-excursion + (while (re-search-backward "\\(~\\|/\\|[[:lower:][:upper:]]:/\\)" + limit t)) + (buffer-substring-no-properties (point) end)))) + +(defun helm-insert-file-name-completion-at-point (_candidate) + "Insert file name completion at point. + +When completing i.e. there is already something at point, insert +filename abbreviated, relative or full according to initial +input, whereas when inserting i.e. there is nothing at point, +insert filename full, abbreviated or relative according to prefix +arg, respectively no prefix arg, one prefix arg or two prefix +arg." + (with-helm-current-buffer + (if buffer-read-only + (error "Error: Buffer `%s' is read-only" (buffer-name)) + (let* ((mkds (helm-marked-candidates :with-wildcard t)) + (candidate (car mkds)) + (end (point)) + (tap (helm-ffap-guesser)) + (guess (and (stringp tap) + (substring-no-properties tap))) + (beg (helm-aif (and guess + (save-excursion + (when (re-search-backward + (regexp-quote guess) + (pos-bol) t) + (point)))) + it (point))) + (full-path-p (and (stringp guess) + (or (string-match-p + (concat "^" (getenv "HOME")) + guess) + (string-match-p + "\\`\\(/\\|[[:lower:][:upper:]]:/\\)" + guess)))) + (escape-fn (if (memq major-mode + helm-modes-using-escaped-strings) + #'shell-quote-argument #'identity))) + (when (and beg end) + (delete-region beg end)) + (insert + (funcall + escape-fn + (helm-ff--format-fname-to-insert + candidate beg end full-path-p guess + helm-current-prefix-arg)) + (if (cdr mkds) " " "") + (mapconcat escape-fn + (cl-loop for f in (cdr mkds) + collect (helm-ff--format-fname-to-insert + f nil nil nil nil + helm-current-prefix-arg)) + " ")))))) + +(defun helm-ff--format-fname-to-insert (candidate + &optional beg end full-path guess prefarg) + (set-text-properties 0 (length candidate) nil candidate) + (if (and beg end guess (not (string= guess "")) + (null prefarg) + (or (string-match + "^\\(~/\\|/\\|[[:lower:][:upper:]]:/\\)" + guess) + (file-exists-p candidate))) + (cond (full-path + (expand-file-name candidate)) + ((string= (match-string 1 guess) "~/") + (abbreviate-file-name candidate)) + (t (file-relative-name candidate))) + (helm-acase prefarg + ('(4) (abbreviate-file-name candidate)) + ('(16) (file-relative-name candidate)) + ('(64) (helm-basename candidate)) + (t candidate)))) + +(cl-defun helm-find-files-history (arg &key (comp-read t)) + "The `helm-find-files' history. +Show the first `helm-ff-history-max-length' elements of +`helm-ff-history' in an `helm-comp-read'." + (interactive "p") + (let ((history (when helm-ff-history + (helm-fast-remove-dups helm-ff-history + :test 'equal)))) + (when history + (setq helm-ff-history + (if (>= (length history) helm-ff-history-max-length) + (helm-take history helm-ff-history-max-length) + history)) + (if comp-read + (let ((src (helm-build-sync-source "Helm Find Files History" + :candidates helm-ff-history + :fuzzy-match (helm-ff-fuzzy-matching-p) + :persistent-action 'ignore + :migemo t + :action (lambda (candidate) + (if arg + (helm-set-pattern + (expand-file-name candidate)) + (identity candidate)))))) + (helm :sources src + :resume 'noresume + :buffer helm-ff-history-buffer-name + :allow-nest t)) + helm-ff-history)))) +(put 'helm-find-files-history 'helm-only t) + +(defvar helm-ff-drag-mouse-1-default-action 'copy + "Default action when dragging files. +Possible values are `copy', `rsync' or `rename'.") + +(defvar helm-ff-drag-and-drop-default-directory nil + "Default directory where to drop files on a drag-and-drop action. +It is used when no suitable directory is found at drop place, +generally when dropping outside of an emacs frame. +You want generally to set this to your home desktop directory.") + +(defun helm-ff-drag-mouse-1-fn (event) + "Drag-and-drop function for `helm-find-files'. +Allows dropping marked files to another frame or window. +When dropping to another frame (i.e. not the selected one where helm +is running), you are asked for which directory you want to drop to when frame +displays more than one window. +When no suitable place to drop is found ask to drop to +`helm-ff-drag-and-drop-default-directory' if set." + (interactive "e") + (cl-assert (memq helm-ff-drag-mouse-1-default-action + '(copy rsync rename))) + (let* ((win-or-frame (posn-window (event-end event))) + (target-frame (when (framep win-or-frame) + (car (mouse-pixel-position)))) + (target (with-selected-window + (if target-frame + (frame-selected-window target-frame) + win-or-frame) + default-directory)) + (windows (and target-frame + (remove (helm-window) + (window-list target-frame 1))))) + (when windows + (setq target + (helm-acond ((cdr windows) + (x-popup-menu + t (list "Choose target" + (cons "" + (cl-loop for win in windows + for dir = (with-selected-window + win default-directory) + collect (cons dir dir)))))) + ((and (eql (window-buffer (car windows)) + helm-current-buffer) + helm-ff-drag-and-drop-default-directory) + (x-popup-menu + t (list "Choose target" + (cons "" + (list (cons it it)))))) + ((car windows) + (with-selected-window it default-directory))))) + (if (memq helm-ff-drag-mouse-1-default-action '(copy rsync)) + (helm-find-files-do-action + helm-ff-drag-mouse-1-default-action target) + (helm-run-after-exit + #'helm-find-files-do-action + helm-ff-drag-mouse-1-default-action target)))) + +(defun helm-find-files-1 (fname &optional preselect) + "Find FNAME filename with PRESELECT filename preselected. + +Use it for non-interactive calls of `helm-find-files'." + (require 'tramp) + ;; Resolve FNAME now outside of helm. + ;; [FIXME] When `helm-find-files-1' is used directly from lisp + ;; and FNAME is an abbreviated path, for some reasons + ;; `helm-update' is called many times before resolving + ;; the abbreviated path (Bug#1939) so be sure to pass a + ;; full path to helm-find-files-1. + (unless (string-match-p helm-ff-url-regexp fname) + (setq fname (expand-file-name (substitute-in-file-name fname)))) + (when (get-buffer helm-action-buffer) + (kill-buffer helm-action-buffer)) + (setq helm-find-files--toggle-bookmark nil) + (let* ( ;; Be sure we don't erase the precedent minibuffer if some. + (helm-ff-auto-update-initial-value + (and helm-ff-auto-update-initial-value + (not (minibuffer-window-active-p (minibuffer-window))))) + (tap (thing-at-point 'filename)) + (def (and tap (or (file-remote-p tap) + (expand-file-name tap)))) + ;; Ensure not being prompted for password each time we + ;; navigate to a directory. + (password-cache t)) + (helm-set-local-variable 'helm-follow-mode-persistent nil + 'helm-drag-mouse-1-fn 'helm-ff-drag-mouse-1-fn) + (unless helm-source-find-files + (setq helm-source-find-files (helm-make-source + "Find Files" 'helm-source-ffiles))) + (when (helm-get-attr 'follow helm-source-find-files) + (helm-set-attr 'follow -1 helm-source-find-files)) + ;; If preselected candidate is further than `helm-ff-candidate-number-limit' + ;; in the directory file list, we have to increase `candidate-number-limit' + ;; attr to have this candidate visible for preselection. NOTE: + ;; When HFF has yet not been launched in this directory the maximum length + ;; of this directory is unknown and candidate will NOT be selected until + ;; next time we call HFF on this same buffer. + (helm-aif (and preselect + (not helm-ff-preselect-ignore-large-dirs) + (gethash fname helm-ff--directory-files-length + helm-ff-candidate-number-limit)) + (helm-set-attr 'candidate-number-limit + (max it helm-ff-candidate-number-limit) + helm-source-find-files)) + (helm-ff-setup-update-hook) + (add-hook 'helm-resume-after-hook 'helm-ff--update-resume-after-hook) + (unwind-protect + (helm :sources 'helm-source-find-files + :input fname + :case-fold-search helm-file-name-case-fold-search + :preselect preselect + :ff-transformer-show-only-basename + helm-ff-transformer-show-only-basename + :default def + :prompt "Find files or url: " + :buffer "*helm find files*") + (helm-ff--update-resume-after-hook nil t) + (setq helm-ff-default-directory nil)))) + +(defun helm-ff--update-resume-after-hook (sources &optional nohook) + "Meant to be used in `helm-resume-after-hook'. +When NOHOOK is non-nil run inconditionally, otherwise only when +source is `helm-source-find-files'." + (when (or nohook (string= "Find Files" + (assoc-default 'name (car sources)))) + (helm-set-attr 'resume `(lambda () + (helm-ff-setup-update-hook) + (setq helm-ff-default-directory + ,helm-ff-default-directory + helm-ff-last-expanded + ,helm-ff-last-expanded)) + helm-source-find-files))) + +(defun helm-ff-clean-initial-input () + ;; When using hff in an external frame initial input is printed in + ;; the minibuffer of initial-frame, delete it. + (with-selected-frame helm-initial-frame + (helm-clean-up-minibuffer))) + +(defun helm-ff-setup-update-hook () + (dolist (hook '(helm-ff-clean-initial-input ; Add to be called first. + helm-ff-move-to-first-real-candidate + helm-ff-update-when-only-one-matched + helm-ff-auto-expand-to-home-or-root)) + (add-hook 'helm-after-update-hook hook))) + +(defun helm-find-files-cleanup () + (mapc (lambda (hook) + (remove-hook 'helm-after-update-hook hook)) + '(helm-ff-auto-expand-to-home-or-root + helm-ff-update-when-only-one-matched + helm-ff-move-to-first-real-candidate + helm-ff-clean-initial-input)) + (maphash (lambda (k _v) + (when (member k helm-ff--thumbnailed-directories) + (remhash k helm-ff--list-directory-cache))) + helm-ff--list-directory-cache) + (setq helm-ff--show-directories-only nil + helm-ff--show-files-only nil + helm-ff--show-thumbnails nil + helm-ff--thumbnailed-directories nil) + (helm-ff-clean-image-cache)) + +(defun helm-ff-bookmark () + (helm :sources 'helm-source-bookmark-helm-find-files + :buffer "*helm ff bookmarks*")) + +(defun helm-find-files-switch-to-bookmark () + "Switch to helm-bookmark for `helm-find-files' from `helm-find-files.'" + (interactive) + (require 'helm-bookmark) + (with-helm-alive-p + (helm-run-after-exit 'helm-ff-bookmark))) +(put 'helm-find-files-switch-to-bookmark 'helm-only t) + +(defun helm-find-files-initial-input (&optional input) + "Return INPUT if present, otherwise try to guess it." + (let ((guesser (helm-acase (helm-ffap-guesser) + ("" nil) + (t it)))) + (unless (eq major-mode 'image-mode) + (if input + (if (or (file-remote-p input) + (string-match helm-ff-url-regexp input)) + input + (expand-file-name input)) + (helm-find-files-input + (if (and helm-ff-allow-non-existing-file-at-point + guesser + (not (string-match ffap-url-regexp guesser))) + ;; Keep the ability of jumping to numbered lines even + ;; when allowing non existing filenames at point. + (helm-aand guesser + (thing-at-point 'filename) + (replace-regexp-in-string + ":[0-9]+\\'" "" it)) + guesser) + (thing-at-point 'filename)))))) + +(defun helm-ffap-guesser () + "Same as `ffap-guesser' but without gopher and machine support." + (require 'ffap) + ;; Avoid "Stack overflow in regexp matcher" error + ;; in evil `ffap-guesser' by removing crap `ffap-gopher-at-point' + ;; (bug fixed in emacs-26 http://debbugs.gnu.org/cgi/bugreport.cgi?bug=25391) . + ;; `ffap-machine-at-point' have been removed too as it was anyway + ;; disabled with `ffap-machine-p-known' bound to 'reject. + ;; `ffap-file-at-point' can be neutralized with + ;; `helm-ff-guess-ffap-filenames' and `ffap-url-at-point' with + ;; `helm-ff-guess-ffap-urls' + ;; Note also that `ffap-url-unwrap-remote' can override these + ;; variables. + (let ((ffap-alist (and helm-ff-guess-ffap-filenames ffap-alist)) + (ffap-url-regexp helm--url-regexp)) + (if (eq major-mode 'dired-mode) + (let ((beg (save-excursion (dired-move-to-filename))) + (end (save-excursion (dired-move-to-end-of-filename t)))) + (helm-aif (and beg end (member (buffer-substring beg end) + '("." ".."))) + (concat (file-name-as-directory + (expand-file-name dired-directory)) + (car it)) + (dired-get-filename 'no-dir t))) + (let* ((beg (and (use-region-p) (region-beginning))) + (end (and (use-region-p) (region-end))) + (str (and beg end (buffer-substring-no-properties beg end))) + (ffap (or (helm-aand helm-ff-guess-ffap-urls ffap-url-regexp + (ffap-url-at-point) + (ffap-fixup-url it) + (and (string-match ffap-url-regexp it) it)) + (ffap-file-at-point)))) + ;; Workaround emacs bugs: + ;; When the region is active and a file is detected + ;; `ffap-string-at-point' returns the region prefixed with + ;; "/", e.g. at a beginning of a patch (first bug) and make + ;; `file-remote-p' returning an error (second bug), so in such + ;; case returns the region itself instead of the region + ;; corrupted by ffap. + (if (and str ffap) str ffap))))) + +(defun helm-find-files-input (file-at-pt thing-at-pt) + "Try to guess a default input for `helm-find-files'." + (let* ((non-essential t) + (remp (or (and file-at-pt (file-remote-p file-at-pt)) + (and thing-at-pt (file-remote-p thing-at-pt)))) + (def-dir (helm-current-directory)) + (urlp (and file-at-pt helm--url-regexp + (string-match helm--url-regexp file-at-pt))) + (lib (when helm-ff-search-library-in-sexp + (helm-find-library-at-point))) + (hlink (helm-ff-find-url-at-point)) + (file-p (and file-at-pt + (not (string= file-at-pt "")) + (not remp) + (or (file-exists-p file-at-pt) + helm-ff-allow-non-existing-file-at-point) + (not urlp) + thing-at-pt + (not (string= thing-at-pt "")) + (file-exists-p + (file-name-directory + (expand-file-name thing-at-pt def-dir)))))) + (cond (lib) ; e.g we are inside a require sexp. + (hlink) ; String at point is an hyperlink. + (file-p ; a regular file + (and file-at-pt (if (not (member (helm-basename file-at-pt) + '("." ".."))) + (expand-file-name file-at-pt) + file-at-pt))) + (urlp (helm-html-decode-entities-string file-at-pt)) ; possibly an url or email. + ((and file-at-pt + (not remp) + (or helm-ff-allow-non-existing-file-at-point + (file-exists-p file-at-pt))) + (expand-file-name file-at-pt))))) + +(defun helm-ff-find-url-at-point () + "Try to find link to an url in text-property at point." + (let* ((he (get-text-property (point) 'help-echo)) + (ov (overlays-at (point))) + (ov-he (and ov (overlay-get + (car (overlays-at (point))) 'help-echo))) + (w3m-l (get-text-property (point) 'w3m-href-anchor)) + (nt-prop (get-text-property (point) 'nt-link))) + ;; Org link. + (when (and (stringp he) (string-match "^LINK: " he)) + (setq he (replace-match "" t t he))) + (cl-loop for i in (list he ov-he w3m-l nt-prop) + thereis (and (stringp i) helm--url-regexp (string-match helm--url-regexp i) i)))) + +(defun helm-find-library-at-point () + "Try to find library path at point. +Find inside `require' and `declare-function' sexp." + (require 'find-func) + (let* ((beg-sexp (save-excursion (search-backward "(" (pos-bol) t))) + (end-sexp (save-excursion (ignore-errors (end-of-defun)) (point))) + (sexp (and beg-sexp end-sexp + (buffer-substring-no-properties + (1+ beg-sexp) (1- end-sexp))))) + (ignore-errors + (cond (;; Should work only when point is on the use-package line + ;; i.e. first line of sexp otherwise it prevents matching + ;; urls with helm-find-files (bug #2469). + (and sexp (string-match "use-package +\\([^ )\n]+\\)" sexp)) + (find-library-name (match-string 1 sexp))) + ((and sexp (string-match "require +[']\\([^ )]+\\)" sexp)) + ;; If require use third arg, ignore it, + ;; always use library path found in `load-path'. + (find-library-name (match-string 1 sexp))) + ;; Assume declare-function sexps are on one line. + ((and sexp (string-match "declare-function .+? \"\\(?:ext:\\)?\\([^ )]+\\)\"" sexp)) + (find-library-name (match-string 1 sexp))) + (t nil))))) + + +;;; Handle copy, rename, symlink, relsymlink and hardlink from helm. +;; +;; +(defun helm-ff--valid-default-directory () + (with-helm-current-buffer + (cl-loop for b in (buffer-list) + for cd = (with-current-buffer b default-directory) + when (eq (car (file-attributes cd)) t) + return cd))) + +(cl-defun helm-dired-action (destination + &key action follow (files (dired-get-marked-files))) + "Execute ACTION on FILES to DESTINATION. +Where ACTION is a symbol that can be one of: +\\='copy', \\='rename', \\='symlink', \\='relsymlink', \\='hardlink' or \\='backup'. +Argument FOLLOW when non-nil specifies to follow FILES to +DESTINATION for the actions copy and rename." + (require 'dired-async) + (require 'dired-x) ; For dired-keep-marker-relsymlink + (when (get-buffer dired-log-buffer) (kill-buffer dired-log-buffer)) + ;; When default-directory in current-buffer is an invalid directory, + ;; (e.g buffer-file directory have been renamed somewhere else) + ;; be sure to use a valid value to give to dired-create-file. + ;; i.e start-process is creating a process buffer based on default-directory. + (let ((default-directory (helm-ff--valid-default-directory)) + (fn (cl-case action + (copy 'dired-copy-file) + (rename 'dired-rename-file) + (symlink 'make-symbolic-link) + (relsymlink 'dired-make-relative-symlink) + (hardlink 'dired-hardlink) + (backup 'backup-file))) + (marker (cl-case action + ((copy rename backup) dired-keep-marker-copy) + (symlink dired-keep-marker-symlink) + (relsymlink dired-keep-marker-relsymlink) + (hardlink dired-keep-marker-hardlink))) + (dirflag (and (= (length files) 1) + (file-directory-p (car files)) + (not (file-directory-p destination)))) + (dired-async-state (if (and (boundp 'dired-async-mode) + dired-async-mode) + 1 -1))) + (and follow (fboundp 'dired-async-mode) (dired-async-mode -1)) + ;; When dired-create-destination-dirs is available (emacs-27.1+) such error + ;; is handled later in dired-create-files. + (when (and (null (boundp 'dired-create-destination-dirs)) + (cdr files) (not (file-directory-p destination))) + (error "%s: target `%s' is not a directory" action destination)) + (unwind-protect + (dired-create-files + fn (symbol-name action) files + (if (file-directory-p destination) + ;; When DESTINATION is a directory, build file-name in this directory. + ;; Else we use DESTINATION. + (lambda (from) + (expand-file-name (file-name-nondirectory from) destination)) + (lambda (_from) destination)) + marker) + (and (fboundp 'dired-async-mode) + (dired-async-mode dired-async-state))) + (push (file-name-as-directory + (if (file-directory-p destination) + (expand-file-name destination) + (file-name-directory destination))) + helm-ff-history) + ;; If follow is non--nil we should not be in async mode. + (when (and follow + (not (memq action '(symlink relsymlink hardlink))) + (not (get-buffer dired-log-buffer))) + (let ((target (directory-file-name destination)) + (cands-to-mark (helm-get-dest-fnames-from-list files destination dirflag))) + (with-helm-after-update-hook (helm-ff-maybe-mark-candidates cands-to-mark)) + ;; Wait for the notify callback ends before calling HFF. + (run-at-time + 0.1 nil + (lambda () + (if (and dirflag (eq action 'rename)) + (helm-find-files-1 (file-name-directory target) + (format helm-ff-last-expanded-candidate-regexp + (if helm-ff-transformer-show-only-basename + (helm-basename target) target))) + (helm-find-files-1 (if (file-directory-p destination) + (file-name-as-directory + (expand-file-name destination)) + (expand-file-name (helm-basedir destination))) + (format helm-ff-last-expanded-candidate-regexp + (if helm-ff-transformer-show-only-basename + (helm-basename (car files)) + (car files))))))))))) + +(defun helm-get-dest-fnames-from-list (flist dest-cand rename-dir-flag) + "Transform filenames of FLIST to abs of DEST-CAND. +If RENAME-DIR-FLAG is non-nil collect the `directory-file-name' +of transformed members of FLIST." + ;; At this point files have been renamed/copied at destination. + ;; That's mean DEST-CAND exists. + (cl-loop + with dest = (expand-file-name dest-cand) + for src in flist + for basename-src = (helm-basename src) + for fname = (cond (rename-dir-flag (directory-file-name dest)) + ((file-directory-p dest) + (concat (file-name-as-directory dest) basename-src)) + (t dest)) + when (file-exists-p fname) + collect fname into tmp-list + finally return (sort tmp-list 'string<))) + +(defun helm-ff-maybe-mark-candidates (seq) + "Add visible mark to all candidates in SEQ. +This is used when copying/renaming/symlinking etc. and following +files to destination." + (when (and (string= (assoc-default 'name (helm-get-current-source)) + (assoc-default 'name helm-source-find-files)) + seq) + (with-helm-window + (while seq + (if (string= (car seq) (helm-get-selection)) + (progn + (helm-make-visible-mark) + (helm-next-line) + (setq seq (cdr seq))) + (helm-next-line))) + (unless (helm-this-visible-mark) + (helm-prev-visible-mark))))) + + +;;; Compress/uncompress files +;; +;; +(define-minor-mode helm-ff--compress-async-modeline-mode + "Notify mode-line that an async process run." + :group 'dired-async + :global t + :lighter (:eval (propertize (format " [%s async job (Un)compressing file(s)]" + (length (dired-async-processes + 'helm-async-compress))) + 'face 'helm-delete-async-message)) + (unless helm-ff--compress-async-modeline-mode + (let ((visible-bell t)) (ding)))) + +(defun helm-do-compress-to (ifiles ofile) + "Compress IFILES files/directories to the OFILE archive. +Choose the archiving command based on the OFILE extension +and `dired-compress-files-alist'." + (let ((cmd (cl-loop for (r . c) in dired-compress-files-alist + when (string-match r ofile) return c)) + (error-file (expand-file-name + "dired-shell-command-output" temporary-file-directory))) + (cl-assert + cmd nil + "No compression rule found for %s, see `dired-compress-files-alist'" ofile) + (when (and (file-exists-p ofile) + (not (y-or-n-p + (format "%s exists, overwrite?" + (abbreviate-file-name ofile))))) + (message "Compression aborted")) + (message "Compressing %d file(s) to `%s'..." + (length ifiles) (helm-basename ofile)) + (process-put + (async-start + `(lambda () + (require 'cl-lib) + (require 'dired-aux) + (let* ((default-directory + (cl-loop with base = (car ',ifiles) + for file in ',ifiles + do (setq base (fill-common-string-prefix base file)) + finally return (file-name-directory base))) + (local-name (shell-quote-argument (file-local-name ,ofile))) + (input (mapconcat + (lambda (in-file) + (shell-quote-argument (file-relative-name in-file))) + ',ifiles " ")) + process-status) + (when (not (zerop + (setq process-status + (dired-shell-command + (format-spec ,cmd `((?o . ,local-name) (?i . ,input))))))) + (let ((error-output (with-current-buffer " *dired-check-process output*" + (buffer-string)))) + (with-temp-file ,error-file + (insert error-output)))) + process-status)) + (lambda (result) + (unless (dired-async-processes 'helm-async-compress) + (helm-ff--compress-async-modeline-mode -1)) + (if (zerop result) ; dired-shell-command succeed. + (progn + (message "Compressed %d file(s) to `%s' done" + (length ifiles) + (file-name-nondirectory ofile)) + (run-with-timer + 0.1 nil + (lambda (flist dest) + (dired-async-mode-line-message + "%s %d file(s) to %s done" + 'helm-delete-async-message + "Compressing" + (length flist) (helm-basename dest))) + ifiles ofile)) + (when (file-exists-p error-file) + (pop-to-buffer (find-file-noselect error-file)))))) + 'helm-async-compress t) + (helm-ff--compress-async-modeline-mode 1))) + +(defun helm-common-dir (files) + "Return the longest common directory path of FILES list" + (cl-loop with base = (car files) + for file in files + do (setq base (fill-common-string-prefix base file)) + finally return (file-name-directory base))) + +(defun helm-ff--dired-compress-file (file) + ;; `dired-compress-file' doesn't take care of binding `default-directory' when + ;; uncompressing FILE, as a result FILE is uncompressed in the directory where + ;; helm was started i.e. the current value of `default-directory'. + (with-helm-default-directory helm-ff-default-directory + (dired-compress-file file))) + +(defun helm-ff-quick-compress (_candidate) + "Compress or uncompress marked files without quitting." + (with-helm-window + (let (cfile) + (unwind-protect + (helm-read-answer-dolist-with-action + "Compress or uncompress file `%s'? " + (helm-marked-candidates) + (lambda (c) + (setq cfile (save-selected-window + (helm-ff--dired-compress-file c))) + (message nil) + (helm--remove-marked-and-update-mode-line c)) + #'abbreviate-file-name) + (setq helm-marked-candidates nil + helm-visible-mark-overlays nil) + (helm-force-update + (let ((presel (helm-get-selection))) + ;; FIXME: Probably this would never happen, I see no cases here where + ;; helm-get-selection doesn't exist. + (unless (file-exists-p presel) + (setq presel cfile)) + (when presel + (format helm-ff-last-expanded-candidate-regexp + (regexp-quote + (if (and helm-ff-transformer-show-only-basename + (not (helm-ff-dot-file-p presel))) + (helm-basename presel) presel)))))))))) + +(helm-make-persistent-command-from-action helm-ff-persistent-compress + "Compress or uncompress marked candidates without quitting." + 'quick-compress 'helm-ff-quick-compress) + +;;; Delete and trash files +;; +;; +(defun helm-file-buffers (filename) + "Return a list of buffer names corresponding to FILENAME." + (cl-loop with name = (expand-file-name filename) + for buf in (buffer-list) + for bfn = (buffer-file-name buf) + when (and bfn (string= name bfn)) + collect (buffer-name buf))) + +(defun helm-ff--delete-by-moving-to-trash (file) + "Decide to trash or delete FILE. +Return non-nil when FILE needs to be trashed." + (let ((remote (file-remote-p file))) + (or + (and delete-by-moving-to-trash + (null helm-current-prefix-arg) + (null current-prefix-arg) + (or (and remote helm-trash-remote-files) + (null remote))) + (and (null delete-by-moving-to-trash) + (or helm-current-prefix-arg + current-prefix-arg) + (or (and remote helm-trash-remote-files) + (null remote)))))) + +(defun helm-trash-directory () + "Try to find a trash directory. +Return the \"files\" subdirectory of trash directory. +When `helm-trash-default-directory' is set use it as trash directory." + (let* ((xdg-data-dir + (or helm-trash-default-directory + (directory-file-name + (expand-file-name "Trash" + (or (getenv "XDG_DATA_HOME") + "~/.local/share"))))) + (trash-files-dir (expand-file-name "files" xdg-data-dir))) + ;; Just return nil if the Trash directory is not yet created. It will be + ;; created later by `delete-directory'. + (and (file-exists-p trash-files-dir) trash-files-dir))) + +(cl-defun helm-ff-file-already-trashed (file &optional (trash-alist nil strash-alist)) + "Return FILE when it is already in trash. + +Optional arg TRASH-ALIST should be an alist as what +`helm-ff-trash-list' returns." + (unless (or (fboundp 'system-move-file-to-trash) + (and strash-alist (null trash-alist))) + (let ((trash-files-dir (helm-trash-directory))) + (cl-loop for (_bn . fn) in (or trash-alist + (helm-ff-trash-list trash-files-dir)) + thereis (and (file-equal-p file fn) file))))) + +(defun helm-ff-quick-delete (_candidate) + "Delete file CANDIDATE without quitting. + +When a prefix arg is given, meaning of +`delete-by-moving-to-trash' is the opposite." + (with-helm-window + (let* ((marked (helm-marked-candidates)) + (trash (helm-ff--delete-by-moving-to-trash (car marked))) + (helm-ff--trashed-files + (and trash (helm-ff-trash-list (helm-trash-directory))))) + (unwind-protect + (cl-loop for c in marked do + (progn (helm-preselect + (format helm-ff-last-expanded-candidate-regexp + (regexp-quote + (if (and helm-ff-transformer-show-only-basename + (not (helm-ff-dot-file-p c))) + (helm-basename c) c)))) + (when (y-or-n-p + (format "Really %s file `%s'? " + (if trash "Trash" "Delete") + (abbreviate-file-name c))) + (helm-acase (helm-delete-file + c helm-ff-signal-error-on-dot-files 'synchro trash) + (skip + ;; This happens only when trying to + ;; trash a file already trashed. + (helm-delete-visible-mark (helm-this-visible-mark)) + (if (helm-end-of-source-p) + (helm-previous-line) + (helm-next-line))) + (t (helm-delete-current-selection))) + (message nil) + (helm--remove-marked-and-update-mode-line c)))) + (setq helm-marked-candidates nil + helm-visible-mark-overlays nil) + (helm-force-update + (let ((presel (helm-get-selection))) + (when presel + (format helm-ff-last-expanded-candidate-regexp + (regexp-quote (if (and helm-ff-transformer-show-only-basename + (not (helm-ff-dot-file-p presel))) + (helm-basename presel) presel)))))))))) + +(defun helm-delete-file (file &optional error-if-dot-file-p synchro trash) + "Delete FILE after querying the user. + +When a prefix arg is given, meaning of +`delete-by-moving-to-trash' is the opposite. + +Return error when ERROR-IF-DOT-FILE-P is non-nil and user tries +to delete a dotted file i.e. \".\" or \"..\". + +Ask user when directory are not empty to allow recursive deletion +unless `helm-ff-allow-recursive-deletes' is non nil. +When user is asked and reply with \"!\" don't ask for remaining +directories. + +Ask to kill buffers associated with that file, too. + +When TRASH is non nil, trash FILE even if `delete-by-moving-to-trash' +is nil." + (require 'dired) + (cl-block nil + (when (and error-if-dot-file-p + (helm-ff-dot-file-p file)) + (error "Error: Cannot operate on `.' or `..'")) + (let ((buffers (helm-file-buffers file)) + (helm--reading-passwd-or-string t) + (file-attrs (file-attributes file)) + (trash (or trash (helm-ff--delete-by-moving-to-trash file))) + (delete-by-moving-to-trash trash) + (already-trashed + (and trash (helm-ff-file-already-trashed + file helm-ff--trashed-files)))) + (cond (already-trashed + ;; We use message here to avoid exiting loop when + ;; deleting more than one file. + (message "User error: `%s' is already trashed" file) + (sit-for 1.5) + (cl-return 'skip)) + ((and (eq (nth 0 file-attrs) t) + (directory-files file t directory-files-no-dot-files-regexp)) + ;; Synchro means persistent deletion from HFF. + (if synchro + (when (or helm-ff-allow-recursive-deletes + trash + (y-or-n-p (format "Recursive delete of `%s'? " + (abbreviate-file-name file)))) + (delete-directory file 'recursive trash)) + ;; Avoid using dired-delete-file really annoying in + ;; emacs-26 but allows using ! (instead of all) to not + ;; confirm anymore for recursive deletion of + ;; directory. This is not persistent for all session + ;; like emacs-26 does with dired-delete-file (think it + ;; is a bug). + (if (or helm-ff-allow-recursive-deletes trash) + (delete-directory file 'recursive trash) + (helm-acase (helm-read-answer (format "Recursive delete of `%s'? [y,n,!,q]" + (abbreviate-file-name file)) + '("y" "n" "!" "q")) + ("y" (delete-directory file 'recursive trash)) + ("!" (setq helm-ff-allow-recursive-deletes t) + (delete-directory file 'recursive trash)) + ("n" (cl-return 'skip)) + ("q" (throw 'helm-abort-delete-file + (progn + (message "Abort file deletion") (sleep-for 1)))))))) + ((eq (nth 0 file-attrs) t) + (delete-directory file nil trash)) + (t (delete-file file trash))) + (when buffers + (dolist (buf buffers) + (when (y-or-n-p (format "Kill buffer %s, too? " buf)) + (kill-buffer buf))))))) + +(defun helm-delete-marked-files (_ignore) + "Delete marked files with `helm-delete-file'. + +When a prefix arg is given, meaning of +`delete-by-moving-to-trash' is the opposite." + (let* ((files (helm-marked-candidates :with-wildcard t)) + (len 0) + (trash (helm-ff--delete-by-moving-to-trash (car files))) + (helm-ff--trashed-files + (and trash (helm-ff-trash-list (helm-trash-directory)))) + (prmt (if trash "Trash" "Delete")) + (old--allow-recursive-deletes helm-ff-allow-recursive-deletes)) + (with-helm-display-marked-candidates + helm-marked-buffer-name + (helm-ff--count-and-collect-dups files) + (if (not (y-or-n-p (format "%s *%s File(s)" prmt (length files)))) + (message "(No deletions performed)") + (catch 'helm-abort-delete-file + (unwind-protect + (dolist (i files) + (set-text-properties 0 (length i) nil i) + (let ((res (helm-delete-file + i helm-ff-signal-error-on-dot-files nil trash))) + (if (eq res 'skip) + (progn (message "Directory is not empty, skipping") + (sleep-for 1)) + (cl-incf len)))) + (setq helm-ff-allow-recursive-deletes old--allow-recursive-deletes))) + (message "%s File(s) %s" len (if trash "trashed" "deleted")))))) + +;;; Delete files async +;; +;; +(defvar helm-ff-delete-log-file + (locate-user-emacs-file "helm-delete-file.log") + "The file use to communicate with Emacs child when deleting files async.") + +(defvar helm-ff--trash-flag nil) + +(define-minor-mode helm-ff--delete-async-modeline-mode + "Notify mode-line that an async process run." + :group 'dired-async + :global t + :lighter (:eval (propertize (format " %s file(s) async [%s job]..." + (if helm-ff--trash-flag + "Trashing" "Deleting") + (length (dired-async-processes + 'helm-delete-async))) + 'face 'helm-delete-async-message)) + (unless helm-ff--delete-async-modeline-mode + (let ((visible-bell t)) (ding)) + (setq helm-ff--trash-flag nil))) + +(defalias 'helm-delete-async-mode-line-message 'dired-async-mode-line-message) +(make-obsolete 'helm-delete-async-mode-line-message + 'dired-async-mode-line-message "3.9.8") + +(defun helm-delete-async-kill-process () + "Kill async process created by helm delete files async." + (interactive) + (let* ((processes (dired-async-processes)) + (proc (car (last processes)))) + (and proc (delete-process proc)) + (unless (> (length processes) 1) + (helm-ff--delete-async-modeline-mode -1)))) + +(defun helm-delete-marked-files-async (_ignore) + "Same as `helm-delete-marked-files' but async. + +When a prefix arg is given, meaning of +`delete-by-moving-to-trash' is the opposite. + +This function is not using `helm-delete-file' and BTW not asking +user for recursive deletion of directory, be warned that +directories are always deleted with no warnings." + (let* ((files (helm-marked-candidates :with-wildcard t)) + (trash (helm-ff--delete-by-moving-to-trash (car files))) + (prmt (if trash "Trash" "Delete")) + buffers callback already-trashed + ;; Workaround emacs-26 bug with tramp see + ;; https://github.com/jwiegley/emacs-async/issues/80. + (async-quiet-switch "-q")) + (cl-loop with trash-alist = (and trash (helm-ff-trash-list (helm-trash-directory))) + for f in files + for buf = (helm-file-buffers f) + for trashed = (helm-ff-file-already-trashed f trash-alist) + for dot-file-p = (helm-ff-dot-file-p f) + when (and helm-ff-signal-error-on-dot-files + dot-file-p) + do (cl-return (error "Error: Cannot operate on `.' or `..'")) + when buf + do (setq buffers (nconc buf buffers)) + when trashed + do (push trashed already-trashed)) + (setq callback (lambda (result) + (unless (dired-async-processes 'helm-delete-async) + (helm-ff--delete-async-modeline-mode -1)) + (when (file-exists-p helm-ff-delete-log-file) + (display-warning 'helm + (with-temp-buffer + (insert-file-contents + helm-ff-delete-log-file) + (buffer-string)) + :error + "*helm delete files*") + (fit-window-to-buffer (get-buffer-window + "*helm delete files*")) + (delete-file helm-ff-delete-log-file)) + (when buffers + (helm-read-answer-dolist-with-action + "Kill buffer `%s', too? " + buffers #'kill-buffer)) + (run-with-timer + 0.1 nil + (lambda () + (dired-async-mode-line-message + "%s (%s/%s) file(s) async done" + 'helm-delete-async-message + (if trash "Trashing" "Deleting") + result (length files)))))) + (setq helm-ff--trash-flag trash) + (with-helm-display-marked-candidates + helm-marked-buffer-name + (helm-ff--count-and-collect-dups files) + (if (not (y-or-n-p (format "%s *%s File(s)" prmt (length files)))) + (message "(No deletions performed)") + (process-put + (async-start + `(lambda () + (require 'cl-lib) + ;; `delete-by-moving-to-trash' have to be set globally, + ;; using the TRASH argument of delete-file or + ;; delete-directory is not enough. + (setq delete-by-moving-to-trash ,trash) + (let ((result 0)) + (dolist (file ',files result) + (condition-case err + (cond ((and ,trash + (cl-loop for f in ',already-trashed + thereis (file-equal-p f file))) + (error (format "`%s' is already trashed" file))) + ((eq (nth 0 (file-attributes file)) t) + (delete-directory file 'recursive ,trash) + (setq result (1+ result))) + (t (delete-file file ,trash) + (setq result (1+ result)))) + (error (with-temp-file ,helm-ff-delete-log-file + (insert (format-time-string "%x:%H:%M:%S\n")) + (insert (format "%S\n " err)))))))) + callback) + 'helm-delete-async t) + (helm-ff--delete-async-modeline-mode 1))))) + +(defun helm-find-file-or-marked (candidate) + "Open file CANDIDATE or open helm marked files in separate windows. +Called with one prefix arg open files in separate windows in a +vertical split. +Called with two prefix arg open files in background without +selecting them." + (let ((marked (helm-marked-candidates :with-wildcard t)) + (url-p (and helm--url-regexp ; we should have only one candidate. + (string-match helm--url-regexp candidate))) + (ffap-newfile-prompt helm-ff-newfile-prompt-p) + (find-file-wildcards nil) + (helm--reading-passwd-or-string t)) + (if (cdr marked) + (if (equal helm-current-prefix-arg '(16)) + (mapc 'find-file-noselect marked) + ;; If helm-current-prefix-arg is detected split is done + ;; vertically. + (helm-window-show-buffers (mapcar 'find-file-noselect marked))) + (let ((dir (and (not url-p) (helm-basedir candidate)))) + (cond ((and dir (file-directory-p dir)) + (find-file (substitute-in-file-name candidate))) + (url-p (find-file-at-point candidate)) + ;; A a non--existing filename ending with / + ;; Create a directory and jump to it. + ((and (not (file-exists-p candidate)) + (string-match "/$" candidate)) + (helm-ff--mkdir candidate 'helm-ff)) + ;; A non--existing filename NOT ending with / or + ;; an existing filename, create or jump to it. + ;; If the basedir of candidate doesn't exists, + ;; ask for creating it. + (dir + (helm-ff--mkdir dir) + (find-file candidate)) + ;; Find file at `default-directory' when basedir is + ;; unspecified e.g user hit C-k foo RET. + (t (find-file candidate))))))) + +(helm-make-command-from-action helm-ff-find-file-other-tab + "Run find file in other tab action from `helm-source-buffers-list'." + 'find-file-other-tab + (cl-assert (fboundp 'tab-bar-mode) nil "Tab-bar-mode not available")) + +(defun helm-ff--new-dirs-to-update (path) + "Collect directories to update when creating new directory PATH." + (let ((result (list path))) + (helm-awhile (helm-reduce-file-name path 1) + (if (not (file-directory-p it)) + (progn (push it result) (setq path it)) + (push it result) + (cl-return))) + result)) + +(defun helm-ff--mkdir (dir &optional helm-ff) + (when (or (not confirm-nonexistent-file-or-buffer) + (y-or-n-p (format "Create directory `%s'? " + (abbreviate-file-name + (expand-file-name dir))))) + (let ((dirfname (directory-file-name dir)) + (to-update (and helm-ff (helm-ff--new-dirs-to-update dir)))) + (if (file-exists-p dirfname) + (error + "Mkdir: Unable to create directory `%s': file exists." + (helm-basename dirfname)) + (make-directory dir 'parent)) + (when helm-ff + ;; Refresh cache. + (mapc (lambda (x) (helm-ff-directory-files x t)) to-update) + ;; Allow having this new dir in history + ;; to be able to retrieve it immediately + ;; if we want to e.g copy a file from somewhere in it. + (setq helm-ff-default-directory + (file-name-as-directory (expand-file-name dir))) + (push helm-ff-default-directory helm-ff-history)) + (or (and helm-ff (helm-find-files-1 dir)) t)))) + +(defun helm-transform-file-load-el (actions candidate) + "Add action to load the file CANDIDATE if it is an Emacs Lisp +file. Else return ACTIONS unmodified." + (if (member (file-name-extension candidate) '("el" "elc")) + (append actions '(("Load Emacs Lisp File" . load-file))) + actions)) + +(defun helm-transform-file-browse-url (actions candidate) + "Add an action to browse the file CANDIDATE if it is a HTML file or URL. +Else return ACTIONS unmodified." + (let ((browse-action '("Browse with Browser" . browse-url))) + (cond ((string-match "^http\\|^ftp" candidate) + (cons browse-action actions)) + ((string-match "\\.html?$" candidate) + (append actions (list browse-action))) + (t actions)))) + +(defun helm-file-on-mounted-network-p (file) + "Return non-nil when FILE is part of a mounted remote directory. + +This function is checking `helm-mounted-network-directories' +list." + (when helm-mounted-network-directories + (cl-loop for dir in helm-mounted-network-directories + thereis (file-in-directory-p file dir)))) + +;; helm-find-files bindings for filecache +(defvar file-cache-alist) + +(defun helm-ff-cache-add-file (_candidate) + (require 'filecache) + (let ((mkd (helm-marked-candidates :with-wildcard t))) + (mapc 'file-cache-add-file mkd))) + +(defun helm-ff-file-cache-remove-file-1 (file) + "Remove FILE from `file-cache-alist'." + (let ((entry (assoc (helm-basename file) file-cache-alist)) + (dir (helm-basedir file)) + new-entry) + (setq new-entry (remove dir entry)) + (when (= (length entry) 1) + (setq new-entry nil)) + (setq file-cache-alist + (cons new-entry (remove entry file-cache-alist))))) + +(defun helm-ff-file-cache-remove-file (_file) + "Remove marked files from `file-cache-alist.'" + (let ((mkd (helm-marked-candidates))) + (mapc 'helm-ff-file-cache-remove-file-1 mkd))) + +;;; Find files in file +;; +;; +(defclass helm-find-files-in-file-class (helm-source-in-file helm-type-file) ()) +(cl-defmethod helm--setup-source ((source helm-find-files-in-file-class)) + (helm-aif (slot-value source 'candidate-transformer) + (setf (slot-value source 'candidate-transformer) + (append (helm-mklist it) + (list (lambda (candidates) + (cl-loop for c in candidates + when (and (not (string= c "")) + (file-exists-p c)) + collect c))))))) + +(defun helm-find-files-in-file-build-source (file) + (helm-make-source + (format "Find files in `%s'" (helm-basename file)) + 'helm-find-files-in-file-class + :candidates-file file)) + +(defun helm-find-files-in-file (_file) + "Helm action for listing filenames listed in marked files." + (require 'helm-for-files) + (let ((sources (cl-loop for f in (helm-marked-candidates) + collect (helm-find-files-in-file-build-source f)))) + (helm :sources sources + :quit-if-no-candidate (lambda () + (message "No files found in file(s)")) + :buffer "*helm find files in files*"))) + +(cl-defun helm-ff-mcp (_candidate) + "Copy the car of marked candidates to the remaining marked candidates. + +The car of marked should be a regular file and the rest of marked (cdr) should +be directories." + (let* ((mkd (helm-marked-candidates)) + (file (car mkd)) + (targets (cdr mkd)) + (skipped 0) + operations) + (cl-assert (file-regular-p file) nil (format "ERROR: Not a regular file `%s'" file)) + (cl-assert targets nil (format "ERROR: No destination specified for file `%s'" file)) + (cl-assert (cl-loop for f in targets always (file-directory-p f)) nil + "ERROR: Destinations must be directories") + (when targets + (cl-loop with yes-for-all + for dest in targets + for dest-file = (expand-file-name (helm-basename file) dest) + for dir-ok = (file-accessible-directory-p dest) + for exists = (and dir-ok + (file-exists-p + (expand-file-name + (helm-basename file) dest))) + for overwrite = (or (null exists) + yes-for-all + (helm-acase (helm-read-answer + (format + "File `%s' already-exists, overwrite (y,n,!,q) ? " + dest-file) + '("y" "n" "!" "q")) + ("y" t) + ("n" nil) + ("!" (prog1 t + (setq yes-for-all t))) + ("q" (cl-return-from helm-ff-mcp + (message "Operation aborted"))))) + if dir-ok + do (if overwrite + (push (list file (file-name-as-directory dest) overwrite) operations) + (cl-incf skipped)) + else do (cl-incf skipped)) + (when operations + (with-helm-display-marked-candidates + helm-marked-buffer-name + (mapcar #'abbreviate-file-name targets) + (if (y-or-n-p (format "Copy `%s' to directories?" (helm-basename file))) + (progn + (process-put + (async-start + `(lambda () + (require 'cl-lib) + (cl-loop with copies = 0 + with skipped = ,skipped + for (file dest overwrite) in ',operations + do (condition-case _err + (progn + (copy-file file dest overwrite) + (cl-incf copies)) + (file-error (cl-incf skipped))) + finally return (list file copies skipped))) + (lambda (result) + (let ((copied (nth 1 result))) + (unless (dired-async-processes) + (dired-async--modeline-mode -1)) + (run-with-idle-timer + 0.1 nil + (lambda () + (dired-async-mode-line-message + "Mcp done, %s %s of %s done, %s files skipped" + 'dired-async-message + copied + (if (> copied 1) + "copies" "copy") + (helm-basename (nth 0 result)) + (nth 2 result))))))) + 'dired-async-process t) + (dired-async--modeline-mode 1)) + (message "Operation aborted"))))))) + +(helm-make-command-from-action helm-ff-run-mcp + "Copy the car of marked candidates to the remaining marked candidates." + 'helm-ff-mcp) +;;; File name history +;; +;; +(defun helm-files-save-file-name-history (&optional force) + "Save marked files to `file-name-history'." + (let* ((src (helm-get-current-source)) + (src-name (assoc-default 'name src))) + (when (or force (helm-file-completion-source-p src) + (member src-name helm-files-save-history-extra-sources)) + (let ((mkd (helm-marked-candidates :with-wildcard t)) + (history-delete-duplicates t)) + (cl-loop for sel in mkd + when (and sel + (stringp sel) + ;; If file was one of HFF candidates assume it + ;; is an existing file, so no need to call + ;; file-exists-p which is costly on remote candidates. + ;; (file-exists-p sel) + (not (helm-ff--file-directory-p sel)) + ;; When creating a new directory previous test + ;; check for file-directory-p BEFORE its + ;; creation, so check for ending slash as + ;; well to know if it is a future directory. + (not (string-match "/\\'" sel))) + do + ;; we use `abbreviate-file-name' here because + ;; other parts of Emacs seems to, + ;; and we don't want to introduce duplicates. + (add-to-history 'file-name-history + (abbreviate-file-name sel))))))) +(add-hook 'helm-exit-minibuffer-hook 'helm-files-save-file-name-history) + +(defvar helm-source-file-name-history + (helm-build-sync-source "File Name History" + :candidates 'file-name-history + :persistent-action #'ignore + :filtered-candidate-transformer #'helm-file-name-history-transformer + :action 'helm-type-file-actions)) + +(defun helm-file-name-history-show-or-hide-deleted () + (interactive) + (setq helm-file-name-history-hide-deleted + (not helm-file-name-history-hide-deleted)) + (helm-update)) +(put 'helm-file-name-history-show-or-hide-deleted 'helm-only t) + +(defvar helm-file-name-history-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map helm-map) + (define-key map (kbd "C-c d") 'helm-file-name-history-show-or-hide-deleted) + (define-key map (kbd "C-x C-f") 'helm-ff-file-name-history-run-ff) + map)) + +(defun helm-file-name-history-transformer (candidates _source) + (cl-loop with lgst = helm-file-name-history-max-length + for elm in candidates + for c = (truncate-string-to-width + elm helm-file-name-history-max-length nil nil t) + for disp = (cond ((or (file-remote-p elm) + (and (fboundp 'tramp-archive-file-name-p) + (tramp-archive-file-name-p c))) + (propertize c 'face 'helm-history-remote)) + ((file-exists-p elm) + (let ((last-access (format-time-string "%d/%m/%Y %X" + (nth 4 (file-attributes elm))))) + (propertize + elm 'display + (concat (propertize c 'face 'helm-ff-file) + (make-string (1+ (- lgst (length c))) ? ) + last-access)))) + (t (unless helm-file-name-history-hide-deleted + (propertize c 'face 'helm-history-deleted)))) + when disp + collect (cons (if helm-ff-icon-mode + (concat (all-the-icons-icon-for-file + (helm-basename elm)) + " " disp) + disp) + c))) + +(defun helm-ff-file-name-history-ff (candidate) + (helm-set-pattern + (expand-file-name candidate))) + +(helm-make-command-from-action helm-ff-file-name-history-run-ff + "Switch back to current HFF session with selection as preselect." + 'helm-ff-file-name-history-ff) + +(defun helm-ff-file-name-history-delete-item (_candidate) + (let ((files (helm-marked-candidates))) + (with-helm-display-marked-candidates + helm-marked-buffer-name + (helm-ff--count-and-collect-dups files) + (when (y-or-n-p "Delete file(s) from history? ") + (cl-loop for f in files do + (setq file-name-history (delete f file-name-history)))) + (message nil)))) + +(defun helm-ff-file-name-history () + "Switch to `file-name-history' without quitting `helm-find-files'." + (interactive) + (let ((src (helm-build-sync-source "File name history" + :init (lambda () + (with-helm-alive-p + (when helm-ff-file-name-history-use-recentf + (require 'recentf) + (or recentf-mode (recentf-mode 1))))) + :candidate-number-limit (helm-aand (or (get 'file-name-history 'history-length) + history-length) + (and (numberp it) it)) + :candidates (lambda () + (if helm-ff-file-name-history-use-recentf + recentf-list + file-name-history)) + :help-message 'helm-file-name-history-help-message + :fuzzy-match t + :persistent-action 'ignore + :migemo t + :filtered-candidate-transformer 'helm-file-name-history-transformer + :action (helm-make-actions + "Find file" (lambda (candidate) + (helm-set-pattern + (expand-file-name candidate)) + (with-helm-after-update-hook (helm-exit-minibuffer))) + "Find file in helm" 'helm-ff-file-name-history-ff + "Delete candidate(s)" 'helm-ff-file-name-history-delete-item) + :keymap helm-file-name-history-map))) + (with-helm-alive-p + (helm :sources src + :buffer "*helm-file-name-history*" + :allow-nest t + :resume 'noresume)))) +(put 'helm-ff-file-name-history 'helm-only t) + +;;; Browse project +;; Need dependencies: +;; +;; +;; Only hg and git are supported for now. +(defvar helm--browse-project-cache (make-hash-table :test 'equal)) +(defvar helm-buffers-in-project-p) + +(defvar helm-browse-project-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map helm-generic-files-map) + (define-key map (kbd "M-g a") 'helm-browse-project-run-ag) + map)) + +(defun helm-browse-project-get-buffers (root-directory) + (cl-loop for b in (helm-buffer-list) + ;; FIXME: Why default-directory is root-directory + ;; for current-buffer when coming from helm-quit-and-find-file. + for cd = (with-current-buffer b default-directory) + for bn = (buffer-file-name (get-buffer b)) + if (or (and bn (file-in-directory-p bn root-directory)) + (and (null bn) + (not (file-remote-p cd)) + (file-in-directory-p cd root-directory))) + collect b)) + +(defun helm-browse-project-build-buffers-source (directory) + (helm-make-source "Buffers in project" 'helm-source-buffers + :header-name (lambda (name) + (format + "%s (%s)" + name (abbreviate-file-name directory))) + :buffer-list (lambda () (helm-browse-project-get-buffers directory)))) + +(defun helm-browse-project-walk-directory (directory) + "Default function for `helm-browse-project-default-find-files-fn'." + (helm-walk-directory + directory + :directories nil :path 'full :skip-subdirs t)) + +(defun helm-browse-project-find-files-1 (directory program) + "List files in DIRECTORY recursively with external PROGRAM." + (require 'helm-fd) + (let* ((fd-exe (or helm-fd-executable + (executable-find "fdfind") + (executable-find "fd"))) + (cmd (cl-ecase program + (ag "ag --hidden -g '.*' %s") + (rg "rg --files --hidden -g '*' %s") + (fd (concat fd-exe " --hidden --type f --glob '*' %s"))))) + (with-temp-buffer + (call-process-shell-command + (format cmd directory) + nil t nil) + (mapcar (lambda (f) (expand-file-name f directory)) + (split-string (buffer-string) "\n"))))) + +(defun helm-browse-project-ag-find-files (directory) + "A suitable function for `helm-browse-project-default-find-files-fn'. +Use AG as backend." + (helm-browse-project-find-files-1 directory 'ag)) + +(defun helm-browse-project-rg-find-files (directory) + "A suitable function for `helm-browse-project-default-find-files-fn'. +Use RG as backend." + (helm-browse-project-find-files-1 directory 'rg)) + +(defun helm-browse-project-fd-find-files (directory) + "A suitable function for `helm-browse-project-default-find-files-fn'. +Use FD as backend." + (helm-browse-project-find-files-1 directory 'fd)) + +(defun helm-browse-project-ag (_candidate) + "A `helm-grep' AG action for `helm-browse-project'." + (let ((dir (with-helm-buffer (helm-get-attr 'root-dir)))) + (helm-grep-ag dir helm-current-prefix-arg))) + +(helm-make-command-from-action helm-browse-project-run-ag + "Run `helm-grep' AG from `helm-browse-project'." + 'helm-browse-project-ag) + +(defclass helm-browse-project-override-inheritor (helm-type-file) ()) + +(defclass helm-browse-project-source (helm-source-in-buffer + helm-browse-project-override-inheritor) + ((root-dir :initarg :root-dir + :initform nil + :custom 'file) + (match-part :initform + (lambda (c) + (if (with-helm-buffer + helm-ff-transformer-show-only-basename) + (helm-basename c) c))) + (filter-one-by-one :initform + (lambda (c) + (if (with-helm-buffer + helm-ff-transformer-show-only-basename) + (cons (propertize (helm-basename c) + 'face 'helm-ff-file) + c) + (propertize c 'face 'helm-ff-file))))) + "Class to define a source in `helm-browse-project' handling non +VC handled directories.") + +(cl-defmethod helm--setup-source :after ((source helm-browse-project-override-inheritor)) + (let ((actions (slot-value source 'action))) + (setf (slot-value source 'action) + (helm-append-at-nth + (symbol-value actions) + '(("Grep project with AG `M-g a, C-u select type'" . helm-browse-project-ag)) + 7)) + (setf (slot-value source 'keymap) helm-browse-project-map))) + +(defun helm-browse-project-find-files (directory &optional refresh) + "Browse non VC handled directory DIRECTORY." + (when refresh (remhash directory helm--browse-project-cache)) + (unless (gethash directory helm--browse-project-cache) + (puthash directory (funcall helm-browse-project-default-find-files-fn + directory) + helm--browse-project-cache)) + (helm :sources `(,(helm-browse-project-build-buffers-source directory) + ,(helm-make-source "Browse project" + 'helm-browse-project-source + :root-dir directory + :data (gethash directory helm--browse-project-cache) + :header-name + (lambda (name) + (format + "%s (%s)" + name (abbreviate-file-name directory))))) + :ff-transformer-show-only-basename nil + :buffer "*helm browse project*")) + +(defvar helm-browse-project-history nil) + +;;;###autoload +(defun helm-projects-history (&optional arg) + "Jump to project already visisted with `helm-browse-project'." + (interactive "P") + (helm :sources + (helm-build-sync-source "Project history" + :candidates helm-browse-project-history + :action (lambda (candidate) + (with-helm-default-directory candidate + (helm-browse-project + (or arg helm-current-prefix-arg))))) + :buffer "*helm browse project history*")) + +;;;###autoload +(defun helm-browse-project (arg) + "Preconfigured helm to browse projects. +Browse files and see status of project with its VCS. +Only HG and GIT are supported for now. +Fall back to `helm-browse-project-find-files' if current +directory is not under control of one of those VCS. +With a prefix ARG browse files recursively, with two prefix ARG +rebuild the cache. +If the current directory is found in the cache, start +`helm-browse-project-find-files' even with no prefix ARG. +NOTE: The prefix ARG have no effect on the VCS controlled +directories. + +Needed dependencies for VCS: + +and +." + (interactive "P") + (require 'helm-x-files) + (let ((helm-type-buffer-actions + (remove (assoc "Browse project from buffer" + helm-type-buffer-actions) + helm-type-buffer-actions)) + (helm-buffers-in-project-p t)) + (cl-flet ((push-to-hist (root) + (setq helm-browse-project-history + (cons root (delete root helm-browse-project-history))))) + (helm-acond ((and (require 'helm-ls-git nil t) + (fboundp 'helm-ls-git-root-dir) + (helm-ls-git-root-dir)) + (push-to-hist it) + (helm-ls-git)) + ((and (require 'helm-ls-hg nil t) + (fboundp 'helm-hg-root) + (helm-hg-root)) + (push-to-hist it) + (helm-hg-find-files-in-project)) + ((helm-browse-project-get--root-dir (helm-current-directory)) + (if (or arg (gethash it helm--browse-project-cache)) + (progn + (push-to-hist it) + (helm-browse-project-find-files it (equal arg '(16)))) + (helm :sources (helm-browse-project-build-buffers-source it) + :buffer "*helm browse project*"))))))) + +(defun helm-browse-project-get--root-dir (directory) + (cl-loop with dname = (file-name-as-directory directory) + while (and dname (not (gethash dname helm--browse-project-cache))) + if (file-remote-p dname) + do (setq dname nil) else + do (setq dname (helm-basedir (substring dname 0 (1- (length dname))))) + finally return (or dname (file-name-as-directory directory)))) + +(defun helm-ff-browse-project (_candidate) + "Browse project in current directory. +See `helm-browse-project'." + (with-helm-default-directory helm-ff-default-directory + (helm-browse-project helm-current-prefix-arg))) + +(helm-make-command-from-action helm-ff-run-browse-project + "Run browse project." + 'helm-ff-browse-project) + +;;; Actions calling helm and main interactive functions. +;; +;; +(defun helm-ff-gid (_candidate) + (with-helm-default-directory helm-ff-default-directory + (helm-gid))) + +(helm-make-command-from-action helm-ff-run-gid + "Run gid from HFF." + 'helm-ff-gid) + +;; helm-find bindings for helm-find-files. +(defun helm-ff-find-sh-command (_candidate) + "Run `helm-find' from `helm-find-files'." + (require 'helm-find) + (helm-find-1 helm-ff-default-directory)) + +(helm-make-command-from-action helm-ff-run-find-sh-command + "Run find shell command action with key from `helm-find-files'." + 'helm-ff-find-sh-command) + +;; helm-hd bindings for hff +(defun helm-ff-fd (_candidate) + "Run fd shell command from `helm-find-files'." + (require 'helm-fd) + (helm-fd-1 helm-ff-default-directory)) + +(helm-make-command-from-action helm-ff-run-fd + "Run fd shell command action with key from `helm-find-files'." + 'helm-ff-fd) + +;;;###autoload +(defun helm-find-files (arg) + "Preconfigured `helm' for helm implementation of `find-file'. +Called with a prefix arg show history if some. +Don't call it from programs, use `helm-find-files-1' instead. +This is the starting point for nearly all actions you can do on +files." + (interactive "P") + (let* (tramp-archive-enabled ; Disable tramp-archive which is + ; kicking in unexpectedly. + (hist (and arg helm-ff-history (helm-find-files-history nil))) + (smart-input (or hist (helm-find-files-initial-input))) + (default-input (expand-file-name (helm-current-directory))) + (input (cond ((and (null hist) + helm-find-files-ignore-thing-at-point) + default-input) + ((and (eq major-mode 'org-agenda-mode) + org-directory + (not smart-input)) + (file-name-as-directory + (expand-file-name org-directory))) + ((and (eq major-mode 'dired-mode) smart-input) + (file-name-directory smart-input)) + ((and (not (string= smart-input "")) + smart-input)) + (t default-input))) + (input-as-presel (null (file-directory-p input))) + (presel (helm-aif (or hist + (and input-as-presel input) + (buffer-file-name (current-buffer)) + (and (eq major-mode 'dired-mode) + smart-input)) + (if (and helm-ff-transformer-show-only-basename + (null hist) + (not (string-match-p "[.]\\{1,2\\}\\'" it))) + (helm-basename it) + it)))) + ;; Continue using the same display function as history which used + ;; probably itself the same display function as inner HFF call, + ;; i.e. if history was using frame use a frame otherwise use a window. + (when (and hist (buffer-live-p (get-buffer helm-ff-history-buffer-name))) + (helm-set-local-variable 'helm-display-function + (with-current-buffer helm-ff-history-buffer-name + helm-display-function) + 'helm--last-frame-parameters + (with-current-buffer helm-ff-history-buffer-name + helm--last-frame-parameters))) + (set-text-properties 0 (length input) nil input) + (setq current-prefix-arg nil) + ;; Allow next helm session to reuse helm--last-frame-parameters as + ;; resume would do. + (let ((helm--executing-helm-action (not (null hist)))) + (helm-find-files-1 input (and presel (null helm-ff-no-preselect) + (format helm-ff-last-expanded-candidate-regexp + (regexp-quote presel))))))) + + + +(provide 'helm-files) + +;;; helm-files.el ends here diff --git a/code/elpa/helm-20240320.541/helm-find.el b/code/elpa/helm-20240320.541/helm-find.el new file mode 100644 index 0000000..bdf6d8a --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-find.el @@ -0,0 +1,170 @@ +;;; helm-find.el --- helm interface for find command. -*- lexical-binding: t -*- + +;; Copyright (C) 2012 ~ 2023 Thierry Volpiatto + +;; 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 'helm-files) +(require 'helm-external) + +(defcustom helm-findutils-skip-boring-files t + "Ignore boring files in find command results." + :group 'helm-files + :type 'boolean) + +(defcustom helm-findutils-search-full-path nil + "Search in full path with shell command find when non-nil. +I.e. use the -path/ipath arguments of find instead of +-name/iname." + :group 'helm-files + :type 'boolean) + +(defcustom helm-find-noerrors nil + "Prevent showing error messages in helm buffer when non nil." + :group 'helm-files + :type 'boolean) + +(defvar helm-find-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map helm-generic-files-map) + (define-key map (kbd "DEL") 'helm-delete-backward-no-update) + map)) + +(defvar helm-source-findutils + (helm-build-async-source "Find" + :header-name (lambda (name) + (concat name " in [" (helm-default-directory) "]")) + :candidates-process 'helm-find-shell-command-fn + :filtered-candidate-transformer 'helm-findutils-transformer + :action-transformer 'helm-transform-file-load-el + :persistent-action 'helm-ff-kill-or-find-buffer-fname + :action 'helm-type-file-actions + :help-message 'helm-generic-file-help-message + :keymap helm-find-map + :candidate-number-limit 9999 + :requires-pattern 3)) + +(defun helm-findutils-transformer (candidates _source) + (let (non-essential + (default-directory (helm-default-directory))) + (cl-loop for i in candidates + for abs = (expand-file-name + (helm-aif (file-remote-p default-directory) + (concat it i) i)) + for type = (car (file-attributes abs)) + for disp = (if (and helm-ff-transformer-show-only-basename + (not (string-match "[.]\\{1,2\\}$" i))) + (helm-basename abs) abs) + collect (cond ((eq t type) + (cons (propertize disp 'face 'helm-ff-directory) + abs)) + ((stringp type) + (cons (propertize disp 'face 'helm-ff-symlink) + abs)) + (t (cons (propertize disp 'face 'helm-ff-file) + abs)))))) + +(defun helm-find--build-cmd-line () + (require 'find-cmd) + (let* ((default-directory (or (file-remote-p default-directory 'localname) + default-directory)) + (patterns+options (split-string helm-pattern "\\(\\`\\| +\\)\\* +")) + (fold-case (helm-set-case-fold-search (car patterns+options))) + (patterns (split-string (car patterns+options))) + (additional-options (and (cdr patterns+options) + (list (concat (cadr patterns+options) " ")))) + (ignored-dirs ()) + (ignored-files (when helm-findutils-skip-boring-files + (cl-loop for f in completion-ignored-extensions + if (string-match "/$" f) + do (push (replace-match "" nil t f) + ignored-dirs) + else collect (concat "*" f)))) + (path-or-name (if helm-findutils-search-full-path + '(ipath path) '(iname name))) + (name-or-iname (if fold-case + (car path-or-name) (cadr path-or-name)))) + (find-cmd (and ignored-dirs + `(prune (name ,@ignored-dirs))) + (and ignored-files + `(not (name ,@ignored-files))) + `(and ,@(mapcar + (lambda (pattern) + `(,name-or-iname ,(concat "*" pattern "*"))) + patterns) + ,@additional-options)))) + +(defun helm-find-shell-command-fn () + "Asynchronously fetch candidates for `helm-find'. +Additional find options can be specified after a \"*\" +separator." + (let* (process-connection-type + non-essential + (cmd (concat (helm-find--build-cmd-line) + (if helm-find-noerrors "2> /dev/null" ""))) + (proc (start-file-process-shell-command "hfind" helm-buffer cmd))) + (helm-log "helm-find-shell-command-fn" "Find command:\n%s" cmd) + (prog1 proc + (set-process-sentinel + proc + (lambda (process event) + (helm-process-deferred-sentinel-hook + process event (helm-default-directory)) + (if (string= event "finished\n") + (helm-locate-update-mode-line "Find") + (helm-log "helm-find-shell-command-fn sentinel" "Error: Find %s" + (replace-regexp-in-string "\n" "" event)))))))) + +(defun helm-find-1 (dir) + (let ((default-directory (file-name-as-directory dir))) + (helm :sources 'helm-source-findutils + :buffer "*helm find*" + :ff-transformer-show-only-basename nil + :case-fold-search helm-file-name-case-fold-search))) + + +;;; Preconfigured commands +;; +;; +;;;###autoload +(defun helm-find (arg) + "Preconfigured `helm' for the find shell command. + +Recursively find files whose names are matched by all specified +globbing PATTERNs under the current directory using the external +program specified in `find-program' (usually \"find\"). Every +input PATTERN is silently wrapped into two stars: *PATTERN*. + +With prefix argument, prompt for a directory to search. + +When user option `helm-findutils-search-full-path' is non-nil, +match against complete paths, otherwise, against file names +without directory part. + +The (possibly empty) list of globbing PATTERNs can be followed by +the separator \"*\" plus any number of additional arguments that +are passed to \"find\" literally." + (interactive "P") + (let ((directory + (if arg + (file-name-as-directory + (read-directory-name "DefaultDirectory: ")) + default-directory))) + (helm-find-1 directory))) + +(provide 'helm-find) + +;;; helm-find.el ends here diff --git a/code/elpa/helm-20240320.541/helm-font.el b/code/elpa/helm-20240320.541/helm-font.el new file mode 100644 index 0000000..9d43ffa --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-font.el @@ -0,0 +1,344 @@ +;;; helm-font --- Font and ucs selection for Helm -*- lexical-binding: t -*- + +;; Copyright (C) 2012 ~ 2023 Thierry Volpiatto + +;; 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 'helm) +(require 'helm-help) + +;; No warnings in Emacs built --without-x +(declare-function x-list-fonts "xfaces.c") + +(declare-function helm-generic-sort-fn "helm-utils") + +(defgroup helm-font nil + "Related applications to display fonts in Helm." + :group 'helm) + +(defcustom helm-ucs-recent-size 10 + "Number of recent chars to keep." + :type 'integer + :group 'helm-font) + +(defcustom helm-ucs-actions + '(("Insert character" . helm-ucs-insert-char) + ("Insert character name" . helm-ucs-insert-name) + ("Insert character code in hex" . helm-ucs-insert-code) + ("Kill marked characters" . helm-ucs-kill-char) + ("Kill name" . helm-ucs-kill-name) + ("Kill code" . helm-ucs-kill-code) + ("Describe char" . helm-ucs-describe-char)) + "Actions for `helm-source-ucs'." + :group 'helm-font + :type '(alist :key-type string :value-type function)) + +(defvar helm-ucs-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map helm-map) + (define-key map (kbd "") 'helm-ucs-persistent-delete) + (define-key map (kbd "") 'helm-ucs-persistent-backward) + (define-key map (kbd "") 'helm-ucs-persistent-forward) + (define-key map (kbd "C-c SPC") 'helm-ucs-persistent-insert-space) + map) + "Keymap for `helm-ucs'.") + +(defface helm-ucs-char + `((((class color) (background dark)) + ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "Gold")) + "Face used to display ucs characters." + :group 'helm-font) + +;;; Xfont selection +;; +;; +(defvar helm-xfonts-cache nil) +(defvar helm-previous-font nil) +(defvar helm-source-xfonts + (helm-build-sync-source "X Fonts" + :init (lambda () + (unless helm-xfonts-cache + (setq helm-xfonts-cache + (x-list-fonts "*"))) + ;; Save current font so it can be restored in cleanup + (setq helm-previous-font (cdr (assq 'font (frame-parameters))))) + :candidates 'helm-xfonts-cache + :action '(("Copy font to kill ring" . (lambda (elm) + (kill-new elm))) + ("Set font" . (lambda (elm) + (kill-new elm) + (set-frame-font elm 'keep-size) + (message "Font copied to kill ring")))) + :cleanup (lambda () + ;; Restore previous font + (set-frame-font helm-previous-font 'keep-size)) + :persistent-action (lambda (new-font) + (set-frame-font new-font 'keep-size) + (kill-new new-font)) + :persistent-help "Preview font and copy to kill-ring")) + + +;;; 𝕌𝕔𝕤 𝕊𝕪𝕞𝕓𝕠𝕝 𝕔𝕠𝕞𝕡𝕝𝕖𝕥𝕚𝕠𝕟 +;; +;; +(defvar helm-ucs--max-len nil) +(defvar helm-ucs--names nil) +(defvar helm-ucs-history nil) +(defvar helm-ucs-recent nil + "Ring of recent `helm-ucs' selections.") + +(defun helm-calculate-ucs-alist-max-len (names) + "Calculate the length of the longest NAMES list candidate." + (cl-loop for (_n . v) in names + maximize (length (format "#x%x:" v)) into code + maximize (max 1 (string-width (format "%c" v))) into char + finally return (cons code char))) + +(defun helm-calculate-ucs-hash-table-max-len (names) + "Calculate the length of the longest NAMES hash table candidate." + (cl-loop for _n being the hash-keys of names + using (hash-values v) + maximize (length (format "#x%x:" v)) into code + maximize (max 1 (string-width (format "%c" v))) into char + finally return (cons code char))) + +(defun helm-calculate-ucs-max-len () + "Calculate the length of the longest `ucs-names' candidate." + (let ((ucs-struct (ucs-names))) + (if (hash-table-p ucs-struct) + (helm-calculate-ucs-hash-table-max-len ucs-struct) + (helm-calculate-ucs-alist-max-len ucs-struct)))) + +(defun helm-ucs-collect-symbols-alist (names) + "Collect ucs symbols from the NAMES list." + (cl-loop with pr = (make-progress-reporter + "collecting ucs names" + 0 (length names)) + for (n . v) in names + for count from 1 + for xcode = (format "#x%x:" v) + for len = (length xcode) + for diff = (- (car helm-ucs--max-len) len) + for code = (format "(#x%x): " v) + for char = (propertize (format "%c" v) + 'face 'helm-ucs-char) + unless (or (string= "" n) + ;; `char-displayable-p' return a font object or + ;; t for some char that are displayable but have + ;; no special font (e.g 10) so filter out char + ;; with no font. + (not (fontp (char-displayable-p (read xcode))))) + collect + (concat code (make-string diff ? ) + char " " n) + and do (progress-reporter-update pr count))) + +(defun helm-ucs-collect-symbols-hash-table (names) + "Collect ucs symbols from the NAMES hash-table." + (cl-loop with pr = (make-progress-reporter + "collecting ucs names" + 0 (hash-table-count names)) + for n being the hash-keys of names + using (hash-values v) + for count from 1 + for xcode = (format "#x%x:" v) + for len = (length xcode) + for diff = (- (car helm-ucs--max-len) len) + for code = (format "(#x%x): " v) + for char = (propertize (format "%c" v) + 'face 'helm-ucs-char) + unless (or (string= "" n) + (not (fontp (char-displayable-p (read xcode))))) + collect + (concat code (make-string diff ? ) + char " " n) + and do (progress-reporter-update pr count))) + +(defun helm-ucs-collect-symbols (ucs-struct) + "Collect ucs symbols from UCS-STRUCT. + +Depending on the Emacs version, the variable `ucs-names' can +either be an alist or a hash-table." + (if (hash-table-p ucs-struct) + (helm-ucs-collect-symbols-hash-table ucs-struct) + (helm-ucs-collect-symbols-alist ucs-struct))) + +(defun helm-ucs-init () + "Initialize a Helm buffer with ucs symbols. +Only math* symbols are collected." + (unless helm-ucs--max-len + (setq helm-ucs--max-len + (helm-calculate-ucs-max-len))) + (or helm-ucs--names + (setq helm-ucs--names + (helm-ucs-collect-symbols (ucs-names))))) + +;; Actions (insertion) + +(defun helm-ucs-match (candidate n) + "Return the N part of an ucs CANDIDATE. +Where N=1 is the ucs code, N=2 the ucs char and N=3 the ucs +name." + (when (string-match + "^(\\(#x[a-f0-9]+\\)): *\\(.\\) *\\([^:]+\\)+" + candidate) + (match-string n candidate))) + +(defun helm-ucs-save-recentest (candidate) + (let ((lst (cons candidate (delete candidate helm-ucs-recent)))) + (setq helm-ucs-recent + (if (> (length lst) helm-ucs-recent-size) + (nbutlast lst 1) + lst)))) + +(defun helm-ucs-insert (candidate n) + "Insert the N part of CANDIDATE." + (with-helm-current-buffer + (helm-ucs-save-recentest candidate) + (insert (helm-ucs-match candidate n)))) + +(defun helm-ucs-insert-char (candidate) + "Insert ucs char part of CANDIDATE at point." + (helm-ucs-insert candidate 2)) + +(defun helm-ucs-insert-code (candidate) + "Insert ucs code part of CANDIDATE at point." + (helm-ucs-insert candidate 1)) + +(defun helm-ucs-insert-name (candidate) + "Insert ucs name part of CANDIDATE at point." + (helm-ucs-insert candidate 3)) + +;; Kill actions +(defun helm-ucs-kill-char (_candidate) + "Action that concatenate ucs marked chars." + (let ((marked (helm-marked-candidates))) + (cl-loop for candidate in marked + do (helm-ucs-save-recentest candidate)) + (kill-new (mapconcat (lambda (x) + (helm-ucs-match x 2)) + marked "")))) + +(defun helm-ucs-kill-code (candidate) + (helm-ucs-save-recentest candidate) + (kill-new (helm-ucs-match candidate 1))) + +(defun helm-ucs-kill-name (candidate) + (helm-ucs-save-recentest candidate) + (kill-new (helm-ucs-match candidate 3))) + +;; Describe char +(defun helm-ucs-describe-char (candidate) + "Describe char CANDIDATE." + (with-temp-buffer + (insert (helm-ucs-match candidate 2)) + (describe-char (point-min)))) + +;; Navigation in current-buffer (persistent) + +(defun helm-ucs-forward-char (_candidate) + (with-helm-current-buffer + (forward-char 1))) + +(defun helm-ucs-backward-char (_candidate) + (with-helm-current-buffer + (forward-char -1))) + +(defun helm-ucs-delete-backward (_candidate) + (with-helm-current-buffer + (delete-char -1))) + +(defun helm-ucs-insert-space (_candidate) + (with-helm-current-buffer + (insert " "))) + +(defun helm-ucs-persistent-forward () + (interactive) + (with-helm-alive-p + (helm-set-attr 'action-forward 'helm-ucs-forward-char) + (helm-execute-persistent-action 'action-forward))) +(put 'helm-ucs-persistent-forward 'helm-only t) + +(defun helm-ucs-persistent-backward () + (interactive) + (with-helm-alive-p + (helm-set-attr 'action-back 'helm-ucs-backward-char) + (helm-execute-persistent-action 'action-back))) +(put 'helm-ucs-persistent-backward 'helm-only t) + +(defun helm-ucs-persistent-delete () + (interactive) + (with-helm-alive-p + (helm-set-attr 'action-delete 'helm-ucs-delete-backward) + (helm-execute-persistent-action 'action-delete))) +(put 'helm-ucs-persistent-delete 'helm-only t) + +(defun helm-ucs-persistent-insert-space () + (interactive) + (with-helm-alive-p + (helm-set-attr 'action-insert-space 'helm-ucs-insert-space) + (helm-execute-persistent-action 'action-insert-space))) + +(defvar helm-source-ucs-recent + (helm-build-sync-source "Recent UCS" + :action 'helm-ucs-actions + :candidates (lambda () helm-ucs-recent) + :help-message helm-ucs-help-message + :keymap helm-ucs-map + :volatile t)) + +(defvar helm-source-ucs + (helm-build-in-buffer-source "UCS names" + :data #'helm-ucs-init + :get-line #'buffer-substring + :help-message 'helm-ucs-help-message + :filtered-candidate-transformer + (lambda (candidates _source) (sort candidates #'helm-generic-sort-fn)) + :action 'helm-ucs-actions + :persistent-action (lambda (candidate) + (helm-ucs-insert-char candidate) + (helm-force-update)) + :keymap helm-ucs-map) + "Source for collecting `ucs-names' math symbols.") + +;;;###autoload +(defun helm-select-xfont () + "Preconfigured `helm' to select Xfont." + (interactive) + (helm :sources 'helm-source-xfonts + :buffer "*helm select xfont*")) + +;;;###autoload +(defun helm-ucs (arg) + "Preconfigured `helm' for `ucs-names'. + +Called with a prefix arg force reloading cache." + (interactive "P") + (when arg + (setq helm-ucs--names nil + helm-ucs--max-len nil + ucs-names nil)) + (let ((char (helm-aif (char-after) (string it)))) + (helm :sources (list helm-source-ucs-recent helm-source-ucs) + :history 'helm-ucs-history + :input (and char (multibyte-string-p char) char) + :buffer "*helm ucs*"))) + +(provide 'helm-font) + +;;; helm-font.el ends here diff --git a/code/elpa/helm-20240320.541/helm-for-files.el b/code/elpa/helm-20240320.541/helm-for-files.el new file mode 100644 index 0000000..0d55db9 --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-for-files.el @@ -0,0 +1,310 @@ +;;; helm-for-files.el --- helm-for-files and related. -*- lexical-binding: t -*- + +;; Copyright (C) 2012 ~ 2023 Thierry Volpiatto + +;; 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 'helm-files) +(require 'helm-external) +(require 'helm-bookmark) + +(defcustom helm-multi-files-toggle-locate-binding "C-c p" + "Default binding to switch back and forth locate in `helm-multi-files'." + :group 'helm-files + :type 'string) + +(defcustom helm-for-files-preferred-list + '(helm-source-buffers-list + helm-source-recentf + helm-source-bookmarks + helm-source-file-cache + helm-source-files-in-current-dir + helm-source-locate) + "Your preferred sources for `helm-for-files' and `helm-multi-files'. + +When adding a source here it is up to you to ensure the library +of this source is accessible and properly loaded." + :type '(repeat (choice symbol)) + :group 'helm-files) + +(defcustom helm-for-files-tramp-not-fancy t + "Colorize remote files when non nil. + +Be aware that a nil value will make tramp display very slow." + :group 'helm-files + :type 'boolean) + +;;; File Cache +;; +;; +(defvar file-cache-alist) + +(defclass helm-file-cache (helm-source-in-buffer helm-type-file) + ((init :initform (lambda () (require 'filecache))))) + +(defun helm-file-cache-get-candidates () + (cl-loop for item in file-cache-alist append + (cl-destructuring-bind (base &rest dirs) item + (cl-loop for dir in dirs collect + (concat dir base))))) + +(defvar helm-source-file-cache nil) + +(defcustom helm-file-cache-fuzzy-match nil + "Enable fuzzy matching in `helm-source-file-cache' when non--nil." + :group 'helm-files + :type 'boolean + :set (lambda (var val) + (set var val) + (setq helm-source-file-cache + (helm-make-source "File Cache" 'helm-file-cache + :fuzzy-match helm-file-cache-fuzzy-match + :data 'helm-file-cache-get-candidates)))) + +(cl-defun helm-file-cache-add-directory-recursively + (dir &optional match (ignore-dirs t)) + (require 'filecache) + (cl-loop for f in (helm-walk-directory + dir + :path 'full + :directories nil + :match match + :skip-subdirs ignore-dirs) + do (file-cache-add-file f))) + +(defun helm-transform-file-cache (actions _candidate) + (let ((source (helm-get-current-source))) + (if (string= (assoc-default 'name source) "File Cache") + (append actions + '(("Remove marked files from file-cache" + . helm-ff-file-cache-remove-file))) + actions))) + +;;; Recentf files +;; +;; +(defvar helm-recentf--basename-flag nil) + +(defun helm-recentf-pattern-transformer (pattern) + (let ((pattern-no-flag (replace-regexp-in-string " -b" "" pattern))) + (cond ((and (string-match " " pattern-no-flag) + (string-match " -b\\'" pattern)) + (setq helm-recentf--basename-flag t) + pattern-no-flag) + ((string-match "\\([^ ]*\\) -b\\'" pattern) + (prog1 (match-string 1 pattern) + (setq helm-recentf--basename-flag t))) + (t (setq helm-recentf--basename-flag nil) + pattern)))) + +(defcustom helm-turn-on-recentf t + "Automatically turn on `recentf-mode' when non-nil." + :group 'helm-files + :type 'boolean) + +(defclass helm-recentf-source (helm-source-sync helm-type-file) + ((init :initform (lambda () + (require 'recentf) + (when helm-turn-on-recentf (recentf-mode 1)))) + (candidates :initform (lambda () recentf-list)) + (pattern-transformer :initform 'helm-recentf-pattern-transformer) + (match-part :initform (lambda (candidate) + (if (or helm-ff-transformer-show-only-basename + helm-recentf--basename-flag) + (helm-basename candidate) candidate))) + (migemo :initform t) + (persistent-action :initform 'helm-ff-kill-or-find-buffer-fname))) + +(cl-defmethod helm--setup-source :after ((source helm-recentf-source)) + (setf (slot-value source 'action) + (append (symbol-value (helm-actions-from-type-file)) + '(("Delete file(s) from recentf" . + (lambda (_candidate) + (cl-loop for file in (helm-marked-candidates) + do (setq recentf-list (delete file recentf-list))))))))) + +(defvar helm-source-recentf nil + "See (info \"(emacs)File Conveniences\"). +Set `recentf-max-saved-items' to a bigger value if default is too +small.") + +(defcustom helm-recentf-fuzzy-match nil + "Enable fuzzy matching in `helm-source-recentf' when non-nil." + :group 'helm-files + :type 'boolean + :set (lambda (var val) + (set var val) + (let ((helm-fuzzy-sort-fn 'helm-fuzzy-matching-sort-fn-preserve-ties-order)) + (setq helm-source-recentf + (helm-make-source "Recentf" 'helm-recentf-source + :fuzzy-match val))))) + + +;;; Files in current dir +;; +;; +(defun helm-highlight-files (files _source) + "A basic transformer for helm files sources. +Colorize only symlinks, directories and files." + (cl-loop with mp-fn = (or (assoc-default + 'match-part (helm-get-current-source)) + 'identity) + for i in files + for disp = (if (and helm-ff-transformer-show-only-basename + (not (helm-ff-dot-file-p i)) + (not (and helm--url-regexp + (string-match helm--url-regexp i))) + (not (string-match helm-ff-url-regexp i))) + (helm-basename i) (abbreviate-file-name i)) + for isremote = (or (file-remote-p i) + (helm-file-on-mounted-network-p i)) + ;; Call file-attributes only if: + ;; - file is not remote + ;; - helm-for-files--tramp-not-fancy is nil and file is remote AND + ;; connected. (Bug#1679) + for type = (and (or (null isremote) + (and (null helm-for-files-tramp-not-fancy) + (file-remote-p i nil t))) + (car (file-attributes i))) + collect + (cond ((and (null type) isremote) (cons disp i)) + ((stringp type) + (cons (propertize disp + 'face 'helm-ff-symlink + 'match-part (funcall mp-fn disp) + 'help-echo (expand-file-name i)) + i)) + ((eq type t) + (cons (propertize disp + 'face 'helm-ff-directory + 'match-part (funcall mp-fn disp) + 'help-echo (expand-file-name i)) + i)) + (t (let* ((ext (helm-file-name-extension disp)) + (disp (propertize disp + 'face 'helm-ff-file + 'match-part (funcall mp-fn disp) + 'help-echo (expand-file-name i)))) + (when (condition-case _err + (string-match (format "\\.\\(%s\\)$" ext) disp) + (invalid-regexp nil)) + (add-face-text-property + (match-beginning 1) (match-end 1) + 'helm-ff-file-extension nil disp)) + (cons disp i)))))) + +(defclass helm-files-in-current-dir-source (helm-source-sync helm-type-file) + ((candidates :initform (lambda () + (with-helm-current-buffer + (let ((dir (helm-current-directory))) + (when (file-accessible-directory-p dir) + (directory-files dir t)))))) + (pattern-transformer :initform 'helm-recentf-pattern-transformer) + (match-part :initform (lambda (candidate) + (if (or helm-ff-transformer-show-only-basename + helm-recentf--basename-flag) + (helm-basename candidate) candidate))) + (fuzzy-match :initform t) + (migemo :initform t))) + +(defvar helm-source-files-in-current-dir + (helm-make-source "Files from Current Directory" + 'helm-files-in-current-dir-source)) + +;;;###autoload +(defun helm-for-files () + "Preconfigured `helm' for opening files. +Run all sources defined in `helm-for-files-preferred-list'." + (interactive) + (require 'helm-x-files) + (unless helm-source-buffers-list + (setq helm-source-buffers-list + (helm-make-source "Buffers" 'helm-source-buffers))) + (helm :sources helm-for-files-preferred-list + :ff-transformer-show-only-basename nil + :buffer "*helm for files*" + :truncate-lines helm-buffers-truncate-lines)) + +(defun helm-multi-files-toggle-to-locate () + (interactive) + (with-helm-alive-p + (with-helm-buffer + (if (setq helm-multi-files--toggle-locate + (not helm-multi-files--toggle-locate)) + (progn + (helm-set-sources (unless (memq 'helm-source-locate + helm-sources) + (cons 'helm-source-locate helm-sources))) + (helm-set-source-filter '(helm-source-locate))) + (helm-kill-async-processes) + (helm-set-sources (remove 'helm-source-locate + helm-for-files-preferred-list)) + (helm-set-source-filter nil))))) +(put 'helm-multi-files-toggle-to-locate 'helm-only t) + +;;;###autoload +(defun helm-multi-files () + "Preconfigured helm like `helm-for-files' but running locate only on demand. + +Allow toggling back and forth from locate to others sources with +`helm-multi-files-toggle-locate-binding' key. +This avoids launching locate needlessly when what you are +searching for is already found." + (interactive) + (require 'helm-x-files) + (unless helm-source-buffers-list + (setq helm-source-buffers-list + (helm-make-source "Buffers" 'helm-source-buffers))) + (setq helm-multi-files--toggle-locate nil) + (helm-locate-set-command) + (helm-set-local-variable 'helm-async-outer-limit-hook + (list (lambda () + (when (and helm-locate-fuzzy-match + (not (string-match-p + "\\s-" helm-pattern))) + (helm-redisplay-buffer))))) + (let ((sources (remove 'helm-source-locate helm-for-files-preferred-list)) + (helm-locate-command + (if helm-locate-fuzzy-match + (unless (string-match-p "\\`locate -b" helm-locate-command) + (replace-regexp-in-string + "\\`locate" "locate -b" helm-locate-command)) + helm-locate-command)) + (old-key (lookup-key + helm-map + (read-kbd-macro helm-multi-files-toggle-locate-binding)))) + (with-helm-temp-hook 'helm-after-initialize-hook + (define-key helm-map (kbd helm-multi-files-toggle-locate-binding) + 'helm-multi-files-toggle-to-locate)) + (unwind-protect + (helm :sources sources + :ff-transformer-show-only-basename nil + :buffer "*helm multi files*" + :truncate-lines helm-buffers-truncate-lines) + (define-key helm-map (kbd helm-multi-files-toggle-locate-binding) + old-key)))) + +;;;###autoload +(defun helm-recentf () + "Preconfigured `helm' for `recentf'." + (interactive) + (helm :sources 'helm-source-recentf + :ff-transformer-show-only-basename nil + :buffer "*helm recentf*")) + +(provide 'helm-for-files) + +;;; helm-for-files.el ends here diff --git a/code/elpa/helm-20240320.541/helm-global-bindings.el b/code/elpa/helm-20240320.541/helm-global-bindings.el new file mode 100644 index 0000000..18921fc --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-global-bindings.el @@ -0,0 +1,104 @@ +;;; helm-global-bindings.el --- Bind global helm commands -*- lexical-binding: t -*- + +;; Copyright (C) 2012 ~ 2023 Thierry Volpiatto + +;; 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 'helm-lib) ; For helm-aif (bug #2520). + + +;;; Command Keymap +;; +;; +(defgroup helm-global-bindings nil + "Global bindings for Helm." + :group 'helm) + +(defcustom helm-command-prefix-key + (helm-aif (car (where-is-internal 'Control-X-prefix (list global-map))) + (concat it [?c])) + "The prefix key used to call Helm commands from the `global-map'. + +Its default value is `C-x c'. +This key is bound to the function `helm-command-prefix' in the global map. +The definition of `helm-command-prefix' is the keymap `helm-command-map'. +Using `setq' to modify this variable will have no effect." + :type '(choice (string :tag "Key") (const :tag "no binding")) + :set + (lambda (var key) + (helm-aif (and (boundp var) (symbol-value var)) + (global-unset-key (read-kbd-macro it))) + (when key + (global-set-key (read-kbd-macro key) 'helm-command-prefix)) + (set var key))) + +(defvar helm-command-map + (let ((map (make-sparse-keymap))) + (define-key map (kbd "a") 'helm-apropos) + (define-key map (kbd "e") 'helm-etags-select) + (define-key map (kbd "l") 'helm-locate) + (define-key map (kbd "L") 'helm-locate-library) + (define-key map (kbd "s") 'helm-surfraw) + (define-key map (kbd "r") 'helm-regexp) + (define-key map (kbd "m") 'helm-man-woman) + (define-key map (kbd "t") 'helm-top) + (define-key map (kbd "/") 'helm-find) + (define-key map (kbd "i") 'helm-imenu) + (define-key map (kbd "I") 'helm-imenu-in-all-buffers) + (define-key map (kbd "") 'helm-lisp-completion-at-point) + (define-key map (kbd "p") 'helm-list-emacs-process) + (define-key map (kbd "C-x r b") 'helm-filtered-bookmarks) + (define-key map (kbd "M-y") 'helm-show-kill-ring) + (define-key map (kbd "C-c ") 'helm-all-mark-rings) + (define-key map (kbd "C-x C-f") 'helm-find-files) + (define-key map (kbd "f") 'helm-multi-files) + (define-key map (kbd "C-:") 'helm-eval-expression-with-eldoc) + (define-key map (kbd "C-,") 'helm-calcul-expression) + (define-key map (kbd "M-x") 'helm-M-x) + (define-key map (kbd "M-s o") 'helm-occur) + (define-key map (kbd "M-g a") 'helm-do-grep-ag) + (define-key map (kbd "c") 'helm-colors) + (define-key map (kbd "F") 'helm-select-xfont) + (define-key map (kbd "8") 'helm-ucs) + (define-key map (kbd "C-c f") 'helm-recentf) + (define-key map (kbd "C-c g") 'helm-google-suggest) + (define-key map (kbd "h i") 'helm-info-at-point) + (define-key map (kbd "h r") 'helm-info-emacs) + (define-key map (kbd "h g") 'helm-info-gnus) + (define-key map (kbd "h h") 'helm-documentation) + (define-key map (kbd "C-x C-b") 'helm-buffers-list) + (define-key map (kbd "C-x r i") 'helm-register) + (define-key map (kbd "C-c C-x") 'helm-run-external-command) + (define-key map (kbd "b") 'helm-resume) + (define-key map (kbd "M-g i") 'helm-gid) + (define-key map (kbd "@") 'helm-packages) + map) + "Default keymap for \\[helm-command-prefix] commands. +The normal global definition of the character \\[helm-command-prefix] indirects to this keymap.") + +(fset 'helm-command-prefix helm-command-map) + + +;;; Menu + +(require 'helm-easymenu) + + +;;; Provide + +(provide 'helm-global-bindings) + +;;; helm-global-bindings.el ends here diff --git a/code/elpa/helm-20240320.541/helm-grep.el b/code/elpa/helm-20240320.541/helm-grep.el new file mode 100644 index 0000000..f514e95 --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-grep.el @@ -0,0 +1,1800 @@ +;;; helm-grep.el --- Helm Incremental Grep. -*- lexical-binding: t -*- + +;; Copyright (C) 2012 ~ 2023 Thierry Volpiatto + +;; 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 'ansi-color) +(require 'cl-lib) +(require 'format-spec) +(require 'helm) +(require 'helm-help) +(require 'helm-regexp) + +;;; load wgrep proxy if it's available +(require 'wgrep-helm nil t) + +(declare-function helm-buffer-list "helm-buffers") +(declare-function View-quit "view") +(declare-function doc-view-goto-page "doc-view" (page)) +(declare-function pdf-view-goto-page "pdf-view" (page &optional window)) +(declare-function helm-mm-split-pattern "helm-multi-match") +(declare-function helm-comp-read "helm-mode") +(declare-function helm-occur "helm-occur") + +(defvar helm--ansi-color-regexp) +(defvar helm-ff-default-directory) +(defvar helm-tramp-verbose) +(defvar helm-grep-ack-types-cache) +(defvar helm-grep-git-grep-command) +(defvar helm-source-grep-git) +(defvar tramp-verbose) +(defvar helm-current-error) + +;;; Internals vars +;; +;; +(defvar helm-rzgrep-cache (make-hash-table :test 'equal)) +(defvar helm-grep-default-function 'helm-grep-init) +(defvar helm-zgrep-recurse-flag nil) +(defvar helm-grep-history nil) +(defvar helm-grep-ag-history nil) +(defvar helm-grep-last-targets nil) +(defvar helm-grep-include-files nil) +(defvar helm-grep-in-recurse nil) +(defvar helm-grep-use-zgrep nil) +(defvar helm-grep-default-directory-fn nil + "A function that should return a directory to expand candidate to. +It is intended to use as a let-bound variable, DON'T set this globaly.") +(defvar helm-pdfgrep-targets nil) +(defvar helm-grep-last-cmd-line nil) +(defvar helm-grep-split-line-regexp "^\\([[:lower:][:upper:]]?:?.*?\\):\\([0-9]+\\):\\(.*\\)") + + +;;; Keymaps +;; +;; +(defvar helm-grep-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map helm-map) + (define-key map (kbd "M-") 'helm-goto-next-file) + (define-key map (kbd "M-") 'helm-goto-precedent-file) + (define-key map (kbd "C-c o") 'helm-grep-run-other-window-action) + (define-key map (kbd "C-c C-o") 'helm-grep-run-other-frame-action) + (define-key map (kbd "C-x C-s") 'helm-grep-run-save-buffer) + (define-key map (kbd "DEL") 'helm-delete-backward-no-update) + map) + "Keymap used in Grep sources.") + +(defvar helm-pdfgrep-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map helm-map) + (define-key map (kbd "M-") 'helm-goto-next-file) + (define-key map (kbd "M-") 'helm-goto-precedent-file) + (define-key map (kbd "DEL") 'helm-delete-backward-no-update) + map) + "Keymap used in pdfgrep.") + +(defvar helm-grep-mode-map + (let ((map (make-sparse-keymap))) + (define-key map (kbd "RET") 'helm-grep-mode-jump) + (define-key map (kbd "C-o") 'helm-grep-mode-jump-other-window) + (define-key map (kbd "") 'helm-grep-mode-jump-other-window-forward) + (define-key map (kbd "") 'helm-grep-mode-jump-other-window-backward) + (define-key map (kbd "") 'helm-gm-next-file) + (define-key map (kbd "") 'helm-gm-precedent-file) + (define-key map (kbd "M-n") 'helm-grep-mode-jump-other-window-forward) + (define-key map (kbd "M-p") 'helm-grep-mode-jump-other-window-backward) + (define-key map (kbd "M-N") 'helm-gm-next-file) + (define-key map (kbd "M-P") 'helm-gm-precedent-file) + map)) + + +(defgroup helm-grep nil + "Grep related Applications and libraries for Helm." + :group 'helm) + +(defcustom helm-grep-default-command + "grep --color=always -a -d skip %e -n%cH -e %p %f" + "Default grep format command for `helm-do-grep-1'. +Where: +'%e' format spec is for --exclude or --include grep options or + ack-grep --type option. (Not mandatory) + +'%c' format spec is for case-fold-search, + whether to use the -i option of grep. (Not mandatory) + When you specify this spec, helm grep will use smartcase + that is when a upcase character is found in pattern case will + be respected and no \\='-i' option will be used, otherwise, when + no upcase character is found in pattern always use \\='-i'. + If you don't want this behavior, don't use this spec and + specify or not the \\='-i' option. + Note that with ack-grep this is not needed, just specify + the \\='--smart-case' option. + +'%p' format spec is for pattern. (Mandatory) + +'%f' format spec is for filenames. (Mandatory) + +If your grep version doesn't support the --exclude/include args +don't specify the \\='%e' format spec. + +Helm also support ack-grep and git-grep. The following is a +default command example for ack-grep: + +\(setq helm-grep-default-command + \"ack-grep -Hn --color --smart-case --no-group %e -- %p %f\" + helm-grep-default-recurse-command + \"ack-grep -H --color --smart-case --no-group %e -- %p %f\") + +You can ommit the %e spec if you don't want to be prompted for +types. + +NOTE: Helm for ack-grep support ANSI sequences, so you can remove +the \"--no-color\" option safely (recommended). +However you should specify --color to enable multi matches highlighting +because ack disable it when output is piped. + +Same for grep you can use safely the option \"--color=always\" (default). +You can customize the color of matches using GREP_COLORS env var. +e.g: (setenv \"GREP_COLORS\" + \"ms=30;43:mc=30;43:sl=01;37:cx=:fn=35:ln=32:bn=32:se=36\") + +To enable ANSI color in git-grep just add \"--color=always\". +To customize the ANSI color in git-grep, GREP_COLORS have no effect, +you will have to setup this in your .gitconfig: + + [color \"grep\"] + match = black yellow + +Where \"black\" is the foreground and \"yellow\" the background. +See the git documentation for more infos. + +`helm-grep-default-command' and +`helm-grep-default-recurse-command' are independent, so you can +enable `helm-grep-default-command' with ack-grep and +`helm-grep-default-recurse-command' with grep if you want to be +faster on recursive grep. + +NOTE: Remote grepping is not available with ack-grep, and badly + supported with grep because tramp handles badly repeated + remote processes in a short delay (< to 5s)." + :type 'string) + +(defcustom helm-grep-default-recurse-command + "grep --color=always -a -d recurse %e -n%cH -e %p %f" + "Default recursive grep format command for `helm-do-grep-1'. +See `helm-grep-default-command' for format specs and infos about +ack-grep." + :type 'string) + +(defcustom helm-default-zgrep-command + "zgrep --color=always -a -n%cH -e %p %f" + "Default command for Zgrep. +See `helm-grep-default-command' for infos on format specs. +Option --color=always is supported and can be used safely to +replace the Helm internal match highlighting. See +`helm-grep-default-command' for more infos." + :type 'string) + +(defcustom helm-pdfgrep-default-command + "pdfgrep --color always -niH %s %s" + "Default command for pdfgrep. +Option \"--color always\" is supported starting Helm version +1.7.8. When used matches will be highlighted according to +GREP_COLORS env var." + :type 'string) + +(defcustom helm-pdfgrep-default-recurse-command + "pdfgrep --color always -rniH %s %s" + "Default recurse command for pdfgrep. +Option \"--color always\" is supported starting Helm version +1.7.8. When used matches will be highlighted according to +GREP_COLORS env var." + :type 'string) + +(defcustom helm-pdfgrep-default-read-command nil + "Default command to read pdf files from pdfgrep. +Where \\='%f' format spec is filename and \\='%p' is page number. +E.g. In Ubuntu you can set it to: + + \"evince --page-label=%p \\='%f'\" + +If set to nil either `doc-view-mode' or `pdf-view-mode' will be +used instead of an external command." + :type 'string) + +(defcustom helm-grep-max-length-history 100 + "Max number of elements to save in `helm-grep-history'." + :type 'integer) + +(defcustom helm-zgrep-file-extension-regexp + ".*\\(\\.gz\\|\\.bz\\|\\.xz\\|\\.lzma\\)$" + "Default file extensions zgrep will search in." + :type 'string) + +(defcustom helm-grep-preferred-ext nil + "This file extension will be preselected for grep." + :type 'string) + +(defcustom helm-grep-save-buffer-name-no-confirm nil + "When *hgrep* already exists, auto append suffix." + :type 'boolean) + +(defcustom helm-grep-ignored-files + (cons ".#*" (delq nil (mapcar (lambda (s) + (unless (string-match-p "/\\'" s) + (concat "*" s))) + completion-ignored-extensions))) + "List of file names which `helm-grep' shall exclude." + :type '(repeat string)) + +(defcustom helm-grep-ignored-directories + helm-walk-ignore-directories + "List of names of sub-directories which `helm-grep' shall not recurse into." + :type '(repeat string)) + +(defcustom helm-grep-truncate-lines t + "When nil the grep line that appears will not be truncated." + :type 'boolean) + +(defcustom helm-grep-file-path-style 'basename + "File path display style when grep results are displayed. +Possible value are: + basename: displays only the filename, none of the directory path + absolute: displays absolute path + relative: displays relative path from root grep directory." + :type '(choice (const :tag "Basename" basename) + (const :tag "Absolute" absolute) + (const :tag "Relative" relative))) + +(defcustom helm-grep-actions + (helm-make-actions + "Find File" 'helm-grep-action + "Find file other frame" 'helm-grep-other-frame + "Save results in grep buffer" 'helm-grep-save-results + "Find file other window (C-u vertically)" 'helm-grep-other-window) + "Actions for helm grep." + :type '(alist :key-type string :value-type function)) + +(defcustom helm-grep-pipe-cmd-switches nil + "A list of additional parameters to pass to grep pipe command. +This will be used to pipe command for multiple pattern matching +for grep, zgrep ack-grep and git-grep backends. +If you add extra args for ack-grep, use ack-grep options, for +others (grep, zgrep and git-grep) use grep options. +Here are the commands where you may want to add switches: + + grep --color=always + ack-grep --smart-case --color + +You probably don't need to use this unless you know what you are +doing." + :type '(repeat string)) + +(defcustom helm-grep-ag-pipe-cmd-switches nil + "A list of additional parameters to pass to grep-ag pipe command. +Use parameters compatibles with the backend you are using +\(i.e. AG for AG, PT for PT or RG for RG) +Here are the commands where you may want to add switches: + + ag -S --color + rg -N -S --color=? + +For RG the value of --color= is computed according to the --color= +value used in `helm-grep-ag-command'. + +Note also that by default the \"--\" option is always used, you don't +need to add it here. + +You probably don't need to use this unless you know what you are +doing." + :type '(repeat string)) + +(defcustom helm-grep-input-idle-delay 0.1 + "Idle time before updating, specified in seconds. +A lower value (default) means Helm will display the results +faster. Increasing it to a higher value (e.g. 0.6) prevents the +buffer from flickering when updating." + :type 'float) + +(defcustom helm-grep-use-ioccur-style-keys t + "Use Arrow keys to jump to occurences. +Note that if you define this variable with `setq' your change +will have no effect, use customize instead." + :type 'boolean + :set (lambda (var val) + (set var val) + (if val + (progn + (define-key helm-grep-map (kbd "") 'helm-execute-persistent-action) + (define-key helm-grep-map (kbd "") 'helm-grep-run-default-action)) + (define-key helm-grep-map (kbd "") nil) + (define-key helm-grep-map (kbd "") nil)))) + +(defcustom helm-grep-ag-command + (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. + +You can use safely \"--color\" (used by default) with AG RG and +PT. + +NOTE: Usage of \"--color=never\" is discouraged as it uses Elisp +to colorize matched items which is slower than using the native +colorization of backend, however it is still supported. + +For ripgrep here is the command line to use: + + rg --color=always --smart-case --no-heading --line-number %s -- %s %s + +And to customize colors (always for ripgrep) use something like this: + + rg --color=always --colors \\='match:bg:yellow' --colors \\='match:fg:black' +\--smart-case --no-heading --line-number %s -- %s %s + +This will change color for matched items from foreground red (the +default) to a yellow background with a black foreground. Note +that your color settings for RG will not work properly with +multiples pattern if you have configured colors in rg config file +instead of command line. For more enhanced settings of ansi +colors see https://github.com/emacs-helm/helm/issues/2313 + +You must use an output format that fit with helm grep, that is: + + \"filename:line-number:string\" + +The option \"--nogroup\" allow this. +The option \"--line-numbers\" is also mandatory except with +PT (not supported). +For RG the options \"--no-heading\" and \"--line-number\" are the +ones to use. + +When modifying the default colors of matches with e.g. +\"--color-match\" option of AG or \"--colors\" option of ripgrep +you may want to modify as well `helm-grep-ag-pipe-cmd-switches' +to have all matches colorized with the same color in multi +match. + +Of course you can use several other options, see the man page of the +backend you are using." + :type 'string) + +(defcustom helm-grep-git-grep-command + "git --no-pager grep -n%cH --color=always --full-name -e %p -- %f" + "The git grep default command line. +The option \"--color=always\" can be used safely. +The color of matched items can be customized in your .gitconfig +See `helm-grep-default-command' for more infos. + +The \"--exclude-standard\" and \"--no-index\" switches allow +skipping unwanted files specified in ~/.gitignore_global and +searching files not already staged (not enabled by default). + +You have also to enable this in global \".gitconfig\" with + \"git config --global core.excludesfile ~/.gitignore_global\"." + :type 'string) + + +;;; Faces +;; +;; +(defgroup helm-grep-faces nil + "Customize the appearance of helm-grep." + :prefix "helm-" + :group 'helm-grep + :group 'helm-faces) + +(defface helm-grep-match + `((((background light)) + ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "#b00000") + (((background dark)) + ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "gold1")) + "Face used to highlight grep matches. +Have no effect when grep backend use \"--color=\"." + :group 'helm-grep-faces) + +(defface helm-grep-file + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "BlueViolet" + :underline t)) + "Face used to highlight grep results filenames." + :group 'helm-grep-faces) + +(defface helm-grep-lineno + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "Darkorange1")) + "Face used to highlight grep number lines." + :group 'helm-grep-faces) + +(defface helm-grep-finish + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "Green")) + "Face used in mode line when grep is finish." + :group 'helm-grep-faces) + +(defface helm-grep-cmd-line + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :inherit font-lock-type-face)) + "Face used to highlight grep command line when no results." + :group 'helm-grep-faces) + + +;;; Init +;; +;; +(defun helm-grep-prepare-candidates (candidates in-directory) + "Prepare filenames and directories CANDIDATES for grep command line." + ;; If one or more candidate is a directory, search in all files + ;; of this candidate (e.g /home/user/directory/*). + ;; If r option is enabled search also in subdidrectories. + ;; We need here to expand wildcards to support crap windows filenames + ;; as grep doesn't accept quoted wildcards (e.g "dir/*.el"). + (if helm-zgrep-recurse-flag + (mapconcat 'shell-quote-argument candidates " ") + ;; When candidate is a directory, search in all its files. + ;; NOTE that `file-expand-wildcards' will return also + ;; directories, they will be ignored by grep but not + ;; by ack-grep that will grep all files of this directory + ;; without recursing in their subdirs though, see that as a one + ;; level recursion with ack-grep. + ;; So I leave it as it is, considering it is a feature. [1] + (cl-loop for i in candidates append + (cond ((string-match "^git" helm-grep-default-command) + (list i)) + ;; Candidate is a directory and we use recursion or ack. + ((and (file-directory-p i) + (or helm-grep-in-recurse + ;; ack-grep accept directory [1]. + (helm-grep-use-ack-p))) + (list (expand-file-name i))) + ;; Grep doesn't support directory only when not in recurse. + ((file-directory-p i) + (file-expand-wildcards + (concat (file-name-as-directory (expand-file-name i)) "*") t)) + ;; Candidate is a file or wildcard and we use recursion, use the + ;; current directory instead of candidate. + ((and (or (file-exists-p i) (string-match "[*]" i)) + helm-grep-in-recurse) + (list (expand-file-name + (directory-file-name ; Needed for windoze. + (file-name-directory (directory-file-name i)))))) + ;; Else should be one or more file/directory + ;; possibly marked. + ;; When real is a normal filename without wildcard + ;; file-expand-wildcards returns a list of one file. + ;; wildcards should have been already handled by + ;; helm-read-file-name or helm-find-files but do it from + ;; here too in case we are called from elsewhere. + (t (file-expand-wildcards i t))) into all-files ; [1] + finally return + (let ((files (if (file-remote-p in-directory) + ;; Grep don't understand tramp filenames + ;; use the local name. + (mapcar (lambda (x) + (file-remote-p x 'localname)) + all-files) + all-files))) + ;; When user mark files and use recursion with grep + ;; backend enabled, the loop collect on each marked + ;; candidate its `file-name-directory' and we endup with + ;; duplicates (Bug#1714). FIXME: For now as a quick fix + ;; I just remove dups here but I should handle this inside + ;; the cond above. + (setq files (helm-fast-remove-dups files :test 'equal)) + (if (string-match "^git" helm-grep-default-command) + (mapconcat 'identity files " ") + (mapconcat 'shell-quote-argument files " ")))))) + +(defun helm-grep-command (&optional recursive grep) + (let* ((com (if recursive + helm-grep-default-recurse-command + helm-grep-default-command)) + (exe (if grep + (symbol-name grep) + (and com (car (split-string com " ")))))) + (if (and exe (string= exe "git")) "git-grep" exe))) + +(cl-defun helm-grep-use-ack-p (&key where) + (let* ((rec-com (helm-grep-command t)) + (norm-com (helm-grep-command)) + (norm-com-ack-p (string-match "\\`ack" norm-com)) + (rec-com-ack-p (and rec-com (string-match "\\`ack" rec-com)))) + (cl-case where + (default (and norm-com norm-com-ack-p)) + (recursive (and rec-com rec-com-ack-p)) + (strict (and norm-com rec-com rec-com-ack-p norm-com-ack-p)) + (t (and (not (and norm-com (string= norm-com "git-grep"))) + (or (and norm-com norm-com-ack-p) + (and rec-com rec-com-ack-p))))))) + +(defun helm-grep--pipe-command-for-grep-command (smartcase pipe-switches &optional grep-cmd) + (helm-acase (or grep-cmd (helm-grep-command)) + ;; Use grep for GNU regexp based tools. + (("grep" "zgrep" "git-grep") + (format "grep --color=always%s %s" + (if smartcase " -i" "") + pipe-switches)) + ;; Use ack-grep for PCRE based tools. + ;; Sometimes ack-grep cmd is ack only so compare by matching ack. + ((guard (string-match-p "ack" it)) + (format "%s --smart-case --color %s" it pipe-switches)))) + +(defun helm-grep--prepare-cmd-line (only-files &optional include zgrep) + (let* ((default-directory (or helm-ff-default-directory + (helm-default-directory) + default-directory)) + (fnargs (helm-grep-prepare-candidates + only-files default-directory)) + (ignored-files (unless (helm-grep-use-ack-p) + (mapconcat + (lambda (x) + (concat "--exclude=" + (shell-quote-argument x))) + helm-grep-ignored-files " "))) + (ignored-dirs (unless (helm-grep-use-ack-p) + (mapconcat + ;; Need grep version >=2.5.4 + ;; of Gnuwin32 on windoze. + (lambda (x) + (concat "--exclude-dir=" + (shell-quote-argument x))) + helm-grep-ignored-directories " "))) + (exclude (unless (helm-grep-use-ack-p) + (let ((inc (and include + (concat include " "))) + (igfiles (and ignored-files + (concat ignored-files " "))) + (igdirs (and helm-grep-in-recurse + ignored-dirs))) + (concat inc igfiles igdirs)))) + (types (and (helm-grep-use-ack-p) + ;; When %e format spec is not specified + ;; in `helm-grep-default-command' + ;; we need to pass an empty string + ;; to types to avoid error. + (or include ""))) + (smartcase (if (helm-grep-use-ack-p) + "" + (unless (let ((case-fold-search nil)) + (string-match-p + "[[:upper:]]" helm-pattern)) + "i"))) + (helm-grep-default-command + (concat helm-grep-default-command " %m")) ; `%m' like multi. + (patterns (helm-mm-split-pattern helm-pattern t)) + (pipe-switches (mapconcat 'identity helm-grep-pipe-cmd-switches " ")) + (pipes + (helm-aif (cdr patterns) + (cl-loop with pipcom = (helm-grep--pipe-command-for-grep-command + smartcase pipe-switches) + for p in it concat + (format " | %s %s" pipcom (shell-quote-argument p))) + ""))) + (format-spec + helm-grep-default-command + (delq nil + (list (unless zgrep + (if types + (cons ?e types) + (cons ?e exclude))) + (cons ?c (or smartcase "")) + (cons ?p (shell-quote-argument (car patterns))) + (cons ?f fnargs) + (cons ?m pipes)))))) + +(defun helm-grep-init (cmd-line) + "Start an asynchronous grep process with CMD-LINE using ZGREP if non-nil." + (let* ((default-directory (or helm-ff-default-directory + (helm-default-directory) + default-directory)) + (zgrep (string-match "\\`zgrep" cmd-line)) + ;; Use pipe only with grep, zgrep or git-grep. + (process-connection-type (and (not zgrep) (helm-grep-use-ack-p))) + (tramp-verbose helm-tramp-verbose) + (start-time (float-time)) + (proc-name (if helm-grep-use-zgrep + "Zgrep" + (capitalize + (if helm-grep-in-recurse + (helm-grep-command t) + (helm-grep-command))))) + non-essential) + ;; Start grep process. + (helm-log "helm-grep-init" "Starting Grep process in directory `%s'" default-directory) + (helm-log "helm-grep-init" "Command line used was:\n\n%s" + (concat ">>> " (propertize cmd-line 'face 'helm-grep-cmd-line) "\n\n")) + (prog1 ; This function should return the process first. + (start-file-process-shell-command + proc-name helm-buffer cmd-line) + ;; Init sentinel. + (set-process-sentinel + (get-buffer-process helm-buffer) + (lambda (process event) + (let* ((err (process-exit-status process)) + (noresult (= err 1))) + (unless (and err (> err 0)) + (helm-process-deferred-sentinel-hook + process event (helm-default-directory))) + (cond ((and noresult + ;; This is a workaround for zgrep + ;; that exit with code 1 + ;; after a certain amount of results. + (with-helm-buffer (helm-empty-buffer-p))) + (with-helm-buffer + (insert (concat "* Exit with code 1, no result found," + " command line was:\n\n " + (propertize helm-grep-last-cmd-line + 'face 'helm-grep-cmd-line))) + (setq mode-line-format + `(" " mode-line-buffer-identification " " + (:eval (format "L%s" (helm-candidate-number-at-point))) " " + (:eval (propertize + (format + "[%s process finished - (no results)] " + ,proc-name) + 'face 'helm-grep-finish)))))) + ((or (string= event "finished\n") + (and noresult + ;; This is a workaround for zgrep + ;; that exit with code 1 + ;; after a certain amount of results. + (with-helm-buffer (not (helm-empty-buffer-p))))) + (helm-log "helm-grep-init" "%s process finished with %s results in %fs" + proc-name + (helm-get-candidate-number) + (- (float-time) start-time)) + (helm-maybe-show-help-echo) + (with-helm-window + (setq mode-line-format + `(" " mode-line-buffer-identification " " + (:eval (format "L%s" (helm-candidate-number-at-point))) " " + (:eval (propertize + (format + "[%s process finished in %.2fs - (%s results)] " + ,proc-name + ,(- (float-time) start-time) + (helm-get-candidate-number)) + 'face 'helm-grep-finish)))) + (force-mode-line-update) + (when (and helm-allow-mouse helm-selection-point) + (helm--bind-mouse-for-selection helm-selection-point)))) + ;; Catch error output in log. + (t (helm-log + "helm-grep-init" + "Error: %s %s" + proc-name + (replace-regexp-in-string "\n" "" event)))))))))) + +(defun helm-grep-collect-candidates () + (let ((cmd-line (helm-grep--prepare-cmd-line + helm-grep-last-targets + helm-grep-include-files + helm-grep-use-zgrep))) + (set (make-local-variable 'helm-grep-last-cmd-line) cmd-line) + (funcall helm-grep-default-function cmd-line))) + + +;;; Actions +;; +;; +(defun helm-grep-action (candidate &optional where) + "Define a default action for `helm-do-grep-1' on CANDIDATE. +WHERE can be `other-window' or `other-frame'." + (let* ((split (helm-grep-split-line candidate)) + (split-pat (helm-mm-split-pattern helm-input)) + (lineno (string-to-number (nth 1 split))) + (loc-fname (or (with-current-buffer + (if (eq major-mode 'helm-grep-mode) + (current-buffer) + helm-buffer) + (get-text-property (pos-bol) + 'helm-grep-fname)) + (car split))) + (tramp-fname (file-remote-p (or helm-ff-default-directory + default-directory))) + (fname (if tramp-fname + (concat tramp-fname loc-fname) + loc-fname))) + (helm-log "helm-grep-action" "helm-grep-action fname: %s" fname ) + (cl-case where + (other-window (helm-window-show-buffers + (list (find-file-noselect fname)) t)) + (other-frame (find-file-other-frame fname)) + (grep (helm-grep-save-results-1)) + (pdf (if helm-pdfgrep-default-read-command + (helm-pdfgrep-action-1 split lineno (car split)) + (find-file (car split)) + (if (derived-mode-p 'pdf-view-mode) + (pdf-view-goto-page lineno) + (doc-view-goto-page lineno)))) + (t (find-file fname))) + (unless (or (eq where 'grep) (eq where 'pdf)) + (helm-goto-line lineno) + ;; Move point to the nearest matching regexp from bol. + (cl-loop for reg in split-pat + when (save-excursion + (condition-case _err + (if helm-migemo-mode + (helm-mm-migemo-forward reg (pos-eol) t) + (re-search-forward reg (pos-eol) t)) + (invalid-regexp nil))) + collect (match-beginning 0) into pos-ls + finally (when pos-ls (goto-char (apply #'min pos-ls)))) + ;; Save history + (unless (or helm-in-persistent-action + (eq major-mode 'helm-grep-mode) + (string= helm-pattern "")) + (setq helm-grep-history + (cons helm-pattern + (delete helm-pattern helm-grep-history))) + (when (> (length helm-grep-history) + helm-grep-max-length-history) + (setq helm-grep-history + (delete (car (last helm-grep-history)) + helm-grep-history))))))) + +(defun helm-grep-persistent-action (candidate) + "Persistent action for `helm-do-grep-1'. +With a prefix arg record CANDIDATE in `mark-ring'." + (helm-grep-action candidate) + (helm-highlight-current-line)) + +(defun helm-grep-other-window (candidate) + "Jump to result in other window from helm grep." + (helm-grep-action candidate 'other-window)) + +(defun helm-grep-other-frame (candidate) + "Jump to result in other frame from helm grep." + (helm-grep-action candidate 'other-frame)) + +(defun helm-goto-next-or-prec-file (n) + "Go to next or precedent candidate file in helm grep/etags buffers. +If N is positive go forward otherwise go backward." + (let* ((allow-mode (or (eq major-mode 'helm-grep-mode) + (eq major-mode 'helm-moccur-mode) + (eq major-mode 'helm-occur-mode))) + (sel (if allow-mode + (buffer-substring (pos-bol) (pos-eol)) + (helm-get-selection nil t))) + (current-line-list (helm-grep-split-line sel)) + (current-fname (nth 0 current-line-list)) + (bob-or-eof (if (eq n 1) 'eobp 'bobp)) + (mark-maybe (lambda () + (if allow-mode + (ignore) + (helm-mark-current-line))))) + (catch 'break + (while (not (funcall bob-or-eof)) + (forward-line n) ; Go forward or backward depending of n value. + ;; Exit when current-fname is not matched or in `helm-grep-mode' + ;; the line is not a grep line i.e 'fname:num:tag'. + (setq sel (buffer-substring (pos-bol) (pos-eol))) + (when helm-allow-mouse + (helm--mouse-reset-selection-help-echo)) + (unless (or (string= current-fname + (car (helm-grep-split-line sel))) + (and (eq major-mode 'helm-grep-mode) + (not (get-text-property (pos-bol) 'helm-grep-fname)))) + (funcall mark-maybe) + (throw 'break nil)))) + (cond ((and (> n 0) (eobp)) + (re-search-backward ".") + (forward-line 0) + (funcall mark-maybe)) + ((and (< n 0) (bobp)) + (helm-aif (next-single-property-change (pos-bol) 'helm-grep-fname) + (goto-char it) + (forward-line 1)) + (funcall mark-maybe))) + (unless allow-mode + (helm-follow-execute-persistent-action-maybe) + (helm-log-run-hook "helm-goto-next-or-prec-file" 'helm-move-selection-after-hook)))) + +;;;###autoload +(defun helm-goto-precedent-file () + "Go to previous file in Helm grep/etags buffers." + (interactive) + (with-helm-alive-p + (with-helm-window + (helm-goto-next-or-prec-file -1)))) +(put 'helm-goto-precedent-file 'helm-only t) + +;;;###autoload +(defun helm-goto-next-file () + "Go to previous file in Helm grep/etags buffers." + (interactive) + (with-helm-window + (helm-goto-next-or-prec-file 1))) + +(helm-make-command-from-action helm-grep-run-default-action + "Run grep default action from `helm-do-grep-1'." + 'helm-grep-action) + +(helm-make-command-from-action helm-grep-run-other-window-action + "Run grep goto other window action from `helm-do-grep-1'." + 'helm-grep-other-window) + +(helm-make-command-from-action helm-grep-run-other-frame-action + "Run grep goto other frame action from `helm-do-grep-1'." + 'helm-grep-other-frame) + +(helm-make-command-from-action helm-grep-run-save-buffer + "Run grep save results action from `helm-do-grep-1'." + 'helm-grep-save-results) + +(defun helm-grep-quit-an-find-file-fn (source) + (let* ((sel (helm-get-selection nil nil source)) + (grep-line (and (stringp sel) + (helm-grep-split-line sel)))) + (if (and grep-line (file-exists-p (car grep-line))) + (expand-file-name (car grep-line)) + default-directory))) + +;;; helm-grep-mode +;; +;; +(defun helm-grep-save-results (candidate) + (helm-grep-action candidate 'grep)) + +(defvar helm-grep-mode-use-pcre nil) +(defun helm-grep-save-results-1 () + "Save Helm grep result in a `helm-grep-mode' buffer." + (let* ((buf "*hgrep*") + new-buf + (pattern (with-helm-buffer helm-input-local)) + (src (helm-get-current-source)) + (src-name (assoc-default 'name src))) + (when (get-buffer buf) + (if helm-grep-save-buffer-name-no-confirm + (setq new-buf (format "*hgrep|%s|-%s" pattern + (format-time-string "%H-%M-%S*"))) + (setq new-buf (helm-read-string "GrepBufferName: " buf)) + (cl-loop for b in (helm-buffer-list) + when (and (string= new-buf b) + (not (y-or-n-p + (format "Buffer `%s' already exists overwrite? " + new-buf)))) + do (setq new-buf (helm-read-string "GrepBufferName: " "*hgrep ")))) + (setq buf new-buf)) + (with-current-buffer (get-buffer-create buf) + (setq default-directory (or helm-ff-default-directory + (helm-default-directory) + default-directory)) + (setq-local helm-grep-mode-use-pcre (helm-get-attr 'pcre src)) + (setq buffer-read-only t) + (let ((inhibit-read-only t) + (map (make-sparse-keymap))) + (erase-buffer) + (insert "-*- mode: helm-grep -*-\n\n" + (format "%s Results for `%s':\n\n" src-name pattern)) + (save-excursion + (insert (with-current-buffer helm-buffer + (goto-char (point-min)) (forward-line 1) + (buffer-substring (point) (point-max))))) + (save-excursion + (while (not (eobp)) + (add-text-properties (pos-bol) (pos-eol) + `(keymap ,map + help-echo ,(concat + (get-text-property + (point) 'helm-grep-fname) + "\nmouse-1: set point\nmouse-2: jump to selection") + mouse-face highlight)) + (define-key map [mouse-1] 'mouse-set-point) + (define-key map [mouse-2] 'helm-grep-mode-mouse-jump) + (define-key map [mouse-3] 'ignore) + (forward-line 1)))) + (helm-grep-mode)) + (pop-to-buffer buf) + (setq next-error-last-buffer (get-buffer buf)) + (message "Helm %s Results saved in `%s' buffer" src-name buf))) + +(defun helm-grep-mode-mouse-jump (event) + (interactive "e") + (let* ((window (posn-window (event-end event))) + (pos (posn-point (event-end event)))) + (with-selected-window window + (when (eq major-mode 'helm-grep-mode) + (goto-char pos) + (helm-grep-mode-jump))))) +(put 'helm-grep-mode-mouse-jump 'helm-only t) + +(defun helm-grep-next-error (&optional argp reset) + "Goto ARGP position from a `helm-grep-mode' buffer. +RESET non-nil means rewind to the first match. +This is the `next-error-function' for `helm-grep-mode'." + (interactive "p") + (goto-char (cond (reset (point-min)) + ((and (< argp 0) helm-current-error) + (line-beginning-position)) + ((and (> argp 0) helm-current-error) + (line-end-position)) + ((point)))) + (let ((fun (if (> argp 0) + #'next-single-property-change + #'previous-single-property-change))) + (helm-aif (funcall fun (point) 'helm-grep-fname) + (progn + (goto-char it) + ;; `helm-current-error' is set in + ;; `helm-grep-mode-jump'. + (helm-grep-mode-jump)) + (user-error "No more matches")))) +(put 'helm-grep-next-error 'helm-only t) + +;;;###autoload +(defun helm-revert-next-error-last-buffer () + "Revert last `next-error' buffer from `current-buffer'. + +Accept to revert only `helm-grep-mode' or `helm-occur-mode' buffers. +Use this when you want to revert the `next-error' buffer after +modifications in `current-buffer'." + (interactive) + (let ((buffer (next-error-find-buffer)) + (linum (line-number-at-pos)) + (bufname (buffer-name))) + (if buffer + (with-current-buffer buffer + (helm-aif (memq major-mode '(helm-grep-mode helm-occur-mode)) + (progn (revert-buffer) + ;; helm-occur-mode revert fn is synchronous so + ;; reajust from here (it is done with + ;; helm-grep-mode in its sentinel). + (when (eq (car it) 'helm-occur-mode) + (helm-grep-goto-closest-from-linum linum bufname))) + (error "No suitable buffer to revert found"))) + (error "No suitable buffer to revert found")))) + +(define-derived-mode helm-grep-mode + special-mode "helm-grep" + "Major mode to provide actions in helm grep saved buffer. + +Special commands: +\\{helm-grep-mode-map}" + (set (make-local-variable 'helm-grep-last-cmd-line) + (with-helm-buffer helm-grep-last-cmd-line)) + (set (make-local-variable 'revert-buffer-function) + #'helm-grep-mode--revert-buffer-function) + (set (make-local-variable 'next-error-function) + #'helm-grep-next-error) + (set (make-local-variable 'helm-current-error) nil)) +(put 'helm-grep-mode 'helm-only t) + +(defun helm-grep-mode--revert-buffer-function (&optional _ignore-auto _noconfirm) + (goto-char (point-min)) + (when (re-search-forward helm-grep-split-line-regexp nil t) (forward-line 0)) + (let ((inhibit-read-only t)) + (delete-region (point) (point-max))) + (message "Reverting buffer...") + (let ((process-connection-type + ;; Git needs a nil value otherwise it tries to use a pager. + (null (string-match-p "\\`git" helm-grep-last-cmd-line)))) + (set-process-sentinel + (start-file-process-shell-command + "hgrep" (generate-new-buffer "*hgrep revert*") helm-grep-last-cmd-line) + 'helm-grep-mode--sentinel))) + +(defun helm-grep-mode--sentinel (process event) + (when (string= event "finished\n") + (with-current-buffer (if (eq major-mode 'helm-grep-mode) + (current-buffer) + (next-error-find-buffer)) + (let ((inhibit-read-only t)) + (save-excursion + (cl-loop for l in (with-current-buffer (process-buffer process) + (prog1 (split-string (buffer-string) "\n") + (kill-buffer))) + for line = (if (string-match-p helm--ansi-color-regexp l) + (ansi-color-apply l) l) + when (string-match helm-grep-split-line-regexp line) + do (insert (propertize + (car (helm-grep-filter-one-by-one + line helm-grep-mode-use-pcre)) + ;; needed for wgrep. + 'helm-realvalue line) + "\n")))) + (when (fboundp 'wgrep-cleanup-overlays) + (wgrep-cleanup-overlays (point-min) (point-max)))) + (unless (eq major-mode 'helm-grep-mode) + (let ((bufname (buffer-name)) + (linum (line-number-at-pos))) + (with-current-buffer (next-error-find-buffer) + (helm-grep-goto-closest-from-linum linum bufname)))) + (message "Reverting buffer done") + (when executing-kbd-macro (sit-for 1)))) + +(defun helm-grep-goto-closest-from-linum (linum bufname) + (goto-char (point-min)) + (catch 'break + (while (re-search-forward (format "^%s:\\([0-9]+\\):" (regexp-quote bufname)) nil t) + (let ((numline (string-to-number (match-string 1)))) + (when (< (- linum numline) 0) + (forward-line -1) + (throw 'break nil)))))) + +(defun helm-gm-next-file () + (interactive) + (helm-goto-next-or-prec-file 1)) + +(defun helm-gm-precedent-file () + (interactive) + (helm-goto-next-or-prec-file -1)) + +(defun helm-grep-mode-jump () + (interactive) + (setq next-error-last-buffer (current-buffer)) + (setq-local helm-current-error (point-marker)) + (helm-grep-action + (buffer-substring (pos-bol) (pos-eol))) + (helm-match-line-cleanup-pulse)) + +(defun helm-grep-mode-jump-other-window-1 (arg) + (condition-case nil + (progn + (when (or (eq last-command 'helm-grep-mode-jump-other-window-forward) + (eq last-command 'helm-grep-mode-jump-other-window-backward)) + (forward-line arg)) + (save-selected-window + (helm-grep-action (buffer-substring (pos-bol) (pos-eol)) + 'other-window) + (helm-match-line-cleanup-pulse) + (recenter))) + (error nil))) + +(defun helm-grep-mode-jump-other-window-forward (arg) + (interactive "p") + (helm-grep-mode-jump-other-window-1 arg)) + +(defun helm-grep-mode-jump-other-window-backward (arg) + (interactive "p") + (helm-grep-mode-jump-other-window-1 (- arg))) + +(defun helm-grep-mode-jump-other-window () + (interactive) + (setq next-error-last-buffer (current-buffer)) + (setq-local helm-current-error (point-marker)) + (let ((candidate (buffer-substring (pos-bol) (pos-eol)))) + (condition-case nil + (progn (helm-grep-action candidate 'other-window) + (helm-match-line-cleanup-pulse)) + (error nil)))) + + +;;; ack-grep types +;; +;; +(defun helm-grep-hack-types () + "Return a list of known ack-grep types." + (with-temp-buffer + ;; "--help-types" works with both 1.96 and 2.1+, while + ;; "--help types" works only with 1.96 Bug#422. + ;; `helm-grep-command' should return the ack executable + ;; when this function is used in the right context + ;; i.e After checking is we are using ack-grep with + ;; `helm-grep-use-ack-p'. + (call-process (helm-grep-command t) nil t nil "--help-types") + (goto-char (point-min)) + (cl-loop while (re-search-forward "^ +\\([^. ]+\\) +\\(.*\\)" nil t) + collect (cons (concat (match-string 1) + " [" (match-string 2) "]") + (match-string 1)) + collect (cons (concat "no" (match-string 1) + " [" (match-string 2) "]") + (concat "no" (match-string 1)))))) + +(defun helm-grep-ack-types-transformer (candidates _source) + (cl-loop for i in candidates + if (stringp i) + collect (rassoc i helm-grep-ack-types-cache) + else + collect i)) + +(defvar helm-grep-ack-types-cache nil) +(defun helm-grep-read-ack-type () + "Select types for the \\='--type' argument of ack-grep." + (require 'helm-mode) + (require 'helm-adaptive) + (setq helm-grep-ack-types-cache (helm-grep-hack-types)) + (let ((types (helm-comp-read + "Types: " helm-grep-ack-types-cache + :name "*Ack-grep types*" + :marked-candidates t + :must-match t + :fc-transformer '(helm-adaptive-sort + helm-grep-ack-types-transformer) + :buffer "*helm ack-types*"))) + (mapconcat (lambda (type) (concat "--type=" type)) types " "))) + + +;;; grep extensions +;; +;; +(defun helm-grep-guess-extensions (files) + "Try to guess file extensions in FILES list when using grep recurse. +These extensions will be added to command line with --include arg +of grep." + (cl-loop with ext-list = (list helm-grep-preferred-ext "*") + with lst = (if (file-directory-p (car files)) + (directory-files + (car files) nil + directory-files-no-dot-files-regexp) + files) + for i in lst + for ext = (file-name-extension i 'dot) + for glob = (and ext (not (string= ext "")) + (concat "*" ext)) + unless (or (not glob) + (and glob-list (member glob glob-list)) + (and glob-list (member glob ext-list)) + (and glob-list (member glob helm-grep-ignored-files))) + collect glob into glob-list + finally return (delq nil (append ext-list glob-list)))) + +(defun helm-grep-get-file-extensions (files) + "Try to return a list of file extensions to pass to \\='--include' arg of grep." + (require 'helm-adaptive) + (let* ((all-exts (helm-grep-guess-extensions + (mapcar 'expand-file-name files))) + (extensions (helm-comp-read "Search Only in: " all-exts + :marked-candidates t + :fc-transformer 'helm-adaptive-sort + :buffer "*helm grep exts*" + :name "*helm grep extensions*"))) + (when (listp extensions) ; Otherwise it is empty string returned by C-RET. + ;; If extensions is a list of one string containing spaces, + ;; assume user entered more than one glob separated by space(s) and + ;; split this string to pass it later to mapconcat. + ;; e.g '("*.el *.py") + (cl-loop for i in extensions + append (split-string-and-unquote i " "))))) + + +;;; Set up source +;; +;; +(defvar helm-grep-before-init-hook nil + "Hook that runs before initialization of the Helm buffer.") + +(defvar helm-grep-after-init-hook nil + "Hook that runs after initialization of the Helm buffer.") + +(defclass helm-grep-class (helm-source-async) + ((candidates-process :initform 'helm-grep-collect-candidates) + (filtered-candidate-transformer :initform #'helm-grep-fc-transformer) + (keymap :initform 'helm-grep-map) + (pcre :initarg :pcre :initform nil + :documentation + " Backend is using pcre regexp engine when non-nil.") + (nohighlight :initform t) + (nomark :initform t) + (backend :initarg :backend + :initform nil + :documentation + " The grep backend that will be used. + It is actually used only as an internal flag + and doesn't set the backend by itself. + You probably don't want to modify this.") + (candidate-number-limit :initform 9999) + (help-message :initform 'helm-grep-help-message) + (history :initform 'helm-grep-history) + (action :initform 'helm-grep-actions) + (persistent-action :initform 'helm-grep-persistent-action) + (persistent-help :initform "Jump to line (`C-u' Record in mark ring)") + (requires-pattern :initform 2) + (before-init-hook :initform 'helm-grep-before-init-hook) + (after-init-hook :initform 'helm-grep-after-init-hook) + (find-file-target :initform #'helm-grep-quit-an-find-file-fn) + (group :initform 'helm-grep))) + +(defvar helm-source-grep nil) + +(cl-defmethod helm--setup-source ((source helm-grep-class)) + (cl-call-next-method) + (helm-aif (and helm-follow-mode-persistent + (if (eq (slot-value source 'backend) 'git) + helm-source-grep-git + helm-source-grep)) + (setf (slot-value source 'follow) + (assoc-default 'follow it)))) + +(cl-defun helm-do-grep-1 (targets &optional recurse backend exts + default-input input (source 'helm-source-grep)) + "Launch helm using backend BACKEND on a list of TARGETS files. + +When RECURSE is given and BACKEND is \\='grep' use -r option of +BACKEND and prompt user for EXTS to set the --include args of +BACKEND. +Interactively you can give more than one arg separated by space +at prompt. +E.g.: + $Pattern: *.el *.py *.tex + +From Lisp use the EXTS argument as a list of extensions as above. +If you are using ack-grep, you will be prompted for --type +instead and EXTS will be ignored. If prompt is empty +`helm-grep-ignored-files' are added to --exclude. + +Argument DEFAULT-INPUT is use as `default' arg of `helm' and +INPUT is used as `input' arg of `helm'. See `helm' docstring. + +Arg BACKEND when non-nil specifies which backend to use. +It is used actually to specify \\='zgrep' or \\='git'. +When BACKEND \\='zgrep' is used don't prompt for a choice in +recurse, and ignore EXTS, search being made recursively on files +matching `helm-zgrep-file-extension-regexp' only." + (let* (non-essential + (ack-rec-p (helm-grep-use-ack-p :where 'recursive)) + (exts (and recurse + ;; [FIXME] I could handle this from helm-walk-directory. + (not (eq backend 'zgrep)) ; zgrep doesn't handle -r opt. + (not ack-rec-p) + (or exts (helm-grep-get-file-extensions targets)))) + (include-files + (and exts + (mapconcat (lambda (x) + (concat "--include=" + (shell-quote-argument x))) + (if (> (length exts) 1) + (remove "*" exts) + exts) " "))) + (types (and (not include-files) + (not (eq backend 'zgrep)) + recurse + ack-rec-p + ;; When %e format spec is not specified + ;; ignore types and do not prompt for choice. + (string-match "%e" helm-grep-default-command) + (helm-grep-read-ack-type))) + (src-name (capitalize (helm-grep-command recurse backend))) + (com (cond ((eq backend 'zgrep) helm-default-zgrep-command) + ((eq backend 'git) helm-grep-git-grep-command) + (recurse helm-grep-default-recurse-command) + ;; When resuming, the local value of + ;; `helm-grep-default-command' is used, only git-grep + ;; should need this. + (t helm-grep-default-command)))) + ;; When called as action from an other source e.g *-find-files + ;; we have to kill action buffer. + (when (get-buffer helm-action-buffer) + (kill-buffer helm-action-buffer)) + ;; If `helm-find-files' haven't already started, + ;; give a default value to `helm-ff-default-directory' + ;; and set locally `default-directory' to this value . See below [1]. + (unless helm-ff-default-directory + (setq helm-ff-default-directory default-directory)) + ;; We need to store these vars locally + ;; to pass infos later to `helm-resume'. + (helm-set-local-variable + 'helm-zgrep-recurse-flag (and recurse (eq backend 'zgrep)) + 'helm-grep-last-targets targets + 'helm-grep-include-files (or include-files types) + 'helm-grep-in-recurse recurse + 'helm-grep-use-zgrep (eq backend 'zgrep) + 'helm-grep-default-command com + 'helm-input-idle-delay helm-grep-input-idle-delay + 'default-directory helm-ff-default-directory) ;; [1] + ;; Setup the source. + (set source (helm-make-source src-name 'helm-grep-class + :backend backend + :pcre (string-match-p "\\`ack" com))) + (helm + :sources source + :buffer (format "*helm %s*" (helm-grep-command recurse backend)) + :default default-input + :input input + :keymap helm-grep-map + :history 'helm-grep-history + :truncate-lines helm-grep-truncate-lines))) + + +;;; zgrep +;; +;; +(defun helm-ff-zgrep-1 (flist recursive) + (unwind-protect + (let* ((def-dir (or helm-ff-default-directory + default-directory)) + (only (if recursive + (or (gethash def-dir helm-rzgrep-cache) + (puthash + def-dir + (helm-walk-directory + def-dir + :directories nil + :path 'full + :match helm-zgrep-file-extension-regexp) + helm-rzgrep-cache)) + flist))) + (helm-do-grep-1 only recursive 'zgrep)) + (setq helm-zgrep-recurse-flag nil))) + + +;;; transformers +;; +;; +(defun helm-grep-split-line (line) + "Split a grep output line." + ;; The output of grep may send a truncated line in this chunk, + ;; so don't split until grep line is valid, that is + ;; once the second part of the line comes with next chunk + ;; send by process. + (when (string-match helm-grep-split-line-regexp line) + ;; Don't use split-string because buffer/file name or string + ;; may contain a ":". + (cl-loop for n from 1 to 3 collect (match-string n line)))) + +(defun helm-grep--filter-candidate-1 (candidate &optional dir pcre) + (let* ((root (or dir (and helm-grep-default-directory-fn + (funcall helm-grep-default-directory-fn)))) + (ansi-p (string-match-p helm--ansi-color-regexp candidate)) + (line (if ansi-p (ansi-color-apply candidate) candidate)) + (split (helm-grep-split-line line)) + (fname (if (and root split) + ;; Filename should always be provided as a local + ;; path, if the root directory is remote, the + ;; tramp prefix will be added before executing + ;; action, see `helm-grep-action' and Bug#2032. + (expand-file-name (car split) + (or (file-remote-p root 'localname) + root)) + (car-safe split))) + (lineno (nth 1 split)) + (str (nth 2 split)) + (display-fname (cl-ecase helm-grep-file-path-style + (basename (and fname (file-name-nondirectory fname))) + (absolute fname) + (relative (and fname root + (file-relative-name fname root)))))) + (if (and display-fname lineno str) + (cons (concat (propertize display-fname + 'face 'helm-grep-file + 'help-echo (abbreviate-file-name fname) + 'helm-grep-fname fname) + ":" + (propertize lineno 'face 'helm-grep-lineno) + ":" + (if ansi-p str (helm-grep-highlight-match str pcre))) + line) + ""))) + +(defun helm-grep-filter-one-by-one (candidate &optional pcre) + "`filter-one-by-one' transformer function for `helm-do-grep-1'." + (let ((helm-grep-default-directory-fn + (or helm-grep-default-directory-fn + (lambda () (or helm-ff-default-directory + (and helm-alive-p + (helm-default-directory)) + default-directory))))) + (if (consp candidate) + ;; Already computed do nothing (default as input). + candidate + (and (stringp candidate) + (helm-grep--filter-candidate-1 candidate nil pcre))))) + +(defun helm-grep-fc-transformer (candidates source) + (let ((helm-grep-default-directory-fn + (or helm-grep-default-directory-fn + (lambda () (or helm-ff-default-directory + (and (null (eq major-mode 'helm-grep-mode)) + (helm-default-directory)) + default-directory)))) + (pcre (helm-get-attr 'pcre source))) + (cl-loop for c in candidates + collect (helm-grep--filter-candidate-1 c nil pcre)))) + +(defun helm-grep-highlight-match (str &optional pcre) + "Highlight in string STR all occurences matching `helm-pattern'." + (let (beg end) + (condition-case-unless-debug nil + (with-temp-buffer + (insert (propertize str 'read-only nil)) ; Fix bug#1176 + (goto-char (point-min)) + (cl-loop for reg in + (cl-loop for r in (helm-mm-split-pattern + helm-input) + unless (string-match "\\`!" r) + collect + (helm-aif (and helm-migemo-mode + (assoc r helm-mm--previous-migemo-info)) + (cdr it) r)) + do + (while (and (re-search-forward + (if pcre + (helm--translate-pcre-to-elisp reg) + reg) + nil t) + (> (- (setq end (match-end 0)) + (setq beg (match-beginning 0))) + 0)) + (helm-add-face-text-properties beg end 'helm-grep-match)) + do (goto-char (point-min))) + (buffer-string)) + (error nil)))) + + +;;; Grep from buffer list +;; +;; +(defun helm-grep-buffers-1 (candidate &optional zgrep) + "Run grep on all file buffers or CANDIDATE if it is a file buffer. +If one of selected buffers is not a file buffer, it is ignored +and grep will run on all others file-buffers. +If only one candidate is selected and it is not a file buffer, +switch to this buffer and run `helm-occur'. +If a prefix arg is given run grep on all buffers ignoring +non-file buffers." + (let* ((prefarg (or current-prefix-arg helm-current-prefix-arg)) + (helm-ff-default-directory + (if (and helm-ff-default-directory + (file-remote-p helm-ff-default-directory)) + default-directory + helm-ff-default-directory)) + (cands (if prefarg + (buffer-list) + (helm-marked-candidates))) + (win-conf (current-window-configuration)) + ;; Non--fname and remote buffers are ignored. + (bufs (cl-loop for buf in cands + for fname = (buffer-file-name (get-buffer buf)) + when (and fname (not (file-remote-p fname))) + collect (expand-file-name fname)))) + (if bufs + (if zgrep + (helm-do-grep-1 bufs nil 'zgrep) + (helm-do-grep-1 bufs)) + ;; bufs is empty, thats mean we have only CANDIDATE + ;; and it is not a buffer-filename, fallback to occur. + (switch-to-buffer candidate) + (when (get-buffer helm-action-buffer) + (kill-buffer helm-action-buffer)) + (helm-occur) + (when (eq helm-exit-status 1) + (set-window-configuration win-conf))))) + +(defun helm-grep-buffers (candidate) + "Action to grep buffers." + (helm-grep-buffers-1 candidate)) + +(defun helm-zgrep-buffers (candidate) + "Action to zgrep buffers." + (helm-grep-buffers-1 candidate 'zgrep)) + + +;;; Helm interface for pdfgrep +;; pdfgrep program +;; and a pdf-reader (e.g xpdf) are needed. +;; +(defvar helm-pdfgrep-default-function 'helm-pdfgrep-init) +(defun helm-pdfgrep-init (only-files &optional recurse) + "Start an asynchronous pdfgrep process in ONLY-FILES list." + (let* ((default-directory (or helm-ff-default-directory + default-directory)) + (fnargs (helm-grep-prepare-candidates + (if (file-remote-p default-directory) + (mapcar (lambda (x) + (file-remote-p x 'localname)) + only-files) + only-files) + default-directory)) + (cmd-line (format (if recurse + helm-pdfgrep-default-recurse-command + helm-pdfgrep-default-command) + helm-pattern + fnargs)) + process-connection-type) + ;; Start pdf grep process. + (helm-log "helm-pdfgrep-init" "Starting Pdf Grep process in directory `%s'" default-directory) + (helm-log "helm-pdfgrep-init" "Command line used was:\n\n%s" + (concat ">>> " (propertize cmd-line 'face 'helm-grep-cmd-line) "\n\n")) + (prog1 + (start-file-process-shell-command + "pdfgrep" helm-buffer cmd-line) + (message nil) + (set-process-sentinel + (get-buffer-process helm-buffer) + (lambda (_process event) + (if (string= event "finished\n") + (with-helm-window + (setq mode-line-format + '(" " mode-line-buffer-identification " " + (:eval (format "L%s" (helm-candidate-number-at-point))) " " + (:eval (propertize + (format "[Pdfgrep Process Finish - %s result(s)] " + (max (1- (count-lines + (point-min) (point-max))) 0)) + 'face 'helm-grep-finish)))) + (force-mode-line-update) + (when helm-allow-mouse + (helm--bind-mouse-for-selection helm-selection-point))) + (helm-log "helm-pdfgrep-init" "Error: Pdf grep %s" + (replace-regexp-in-string "\n" "" event)))))))) + +(defun helm-do-pdfgrep-1 (only &optional recurse) + "Launch pdfgrep with a list of ONLY files." + (unless (executable-find "pdfgrep") + (error "Error: No such program `pdfgrep'.")) + (let (helm-grep-in-recurse) ; recursion is implemented differently in *pdfgrep. + ;; When called as action from an other source e.g *-find-files + ;; we have to kill action buffer. + (when (get-buffer helm-action-buffer) + (kill-buffer helm-action-buffer)) + (setq helm-pdfgrep-targets only) + (helm + :sources (helm-build-async-source "PdfGrep" + :init (lambda () + ;; If `helm-find-files' haven't already started, + ;; give a default value to `helm-ff-default-directory'. + (setq helm-ff-default-directory (or helm-ff-default-directory + default-directory))) + :candidates-process (lambda () + (funcall helm-pdfgrep-default-function + helm-pdfgrep-targets recurse)) + :nohighlight t + :nomark t + :filter-one-by-one #'helm-grep-filter-one-by-one + :candidate-number-limit 9999 + :history 'helm-grep-history + :keymap helm-pdfgrep-map + :help-message 'helm-pdfgrep-help-message + :action #'helm-pdfgrep-action + :persistent-help "Jump to PDF Page" + :requires-pattern 2) + :buffer "*helm pdfgrep*" + :history 'helm-grep-history))) + +(defun helm-pdfgrep-action (candidate) + (helm-grep-action candidate 'pdf)) + +(defun helm-pdfgrep-action-1 (_split pageno fname) + (save-selected-window + (start-file-process-shell-command + "pdf-reader" nil + (format-spec helm-pdfgrep-default-read-command + (list (cons ?f fname) (cons ?p pageno)))))) + +;;; AG - PT - RG +;; +;; https://github.com/ggreer/the_silver_searcher +;; https://github.com/monochromegane/the_platinum_searcher +;; https://github.com/BurntSushi/ripgrep + +(defun helm-grep--ag-command () + (car (helm-remove-if-match + "\\`[A-Z]*=" (split-string helm-grep-ag-command)))) + +(defun helm-grep-ag-get-types () + "Returns a list of AG types if available with AG version. +See AG option \"--list-file-types\" +Ripgrep (rg) types are also supported if this backend is used." + (with-temp-buffer + (let* ((com (helm-grep--ag-command)) + (ripgrep (string= com "rg")) + (regex (if ripgrep "^\\(.*\\):" "^ *\\(--[a-z]*\\)")) + (prefix (if ripgrep "-t " ""))) + (when (equal (call-process com + nil t nil + (if ripgrep + "--type-list" "--list-file-types")) 0) + (goto-char (point-min)) + (cl-loop while (re-search-forward regex nil t) + for type = (match-string 1) + collect (cons type (concat prefix type))))))) + +(defun helm-grep-ag-prepare-cmd-line (pattern directory &optional type) + "Prepare AG command line to search PATTERN in DIRECTORY. +When TYPE is specified it is one of what `helm-grep-ag-get-types' +returns if available with current AG version." + (let* ((patterns (helm-mm-split-pattern pattern t)) + (pipe-switches (mapconcat 'identity helm-grep-ag-pipe-cmd-switches " ")) + (pipe-cmd (helm-acase (helm-grep--ag-command) + (("ag" "pt") + (format "%s -S --color%s" it (concat " " pipe-switches))) + ("rg" (format "rg -N -S --color=%s%s" + (when (string-match "--color=\\([a-z]+\\) " + helm-grep-ag-command) + (match-string 1 helm-grep-ag-command)) + (concat " " pipe-switches))))) + (cmd (format helm-grep-ag-command + (mapconcat 'identity type " ") + (shell-quote-argument (car patterns)) + (shell-quote-argument directory)))) + (helm-aif (cdr patterns) + (concat cmd (cl-loop for p in it concat + (format " | %s -- %s" + pipe-cmd (shell-quote-argument p)))) + cmd))) + +(defun helm-grep-ag-init (directory &optional type) + "Start AG process in DIRECTORY maybe searching only files of type TYPE." + (let ((default-directory (or helm-ff-default-directory + (helm-default-directory) + default-directory)) + (cmd-line (helm-grep-ag-prepare-cmd-line + helm-pattern (or (file-remote-p directory 'localname) + directory) + type)) + (start-time (float-time)) + (proc-name (helm-grep--ag-command))) + (set (make-local-variable 'helm-grep-last-cmd-line) cmd-line) + (helm-log "helm-grep-ag-init" "Starting %s process in directory `%s'" + proc-name directory) + (helm-log "helm-grep-ag-init" "Command line used was:\n\n%s" + (concat ">>> " cmd-line "\n\n")) + (prog1 + (start-file-process-shell-command + proc-name helm-buffer cmd-line) + (set-process-sentinel + (get-buffer-process helm-buffer) + (lambda (process event) + (let* ((err (process-exit-status process)) + (noresult (= err 1))) + (cond (noresult + (with-helm-buffer + (insert (concat "* Exit with code 1, no result found," + " command line was:\n\n " + (propertize helm-grep-last-cmd-line + 'face 'helm-grep-cmd-line))) + (setq mode-line-format + `(" " mode-line-buffer-identification " " + (:eval (format "L%s" (helm-candidate-number-at-point))) " " + (:eval (propertize + (format + "[%s process finished - (no results)] " + ,(upcase proc-name)) + 'face 'helm-grep-finish)))))) + ((string= event "finished\n") + (helm-log "helm-grep-ag-init" "%s process finished with %s results in %fs" + proc-name + (helm-get-candidate-number) + (- (float-time) start-time)) + (helm-maybe-show-help-echo) + (with-helm-window + (setq mode-line-format + `(" " mode-line-buffer-identification " " + (:eval (format "L%s" (helm-candidate-number-at-point))) " " + (:eval (propertize + (format + "[%s process finished in %.2fs - (%s results)] " + ,(upcase proc-name) + ,(- (float-time) start-time) + (helm-get-candidate-number)) + 'face 'helm-grep-finish)))) + (force-mode-line-update) + (when helm-allow-mouse + (helm--bind-mouse-for-selection helm-selection-point)))) + (t (helm-log + "helm-grep-ag-init" + "Error: %s %s" + proc-name + (replace-regexp-in-string "\n" "" event)))))))))) + +(defclass helm-grep-ag-class (helm-source-async) + ((nohighlight :initform t) + (pcre :initarg :pcre :initform t + :documentation + " Backend is using pcre regexp engine when non--nil.") + (keymap :initform 'helm-grep-map) + (history :initform 'helm-grep-ag-history) + (help-message :initform 'helm-grep-help-message) + (filtered-candidate-transformer :initform #'helm-grep-fc-transformer) + (persistent-action :initform 'helm-grep-persistent-action) + (persistent-help :initform "Jump to line (`C-u' Record in mark ring)") + (candidate-number-limit :initform 99999) + (requires-pattern :initform 2) + (nomark :initform t) + (action :initform 'helm-grep-actions) + (find-file-target :initform #'helm-grep-quit-an-find-file-fn) + (group :initform 'helm-grep))) + +(defvar helm-source-grep-ag nil) + +(cl-defmethod helm--setup-source ((source helm-grep-ag-class)) + (cl-call-next-method) + (helm-aif (and helm-follow-mode-persistent + helm-source-grep-ag + (assoc-default 'follow helm-source-grep-ag)) + (setf (slot-value source 'follow) it))) + +(defun helm-grep-ag-1 (directory &optional type input) + "Start helm ag in DIRECTORY maybe searching in files of type TYPE. +If INPUT is provided, use it as the search string." + (setq helm-source-grep-ag + (helm-make-source (upcase (helm-grep--ag-command)) 'helm-grep-ag-class + :header-name (lambda (name) + (format "%s [%s]" + name (abbreviate-file-name directory))) + :candidates-process + (lambda () (helm-grep-ag-init directory type)))) + (helm-set-local-variable 'helm-input-idle-delay helm-grep-input-idle-delay) + (helm :sources 'helm-source-grep-ag + :keymap helm-grep-map + :history 'helm-grep-ag-history + :input input + :truncate-lines helm-grep-truncate-lines + :buffer (format "*helm %s*" (helm-grep--ag-command)))) + +(defun helm-grep-ag (directory with-types) + "Start grep AG in DIRECTORY. +When WITH-TYPES is non-nil provide completion on AG types." + (require 'helm-adaptive) + (let ((com (capitalize (helm-grep--ag-command)))) + (helm-grep-ag-1 directory + (helm-aif (and with-types + (helm-grep-ag-get-types)) + (helm-comp-read + (format "%s type: " com) it + :must-match t + :marked-candidates t + :fc-transformer 'helm-adaptive-sort + :buffer (format "*helm %s types*" com)))))) + +;;; Git grep +;; +;; +(defvar helm-source-grep-git nil) + +(defun helm-grep-git-1 (directory &optional all default input) + "Run git-grep on DIRECTORY. +If DIRECTORY is not inside or part of a git repo exit with error. +If optional arg ALL is non-nil grep the whole repo otherwise +start at DIRECTORY. +Arg DEFAULT is what you will have with `next-history-element', +arg INPUT is what you will have by default at prompt on startup." + (require 'vc) + (let* (helm-grep-default-recurse-command + ;; Expand filename of each candidate with the git root dir. + ;; The filename will be in the helm-grep-fname prop. + (helm-grep-default-directory-fn (lambda () + (vc-find-root directory ".git"))) + (helm-ff-default-directory (funcall helm-grep-default-directory-fn))) + (cl-assert helm-ff-default-directory nil "Not inside a Git repository") + (helm-do-grep-1 (if all '("") `(,(expand-file-name directory))) + nil 'git nil default input 'helm-source-grep-git))) + + +;;;###autoload +(defun helm-do-grep-ag (arg) + "Preconfigured `helm' for grepping with AG in `default-directory'. +With prefix arg prompt for type if available with your AG +version." + (interactive "P") + (require 'helm-files) + (helm-grep-ag (expand-file-name default-directory) arg)) + +;;;###autoload +(defun helm-grep-do-git-grep (arg) + "Preconfigured `helm' for git-grepping `default-directory'. +With a prefix arg ARG git-grep the whole repository." + (interactive "P") + (require 'helm-files) + (helm-grep-git-1 default-directory arg)) + + +(provide 'helm-grep) + +;;; helm-grep.el ends here diff --git a/code/elpa/helm-20240320.541/helm-help.el b/code/elpa/helm-20240320.541/helm-help.el new file mode 100644 index 0000000..614ca05 --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-help.el @@ -0,0 +1,2552 @@ +;;; helm-help.el --- Help messages for Helm. -*- lexical-binding: t -*- + +;; Copyright (C) 2012 ~ 2023 Thierry Volpiatto + +;; 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 'helm) + + +(defgroup helm-help nil + "Embedded help for `helm'." + :group 'helm) + +(defface helm-helper + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :inherit helm-header)) + "Face for Helm help string in minibuffer." + :group 'helm-help) + +(defvar helm-help--string-list '(helm-help-message + helm-buffer-help-message + helm-ff-help-message + helm-read-file-name-help-message + helm-generic-file-help-message + helm-fd-help-message + helm-grep-help-message + helm-pdfgrep-help-message + helm-etags-help-message + helm-ucs-help-message + helm-bookmark-help-message + helm-esh-help-message + helm-buffers-ido-virtual-help-message + helm-moccur-help-message + helm-top-help-message + helm-M-x-help-message + helm-imenu-help-message + helm-colors-help-message + helm-semantic-help-message + helm-kmacro-help-message + helm-kill-ring-help-message) + "A list of help messages (strings) used by `helm-documentation'.") + +(defvar helm-documentation-buffer-name "*helm documentation*") + +;;;###autoload +(defun helm-documentation () + "Preconfigured `helm' for Helm documentation. +With a prefix arg refresh the documentation. + +Find here the documentation of all documented sources." + (interactive) + (let ((buf (get-buffer-create helm-documentation-buffer-name))) + (switch-to-buffer buf) + (set-buffer buf) + (let ((inhibit-read-only t)) + (erase-buffer) + (save-excursion + (cl-loop for elm in helm-help--string-list + for str = (helm-interpret-value elm) + do (insert (substitute-command-keys str) "\n\n"))) + (org-mode)) + (setq buffer-read-only t) + (view-mode))) + + +;;; Local help messages. + +;;; `helm-buffer-list' help +;; +;; +(defvar helm-buffer-help-message + "* Helm Buffer + +** Tips + +*** Completion + +**** Major-mode + +You can enter a partial major-mode name (e.g. lisp, sh) to narrow down buffers. +To specify the major-mode, prefix it with \"*\" e.g. \"*lisp\". + +If you want to match all buffers but the ones with a specific major-mode +\(negation), prefix the major-mode with \"!\" e.g. \"*!lisp\". + +If you want to specify more than one major-mode, separate them with \",\", +e.g. \"*!lisp,!sh,!fun\" lists all buffers but the ones in lisp-mode, sh-mode +and fundamental-mode. + +Then enter a space followed by a pattern to narrow down to buffers matching this +pattern. + +**** Search inside buffers + +If you enter a space and a pattern prefixed by \"@\", Helm searches for text +matching this pattern *inside* the buffer (i.e. not in the name of the buffer). + +Negation are supported i.e. \"!\". + +When you specify more than one of such patterns, it will match +buffers with contents matching each of these patterns i.e. AND, +not OR. That means that if you specify \"@foo @bar\" the contents +of buffer will have to be matched by foo AND bar. If you specify +\"@foo @!bar\" it means the contents of the buffer have to be +matched by foo but NOT bar. + +If you enter a pattern prefixed with an escaped \"@\", Helm searches for a +buffer matching \"@pattern\" but does not search inside the buffer. + +**** Search by directory name + +If you prefix the pattern with \"/\", Helm matches over the directory names +of the buffers. + +This feature can be used to narrow down the search to one directory while +subsequent strings entered after a space match over the buffer name only. + +Note that negation is not supported for matching on buffer filename. + +Starting from Helm v1.6.8, you can specify more than one directory. + +**** Fuzzy matching + +`helm-buffers-fuzzy-matching' turns on fuzzy matching on buffer +names, but not on directory names or major modes. A pattern +starting with \"^\" disables fuzzy matching and matching is done +litteraly IOW do not use regexps (\"^\" or whatever special +regexp character) when you want to fuzzy match. + +**** Examples + +With the following pattern + + \"*lisp ^helm @moc\" + +Helm narrows down the list by selecting only the buffers that are in lisp mode, +start with \"helm\" and which content matches \"moc\". + +Without the \"@\" + + \"*lisp ^helm moc\" + +Helm looks for lisp mode buffers starting with \"helm\" and containing \"moc\" +in their name. + +With this other pattern + + \"*!lisp !helm\" + +Helm narrows down to buffers that are not in \"lisp\" mode and that do not match +\"helm\". + +With this last pattern + + /helm/ w3 + +Helm narrows down to buffers that are in any \"helm\" subdirectory and +matching \"w3\". + +*** Creating buffers + +When creating a new buffer, use `\\[universal-argument]' to choose a mode from a +list. This list is customizable, see `helm-buffers-favorite-modes'. + +*** Killing buffers + +You can kill buffers either one by one or all the marked buffers at once. + +One kill-buffer command leaves Helm while the other is persistent. Run the +persistent kill-buffer command either with the regular +`helm-execute-persistent-action' called with a prefix argument (`\\[universal-argument] \\\\[helm-execute-persistent-action]') +or with its specific command `helm-buffer-run-kill-persistent'. See the +bindings below. + +*** Switching to buffers + +To switch to a buffer, press RET, to switch to a buffer in another window, select this buffer +and press \\\\[helm-buffer-switch-other-window], when called with a prefix arg +the buffer will be displayed vertically in other window. +If you mark more than one buffer, the marked buffers will be displayed in different windows. + +*** Saving buffers + +If buffer is associated to a file and is modified, it is by default colorized in orange, +see [[Meaning of colors and prefixes for buffers][Meaning of colors and prefixes for buffers]]. +You can save these buffers with \\\\[helm-buffer-save-persistent]. +If you want to save all these buffers, you can mark them with \\[helm-buffers-mark-similar-buffers] +and save them with \\[helm-buffer-save-persistent]. You can also do this in one step with +\\[helm-buffer-run-save-some-buffers]. Note that you will not be asked for confirmation. + +*** Meaning of colors and prefixes for buffers + +Remote buffers are prefixed with '@'. +Red => Buffer's file was modified on disk by an external process. +Indianred2 => Buffer exists but its file has been deleted. +Orange => Buffer is modified and not saved to disk. +Italic => A non-file buffer. +Yellow => Tramp archive buffer. + +** Commands +\\ +|Keys|Description| +|-------------+----------| +|\\[helm-buffer-run-zgrep]|Grep Buffer(s) works as zgrep too (`\\[universal-argument]' to grep all buffers but non-file buffers). +|\\[helm-buffers-run-occur]|Multi-Occur buffer or marked buffers (`\\[universal-argument]' to toggle force-searching current-buffer). +|\\[helm-buffer-switch-other-window]|Switch to other window. +|\\[helm-buffer-switch-other-frame]|Switch to other frame. +|\\[helm-buffers-run-browse-project]|Browse project from buffer. +|\\[helm-buffer-run-query-replace-regexp]|Query-replace-regexp in marked buffers. +|\\[helm-buffer-run-query-replace]|Query-replace in marked buffers. +|\\[helm-buffer-run-ediff]|Ediff current buffer with candidate. With two marked buffers, ediff those buffers. +|\\[helm-buffer-run-ediff-merge]|Ediff-merge current buffer with candidate. With two marked buffers, ediff-merge those buffers. +|\\[helm-buffer-diff-persistent]|Toggle Diff-buffer with saved file without leaving Helm. +|\\[helm-buffer-revert-persistent]|Revert buffer without leaving Helm. +|\\[helm-buffer-save-persistent]|Save buffer without leaving Helm. +|\\[helm-buffer-run-save-some-buffers]|Save all unsaved buffers. +|\\[helm-buffer-run-kill-buffers]|Delete marked buffers and leave Helm. +|\\[helm-buffer-run-kill-persistent]|Delete buffer without leaving Helm. +|\\[helm-buffer-run-rename-buffer]|Rename buffer. +|\\[helm-toggle-all-marks]|Toggle all marks. +|\\[helm-mark-all]|Mark all. +|\\[helm-toggle-buffers-details]|Toggle details. +|\\[helm-buffers-toggle-show-hidden-buffers]|Show hidden buffers. +|\\[helm-buffers-mark-similar-buffers]|Mark all buffers of the same type (color) as current buffer.") + +;;; Find files help (`helm-find-files') +;; +;; +(defvar helm-ff-help-message + "* Helm Find Files + +** Tips + +*** Navigation summary + +For a better experience you can enable auto completion by setting +`helm-ff-auto-update-initial-value' to non-nil in your init file. It is not +enabled by default to not confuse new users. + +**** Navigate with arrow keys + +You can use and arrows to go down or up one level, to disable +this customize `helm-ff-lynx-style-map'. +Note that using `setq' will NOT work. + +**** Use `\\\\[helm-execute-persistent-action]' (persistent action) on a directory to go down one level + +On a symlinked directory a prefix argument expands to its true name. + +**** Use `\\\\[helm-find-files-up-one-level]' or `DEL' on a directory to go up one level + +***** `DEL' behavior + +`DEL' by default deletes char backward. + +But when `helm-ff-DEL-up-one-level-maybe' is non nil `DEL' behaves +differently depending on the contents of helm-pattern. It goes up one +level if the pattern is a directory ending with \"/\" or disables HFF +auto update and delete char backward if the pattern is a filename or +refers to a non existing path. Going up one level can be disabled +if necessary by deleting \"/\" at the end of the pattern using +\\\\[backward-char] and \\[helm-delete-minibuffer-contents]. + +Note that when deleting char backward, Helm takes care of +disabling update giving you the opportunity to edit your pattern for +e.g. renaming a file or creating a new file or directory. +When `helm-ff-auto-update-initial-value' is non nil you may want to +disable it temporarily, see [[Toggle auto-completion][Toggle auto-completion]] for this. + +**** Use `\\\\[helm-find-files-down-last-level]' to walk back the resulting tree of all the `\\\\[helm-find-files-up-one-level]' or DEL you did + +The tree is reinitialized each time you browse a new tree with +`\\\\[helm-execute-persistent-action]' or by entering some pattern in the prompt. + +**** `RET' behavior + +It behaves differently depending on `helm-selection' (current candidate in helm-buffer): + +- candidate basename is \".\" => Open it in dired. +- candidate is a directory => Expand it. +- candidate is a file => Open it. + +If you have marked candidates and you press RET on a directory, +Helm will navigate to this directory. If you want to exit with +RET with default action with these marked candidates, press RET a +second time while you are on the root of this directory e.g. +\"/home/you/dir/.\" or press RET on any file which is not a +directory. You can also exit with default action at any moment +with `f1'. + +Note that when copying, renaming, etc. from `helm-find-files' the +destination file is selected with `helm-read-file-name'. + +**** `TAB' behavior + +Normally `TAB' is bound to `helm-select-action' in helm-map which +display the action menu. + +You can change this behavior by setting in `helm-find-files-map' +a new command for `TAB': + + (define-key helm-find-files-map (kbd \"C-i\") 'helm-ff-TAB) + +It will then behave slighly differently depending of +`helm-selection': + +- candidate basename is \".\" => open the action menu. +- candidate is a directory => expand it (behave as \\\\[helm-execute-persistent-action]). +- candidate is a file => open action menu. + +Called with a prefix arg open menu unconditionally. + +*** Filter out files or directories + +You can show files or directories only with respectively +\\\\[helm-ff-toggle-dirs-only] and \\\\[helm-ff-toggle-files-only]. +These are toggle commands i.e. filter/show_all. +Changing directory disable filtering. + +*** Sort directory contents + +When listing a directory without narrowing its contents, i.e. when pattern ends with \"/\", +you can sort alphabetically, by newest or by size by using respectively +\\\\[helm-ff-sort-alpha], \\[helm-ff-sort-by-newest] or \\[helm-ff-sort-by-size]. +NOTE: +When starting back narrowing i.e. entering something in minibuffer after \"/\" sorting is done +again with fuzzy sorting and no more with sorting methods previously selected. + +You can use these sort functions only on files or directory, +see [[Filter out files or directories][Filter out files or directories]]. + +*** Find file at point + +Helm uses `ffap' partially or completely to find file at point depending on the +value of `helm-ff-guess-ffap-filenames': if non-nil, support is complete +\(annoying), if nil, support is partial. + +Note that when the variable +`helm-ff-allow-non-existing-file-at-point' is non nil Helm will +insert the filename at point even if file with this name doesn't +exists. If non existing file at point ends with numbers prefixed +with \":\" the \":\" and numbers are stripped. + +**** Find file at line number + +When text at point is in the form of + + ~/elisp/helm/helm.el:1234 + +Helm finds this file at the indicated line number, here 1234. + +**** Find URL at point + +When a URL is found at point, Helm expands to that URL only. +Pressing `RET' opens that URL using `browse-url-browser-function'. + +**** Find e-mail address at point + +When an e-mail address is found at point, Helm expands to this e-mail address +prefixed with \"mailto:\". Pressing `RET' opens a message buffer with that +e-mail address. + +*** Quick pattern expansion + +**** Enter `~/' at end of pattern to quickly reach home directory + +**** Enter `/' at end of pattern to quickly reach the file system root + +**** Enter `./' at end of pattern to quickly reach `default-directory' + +\(As per its value at the beginning of the session.) + +If you already are in the `default-directory' this will move the cursor to the top. + +**** Enter `../' at end of pattern will reach upper directory, moving cursor to the top + +This is different from using `\\\\[helm-find-files-up-one-level]' in that it moves +the cursor to the top instead of remaining on the previous subdir name. + +**** Enter `..name/' at end of pattern to start a recursive search + +It searches directories matching \"name\" under the current directory, +see the [[Recursive completion on subdirectories][Recursive completion on subdirectories]] section below for more details. + +**** Any environment variable (e.g. `$HOME') at end of pattern gets expanded + +**** Any valid filename yanked after pattern gets expanded + +**** Special case: URL at point + +The quick expansions do not take effect after end a URL, you must kill the +pattern first (`\\[helm-delete-minibuffer-contents]'). + +*** Helm-find-files supports fuzzy matching + +It starts from the third character of the pattern. + +For instance \"fob\" or \"fbr\" will complete \"foobar\" but \"fb\" needs a +third character in order to complete it. + +*** Watch briefly files contents while navigating + +You can use `\\[helm-execute-persistent-action]' on a filename for this, then: + +- First hit expands to that filename in the Helm buffer. +- Second hit displays the buffer filename. +- Third hit kills the buffer filename. + +Note: `\\[universal-argument] \\[helm-execute-persistent-action]' displays the buffer directly. + +*** Browse images directories with `helm-follow-mode' and navigate up/down + +Before Emacs-27 Helm was using image-dired that works with +external ImageMagick tools. From Emacs-27 Helm use native +display of images with image-mode by default for Emacs-27 (see `helm-ff-display-image-native'), +this allows automatic resize when changing window size, zooming with `\\[helm-ff-increase-image-size-persistent]' and `\\[helm-ff-decrease-image-size-persistent]' +and rotate images as before. + +You can also use `helm-follow-action-forward' and `helm-follow-action-backward' with +`\\[helm-follow-action-forward]' and `\\[helm-follow-action-backward]' respectively. +Note that these commands have different behavior when `helm-follow-mode' +is enabled (go to next/previous line only). + +Use `\\[universal-argument] \\[helm-execute-persistent-action]' to display an image or kill its buffer. + +TIP: Use `\\\\[helm-toggle-resplit-and-swap-windows]' and `\\[helm-enlarge-window]' to display Helm window vertically +and to enlarge it while viewing images. +Note this may not work with exotic Helm windows settings such as the ones in Spacemacs. + +**** Show thumbnails + +Helm use image-dired to show thumbnails on image files, you can +toggle the thumbnail view with \\`\\[helm-ff-toggle-thumbnails]'. + +**** Launch a slideshow from marked files + +Helm provides an action from `helm-find-files' that allows +running a slideshow on marked files. Just mark image files and +launch slideshow from action menu, bindings are self documented +in mode-line. NOTE: When hitting any other keys than the ones +mentionned in mode-line, slideshow will come in pause, to restart +it you will have to press twice SPACE. + +*** Open files externally + +- Open file with external program (`\\\\[helm-ff-run-open-file-externally]',`C-u' to choose). + +Helm is looking what is used by default to open file +externally (mailcap files) but have its own variable +`helm-external-programs-associations' to store external +applications. If you call the action or its binding without +prefix arg Helm will see if there is an application suitable in +`helm-external-programs-associations', otherwise it will look in +mailcap files. If you want to specify which external application +to use (and its options) use a prefix arg. + +If you have to pass arguments after filename use `%s' in your command e.g. \"foo %s -a -b\" +If you want to detach your program from Emacs, you can use e.g. \"(foo %s &)\" (only supported on Linux/Unix). +When using `%s' do not quote it (i.e. \"%s\"), helm is already quoting filename argument. + +Note: What you configure for Helm in `helm-external-programs-associations' +will take precedence on mailcap files. + +- Preview file with external program (`\\[helm-ff-run-preview-file-externally]'). + +Same as above but doesn't quit Helm session, it is apersistent action. + +- Open file externally with default tool (`\\[helm-ff-run-open-file-with-default-tool]'). + +Use `xdg-open' to open files. + +*** Toggle auto-completion + +It is useful when trying to create a new file or directory and you don't want +Helm to complete what you are writing. + +Note: On a terminal, the default binding `C-' may not work. +In this case use `C-c '. + +*** You can create a new directory and a new file at the same time + +Simply write the path in the prompt and press `RET', e.g. +\"~/new/newnew/newnewnew/my_newfile.txt\". + +*** To create a new directory, append a \"/\" to the new name and press `RET' + +*** To create a new file, enter a filename not ending with \"/\" + +Note that when you enter a new name, this one is prefixed with [+]. + +*** Recursive search from Helm-find-files + +**** You can use Helm-browse-project (see binding below) + +- With no prefix argument: +If the current directory is under version control with either git or hg and +helm-ls-git and/or helm-ls-hg are installed, it lists all the files under +version control. Otherwise it falls back to Helm-find-files. See +https://github.com/emacs-helm/helm-ls-git and +https://github.com/emacs-helm/helm-ls-hg. + +- With one prefix argument: +List all the files under this directory and other subdirectories +\(recursion) and this list of files will be cached. + +- With two prefix arguments: +Same but the cache is refreshed. + +**** You can start a recursive search with \"locate\", \"find\" or [[https://github.com/sharkdp/fd][Fd]] + +See \"Note\" in the [[Recursive completion on subdirectories][section on subdirectories]]. + +Using \"locate\", you can enable the local database with a prefix argument. If the +local database doesn't already exists, you will be prompted for its creation. +If it exists and you want to refresh it, give it two prefix args. + +When using locate the Helm buffer remains empty until you type something. +Regardless Helm uses the basename of the pattern entered in the helm-find-files +session by default. Hitting `\\[next-history-element]' should just kick in the +locate search with this pattern. If you want Helm to automatically do this, add +`helm-source-locate' to `helm-sources-using-default-as-input'. + +NOTE: On Windows use Everything with its command line ~es~ as a replacement of locate. +See [[https://github.com/emacs-helm/helm/wiki/Locate#windows][Locate on Windows]] + +**** Recursive completion on subdirectories + +Starting from the directory you are currently browsing, it is possible to have +completion of all directories underneath. Say you are at \"/home/you/foo/\" and +you want to go to \"/home/you/foo/bar/baz/somewhere/else\", simply type +\"/home/you/foo/..else\" and hit `\\[helm-execute-persistent-action]' or enter +the final \"/\". Helm will then list all possible directories under \"foo\" +matching \"else\". + +Note: Completion on subdirectories uses \"locate\" as backend, you can configure +the command with `helm-locate-recursive-dirs-command'. Because this completion +uses an index, the directory tree displayed may be out-of-date and not reflect +the latest change until you update the index (using \"updatedb\" for \"locate\"). + +If for some reason you cannot use an index, the \"find\" command from +\"findutils\" can be used instead. It will be slower though. You need to pass +the basedir as first argument of \"find\" and the subdir as the value for +'-(i)regex' or '-(i)name' with the two format specs that are mandatory in +`helm-locate-recursive-dirs-command'. + +Examples: +- \"find %s -type d -name '*%s*'\" +- \"find %s -type d -regex .*%s.*$\" + +[[https://github.com/sharkdp/fd][Fd]] command is now also +supported which is regexp based and very fast. Here is the command +line to use: + +- \"fd --hidden --type d .*%s.*$ %s\" + +You can use also a glob based search, in this case use the --glob option: + +- \"fd --hidden --type d --glob '*%s*' %s\" + +*** Insert filename at point or complete filename at point + +On insertion (i.e. there is nothing at point): + +- `\\[helm-ff-run-complete-fn-at-point]': insert absolute file name. +- `\\[universal-argument] \\[helm-ff-run-complete-fn-at-point]': insert abbreviated file name. +- `\\[universal-argument] \\[universal-argument] \\[helm-ff-run-complete-fn-at-point]': insert relative file name. +- `\\[universal-argument] \\[universal-argument] \\[universal-argument] \\[helm-ff-run-complete-fn-at-point]': insert basename. + +On completion (\\[helm-ff-run-complete-fn-at-point]): + +- Target starts with \"~/\": insert abbreviate file name. +- target starts with \"/\" or \"[a-z]:/\": insert full path. +- Otherwise: insert relative file name. + +*** Use the wildcard to select multiple files + +Use of wildcard is supported to run an action over a set of files. + +Example: You can copy all the files with \".el\" extension by using \"*.el\" and +then run copy action. + +Similarly, \"**.el\" (note the two stars) will recursively select all \".el\" +files under the current directory. + +Note that when recursively copying files, you may have files with same name +dispatched across different subdirectories, so when copying them in the same +directory they will get overwritten. To avoid this Helm has a special action +called \"backup files\" that has the same behavior as the command line \"cp -f +--backup=numbered\": it allows you to copy many files with the same name from +different subdirectories into one directory. Files with same name are renamed +as follows: \"foo.txt.~1~\". Like with the --force option of cp, it is possible +to backup files in current directory. + +This command is available only when `dired-async-mode' is active. + +When using an action that involves an external backend (e.g. grep), using \"**\" +is not recommended (even thought it works fine) because it will be slower to +select all the files. You are better off leaving the backend to do it, it will +be faster. However, if you know you have not many files it is reasonable to use +this, also using not recursive wildcard (e.g. \"*.el\") is perfectly fine for +this. + +The \"**\" feature is active by default in the option `helm-file-globstar'. It +is different from the Bash \"shopt globstar\" feature in that to list files with +a named extension recursively you would write \"**.el\" whereas in Bash it would +be \"**/*.el\". Directory selection with \"**/\" like Bash \"shopt globstar\" +option is not supported yet. + +Helm supports different styles of wildcards: + +- `sh' style, the ones supported by `file-expand-wildcards'. +e.g. \"*.el\", \"*.[ch]\" which match respectively all \".el\" +files or all \".c\" and \".h\" files. + +- `bash' style (partially) In addition to what allowed in `sh' +style you can specify file extensions that have more than one +character like this: \"*.{sh,py}\" which match \".sh\" and +\".py\" files. + +Of course in both styles you can specify one or two \"*\". + +*** Query replace regexp on filenames + +Replace different parts of a file basename with something else. + +When calling this action you will be prompted twice as with +`query-replace', first for the matching expression of the text to +replace and second for the replacement text. Several facilities, +however, are provided to make the two prompts more powerfull. + +**** Syntax of the first prompt + +In addition to simple regexps, these shortcuts are available: + +- Basename without extension => \"%.\" +- Only extension => \".%\" +- Substring => \"%::\" +- Whole basename => \"%\" + +**** Syntax of the second prompt + +In addition to a simple string to use as replacement, here is what you can use: + +- A placeholder refering to what you have selected in the first prompt: \"\\@\". + +After this placeholder you can use a search-and-replace syntax à-la sed: + + \"\\@/// + +You can select a substring from the string represented by the placeholder: + + \"\\@::\" + +- A special character representing a number which is incremented: \"\\#\". + +- Shortcuts for `upcase', `downcase' and `capitalize' +are available as`%u', `%d' and `%c' respectively. + +**** Examples + +***** Recursively rename all files with \".JPG\" extension to \".jpg\" + +Use the `helm-file-globstar' feature described in [[Use the wildcard to select multiple files][recursive globbing]] +by entering \"**.JPG\" at the end of the Helm-find-files pattern, then hit +\\\\[helm-ff-run-query-replace-fnames-on-marked] and enter \"JPG\" on first prompt, then \"jpg\" on second prompt and hit `RET'. + +Alternatively you can enter \".%\" at the first prompt, then \"jpg\" and hit +`RET'. Note that when using this instead of using \"JPG\" at the first prompt, +all extensions will be renamed to \"jpg\" even if the extension of one of the +files is, say, \"png\". If you want to keep the original extension you can use +\"%d\" at the second prompt (downcase). + +***** Batch-rename files from number 001 to 00x + +Use \"\\#\" inside the second prompt. + +Example 1: To rename the files + + foo.jpg + bar.jpg + baz.jpg + +to + + foo-001.jpg + foo-002.jpg + foo-003.jpg + +use \"%.\" as matching regexp and \"foo-\\#\" as replacement string. + +Example 2: To rename the files + + foo.jpg + bar.jpg + baz.jpg + +to + + foo-001.jpg + bar-002.jpg + baz-003.jpg + +use as matching regexp \"%.\" and as replacement string \"\\@-\\#\". + +***** Replace a substring + +Use \"%::\". + +Example: To rename files + + foo.jpg + bar.jpg + baz.jpg + +to + + fOo.jpg + bAr.jpg + bAz.jpg + +use as matching regexp \"%:1:2\" and as replacement string \"%u\" (upcase). + +Note that you \*cannot* use \"%.\" and \".%\" along with substring replacement. + +***** Modify the string from the placeholder (\\@) + +- By substring, i.e. only using the substring of the placeholder: \"\\@::\". +The length of placeholder is used for when unspecified. + +Example 1: \"\\@:0:2\" replaces from the beginning to the second char of the placeholder. + +Example 2: \\@:2: replaces from the second char of the placeholder to the end. + +- By search-and-replace: \"\\@///\". + +Incremental replacement is also handled in . + +Example 3: \"\\@/foo/bar/\" replaces \"foo\" by \"bar\" in the placeholder. + +Example 4: \"\\@/foo/-\\#/\" replaces \"foo\" in the placeholder by 001, 002, etc. + +***** Clash in replacements (avoid overwriting files) + +When performing any of these replacement operations you may end up with same +names as replacement. In such cases Helm numbers the file that would otherwise +overwritten. For instance, should you remove the \"-m\" part from the files +\"emacs-m1.txt\", \"emacs-m2.txt\" and \"emacs-m3.txt\" you would end up with +three files named \"emacs.txt\", the second renaming overwriting first file, and +the third renaming overwriting second file and so on. Instead Helm will +automatically rename the second and third files as \"emacs(1).txt\" and +\"emacs(2).txt\" respectively. + +***** Query-replace on filenames vs. serial-rename action + +Unlike the [[Serial renaming][serial rename]] actions, the files renamed with +the query-replace action stay in their initial directory and are not moved to +the current directory. As such, using \"\\#\" to serial-rename files only makes +sense for files inside the same directory. It even keeps renaming files +with an incremental number in the next directories. + +*** Serial renaming + +You can use the serial-rename actions to rename, copy or symlink marked files to +a specific directory or in the current directory with all the files numbered +incrementally. + +- Serial-rename by renaming: +Rename all marked files with incremental numbering to a specific directory. + +- Serial-rename by copying: +Copy all marked files with incremental numbering to a specific directory. + +- Serial-rename by symlinking: +Symlink all marked files with incremental numbering to a specific directory. + +*** Edit marked files in a dired buffer + +You can open a dired buffer containing only marked files with `\\\\[helm-ff-run-marked-files-in-dired]'. +With a prefix argument you can open this same dired buffer in wdired mode for +editing. Note that wildcards are supported as well, so you can use e.g. +\"*.txt\" to select all \".txt\" files in the current directory or \"**.txt\" to +select all files recursively from the current directory. +See [[Use the wildcard to select multiple files]] section above. + +*** Defining default target directory for copying, renaming, etc + +You can customize `helm-dwim-target' to behave differently depending on the +windows open in the current frame. Default is to provide completion on all +directories associated to each window. + +*** Copying/Renaming from or to remote directories + +Never use ssh tramp method to copy/rename large files, use +instead its scp method if you want to avoid out of memory +problems and crash Emacs or the whole system. Moreover when using +scp method, you will hit a bug when copying more than 3 files at +the time, see [[https://github.com/emacs-helm/helm/issues/1945][bug#1945]]. +The best way actually is using Rsync to copy files from or to +remote, see [[Use Rsync to copy files][Use Rsync to copy files]]. +Also if you often work on remote you may consider using SSHFS +instead of relying on tramp. + +*** Copying and renaming asynchronously + +If you have the async library installed (if you got Helm from MELPA you do), you +can use it for copying/renaming files by enabling `dired-async-mode'. + +Note that even when async is enabled, running a copy/rename action with a prefix +argument will execute action synchronously. Moreover it will follow the first +file of the marked files in its destination directory. + +When `dired-async-mode' is enabled, an additional action named \"Backup files\" +will be available. (Such command is not natively available in Emacs). +See [[Use the wildcard to select multiple files]] for details. + +*** Multiple copies of a file + +The command \\\\[helm-ff-run-mcp] allows +copying a single file to multiple directories. To use it, mark +the file you want to copy first and then mark the directories +where you want to copy file. For example if you run +\\[helm-ff-run-mcp] on the marked candidates '(\"foo.txt\" \"bar/\" \"baz\"), +\"foo.txt\" will be copied to directories \"bar/\" and \"baz/\". + +*** Use Rsync to copy files + +If Rsync is available, you can use it to copy/sync files or directories +with some restrictions though: + +- Copying from/to tramp sudo method may not work (permissions). +- Copying from remote to remote is not supported (rsync restriction) +however you can mount a remote with sshfs and copy to it (best), otherwise you have to modify +the command line with a prefix arg, see [[https://unix.stackexchange.com/questions/183504/how-to-rsync-files-between-two-remotes][how-to-rsync-files-between-two-remotes]] +for the command line to use. + +This command is mostly useful when copying large files as it is +fast, asynchronous and provide a progress bar in mode-line. Each +rsync process have its own progress bar, so you can run several +rsync jobs, they are independents. If rsync fails you can +consult the \"*helm-rsync*\" buffer to see rsync errors. An +help-echo (move mouse over progress bar) is provided to see which +file is in transfer. Note that when copying directories, no +trailing slashes are added to directory names, which mean that +directory is created on destination if it doesn't already exists, +see rsync documentation for more infos on rsync behavior. To +synchronize a directory, mark all in the directory and rsync all +marked to the destination directory or rsync the directory itself +to its parent, e.g. remote:/home/you/music => /home/you. + +The options are configurable through `helm-rsync-switches', but +you can modify them on the fly when needed by using a prefix arg, +in this case you will be prompted for modifications. + +NOTE: When selecting a remote file, if you use the tramp syntax +for specifying a port, i.e. host#2222, helm will add +automatically \"-e 'ssh -p 2222'\" to the rsync command line +unless you have specified yourself the \"-e\" option by editing +rsync command line with a prefix arg (see above). + +*** Access files on Android phones from Helm + +Since Android doesn't provide anymore mass storage for USB, it is +not simple to access files on Android, the best way to do this +actually seems to use Adb, here some hints to set this up, read +in addition the Tramp documentation. + +1) Install Adb, most distribution provide it. +2) Enable on your phone USB debug in System/dvlpmnt settings. +3) From helm-find-files use adb tramp method: + /adb::/ +From there you can navigate as usual, mark and copy files etc... + +*** Bookmark the `helm-find-files' session + +You can bookmark the `helm-find-files' session with `\\[helm-ff-bookmark-set]'. +You can later retrieve these bookmarks by calling `helm-filtered-bookmarks' +or, from the current `helm-find-files' session, by hitting `\\[helm-find-files-switch-to-bookmark]'. + +*** Grep files from `helm-find-files' + +You can grep individual files from `helm-find-files' by using +\`\\\\[helm-ff-run-grep]'. This same command can also +recursively grep files from the current directory when called with a prefix +argument. In this case you will be prompted for the file extensions to use +\(grep backend) or the types of files to use (ack-grep backend). See the +`helm-grep-default-command' documentation to set this up. For compressed files +or archives, use zgrep with \`\\\\[helm-ff-run-zgrep]'. + +Otherwise you can use recursive commands like \`\\\\[helm-ff-run-grep-ag]' or `\\\\[helm-ff-run-git-grep]' +that are much faster than using `\\\\[helm-ff-run-grep]' with a prefix argument. +See `helm-grep-ag-command' and `helm-grep-git-grep-command' to set this up. + +You can also use \"id-utils\"' GID with \`\\\\[helm-ff-run-gid]' +by creating an ID index file with the \"mkid\" shell command. + +All those grep commands use the symbol at point as the default pattern. +Note that default is different from input (nothing is added to the prompt until +you hit `\\[next-history-element]'). + +**** Grepping on remote files + +On remote files grep is not well supported by TRAMP unless you suspend updates before +entering the pattern and re-enable it once your pattern is ready. +To toggle suspend-update, use `\\\\[helm-toggle-suspend-update]'. + +*** Compressing or uncompressing files from helm-find-files + +**** Compressing/uncompressing using Helm commands + +Helm provide commands like dired (reusing dired code) +to (un)compress files from `helm-find-files', however these +commands are asynchronous. + +You can use `\\\\[helm-ff-run-compress-marked-files]' to compress marked files. +To compress file(s) to an archive use `\\\\[helm-ff-run-compress-to]'. + +To quickly compress/uncompress small files without quitting Helm use `\\\\[helm-ff-persistent-compress]'. +NOTE: This persistent action is NOT asynchronous, IOW it will block Helm +for a while until compression/uncompression finish. + +**** Compressing/uncompressing using external commands in Eshell + +You can use Eshell aliases to uncompress files, +see [[Execute Eshell commands on files][Execute Eshell commands on files]] for more infos. + +Here some aliases using commands from the excellent =atools= package: + +alias pack2zip apack -e -F .zip $* & +alias pack2gz apack -e -F .tar.gz $* & +alias pack2bz apack -e -F .tar.bz $* & +alias pack2xz apack -e -F .tar.xz $* & +alias unpack aunpack $1 & + +Note the \"&\" at end of commands that make eshell aliases asynchronous. + +Of course you can use any other commands of your choice as aliases. + +*** Execute Eshell commands on files + +Setting up aliases in Eshell allows you to set up powerful customized commands. + +Your aliases for using eshell command on file should allow +specifying one or more files, use e.g. \"alias foo $1\" or +\"alias foo $*\", if you want your command to be asynchronous add +at end \"&\", e.g. \"alias foo $* &\". + +Adding Eshell aliases to your `eshell-aliases-file' or using the +`alias' command from Eshell allows you to create personalized +commands not available in `helm-find-files' actions and use them +from `\\\\[helm-ff-run-eshell-command-on-file]'. + +Example: You want a command to uncompress some \"*.tar.gz\" files from `helm-find-files': + +1) Create an Eshell alias named, say, \"untargz\" with the command +\"alias untargz tar zxvf $*\". + +2) Now from `helm-find-files' select the \"*.tar.gz\" file (you can also +mark files if needed) and hit `\\\\[helm-ff-run-eshell-command-on-file]'. + +Note: When using marked files with this, the meaning of the prefix argument is +quite subtle. Say you have \"foo\", \"bar\" and \"baz\" marked; when you run +the alias command `example' on these files with no prefix argument it will run +`example' sequentially on each file: + +$ example foo +$ example bar +$ example baz + +With a prefix argument however it will apply `example' on all files at once: + +$ example foo bar baz + +Of course the alias command should support this. + +NOTE: Helm assume that any alias command ending with '$*' or +'$*&' supports many files as arguments, so no need to give a +prefix arg for such alias, however if your command is not an +alias you have to specify a prefix arg if you want your command +to apply all files at once. + +If you add %s to the command line %s will be replaced with the candidate, this mean you can +add extra argument to your command e.g. command -extra-arg %s or command %s -extra-arg. +If you want to pass many files inside %s, don't forget to use a prefix arg. + +You can also use special placeholders in extra-args, +see the specific info page once you hit `\\\\[helm-ff-run-eshell-command-on-file]'. + +*** Using TRAMP with `helm-find-files' to read remote directories + +`helm-find-files' works fine with TRAMP despite some limitations. + +- Grepping files is not very well supported when used incrementally. +See [[Grepping on remote files]]. + +- Locate does not work on remote directories. + +**** A TRAMP syntax crash course + +Please refer to TRAMP's documentation for more details. + +- Connect to host 192.168.0.4 as user \"foo\": + +/scp:192.168.0.4@foo: + +- Connect to host 192.168.0.4 as user \"foo\" on port 2222: + +/scp:192.168.0.4@foo#2222: + +- Connect to host 192.168.0.4 as root using multihops syntax: + +/ssh:192.168.0.4@foo|sudo:192.168.0.4: + +Note: You can also use `tramp-default-proxies-alist' when connecting often to +the same hosts. + +As a rule of thumb, prefer the scp method unless using multihops (which only +works with the ssh method), especially when copying large files. + +IMPORTANT: +You need to hit `C-j' once on top of a directory on the first connection +to complete the pattern in the minibuffer. + +**** Display color for directories, symlinks etc... with tramp + +Starting at helm version 2.9.7 it is somewhat possible to +colorize fnames by listing files without loosing performances with +external commands (ls and awk) if your system is compatible. +For this you can use `helm-list-dir-external' as value +for `helm-list-directory-function'. + +See `helm-list-directory-function' documentation for more infos. + +**** Completing host + +As soon as you enter the first \":\" after method e.g =/scp:= you will +have some completion about previously used hosts or from your =~/.ssh/config= +file, hitting `\\[helm-execute-persistent-action]' or `right' on a candidate will insert this host in minibuffer +without addind the ending \":\", second hit insert the last \":\". +As soon the last \":\" is entered TRAMP will kick in and you should see the list +of candidates soon after. + +**** Completion on tramp methods + +If you enter \":\" directly after \"/\" or \"|\" you will have completion on tramp methods, +hitting `\\[helm-execute-persistent-action]' or `right' on a method will insert it in minibuffer. + +When connection fails, be sure to delete your TRAMP connection with M-x +`helm-delete-tramp-connection' before retrying. + +**** Editing local files as root + +Use the sudo method: + +\"/sudo:host:\" or simply \"/sudo::\". + +*** Attach files to a mail buffer (message-mode) + +If you are in a `message-mode' or `mail-mode' buffer, that action will appear +in action menu, otherwise it is available at any time with \\\\[helm-ff-run-mail-attach-files]. +It behaves as follows: + +- If you are in a (mail or message) buffer, files are attached there. + +- If you are not in a mail buffer but one or more mail buffers exist, you are +prompted to attach files to one of these mail buffers. + +- If you are not in a mail buffer and no mail buffer exists, +a new mail buffer is created with the attached files in it. + +*** Open files in separate windows + +When [[Marked candidates][marking]] multiple files or using [[Use the wildcard to select multiple files][wildcard]], helm allow opening all +this files in separate windows using an horizontal layout or a +vertical layout if you used a prefix arg, when no more windows can be +displayed in frame, next files are opened in background without being +displayed. When using \\\\[helm-ff-run-switch-other-window] the current +buffer is kept and files are displayed next to it with same behavior as above. +When using two prefix args, files are opened in background without beeing displayed. + +*** Expand archives as directories in a avfs directory + +If you have mounted your filesystem with 'mountavfs' command, +you can expand archives in the \"~/.avfs\" directory with \\\\[helm-execute-persistent-action]. + +To umount Avfs, use ~fusermount -u ~/.avfs~ + +NOTE: You need the package 'avfs', on debian like distros use ~apt-get install avfs~. + +*** Tramp archive support (emacs-27+ only) + +As Tramp archive often crash Helm and Emacs, Helm does its best +to disable it, however it is hard to do so as Tramp Archive is +enabled inconditionally in Emacs. Here I build my Emacs +without-dbus to ensure Tramp archive wont kickin unexpectedly. + +If you want to browse archives please use [[Expand archives as +directories in a avfs directory][Avfs]] which is much better and +stable. + +*** Touch files + +In the completion buffer, you can choose the default which is the current-time, it is +the first candidate or the timestamp of one of the selected files. +If you need to use something else, use \\\\[next-history-element] and edit +the date in minibuffer. +It is also a way to quickly create a new file without opening a buffer, saving it +and killing it. +To touch more than one new file, separate you filenames with a comma (\",\"). +If one wants to create (touch) a new file with comma inside the name use a prefix arg, +this will prevent splitting the name and create multiple files. + +*** Change mode on files (chmod) + +When running `\\\\[helm-ff-run-chmod]' on +marked files, you can enter the new mode in prompt but you can +also use the first marked file as model to use it as default. +For example you can mark a file with mode 777 and mark other +files with mode 664, press 'RET' and answer 'y', all marked files +will be changed to 777. + +NOTE: Another way to change modes on files in helm-find-files is +running `\\\\[helm-ff-run-switch-to-shell]' and use 'chmod' directly. + +*** Delete files + +You can delete files without quitting helm with +`\\\\[helm-ff-persistent-delete]' or delete files and quit helm with `\\[helm-ff-run-delete-file]'. + +In the second method you can choose to +make this command asynchronous by customizing +\`helm-ff-delete-files-function'. + +_WARNING_: When deleting files asynchronously you will NOT be +WARNED if directories are not empty, that's mean non empty directories will +be deleted recursively in background without asking. + +A good compromise is to trash your files +when using asynchronous method (see [[Trashing files][Trashing files]]). + +When choosing synchronous delete, you can allow recursive +deletion of directories with `helm-ff-allow-recursive-deletes'. +Note that when trashing (synchronous) you are not asked for recursive deletion. + +Note that `helm-ff-allow-recursive-deletes' have no effect when +deleting asynchronously. + +First method (persistent delete) is always synchronous. + +Note that when a prefix arg is given, trashing behavior is inversed. +See [[Trashing files][Trashing files]]. + +**** Trashing files + +If you want to trash your files instead of deleting them you can +set `delete-by-moving-to-trash' to non nil, like this your files +will be moved to trash instead of beeing deleted. + +You can reverse at any time the behavior of `delete-by-moving-to-trash' by using +a prefix arg with any of the delete files command. + +On GNULinux distributions, when navigating to a Trash directory you +can restore any file in ..Trash/files directory with the 'Restore +from trash' action you will find in action menu (needs the +trash-cli package installed for remote files, see [[Trashing remote files with tramp][Here]]). +You can as well delete files from Trash directories with the 'delete files from trash' +action. +If you want to know where a file will be restored, hit `M-i', you will find a trash info. + +Tip: Navigate to your Trash/files directories with `helm-find-files' and set a bookmark +there with \\\\[helm-ff-bookmark-set] for fast access to Trash. + +NOTE: Restoring files from trash is working only on system using +the +[[http://freedesktop.org/wiki/Specifications/trash-spec][freedesktop trash specifications]]. + +***** Trashing remote files with tramp + +Trashing remote files (or local files with sudo method) is disabled by default +because tramp is requiring the 'trash' command to be installed, if you want to +trash your remote files, customize `helm-trash-remote-files'. +The package on most GNU/Linux based distributions is trash-cli, it is available [[https://github.com/andreafrancia/trash-cli][here]]. + +NOTE: +When deleting your files with sudo method, your trashed files will not be listed +with trash-list command line until you log in as root. + +*** Checksum file + +Checksum is calculated with the md5sum, sha1sum, sha224sum, +sha256sum, sha384sum and sha512sum commands when available, otherwise the +Emacs function `secure-hash' is used but it is slow and may crash +Emacs and even the whole system as it eats all memory. So if +your system doesn't have the md5sum and sha*sum command line tools be +careful when checking sum of larges files e.g. isos. + +*** Ignored or boring files + +Helm-find-files can ignore files matching +`helm-boring-file-regexp-list' or files that are git ignored, you +can set this with `helm-ff-skip-boring-files' or +`helm-ff-skip-git-ignored-files'. +NOTE: This will slow down helm, be warned. + +*** Helm-find-files is using a cache + +Helm is caching each directory files list in a hash table for +faster search, when a directory is modified it is removed from cache +so that further visit in this directory refresh cache. +You may have in some rare cases to refresh directory manually with `\\\\[helm-refresh]' +for example when helm-find-files session is running and a file is modified/deleted +in current visited directory by an external command from outside Emacs. + +NOTE: Helm is using file-notify to watch visited directories, +nowaday most systems come with a notify package but if your +system doesn't support this, you can turn off file notifications +by customizing the variable `helm-ff-use-notify'. In this case +you will have to refresh manually directories when needed with `\\\\[helm-refresh]'. + +*** Prefix file candidates with icons + +If `all-the-icons' package is installed, turning on +`helm-ff-icon-mode' will show icons before files and directories. + +** Commands +\\ +|Keys|Description +|-----------+----------| +|\\[helm-ff-run-locate]|Run `locate' (`\\[universal-argument]' to specify locate database, `M-n' to insert basename of candidate). +|\\[helm-ff-run-browse-project]|Browse project (`\\[universal-argument]' to recurse, `\\[universal-argument] \\[universal-argument]' to recurse and refresh database). +|\\[helm-ff-run-find-sh-command]|Run `find' shell command from this directory. +|\\[helm-ff-run-grep]|Run Grep (`\\[universal-argument]' to recurse). +|\\[helm-ff-run-pdfgrep]|Run Pdfgrep on marked files. +|\\[helm-ff-run-zgrep]|Run zgrep (`\\[universal-argument]' to recurse). +|\\[helm-ff-run-grep-ag]|Run AG grep on current directory. +|\\[helm-ff-run-git-grep]|Run git-grep on current directory. +|\\[helm-ff-run-gid]|Run gid (id-utils). +|\\[helm-ff-run-etags]|Run Etags (`\\[universal-argument]' to use thing-at-point, `\\[universal-argument] \\[universal-argument]' to reload cache). +|\\[helm-ff-run-rename-file]|Rename Files (`\\[universal-argument]' to follow). +|\\[helm-ff-run-query-replace-fnames-on-marked]|Query replace on marked files. +|\\[helm-ff-run-copy-file]|Copy Files (`\\[universal-argument]' to follow). +|\\[helm-ff-run-mcp]|Copy car of marked to remaining directories. +|\\[helm-ff-run-rsync-file]|Rsync Files (`\\[universal-argument]' to edit command). +|\\[helm-ff-run-byte-compile-file]|Byte Compile Files (`\\[universal-argument]' to load). +|\\[helm-ff-run-load-file]|Load Files. +|\\[helm-ff-run-symlink-file]|Symlink Files. +|\\[helm-ff-run-hardlink-file]|Hardlink files. +|\\[helm-ff-run-relsymlink-file]|Relative symlink Files. +|\\[helm-ff-run-chmod]|Change mode on Files. +|\\[helm-ff-run-delete-file]|Delete Files. +|\\[helm-ff-run-touch-files]|Touch files. +|\\[helm-ff-run-kill-buffer-persistent]|Kill buffer candidate without leaving Helm. +|\\[helm-ff-persistent-delete]|Delete file without leaving Helm. +|\\[helm-ff-run-switch-to-shell]|Switch to prefered shell. +|\\[helm-ff-run-eshell-command-on-file]|Eshell command on file (`\\[universal-argument]' to apply on marked files, otherwise treat them sequentially). +|\\[helm-ff-run-ediff-file]|Ediff file. +|\\[helm-ff-run-ediff-merge-file]|Ediff merge file. +|\\[helm-ff-run-complete-fn-at-point]|Complete file name at point. +|\\[helm-ff-run-switch-other-window]|Switch to other window. +|\\[helm-ff-run-switch-other-frame]|Switch to other frame. +|\\[helm-ff-run-open-file-externally]|Open file with external program (`\\[universal-argument]' to choose). +|\\[helm-ff-run-preview-file-externally]|Preview file with external program. +|\\[helm-ff-run-open-file-with-default-tool]|Open file externally with default tool. +|\\[helm-ff-rotate-left-persistent]|Rotate image left. +|\\[helm-ff-rotate-right-persistent]|Rotate image right. +|\\[helm-ff-increase-image-size-persistent]|Zoom in image. +|\\[helm-ff-decrease-image-size-persistent]|Zoom out image. +|\\[helm-ff-toggle-thumbnails]|Show thumbnails on image files. +|\\[helm-find-files-up-one-level]|Go to parent directory. +|\\[helm-find-files-history]|Switch to the visited-directory history. +|\\[helm-ff-file-name-history]|Switch to file name history. +|\\[helm-ff-properties-persistent]|Show file properties in a tooltip. +|\\[helm-mark-all]|Mark all visible candidates. +|\\[helm-ff-run-toggle-auto-update]|Toggle auto-expansion of directories. +|\\[helm-unmark-all]|Unmark all candidates, visible and invisible ones. +|\\[helm-ff-run-mail-attach-files]|Attach files to message buffer. +|\\[helm-ff-run-print-file]|Print file, (`\\[universal-argument]' to refresh printer list). +|\\[helm-enlarge-window]|Enlarge Helm window. +|\\[helm-narrow-window]|Narrow Helm window. +|\\[helm-ff-run-toggle-basename]|Toggle basename/fullpath. +|\\[helm-ff-run-find-file-as-root]|Find file as root. +|\\[helm-ff-run-find-alternate-file]|Find alternate file. +|\\[helm-ff-run-insert-org-link]|Insert org link. +|\\[helm-ff-bookmark-set]|Set bookmark to current directory. +|\\[helm-find-files-switch-to-bookmark]|Jump to bookmark list. +|\\[helm-ff-sort-alpha]|Sort alphabetically. +|\\[helm-ff-sort-by-newest]|Sort by newest. +|\\[helm-ff-sort-by-size]|Sort by size. +|\\[helm-ff-toggle-dirs-only]|Show only directories. +|\\[helm-ff-toggle-files-only]|Show only files. +|\\[helm-ff-sort-by-ext]|Sort by extensions. +|\\[helm-ff-run-compress-to]|Compress file(s) to archive. +|\\[helm-ff-run-compress-marked-files]|Compress file(s). +|\\[helm-ff-persistent-compress]|Compress file(s) without quitting.") + +;;; Help for file-name-history +;; +;; +(defvar helm-file-name-history-help-message + "* Helm file name history + +** Tips +You can open directly the selected file and exit helm or preselect the file in helm-find-files, +see actions in action menu. + +You can toggle the view of deleted files, see commands below. + +** Commands +\\ +\\[helm-file-name-history-show-or-hide-deleted]|Toggle deleted files view.") + +;;; Help for `helm-read-file-name' +;; +;; +(defun helm-read-file-name-help-message () + (let ((name (if helm-alive-p + (assoc-default 'name (helm-get-current-source)) + "generic"))) + (format + "* Helm `%s' read file name completion + +This is `%s' read file name completion that have been \"helmized\" +because you have enabled [[Helm mode][helm-mode]]. +Don't confuse this with `helm-find-files' which is a native helm command, +see [[Helm functions vs helmized Emacs functions]]. + +** Tips + +*** Navigation + +**** Enter `~/' at end of pattern to quickly reach home directory + +**** Enter `/' at end of pattern to quickly reach the file system root + +**** Enter `./' at end of pattern to quickly reach `default-directory' + +\(As per its value at the beginning of the session.) + +If you already are in the `default-directory' this will move the cursor to the top. + +**** Enter `../' at end of pattern will reach upper directory, moving cursor on top + +This is different from using `\\[helm-find-files-up-one-level]' in that it moves +the cursor to the top instead of remaining on the previous subdir name. + +**** You can complete with partial basename + +It starts from the third character of the pattern. + +For instance \"fob\" or \"fbr\" will complete \"foobar\" but \"fb\" needs a +third character in order to complete it. + +*** Persistent actions + +By default `helm-read-file-name' uses the persistent actions of `helm-find-files'. + +**** Use `\\[universal-argument] \\\\[helm-execute-persistent-action]' to display an image + +**** `\\\\[helm-execute-persistent-action]' on a filename will expand to this filename in Helm-buffer + +Second hit displays the buffer filename. +Third hit kills the buffer filename. +Note: `\\[universal-argument] \\\\[helm-execute-persistent-action]' displays the buffer directly. + +**** Browse images directories with `helm-follow-mode' and navigate up/down + +*** Delete characters backward + +When you want to delete characters backward, e.g. to create a new file or directory, +auto-update may come in the way when it keeps updating to an existent directory. +In that case, type `C-' and then `'. +This should not be needed when copying/renaming files because autoupdate is disabled +by default in that case. + +Note: On a terminal, the default binding `C-' may not work. +In this case use `C-c '. + +*** Create new directories and files + +**** You can create a new directory and a new file at the same time + +Simply write the path in prompt and press `RET', e.g. +\"~/new/newnew/newnewnew/my_newfile.txt\". + +**** To create a new directory, append a \"/\" at to the new name and press `RET' + +**** To create a new file, enter a filename not ending with \"/\" + +File and directory creation works only with some commands (e.g. `find-file') +and it will not work with others where it is not intended to return a file or +a directory \(e.g `list-directory'). + +*** Exiting minibuffer with empty string + +You can exit minibuffer with empty string with \\\\[helm-cr-empty-string]. +It is useful when some commands are prompting continuously until you enter an empty prompt. + +** Commands +\\ +|Keys|Description +|-----------+----------| +|\\[helm-find-files-up-one-level]|Go to parent directory. +|\\[helm-ff-run-toggle-auto-update]|Toggle auto-expansion of directories. +|\\[helm-ff-run-toggle-basename]|Toggle basename. +|\\[helm-ff-file-name-history]|File name history. +|C/\\[helm-cr-empty-string]|Return empty string unless `must-match' is non-nil. +|\\[helm-next-source]|Go to next source. +|\\[helm-previous-source]|Go to previous source." + name name))) + +;;; FD help +;; +;; +(defvar helm-fd-help-message + "* Helm fd + +** Tips + +\[[https://github.com/sharkdp/fd][The Fd command line tool]] is very fast to search files recursively. +You may have to wait several seconds at first usage when your +hard drive cache is \"cold\", then once the cache is initialized +searchs are very fast. You can pass any [[https://github.com/sharkdp/fd#command-line-options][Fd options]] before pattern, e.g. \"-e py foo\". + +The [[https://github.com/sharkdp/fd][Fd]] command line can be customized with `helm-fd-switches' user variable. +Always use =--color always= as option otherwise you will have no colors. +To customize colors see [[https://github.com/sharkdp/fd#colorized-output][Fd colorized output]]. + +NOTE: +Starting from fd version 8.2.1, you have to provide the env var +LS_COLORS to Emacs to have a colorized output, the easiest way is +to add to your =~/.profile= file =eval $(dircolors)=. +Another way is using =setenv= in your init file. +This is not needed when running Emacs from a terminal either with =emacs -nw= +or =emacs= because emacs inherit the env vars of this terminal. +See [[https://github.com/sharkdp/fd/issues/725][fd bugref#725]] + +Search is (pcre) regexp based (see [[https://docs.rs/regex/1.0.0/regex/#syntax][Regexp syntax]]), multi patterns are _not_ supported. + +** Man page + +NAME + fd - find entries in the filesystem + +SYNOPSIS + fd [-HIEsiaLp0hV] [-d depth] [-t filetype] [-e ext] [-E exclude] [-c + when] [-j num] [-x cmd] [pattern] [path...] + +DESCRIPTION + fd is a simple, fast and user-friendly alternative to find(1). + +OPTIONS + -H, --hidden + Include hidden files and directories in the search results + (default: hidden files and directories are skipped). + + -I, --no-ignore + Show search results from files and directories that would other‐ + wise be ignored by .gitignore, .ignore, .fdignore, or the global + ignore file. + + -u, --unrestricted + Alias for '--no-ignore'. Can be repeated; '-uu' is an alias for + '--no-ignore --hidden'. + + --no-ignore-vcs + Show search results from files and directories that would other‐ + wise be ignored by .gitignore files. + + -s, --case-sensitive + Perform a case-sensitive search. By default, fd uses case-insen‐ + sitive searches, unless the pattern contains an uppercase char‐ + acter (smart case). + + -i, --ignore-case + Perform a case-insensitive search. By default, fd uses case- + insensitive searches, unless the pattern contains an uppercase + character (smart case). + + -g, --glob + Perform a glob-based search instead of a regular expression + search. + + --regex + Perform a regular-expression based seach (default). This can be + used to override --glob. + + -F, --fixed-strings + Treat the pattern as a literal string instead of a regular + expression. + + -a, --absolute-path + Shows the full path starting from the root as opposed to rela‐ + tive paths. + + -l, --list-details + Use a detailed listing format like 'ls -l'. This is basically an + alias for '--exec-batch ls -l' with some additional 'ls' + options. This can be used to see more metadata, to show symlink + targets and to achieve a deterministic sort order. + + -L, --follow + By default, fd does not descend into symlinked directories. + Using this flag, symbolic links are also traversed. + + -p, --full-path + By default, the search pattern is only matched against the file‐ + name (or directory name). Using this flag, the pattern is + matched against the full path. + + -0, --print0 + Separate search results by the null character (instead of new‐ + lines). Useful for piping results to xargs. + + --max-results count + Limit the number of search results to 'count' and quit immedi‐ + ately. + + -1 Limit the search to a single result and quit immediately. This + is an alias for '--max-results=1'. + + --show-errors + Enable the display of filesystem errors for situations such as + insufficient permissions or dead symlinks. + + --one-file-system, --mount, --xdev + By default, fd will traverse the file system tree as far as + other options dictate. With this flag, fd ensures that it does + not descend into a different file system than the one it started + in. Comparable to the -mount or -xdev filters of find(1). + + -h, --help + Print help information. + + -V, --version + Print version information. + + -d, --max-depth d + Limit directory traversal to at most d levels of depth. By + default, there is no limit on the search depth. + + --min-depth d + Only show search results starting at the given depth. See also: + '--max-depth' and '--exact-depth'. + + --exact-depth d + Only show search results at the exact given depth. This is an + alias for '--min-depth --max-depth '. + + -t, --type filetype + Filter search by type: + + f, file + regular files + + d, directory + directories + + l, symlink + symbolic links + + x, executable + executable (files) + + e, empty + empty files or directories + + s, socket + sockets + + p, pipe + named pipes (FIFOs) + + This option can be used repeatedly to allow for multiple file + types. + + -e, --extension ext + Filter search results by file extension ext. This option can be + used repeatedly to allow for multiple possible file extensions. + + -E, --exclude pattern + Exclude files/directories that match the given glob pattern. + This overrides any other ignore logic. Multiple exclude pat‐ + terns can be specified. + + --ignore-file path + Add a custom ignore-file in '.gitignore' format. These files + have a low precedence. + + -c, --color when + Declare when to colorize search results: + + auto Colorize output when standard output is connected to terminal (default). + + never Do not colorize output. + + always Always colorize output. + + -j, --threads num + Set number of threads to use for searching & executing (default: + number of available CPU cores). + + -S, --size size + Limit results based on the size of files using the format + <+-> + + '+' file size must be greater than or equal to this + + '-' file size must be less than or equal to this + + 'NUM' The numeric size (e.g. 500) + + 'UNIT' The units for NUM. They are not case-sensitive. Allowed + unit values: + + 'b' bytes + + 'k' kilobytes (base ten, 10^3 = 1000 bytes) + + 'm' megabytes + + 'g' gigabytes + + 't' terabytes + + 'ki' kibibytes (base two, 2^10 = 1024 bytes) + + 'mi' mebibytes + + 'gi' gibibytes + + 'ti' tebibytes + + --changed-within date|duration + Filter results based on the file modification time. The argument + can be provided as a specific point in time (YYYY-MM-DD + HH:MM:SS) or as a duration (10h, 1d, 35min). --change-newer- + than can be used as an alias. + + Examples: + --changed-within 2weeks + --change-newer-than \"2018-10-27 10:00:00\" + + --changed-before date|duration + Filter results based on the file modification time. The argument + can be provided as a specific point in time (YYYY-MM-DD + HH:MM:SS) or as a duration (10h, 1d, 35min). --change-older- + than can be used as an alias. + + Examples: + --changed-before \"2018-10-27 10:00:00\" + --change-older-than 2weeks + + -o, --owner [user][:group] + Filter files by their user and/or group. Format: + [(user|uid)][:(group|gid)]. Either side is optional. Precede + either side with a '!' to exclude files instead. + + Examples: + --owner john + --owner :students + --owner \"!john:students\" + + -x, --exec command + Execute command for each search result. The following placehold‐ + ers are substituted by a path derived from the current search + result: + + {} path + + {/} basename + + {//} parent directory + + {.} path without file extension + + {/.} basename without file extension + + -X, --exec-batch command + Execute command with all search results at once. A single + occurence of the following placeholders is authorized and + sub stituted by the paths derived from the search results before the + command is executed: + + {} path + + {/} basename + + {//} parent directory + + {.} path without file extension + + {/.} basename without file extension + +** Commands +\\ +|Keys|Description +|-----------+----------| +|\\[helm-ff-run-grep]|Run grep (`\\[universal-argument]' to recurse). +|\\[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 Elisp file(s) (`\\[universal-argument]' to load). +|\\[helm-ff-run-load-file]|Load Elisp file(s). +|\\[helm-ff-run-ediff-file]|Ediff file. +|\\[helm-ff-run-ediff-merge-file]|Ediff-merge file. +|\\[helm-ff-run-switch-other-window]|Switch to other window. +|\\[helm-ff-properties-persistent]|Show file properties. +|\\[helm-ff-run-open-file-externally]|Open file with external program (`\\[universal-argument]' 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. +|\\[helm-fd-previous-directory]|Move to previous directory. +|\\[helm-fd-next-directory]|Move to next directory.") + +;;; Generic file help - Used by locate. +;; +;; +(defvar helm-generic-file-help-message + "* Helm Generic files + +** Tips + +*** Locate + +You can append to the search pattern any of the locate command line options, +e.g. -b, -e, -n , etc. See the locate(1) man page for more details. + +Some other sources (at the moment \"recentf\" and \"file in current directory\") +support the -b flag for compatibility with locate when they are used with it. + +When you enable fuzzy matching on locate with `helm-locate-fuzzy-match', the +search will be performed on basename only for efficiency (so don't add \"-b\" at +prompt). As soon as you separate the patterns with spaces, fuzzy matching will +be disabled and search will be done on the full filename. Note that in +multi-match, fuzzy is completely disabled, which means that each pattern is a +match regexp (i.e. \"helm\" will match \"helm\" but \"hlm\" will *not* match +\"helm\"). + +NOTE: On Windows use Everything with its command line ~es~ as a replacement of locate. +See [[https://github.com/emacs-helm/helm/wiki/Locate#windows][Locate on Windows]] + +*** Browse project + +When the current directory is not under version control, don't forget to refresh +the cache when files have been added/removed in the directory. + +*** Find command + +Recursively search files using the \"find\" shell command. + +Candidates are all filenames that match all given globbing patterns. This +respects the options `helm-case-fold-search' and +`helm-findutils-search-full-path'. + +You can pass arbitrary \"find\" options directly after a \"*\" separator. +For example, this would find all files matching \"book\" that are larger +than 1 megabyte: + + book * -size +1M + +** Commands +\\ +|Keys|Description +|-----------+----------| +|\\[helm-ff-run-toggle-basename]|Toggle basename. +|\\[helm-ff-run-grep]|Run grep (`\\[universal-argument]' to recurse). +|\\[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 Elisp file(s) (`\\[universal-argument]' to load). +|\\[helm-ff-run-load-file]|Load Elisp file(s). +|\\[helm-ff-run-ediff-file]|Ediff file. +|\\[helm-ff-run-ediff-merge-file]|Ediff-merge file. +|\\[helm-ff-run-switch-other-window]|Switch to other window. +|\\[helm-ff-properties-persistent]|Show file properties. +|\\[helm-ff-run-open-file-externally]|Open file with external program (`\\[universal-argument]' 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.") + +;;; Grep help +;; +;; +(defvar helm-grep-help-message + "* Helm Grep + +** Tips + +With Helm supporting Git-grep and AG/RG, you are better off using +one of them for recursive searches, keeping grep or ack-grep to +grep individual or marked files. See [[Helm AG][Helm AG]]. + +*** Meaning of the prefix argument +**** With grep or ack-grep + +Grep recursively, in this case you are +prompted for types (ack-grep) or for wild cards (grep). + +**** With AG or RG + +the prefix arg allows you to specify a type of file to search in. + +*** You can use wild cards when selecting files (e.g. \"*.el\") + +Note that a way to grep specific files recursively is to use +e.g. \"**.el\" to select files, the variable `helm-file-globstar' +controls this (it is non nil by default), however it is much +slower than using grep recusively (see helm-find-files +documentation about this feature). + +*** Grep hidden files + +You may want to customize your command line for grepping hidden +files, for AG/RG use \"--hidden\", see man page +of your backend for more infos. + +*** You can grep in different directories by marking files or using wild cards + +*** You can save the result in a `helm-grep-mode' buffer + +See [[Commands][commands]] below. + +Once in that buffer you can use [[https://github.com/mhayashi1120/Emacs-wgrep][emacs-wgrep]] (external package not bundled with Helm) +to edit your changes, for Helm the package name is `wgrep-helm', it is hightly recommended. + +Type `g' to update (revert) the buffer (after saving your buffer's changes to file). + +NOTE: `next-error' is available from this `helm-grep-mode' buffer. + +When you are running `next-error' from elsewhere, you can update +the buffer with `helm-revert-next-error-last-buffer' (up to you +to bind it to a convenient key). + +*** Helm-grep supports multi-matching + +\(Starting from version 1.9.4.) + +Simply add a space between each pattern as for most Helm commands. + +NOTE: Depending the regexp you use it may match as well the +filename, this because we pipe the first grep command which send +the filename in output. + +*** See full path of selected candidate + +Add (helm-popup-tip-mode 1) in your init file or enable it +interactively with M-x helm-popup-tip-mode, however it is +generally enough to just put your mouse cursor over candidate. + +*** Open file in other window + +The command \\\\[helm-grep-run-other-window-action] allow you to open file +in other window horizontally or vertically if a prefix arg is supplied. + +*** Performance over TRAMP + +Grepping works but it is badly supported as TRAMP doesn't support multiple +processes running in a short delay (less than 5s) among other things. + +Helm uses a special hook to suspend the process automatically while you are +typing. Even if Helm handles this automatically by delaying each process by 5s, +you are adviced to this manually by hitting `\\\\[helm-toggle-suspend-update]' (suspend process) before +typing, and hit again `\\\\[helm-toggle-suspend-update]' when the regexp is ready to send to the remote +process. For simple regexps, there should be no need for this. + +Another solution is to not use TRAMP at all and mount your remote file system via +SSHFS. + +* Helm GID + +Still supported, but mostly deprecated, using AG/RG or Git-grep +is much more efficient, also `id-utils' seems no more maintained. + +** Tips + +Helm-GID reads the database created with the `mkid' command from id-utils. +The name of the database file can be customized with `helm-gid-db-file-name', it +is usually \"ID\". + +Helm-GID use the symbol at point as default-input. This command is also +accessible from `helm-find-files' which allow you to navigate to another +directory to consult its database. + +Note: Helm-GID supports multi-matches but only the last pattern entered will be +highlighted since there is no ~--color~-like option in GID itself. + +* Helm AG + +** Tips + +Helm-AG is different from grep or ack-grep in that it works on a +directory recursively and not on a list of files. It is called +helm-AG but it support several backend, namely AG, RG and PT. +Nowaday the best backend is Ripgrep aka RG, it is the fastest and +is actively maintained, see `helm-grep-ag-command' and +`helm-grep-ag-pipe-cmd-switches' to configure it. + +You can ignore files and directories with a \".agignore\" or +\".rgignore\" file, local to a directory or global when placed in +the home directory. (See the AG/RG man pages for more details.) +Note that `helm-grep-ignored-files'and +`helm-grep-ignored-directories' have no effect in helm-AG/RG. + +As always you can access Helm AG from `helm-find-files'. + +Starting with version 0.30, AG accepts one or more TYPE arguments on its command +line. Helm provides completion on these TYPE arguments when available with your +AG version. Use a prefix argument when starting a Helm-AG session to enable this +completion. See RG and AG man pages on how to add new types. + + +Note: You can mark several types to match in the AG query. The first AG +versions providing this feature allowed only one type, so in this case only the +last mark will be used. + +* Helm git-grep + +Helm-git-grep searches the current directory, i.e. the default directory or the +directory in Helm-find-files. If this current directory is a subdirectory of a +project and you want to also match parent directories (i.e the whole project), +use a prefix argument. + +** Commands +\\ +|Keys|Description +|-----------+----------| +|\\[helm-goto-next-file]|Next File. +|\\[helm-goto-precedent-file]|Previous File. +|\\[helm-yank-text-at-point]|Yank text at point in minibuffer. +|\\[helm-grep-run-other-window-action]|Jump to other window. +|\\[helm-grep-run-other-frame-action]|Jump to other frame. +|\\[helm-grep-run-default-action]|Run default action (same as `RET'). +|\\[helm-grep-run-save-buffer]|Save to a `helm-grep-mode' enabled buffer.") + +;;; PDF grep help +;; +;; +(defvar helm-pdfgrep-help-message + "* Helm PDFgrep Map + +** Commands +\\ +|Keys|Description +|-----------+----------| +|\\[helm-goto-next-file]|Next file. +|\\[helm-goto-precedent-file]|Previous file. +|\\[helm-yank-text-at-point]|Yank text at point in minibuffer.") + +;;; Etags help +;; +;; +(defvar helm-etags-help-message + "* Helm Etags Map + +** Commands +\\ +|Keys|Description +|-----------+----------| +|\\[helm-goto-next-file]|Next file. +|\\[helm-goto-precedent-file]|Previous file. +|\\[helm-yank-text-at-point]|Yank text at point in minibuffer.") + +;;; UCS help +;; +;; +(defvar helm-ucs-help-message + "* Helm UCS + +** Tips + +Use commands below to insert unicode characters in current buffer without +leaving Helm. + +** Commands +\\ +|Keys|Description +|-----------+----------| +|\\[helm-ucs-persistent-insert]|Insert character. +|\\[helm-ucs-persistent-forward]|Forward character. +|\\[helm-ucs-persistent-backward]|Backward character. +|\\[helm-ucs-persistent-delete]|Delete character backward. +|\\[helm-ucs-persistent-insert-space]|Insert space.") + +;;; Bookmark help +;; +;; +(defvar helm-bookmark-help-message + "* Helm bookmark name + +When `helm-bookmark-use-icon' is non nil and `all-the-icons' +package is installed icons before candidates will be displayed. + +** Commands +\\ +|Keys|Description +|-----------+----------| +|\\[helm-bookmark-run-jump-other-window]|Jump other window. +|\\[helm-bookmark-run-delete]|Delete bookmark. +|\\[helm-bookmark-run-edit]|Edit bookmark. +|\\[helm-bookmark-toggle-filename]|Toggle bookmark location visibility.") + +;;; Eshell command on file help +;; +;; +(defvar helm-esh-help-message + "* Helm Eshell on file + +** Tips + +*** Pass extra arguments after filename + +Normally the command or alias will be called with file as argument. For instance + + candidate_file + +But you can also pass an argument or more after \"candidate_file\" like this: + + %s [extra_args] + +\"candidate_file\" will be added at \"%s\" and the command will look at this: + + candidate_file [extra_args] + +**** Use placeholders in extra arguments + +placeholder for file without extension: \\@ +placeholder for incremental number: \\# + +\"candidate_file\" will be added at \"%s\" and \\@ but without extension. + + + +\"candidate_file\" will be added at \"%s\" and \\# will be replaced by an incremental number. + + %s \\# + +Here examples: + +Say you want to use the =convert= command to convert all your .png files in a directory to .jpg. + +This will convert all your files to jpg keeping the same basename. + + convert %s \\@.jpg + +This will convert all your files to foo-001.jpg, foo-002.jpg etc... + + convert %s foo-\\#.jpg + +You can of course combine both placeholders if needed. + + convert %s \\@-\\#.jpg + +*** Specify marked files as arguments + +When you have marked files and your command support only one file +as arg, helm will execute command sequencially on each file like +this: + +Example: + + file1 + file2 + ...etc + +When you have marked files and your command accept many files at +once helm will run your command with all files at once like this: + +Example: + + file1 file2 etc... + +The two use case above are applied automatically by Helm +depending if your command is an eshell alias which value ends by +'$1' or '$*'. If your command is not an alias, i.e. you entered +an arbitrary command on prompt with '%s' to specify filenames, +you will have to pass one prefix argument from the command +selection buffer. + +Note: This does not work on remote files. + +With two prefix-args the output is printed to the +`current-buffer', the command being executed in the same +conditions as described above. +NOTE: If your command is not an alias, you can't pass all files at once and print in current buffer at the same time. +Also note that running multiple files at once is not supported with remote files. + +*** Run eshell commands asynchronously + +You can run your commands asynchronously by adding \"&\" at end +of any commands, e.g. \"foo %s &\". You can also directly setup +your alias in the eshell alias file with e.g. \"alias foo $1 &\". + +** Commands +\\") + +;;; Ido virtual buffer help +;; +;; +(defvar helm-buffers-ido-virtual-help-message + "* Helm Ido virtual buffers + +** Commands +\\ +|Keys|Description +|-----------+----------| +|\\[helm-ff-run-switch-other-window]|Switch to other window. +|\\[helm-ff-run-switch-other-frame]|Switch to other frame. +|\\[helm-ff-run-grep]|Grep file. +|\\[helm-ff-run-zgrep]|Zgrep file. +|\\[helm-ff-run-delete-file]|Delete file. +|\\[helm-ff-run-open-file-externally]|Open file externally.") + +;;; helm-occur help +;; +;; +(defvar helm-moccur-help-message + "* Helm Moccur + +** Tips + +*** Searching in many buffers + +Start from `helm-buffers-list' or `helm-mini', mark some buffers and hit \\\\[helm-execute-persistent-action]' (persistent-action), to do it repeatedly +you can use `\\\\[helm-follow-action-forward]' and `\\\\[helm-follow-action-backward]' or enable `helm-follow-mode' with `\\\\[helm-follow-mode]'. +Follow mode is enabled by default in helm-occur. + +*** Switch to buffer in other window + +The command \\\\[helm-moccur-run-goto-line-ow] allow you to switch to buffer +in other window horizontally or vertically if a prefix arg is supplied. + +*** Save the results + +Similarly to Helm-grep, you can save the results with `\\\\[helm-occur-run-save-buffer]'. +Once in the saved buffer, you can edit it, see [[Edit a saved buffer][below]]. + +Of course if you don't save the results, you can resume the Helm session with +`helm-resume'. + +*** Refresh the resumed session + +When the buffer(s) where you ran helm-(m)occur get(s) modified, the Helm buffer +will flash red as a warning. You can refresh the buffer by running `\\\\[helm-refresh]'. +This can be done automatically by customizing `helm-moccur-auto-update-on-resume'. + +*** Refresh a saved buffer + +Type `g' to update (revert) the buffer. + +When you are running `next-error' from elsewhere, you can update +the buffer with `helm-revert-next-error-last-buffer' (up to you +to bind it to a convenient key). + +*** Edit a saved buffer + +First, install wgrep (https://github.com/mhayashi1120/Emacs-wgrep) and then: + +1) `C-c C-p' (`wgrep-change-to-wgrep-mode') to edit the buffer(s). +2) `C-x C-s' to save your changes. + +Tip: Use the excellent iedit (https://github.com/victorhge/iedit) to modify all +occurences at once in the buffer. + +NOTE: `next-error' is available from this `helm-occur-mode' buffer. + +*** Search in region + +When searching in current-buffer with `helm-occur', if a region +is found helm will search in this region only. If you marked +this region with `mark-defun' the symbol that was at point before +marking defun will be used when `helm-source-occur' is member of +`helm-sources-using-default-as-input'. + +*** Switch to next or previous source + +See [[Moving in `helm-buffer'][Moving in `helm-buffer']]. + +** Commands +\\ +|Keys|Description +|-----------+----------| +|\\[helm-occur-run-goto-line-ow]|Go to line in other window. +|\\[helm-occur-run-goto-line-of]|Go to line in new frame. +|\\[helm-occur-run-save-buffer]|Save results in new buffer.") +;;; Helm Top +;; +;; +(defvar helm-top-help-message + "* Helm Top + +** Commands +\\ +|Keys|Description +|-----------+----------| +|\\[helm-top-run-sort-by-com]|Sort by commands. +|\\[helm-top-run-sort-by-cpu]|Sort by CPU usage. +|\\[helm-top-run-sort-by-user]|Sort alphabetically by user. +|\\[helm-top-run-sort-by-mem]|Sort by memory.") + +;;; Helm M-x +;; +;; +(defvar helm-M-x-help-message + "* Helm M-x + +** Tips + +*** Display docstring without quitting session (persistent action) + +You can get help on any command with persistent action (\\\\[helm-execute-persistent-action]) + +*** Display short docstring in helm buffer + +You can toggle short docstring description with \\\\[helm-M-x-toggle-short-doc]. +if you want this at startup you can configure `helm-M-x-show-short-doc'. + +NOTE: helm-M-x will be slower with this enabled. + +*** History source + +Helm-M-x is displaying two sources, one for the commands +themselves and one for the command history, more exactly +`extended-command-history', by default the history source is +displayed in first position, however you can put it in second +position if you don't like that by customizing +`helm-M-x-reverse-history'. + +**** Duplicate entries in helm-M-x history + +helm-M-x history obey to history variables, if you have +duplicates in your helm-M-x history set `history-delete-duplicates' to non nil. + +**** Number of entries in history + +The number of entries saved is controlled by `history-length' +global value, however if you want a different value for +`extended-command-history' e.g. 50 you can add to your config: + + (put 'extended-command-history 'history-length 50) + +*** Enabled modes are highlighted in helm-M-x + +*** Prefix arguments + +You can pass prefix arguments *after* starting `helm-M-x'. A mode-line +counter will display the number of given prefix arguments. + +If you pass prefix arguments before running `helm-M-x', it will +be displayed in the prompt. +The first `\\\\[universal-argument]' after `helm-M-x' clears those prefix arguments. + +NOTE: When you specify prefix arguments once `helm-M-x' is +started, the prefix argument apply on the next command, so if you +hit RET, it will apply on the selected command, but if you type a +new character at prompt to narrow down further candidates, the +prefix arg will apply to `self-insert-command' (e.g. if you type +`C-u e' \"eeee\" will be inserted in prompt) so select the +command you want to execute before specifying prefix arg. + +** Commands +\\ +|Keys|Description +|-----------+------------| +|\\[helm-M-x-universal-argument]|Universal argument for selected command +|\\[helm-M-x-toggle-short-doc]|Toggle details on commands") + + +;;; Helm imenu +;; +;; +(defvar helm-imenu-help-message + "* Helm Imenu + +** Commands +\\ +|Keys|Description +|-----------+----------| +|\\[helm-imenu-next-section]|Go to next section. +|\\[helm-imenu-previous-section]|Go to previous section.") + +;;; Helm colors +;; +;; +(defvar helm-colors-help-message + "* Helm colors + +** Commands +\\ +|Keys|Description +|-----------+----------| +|\\[helm-color-run-insert-name]|Insert the entry name. +|\\[helm-color-run-kill-name]|Kill the entry name. +|\\[helm-color-run-insert-rgb]|Insert entry in RGB format. +|\\[helm-color-run-kill-rgb]|Kill entry in RGB format.") + +;;; Helm Semantic +;; +;; +(defvar helm-semantic-help-message + "* Helm Semantic + +** Commands +\\") + +;;; Helm kmacro +;; +;; +(defvar helm-kmacro-help-message + "* Helm kmacro + +** Tips + +- Start recording a kmacro with `f3'. +- End the kmacro recording with `f4'. +- Run `helm-execute-kmacro' to list all your kmacros. + +When you press RET, your macro goes on top of ring and become the +current macro, hit `f4' for further executions. +Use `helm-execute-kmacro' again to change eventually your macro to execute. + +Note: You can't record keys running Helm commands except `helm-M-x', under the +condition that you don't choose a command using Helm completion. + +See [[info:emacs#Keyboard Macros][Keyboard Macros]] for further infos on macros. + +** Commands +\\") + +;;; Kill ring +;; +;; +(defvar helm-kill-ring-help-message + "* Helm kill ring + +** Tips + +Every Helm session lets you save a candidate to the kill-ring / clipboard / +primary-selection with `\\\\[helm-kill-selection-and-quit]'. + +To save space, Helm-kill-ring truncates the candidates longer than +`helm-kill-ring-max-offset'. +`\\\\[helm-kill-ring-kill-selection]' then saves the whole +text and not the truncated value. The view of truncated candidates can be +toggled; see the command list below. + +As opposed to `yank', numeric prefix arguments are ignored with +`helm-show-kill-ring': there is no need for them since selection happens within +Helm. Moreover Helm has [[Shortcuts for executing the default action on the n-th candidate][Shortcuts for executing the default action on the n-th candidate]]. + +It is recommended to globally bind `M-y' to `helm-show-kill-ring'. Once in the +Helm-kill-ring session you can navigate to next/previous line with `M-y' and +`M-u' for convenience. Of course `\\[helm-next-line]' and `\\[helm-previous-line]' are still available. + +It is possible to delete candidates from the kill ring with `\\\\[helm-kill-ring-delete]' +but also persistently with `\\\\[helm-kill-ring-run-persistent-delete]'. + +You can concatenate marked candidates and yank them in the current +buffer, thus creating a new entry in the kill ring. Candidates are +concatenated with `helm-kill-ring-separator' as default but you can +change interactively the separator while yanking by using two prefix +args. When you have something else than \"\\n\" as default value for +`helm-kill-ring-separator' and you want to use \"\\n\" from prompt, use +`C-q C-j' to enter a newline in prompt. + +To not push a new entry in the kill ring, use `\\\\[helm-copy-to-buffer]' instead of RET +\(note that you can't change separator with this). + +When inserting candidates with the default action (`RET'), `point' is placed at +the end of the candidate and `mark' at the beginning. You can revert this behavior +by using a prefix argument, i.e. `C-u RET', like the regular `yank' command does. + +** Commands +\\ +|Keys|Description +|-----------+----------| +|\\[helm-next-line]|Next line. +|\\[helm-previous-line]|Previous line. +|\\[helm-kill-ring-delete]|Delete entry. +|\\[helm-kill-ring-toggle-truncated]|Toggle truncated view of candidate. +|\\[helm-kill-ring-kill-selection]|Kill non-truncated of selection.") + +;;; Completing-read +;; +(defun helm-comp-read-help-message () + (let ((com (assoc-default 'name (helm-get-current-source)))) + (format + "* Helm completing-read completion for `%s' + +Command `%s' is using a `completing-read' for completion on your input, +this completion have been \"helmized\" because you have enabled [[Helm mode][helm-mode]]'. + +** Tips + +*** Disabling or use something else than helm for completion of some commands + +You can disable helm completion or use something else for specific commands of your choice, +for this customize variable `helm-completing-read-handlers-alist'. + +*** Exiting minibuffer with empty string + +You can exit minibuffer with empty string with \\\\[helm-cr-empty-string]. +It is useful when some commands are prompting continuously until you enter an empty prompt. + +** Commands +\\ +|Keys|Description +|-----------+----------| +|\\[helm-cr-empty-string]|Exit minibuffer with empty string." + com com))) + + +;;; Mode line strings +;; +;; +;;;###autoload +(defvar helm-comp-read-mode-line "\ +\\\ +C/\\[helm-cr-empty-string]:Empty \ +\\\ +\\[helm-help]:Help \ +\\[helm-select-action]:Act \ +\\[helm-maybe-exit-minibuffer]/\ +f1/f2/f-n:NthAct \ +\\[helm-toggle-suspend-update]:Tog.suspend \ +\\[helm-customize-group]:Conf") + +;;;###autoload +(defvar helm-read-file-name-mode-line-string "\ +\\\ +\\[helm-help]:Help \ +C/\\[helm-cr-empty-string]:Empty \ +\\\ +\\[helm-select-action]:Act \ +\\[helm-maybe-exit-minibuffer]/\ +f1/f2/f-n:NthAct \ +\\[helm-toggle-suspend-update]:Tog.suspend \ +\\[helm-customize-group]:Conf" + "String displayed in mode-line in `helm-source-find-files'.") + +;;;###autoload +(defvar helm-top-mode-line "\ +\\\ +\\[helm-help]:Help \ +\\\ +\\[helm-select-action]:Act \ +\\[helm-maybe-exit-minibuffer]/\ +f1/f2/f-n:NthAct \ +\\[helm-toggle-suspend-update]:Tog.suspend \ +\\[helm-customize-group]:Conf") + + +(provide 'helm-help) + +;;; helm-help.el ends here diff --git a/code/elpa/helm-20240320.541/helm-id-utils.el b/code/elpa/helm-20240320.541/helm-id-utils.el new file mode 100644 index 0000000..215092b --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-id-utils.el @@ -0,0 +1,125 @@ +;;; helm-id-utils.el --- Helm interface for id-utils. -*- lexical-binding: t -*- + +;; Copyright (C) 2015 ~ 2020 Thierry Volpiatto + +;; 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 'helm-grep) +(require 'helm-help) + +(defgroup helm-id-utils nil + "ID-Utils related Applications and libraries for Helm." + :group 'helm) + +(defcustom helm-gid-program "gid" + "Name of gid command (usually `gid'). +For Mac OS X users, if you install GNU coreutils, the name `gid' +might be occupied by `id' from GNU coreutils, and you should set +it to correct name (or absolute path). For example, if using +MacPorts to install id-utils, it should be `gid32'." + :group 'helm-id-utils + :type 'file) + +(defcustom helm-gid-db-file-name "ID" + "Name of a database file created by `mkid' command from `ID-utils'." + :group 'helm-id-utils + :type 'string) + +(defun helm-gid-candidates-process () + (let* ((patterns (helm-mm-split-pattern helm-pattern)) + (default-com (format "%s -r %s" helm-gid-program + (shell-quote-argument (car patterns)))) + (cmd (helm-aif (cdr patterns) + (concat default-com + (cl-loop for p in it + concat (format " | grep --color=always %s" + (shell-quote-argument p)))) + default-com)) + (proc (start-process-shell-command + "gid" helm-buffer cmd))) + (set (make-local-variable 'helm-grep-last-cmd-line) cmd) + (prog1 proc + (set-process-sentinel + proc (lambda (_process event) + (when (string= event "finished\n") + (helm-maybe-show-help-echo) + (with-helm-window + (setq mode-line-format + '(" " mode-line-buffer-identification " " + (:eval (format "L%s" (helm-candidate-number-at-point))) " " + (:eval (propertize + (format "[Helm Gid process finished - (%s results)]" + (max (1- (count-lines + (point-min) (point-max))) + 0)) + 'face 'helm-locate-finish)))) + (force-mode-line-update)) + (helm-log "helm-gid-candidates-process" "Error: Gid %s" + (replace-regexp-in-string "\n" "" event)))))))) + +(defun helm-gid-filtered-candidate-transformer (candidates _source) + ;; "gid -r" may add dups in some rare cases. + (cl-loop for c in (helm-fast-remove-dups candidates :test 'equal) + collect (helm-grep--filter-candidate-1 c))) + +(defclass helm-gid-source (helm-source-async) + ((header-name + :initform + (lambda (name) + (concat name " [" (helm-get-attr 'db-dir) "]"))) + (db-dir :initarg :db-dir + :initform nil + :custom string + :documentation " Location of ID file.") + (candidates-process :initform #'helm-gid-candidates-process) + (filtered-candidate-transformer + :initform #'helm-gid-filtered-candidate-transformer) + (candidate-number-limit :initform 99999) + (action :initform (helm-make-actions + "Find File" 'helm-grep-action + "Find file other frame" 'helm-grep-other-frame + "Save results in grep buffer" 'helm-grep-save-results + "Find file other window" 'helm-grep-other-window)) + (persistent-action :initform 'helm-grep-persistent-action) + (history :initform 'helm-grep-history) + (nohighlight :initform t) + (help-message :initform 'helm-grep-help-message) + (requires-pattern :initform 2))) + +;;;###autoload +(defun helm-gid () + "Preconfigured `helm' for `gid' command line of `ID-Utils'. +Need A database created with the command `mkid' above +`default-directory'. +Need id-utils as dependency which provide `mkid', `gid' etc.. +See ." + (interactive) + (let* ((db (locate-dominating-file + default-directory + helm-gid-db-file-name)) + (helm-grep-default-directory-fn + (lambda () default-directory)) + (helm-maybe-use-default-as-input t)) + (cl-assert db nil "No DataBase found, create one with `mkid'") + (helm :sources (helm-make-source "Gid" 'helm-gid-source + :db-dir db) + :buffer "*helm gid*" + :keymap helm-grep-map + :truncate-lines helm-grep-truncate-lines))) + +(provide 'helm-id-utils) + +;;; helm-id-utils ends here diff --git a/code/elpa/helm-20240320.541/helm-imenu.el b/code/elpa/helm-20240320.541/helm-imenu.el new file mode 100644 index 0000000..425d770 --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-imenu.el @@ -0,0 +1,542 @@ +;;; helm-imenu.el --- Helm interface for Imenu -*- lexical-binding: t -*- + +;; Copyright (C) 2012 ~ 2023 Thierry Volpiatto + +;; 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 'helm) +(require 'helm-lib) +(require 'imenu) +(require 'helm-utils) +(require 'helm-help) + +(defvar all-the-icons-default-adjust) +(defvar all-the-icons-scale-factor) + +(declare-function which-function "which-func") +(declare-function all-the-icons-material "ext:all-the-icons.el") +(declare-function all-the-icons-octicon "ext:all-the-icons.el") +(declare-function all-the-icons-faicon "ext:all-the-icons.el") +(declare-function all-the-icons-wicon "ext:all-the-icons.el") + + +(defgroup helm-imenu nil + "Imenu related libraries and applications for Helm." + :group 'helm) + +(defcustom helm-imenu-delimiter " / " + "Delimit types of candidates and their value in `helm-buffer'." + :group 'helm-imenu + :type 'string) + +(defcustom helm-imenu-execute-action-at-once-if-one + #'helm-imenu--execute-action-at-once-p + "Goto the candidate when only one is remaining." + :group 'helm-imenu + :type 'function) + +(defcustom helm-imenu-all-buffer-assoc nil + "Major mode association alist for `helm-imenu-in-all-buffers'. +Allow `helm-imenu-in-all-buffers' searching in these associated +buffers even if they are not derived from each other. The alist +is bidirectional, i.e. no need to add \\='((foo . bar) (bar . foo)), +only \\='((foo . bar)) is needed." + :type '(alist :key-type symbol :value-type symbol) + :group 'helm-imenu) + +(defcustom helm-imenu-in-all-buffers-separate-sources t + "Display imenu index of each buffer in its own source when non-nil. + +When nil all candidates are displayed in a single source. + +NOTE: Each source will have as name \"Imenu \". +`helm-source-imenu-all' will not be set, however it will continue +to be used as a flag for using default as input. If you do not +want this behavior, remove it from +`helm-sources-using-default-as-input' even if not using a single +source to display imenu in all buffers." + :type 'boolean + :group 'helm-imenu) + +(defcustom helm-imenu-type-faces + '(("^Variables$" . font-lock-variable-name-face) + ("^\\(Function\\|Functions\\|Defuns\\)$" . font-lock-function-name-face) + ("^\\(Types\\|Provides\\|Requires\\|Classes\\|Class\\|Includes\\|Imports\\|Misc\\|Code\\)$" . font-lock-type-face)) + "Faces for showing type in helm-imenu. +This is a list of cons cells. The cdr of each cell is a face to +be used, and it can also just be like \\='(:foreground +\"yellow\"). Each car is a regexp match pattern of the imenu type +string." + :group 'helm-faces + :type '(repeat + (cons + (regexp :tag "Imenu type regexp pattern") + (sexp :tag "Face")))) + +(defcustom helm-imenu-extra-modes nil + "Extra modes where `helm-imenu-in-all-buffers' should look into." + :group 'helm-imenu + :type '(repeat symbol)) + +(defcustom helm-imenu-hide-item-type-name nil + "Hide display name of imenu item type along with the icon when non nil. + +This value can be toggled with \\\\[helm-imenu-toggle-type-view]. +Don't use `setq' to set this." + :group 'helm-imenu + :type 'boolean + :set (lambda (var val) + (if (require 'all-the-icons nil t) + (set var val) + (set var nil)))) + +(defcustom helm-imenu-use-icon nil + "Display an icon from all-the-icons package when non nil. + +Don't use `setq' to set this." + :group 'helm-imenu + :type 'boolean + :set (lambda (var val) + (if (require 'all-the-icons nil t) + (set var val) + (set var nil)))) + +(defcustom helm-imenu-icon-type-alist + '(("Array" . (all-the-icons-material "crop" :face font-lock-builtin-face)) + ("Array" . (all-the-icons-material "crop" :face font-lock-builtin-face)) + ("Boolean" . (all-the-icons-material "crop" :face font-lock-builtin-face)) + ("Boolean" . (all-the-icons-material "crop" :face font-lock-builtin-face)) + ("Class" . (all-the-icons-octicon "package" :face font-lock-type-face)) + ("Class" . (all-the-icons-octicon "package" :face font-lock-type-face)) + ("Color" . (all-the-icons-material "color_lens" :face font-lock-builtin-face)) + ("Colors" . (all-the-icons-material "color_lens" :face font-lock-builtin-face)) + ("Constant" . (all-the-icons-material "crop" :face font-lock-builtin-face)) + ("Constants" . (all-the-icons-material "crop" :face font-lock-builtin-face)) + ("Constructor" . (all-the-icons-faicon "cube" :face font-lock-function-name-face)) + ("Constructors" . (all-the-icons-faicon "cube" :face font-lock-function-name-face)) + ("Enum Member" . (all-the-icons-octicon "three-bars" :face font-lock-type-face)) + ("Enum Members" . (all-the-icons-octicon "three-bars" :face font-lock-type-face)) + ("Enum" . (all-the-icons-faicon "cog" :face font-lock-type-face)) + ("Enums" . (all-the-icons-faicon "cog" :face font-lock-type-face)) + ("Event" . (all-the-icons-wicon "lightning" :face font-lock-builtin-face)) + ("Events" . (all-the-icons-wicon "lightning" :face font-lock-builtin-face)) + ("Field" . (all-the-icons-octicon "three-bars" :face font-lock-type-face)) + ("Fields" . (all-the-icons-octicon "three-bars" :face font-lock-type-face)) + ("File" . (all-the-icons-faicon "file" :face font-lock-variable-name-face)) + ("Files" . (all-the-icons-faicon "file" :face font-lock-variable-name-face)) + ("Folder" . (all-the-icons-faicon "folder" :face font-lock-variable-name-face)) + ("Folders" . (all-the-icons-faicon "folder" :face font-lock-variable-name-face)) + ("Interface" . (all-the-icons-octicon "package" :face font-lock-builtin-face)) + ("Interfaces" . (all-the-icons-octicon "package" :face font-lock-builtin-face)) + ("Keyword" . (all-the-icons-octicon "key" :face font-lock-builtin-face)) + ("Keywords" . (all-the-icons-octicon "key" :face font-lock-builtin-face)) + ("Method" . (all-the-icons-faicon "cube" :face font-lock-function-name-face)) + ("Methods" . (all-the-icons-faicon "cube" :face font-lock-function-name-face)) + ("Defun" . (all-the-icons-faicon "cube" :face font-lock-function-name-face)) + ("Defuns" . (all-the-icons-faicon "cube" :face font-lock-function-name-face)) + ("Fn" . (all-the-icons-faicon "cube" :face font-lock-function-name-face)) + ("Fns" . (all-the-icons-faicon "cube" :face font-lock-function-name-face)) + ("Function" . (all-the-icons-faicon "cube" :face font-lock-function-name-face)) + ("Functions" . (all-the-icons-faicon "cube" :face font-lock-function-name-face)) + ("Misc" . (all-the-icons-faicon "globe" :face font-lock-function-name-face)) + ("Miscs" . (all-the-icons-faicon "globe" :face font-lock-function-name-face)) + ("Module" . (all-the-icons-faicon "angle-double-right" :face font-lock-builtin-face)) + ("Modules" . (all-the-icons-faicon "angle-double-right" :face font-lock-builtin-face)) + ("Numeric" . (all-the-icons-material "crop" :face font-lock-builtin-face)) + ("Numeric" . (all-the-icons-material "crop" :face font-lock-builtin-face)) + ("Object" . (all-the-icons-faicon "angle-double-right" :face font-lock-builtin-face)) + ("Objects" . (all-the-icons-faicon "angle-double-right" :face font-lock-builtin-face)) + ("Operator" . (all-the-icons-faicon "calculator" :face font-lock-builtin-face)) + ("Operators" . (all-the-icons-faicon "calculator" :face font-lock-builtin-face)) + ("Property" . (all-the-icons-octicon "book" :face font-lock-variable-name-face)) + ("Properties" . (all-the-icons-octicon "book" :face font-lock-variable-name-face)) + ("Reference" . (all-the-icons-octicon "book" :face font-lock-variable-name-face)) + ("References" . (all-the-icons-octicon "book" :face font-lock-variable-name-face)) + ("Snippet" . (all-the-icons-material "border_style" :face font-lock-variable-name-face)) + ("Snippet" . (all-the-icons-material "border_style" :face font-lock-variable-name-face)) + ("String" . (all-the-icons-material "text_fields" :face font-lock-variable-name-face)) + ("Strings" . (all-the-icons-material "text_fields" :face font-lock-variable-name-face)) + ("Struct" . (all-the-icons-faicon "cog" :face font-lock-type-face)) + ("Structs" . (all-the-icons-faicon "cog" :face font-lock-type-face)) + ("Text" . (all-the-icons-material "text_fields" :face font-lock-variable-name-face)) + ("Texts" . (all-the-icons-material "text_fields" :face font-lock-variable-name-face)) + ("Top level" . (all-the-icons-faicon "globe" :face font-lock-function-name-face)) + ("Trait" . (all-the-icons-octicon "package" :face font-lock-builtin-face)) + ("Traits" . (all-the-icons-octicon "package" :face font-lock-builtin-face)) + ("Type" . (all-the-icons-faicon "cog" :face font-lock-type-face)) + ("Types" . (all-the-icons-faicon "cog" :face font-lock-type-face)) + ("Type Parameter" . (all-the-icons-material "code" :face font-lock-type-face)) + ("Type Parameters" . (all-the-icons-material "code" :face font-lock-type-face)) + ("Unit" . (all-the-icons-faicon "bar-chart" :face font-lock-builtin-face)) + ("Units" . (all-the-icons-faicon "bar-chart" :face font-lock-builtin-face)) + ("Value" . (all-the-icons-faicon "cog" :face font-lock-type-face)) + ("Values" . (all-the-icons-faicon "cog" :face font-lock-type-face)) + ("Variable" . (all-the-icons-octicon "book" :face font-lock-variable-name-face)) + ("Variables" . (all-the-icons-octicon "book":face font-lock-variable-name-face))) + "An alist of types associated with a sexp returning an icon. +The sexp should be an `all-the-icons' function with its args." + :type '(alist :key-type string :value-type sexp) + :group 'helm-imenu) + +(defcustom helm-imenu-default-type-sexp + '(all-the-icons-faicon "globe" :face font-lock-function-name-face) + "Default sexp to use when no type for an object is found." + :type 'sexp + :group 'helm-imenu) + +;;; keymap +(defvar helm-imenu-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map helm-map) + (define-key map (kbd "M-") 'helm-imenu-next-section) + (define-key map (kbd "M-") 'helm-imenu-previous-section) + (define-key map (kbd "C-]") 'helm-imenu-toggle-type-view) + map)) + +(defun helm-imenu-toggle-type-view () + "Toggle candidate type view." + (interactive) + (with-helm-window + (setq helm-imenu-hide-item-type-name (not helm-imenu-hide-item-type-name)) + (let* ((sel (substring (helm-get-selection nil 'withprop) + (if helm-imenu-use-icon 2 0))) + (type (get-text-property 1 'type-name sel))) + (setq sel (substring-no-properties sel)) + (helm-force-update (if helm-imenu-hide-item-type-name + (format "^[ ]*%s$" + (car (last (split-string + sel helm-imenu-delimiter t)))) + (format "^[ ]*%s / %s$" + type sel)))))) +(put 'helm-imenu-toggle-type-view 'no-helm-mx t) + +(defcustom helm-imenu-lynx-style-map nil + "Use Arrow keys to jump to occurences." + :group 'helm-imenu + :type 'boolean + :set (lambda (var val) + (set var val) + (if val + (progn + (define-key helm-imenu-map (kbd "") 'helm-execute-persistent-action) + (define-key helm-imenu-map (kbd "") 'helm-maybe-exit-minibuffer)) + (define-key helm-imenu-map (kbd "") nil) + (define-key helm-imenu-map (kbd "") nil)))) + +(defun helm-imenu-next-or-previous-section (n) + (with-helm-window + (let* ((fn (lambda () + (let ((str (buffer-substring + (pos-bol) (pos-eol)))) + (if helm-imenu-hide-item-type-name + (get-text-property 1 'type-name str) + (car (split-string str helm-imenu-delimiter)))))) + (curtype (funcall fn)) + (stop-fn (if (> n 0) + #'helm-end-of-source-p + #'helm-beginning-of-source-p))) + (while (and (not (funcall stop-fn)) + (string= curtype (funcall fn))) + (forward-line n)) + (helm-mark-current-line) + (helm-follow-execute-persistent-action-maybe)))) + +(defun helm-imenu-next-section () + (interactive) + (helm-imenu-next-or-previous-section 1)) + +(defun helm-imenu-previous-section () + (interactive) + (helm-imenu-next-or-previous-section -1)) + + +;;; Internals +(defvar helm-cached-imenu-alist nil) +(make-variable-buffer-local 'helm-cached-imenu-alist) + +(defvar helm-cached-imenu-candidates nil) +(make-variable-buffer-local 'helm-cached-imenu-candidates) + +(defvar helm-cached-imenu-tick nil) +(make-variable-buffer-local 'helm-cached-imenu-tick) + +(defvar helm-imenu--in-all-buffers-cache nil) + + +(defvar helm-source-imenu nil "See (info \"(emacs)Imenu\")") +(defvar helm-source-imenu-all nil) + +(defclass helm-imenu-source (helm-source-sync) + ((candidates :initform 'helm-imenu-candidates) + (candidate-transformer :initform 'helm-imenu-transformer) + (persistent-action :initform 'helm-imenu-persistent-action) + (persistent-help :initform "Show this entry") + (nomark :initform t) + (keymap :initform 'helm-imenu-map) + (help-message :initform 'helm-imenu-help-message) + (action :initform 'helm-imenu-action) + (find-file-target :initform #'helm-imenu-quit-and-find-file-fn) + (group :initform 'helm-imenu))) + +(defcustom helm-imenu-fuzzy-match nil + "Enable fuzzy matching in `helm-source-imenu'." + :group 'helm-imenu + :type 'boolean + :set (lambda (var val) + (set var val) + (setq helm-source-imenu + (helm-make-source "Imenu" 'helm-imenu-source + :fuzzy-match helm-imenu-fuzzy-match)))) + +(defun helm-imenu--maybe-switch-to-buffer (candidate) + (let ((cand (cdr candidate))) + (helm-aif (and (markerp cand) (marker-buffer cand)) + (switch-to-buffer it)))) + +(defun helm-imenu--execute-action-at-once-p () + (let ((cur (helm-get-selection)) + (mb (with-helm-current-buffer + (save-excursion + (goto-char (pos-bol)) + (point-marker))))) + ;; Happen when cursor is on the line where a definition is. This + ;; prevent jumping to the definition where we are already, instead + ;; display helm with all definitions and preselection to the place + ;; we already are. + (if (equal (cdr cur) mb) + (prog1 nil + (helm-set-pattern "") + (helm-force-update (concat "\\_<" (car cur) "\\_>"))) + t))) + +(defun helm-imenu-quit-and-find-file-fn (source) + (let ((sel (helm-get-selection nil nil source))) + (when (and (consp sel) (markerp (cdr sel))) + (buffer-file-name (marker-buffer (cdr sel)))))) + +(defun helm-imenu-action (candidate) + "Default action for `helm-source-imenu'." + (helm-log-run-hook "helm-imenu-action" 'helm-goto-line-before-hook) + (helm-imenu--maybe-switch-to-buffer candidate) + (imenu candidate) + ;; If semantic is supported in this buffer + ;; imenu used `semantic-imenu-goto-function' + ;; and position have been highlighted, + ;; no need to highlight again. + (unless (eq imenu-default-goto-function + 'semantic-imenu-goto-function) + (helm-highlight-current-line))) + +(defun helm-imenu-persistent-action (candidate) + "Default persistent action for `helm-source-imenu'." + (helm-imenu--maybe-switch-to-buffer candidate) + (imenu candidate) + (helm-highlight-current-line)) + +(defun helm-imenu-candidates (&optional buffer) + (with-current-buffer (or buffer helm-current-buffer) + (let ((tick (buffer-modified-tick))) + (if (eq helm-cached-imenu-tick tick) + helm-cached-imenu-candidates + (setq imenu--index-alist nil) + (prog1 (setq helm-cached-imenu-candidates + (let ((index (imenu--make-index-alist t))) + (helm-imenu--candidates-1 + (delete (assoc "*Rescan*" index) index)))) + (setq helm-cached-imenu-tick tick)))))) + +(defun helm-imenu-candidates-in-all-buffers (&optional build-sources) + (let* ((lst (buffer-list)) + (progress-reporter (make-progress-reporter + "Imenu indexing buffers..." 1 (length lst)))) + (prog1 + (cl-loop with cur-buf = (if build-sources + (current-buffer) helm-current-buffer) + for b in lst + for count from 1 + when (with-current-buffer b + (and (or (member major-mode helm-imenu-extra-modes) + (derived-mode-p 'prog-mode)) + (helm-same-major-mode-p + cur-buf helm-imenu-all-buffer-assoc))) + if build-sources + collect (helm-make-source + (format "Imenu in %s" (buffer-name b)) + 'helm-imenu-source + :candidates (with-current-buffer b + (helm-imenu-candidates b)) + :fuzzy-match helm-imenu-fuzzy-match) + else + append (with-current-buffer b + (helm-imenu-candidates b)) + do (progress-reporter-update progress-reporter count)) + (progress-reporter-done progress-reporter)))) + +(defun helm-imenu--candidates-1 (alist) + (cl-loop for elm in alist + nconc (cond + ((imenu--subalist-p elm) + (helm-imenu--candidates-1 + (cl-loop for (e . v) in (cdr elm) collect + (cons (propertize + e 'helm-imenu-type (car elm)) + ;; If value is an integer, convert it + ;; to a marker, otherwise it is a cons cell + ;; and it will be converted on next recursions. + ;; (Bug#1060) [1]. + (if (integerp v) (copy-marker v) v))))) + ((listp (cdr elm)) + (and elm (list elm))) + (t + ;; bug in imenu, should not be needed. + (and (cdr elm) + ;; Semantic uses overlays whereas imenu uses + ;; markers (Bug#1706). + (setcdr elm (helm-acase (cdr elm) ; Same as [1]. + ((guard (overlayp it)) + (copy-overlay it)) + ((guard (or (markerp it) (integerp it))) + (copy-marker it)))) + (list elm)))))) + +(defun helm-imenu--get-prop (item) + ;; property value of ITEM can have itself + ;; a property value which have itself a property value + ;; ...and so on; Return a list of all these + ;; properties values starting at ITEM. + (let* ((prop (get-text-property 0 'helm-imenu-type item)) + (lst (list prop item))) + (when prop + (while prop + (setq prop (get-text-property 0 'helm-imenu-type prop)) + (and prop (push prop lst))) + lst))) + +(defun helm-imenu-icon-for-type (type) + "Return an icon for type TYPE. +The icon is found in `helm-imenu-icon-type-alist', if not +`helm-imenu-default-type-sexp' is evaled to provide a default icon." + (let ((all-the-icons-scale-factor 1.0) + (all-the-icons-default-adjust 0.0)) + (or (helm-aand (assoc-default + type helm-imenu-icon-type-alist) + (apply (car it) (cdr it))) + (apply (car helm-imenu-default-type-sexp) + (cdr helm-imenu-default-type-sexp))))) + +(defun helm-imenu-transformer (candidates) + (cl-loop for (k . v) in candidates + ;; (k . v) == (symbol-name . marker) + for bufname = (buffer-name + (helm-acase v + ((guard (overlayp it)) (overlay-buffer it)) + ((guard (markerp it)) (marker-buffer it)))) + for types = (or (helm-imenu--get-prop k) + (list (if (with-current-buffer bufname + (derived-mode-p 'prog-mode)) + "Function" + "Top level") + k)) + for type-icon = (and helm-imenu-use-icon + (helm-imenu-icon-for-type (car types))) + for type-name = (propertize + (car types) 'face + (cl-loop for (p . f) in helm-imenu-type-faces + when (string-match p (car types)) + return f + finally return 'default)) + for disp1 = (mapconcat 'identity + (cdr types) + (propertize helm-imenu-delimiter + 'face 'shadow)) + for disp = (concat (if helm-imenu-use-icon + (concat (propertize " " 'display type-icon) " ") + "") + (if helm-imenu-hide-item-type-name + "" + (concat type-name + (propertize helm-imenu-delimiter + 'face 'shadow))) + (propertize disp1 'help-echo bufname 'types types)) + collect + (cons (propertize disp 'type-name type-name) (cons k v)))) + + +;;;###autoload +(defun helm-imenu () + "Preconfigured `helm' for `imenu'." + (interactive) + (require 'which-func) + (unless helm-source-imenu + (setq helm-source-imenu + (helm-make-source "Imenu" 'helm-imenu-source + :fuzzy-match helm-imenu-fuzzy-match))) + (let* ((imenu-auto-rescan t) + (helm-highlight-matches-around-point-max-lines 'never) + (str (thing-at-point 'symbol)) + (init-reg (and str (concat "\\_<" (regexp-quote str) "\\_>"))) + (helm-execute-action-at-once-if-one + helm-imenu-execute-action-at-once-if-one)) + (helm :sources 'helm-source-imenu + :default (and str (list init-reg str)) + :preselect (helm-aif (which-function) + (concat "\\_<" (regexp-quote it) "\\_>") + init-reg) + :buffer "*helm imenu*"))) + +;;;###autoload +(defun helm-imenu-in-all-buffers () + "Fetch Imenu entries in all buffers with similar mode as current. +A mode is similar as current if it is the same, it is derived +i.e. `derived-mode-p' or it have an association in +`helm-imenu-all-buffer-assoc'." + (interactive) + (require 'which-func) + (unless helm-imenu-in-all-buffers-separate-sources + (unless helm-source-imenu-all + (setq helm-source-imenu-all + (helm-make-source "Imenu in all buffers" 'helm-imenu-source + :init (lambda () + ;; Use a cache to avoid repeatedly sending + ;; progress-reporter message when updating + ;; (Bug#1704). + (setq helm-imenu--in-all-buffers-cache + (helm-imenu-candidates-in-all-buffers))) + :candidates 'helm-imenu--in-all-buffers-cache + :fuzzy-match helm-imenu-fuzzy-match)))) + (let* ((imenu-auto-rescan t) + (helm-highlight-matches-around-point-max-lines 'never) + (str (thing-at-point 'symbol)) + (init-reg (and str (concat "\\_<" (regexp-quote str) "\\_>"))) + (helm-execute-action-at-once-if-one + helm-imenu-execute-action-at-once-if-one) + (helm-maybe-use-default-as-input + (not (null (memq 'helm-source-imenu-all + helm-sources-using-default-as-input)))) + (sources (if helm-imenu-in-all-buffers-separate-sources + (helm-imenu-candidates-in-all-buffers 'build-sources) + '(helm-source-imenu-all)))) + (helm :sources sources + :default (and str (list init-reg str)) + :preselect (helm-aif (which-function) + (concat "\\_<" (regexp-quote it) "\\_>") + init-reg) + :buffer "*helm imenu all*"))) + +(provide 'helm-imenu) + +;;; helm-imenu.el ends here diff --git a/code/elpa/helm-20240320.541/helm-info.el b/code/elpa/helm-20240320.541/helm-info.el new file mode 100644 index 0000000..9155f3a --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-info.el @@ -0,0 +1,315 @@ +;;; helm-info.el --- Browse info index with helm -*- lexical-binding: t -*- + +;; Copyright (C) 2012 ~ 2023 Thierry Volpiatto + +;; 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 'info) +;; helm-utils is requiring helm which is requiring helm-lib, but let's require +;; them explicitely anyway to make it clear what we need. helm-core is needed to +;; build all the helm-info-* commands and sources. +(require 'helm) +(require 'helm-lib) +(require 'helm-utils) ; for `helm-goto-line'. + +(declare-function Info-index-nodes "info" (&optional file)) +(declare-function Info-goto-node "info" (&optional fork)) +(declare-function Info-find-node "info" (filename nodename &optional no-going-back)) +(declare-function ring-insert "ring") +(declare-function ring-empty-p "ring") +(declare-function ring-ref "ring") +(defvar Info-history) +(defvar Info-directory-list) +;; `Info-minibuf-history' is not declared in Emacs, see emacs bug/58786. +(when (and (> emacs-major-version 28) + (not (boundp 'Info-minibuf-history))) + (defvar Info-minibuf-history nil)) + + +;;; Customize + +(defgroup helm-info nil + "Info-related applications and libraries for Helm." + :group 'helm) + +(defcustom helm-info-default-sources + '(helm-source-info-elisp + helm-source-info-cl + helm-source-info-eieio + helm-source-info-pages) + "Default sources to use for looking up symbols at point in Info +files with `helm-info-at-point'." + :group 'helm-info + :type '(repeat (choice symbol))) + +;;; Build info-index sources with `helm-info-source' class. + +(cl-defun helm-info-init (&optional (file (helm-get-attr 'info-file))) + "Initialize candidates for info FILE. +If FILE have nodes, loop through all nodes and accumulate candidates +found in each node, otherwise scan only the current info buffer." + ;; Allow reinit candidate buffer when using edebug. + (helm-aif (and debug-on-error + (helm-candidate-buffer)) + (kill-buffer it)) + (unless (helm-candidate-buffer) + (save-window-excursion + (info file " *helm info temp buffer*") + (let ((tobuf (helm-candidate-buffer 'global)) + Info-history) + (helm-aif (Info-index-nodes) + (dolist (node it) + (Info-goto-node node) + (helm-info-scan-current-buffer tobuf)) + (helm-info-scan-current-buffer tobuf)) + (bury-buffer))))) + +(defun helm-info-scan-current-buffer (tobuf) + "Scan current info buffer and print lines to TOBUF. +Argument TOBUF is the `helm-candidate-buffer'." + (let (start end line) + (goto-char (point-min)) + (while (search-forward "\n* " nil t) + (unless (search-forward "Menu:\n" (1+ (pos-eol)) t) + (setq start (pos-bol) + ;; Fix Bug#1503 by getting the invisible + ;; info displayed on next line in long strings. + ;; e.g "* Foo.\n (line 12)" instead of + ;; "* Foo.(line 12)" + end (or (save-excursion + (goto-char (pos-bol)) + (re-search-forward "(line +[0-9]+)" nil t)) + (pos-eol)) + ;; Long string have a new line inserted before the + ;; invisible spec, remove it. + line (replace-regexp-in-string + "\n" "" (buffer-substring start end))) + (with-current-buffer tobuf + (insert line) + (insert "\n")))))) + +(defun helm-info-goto (node-line) + "The helm-info action to jump to NODE-LINE." + (require 'helm-utils) + (let ((alive (buffer-live-p (get-buffer "*info*")))) + (Info-goto-node (car node-line)) + (when alive (revert-buffer nil t)) + (helm-goto-line (cdr node-line)))) + +(defvar helm-info--node-regexp + "^\\* +\\(.+\\):[[:space:]]+\\(.*\\)\\(?:[[:space:]]*\\)(line +\\([0-9]+\\))" + "A regexp that should match file name, node name and line number in +a line like this: + +\* bind: Bash Builtins. (line 21).") + +(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 ((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" + info-file + (replace-regexp-in-string ":\\'" "" nodename)) + (string-to-number (or linum "1"))) + (cons (format "(%s)%s" + info-file + (helm-aand (replace-regexp-in-string "^* " "" line) + (replace-regexp-in-string "::?.*\\'" "" it))) + 1)))) + +(defclass helm-info-source (helm-source-in-buffer) + ((info-file :initarg :info-file + :initform nil + :custom 'string) + (init :initform #'helm-info-init) + (display-to-real :initform #'helm-info-display-to-real) + (get-line :initform #'buffer-substring) + (action :initform '(("Goto node" . helm-info-goto))))) + +(defmacro helm-build-info-source (fname &rest args) + `(helm-make-source (concat "Info Index: " ,fname) 'helm-info-source + :info-file ,fname ,@args)) + +(defun helm-build-info-index-command (name doc source buffer) + "Define a Helm command NAME with documentation DOC. +Arg SOURCE will be an existing helm source named +`helm-source-info-' and BUFFER a string buffer name." + (defalias (intern (concat "helm-info-" name)) + (lambda () + (interactive) + (helm :sources source + :buffer buffer + :candidate-number-limit 1000)) + doc)) + +(defun helm-define-info-index-sources (info-list &optional commands) + "Define Helm info sources for all entries in INFO-LIST. + +Sources will be named named helm-source-info- where NAME is an element of +INFO-LIST. + +Sources are generated for all entries of `helm-default-info-index-list' which is +generated by `helm-get-info-files'. + +If COMMANDS arg is non-nil, also build commands named `helm-info-'." + (cl-loop for str in info-list + for sym = (intern (concat "helm-source-info-" str)) + do (set sym (helm-build-info-source str)) + when commands + do (helm-build-info-index-command + str (format "Predefined helm for %s info." str) + sym (format "*helm info %s*" str)))) + +(defun helm-info-index-set (var value) + (set var value) + (helm-define-info-index-sources value t)) + +;;; Search Info files + +;; `helm-info' is the main entry point here. It prompts the user for an Info +;; file, then a term in the file's index to jump to. + +(defvar helm-info-searched (make-ring 32) + "Ring of previously searched Info files.") + +(defun helm-get-info-files () + "Return list of Info files to use for `helm-info'. + +Elements of the list are strings of Info file names without +extensions (e.g., \"emacs\" for file \"emacs.info.gz\"). Info +files are found by searching directories in +`Info-directory-list'." + (info-initialize) ; Build Info-directory-list from INFOPATH (Bug#2118) + (let ((files (cl-loop for d in (or Info-directory-list + Info-default-directory-list) + when (file-directory-p d) + append (directory-files d nil "\\.info")))) + (helm-fast-remove-dups + (cl-loop for f in files collect + (helm-file-name-sans-extension f)) + :test 'equal))) + +(defcustom helm-default-info-index-list + (helm-get-info-files) + "Info files to search in with `helm-info'." + :group 'helm-info + :type '(repeat (choice string)) + :set 'helm-info-index-set) + +(defun helm-info-search-index (candidate) + "Search the index of CANDIDATE's Info file using the function +helm-info-." + (let ((helm-info-function + (intern-soft (concat "helm-info-" candidate)))) + (when (fboundp helm-info-function) + (funcall helm-info-function) + (ring-insert helm-info-searched candidate)))) + +(defun helm-def-source--info-files () + "Return a Helm source for Info files." + (helm-build-sync-source "Helm Info" + :candidates + (lambda () (copy-sequence helm-default-info-index-list)) + :candidate-number-limit 999 + :candidate-transformer + (lambda (candidates) + (sort candidates #'string-lessp)) + :nomark t + :action '(("Search index" . helm-info-search-index)))) + +;;;###autoload +(defun helm-info (&optional refresh) + "Preconfigured `helm' for searching Info files' indices. + +With a prefix argument \\[universal-argument], set REFRESH to +non-nil. + +Optional parameter REFRESH, when non-nil, re-evaluates +`helm-default-info-index-list'. If the variable has been +customized, set it to its saved value. If not, set it to its +standard value. See `custom-reevaluate-setting' for more. + +REFRESH is useful when new Info files are installed. If +`helm-default-info-index-list' has not been customized, the new +Info files are made available." + (interactive "P") + (let ((default (unless (ring-empty-p helm-info-searched) + (ring-ref helm-info-searched 0)))) + (when refresh + (custom-reevaluate-setting 'helm-default-info-index-list)) + (helm :sources (helm-def-source--info-files) + :buffer "*helm Info*" + :preselect (and default + (concat "\\_<" (regexp-quote default) "\\_>"))))) + +;;;; Info at point + +;; `helm-info-at-point' is the main entry point here. It searches for the +;; symbol at point through the Info sources defined in +;; `helm-info-default-sources' and jumps to it. + +(defvar helm-info--pages-cache nil + "Cache for all Info pages on the system.") + +(defvar helm-source-info-pages + (helm-build-sync-source "Info Pages" + :init #'helm-info-pages-init + :candidates (lambda () helm-info--pages-cache) + :action '(("Show with Info" . + (lambda (node-str) + (info (replace-regexp-in-string + "^[^:]+: " "" node-str))))) + :requires-pattern 2) + "Helm source for Info pages.") + +(defun helm-info-pages-init () + "Collect candidates for initial Info node Top." + (or helm-info--pages-cache + (let ((info-topic-regexp "\\* +\\([^:]+: ([^)]+)[^.]*\\)\\.")) + (save-selected-window + (info "dir" " *helm info temp buffer*") + (Info-find-node "dir" "top") + (goto-char (point-min)) + (while (re-search-forward info-topic-regexp nil t) + (push (match-string-no-properties 1) + helm-info--pages-cache)) + (kill-buffer))))) + +;;;###autoload +(defun helm-info-at-point () + "Preconfigured `helm' for searching info at point." + (interactive) + ;; Symbol at point is used as default as long as one of the sources + ;; in `helm-info-default-sources' is member of + ;; `helm-sources-using-default-as-input'. + (cl-loop for src in helm-info-default-sources + for name = (if (symbolp src) + (assoc 'name (symbol-value src)) + (assoc 'name src)) + unless name + do (warn "Couldn't build source `%S' without its info file" src)) + (helm :sources helm-info-default-sources + :buffer "*helm info*")) + +(provide 'helm-info) + +;;; helm-info.el ends here diff --git a/code/elpa/helm-20240320.541/helm-locate.el b/code/elpa/helm-20240320.541/helm-locate.el new file mode 100644 index 0000000..2e81175 --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-locate.el @@ -0,0 +1,487 @@ +;;; helm-locate.el --- helm interface for locate. -*- lexical-binding: t -*- + +;; Copyright (C) 2012 ~ 2023 Thierry Volpiatto + +;; 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 . + +;; NOTE for WINDOZE users: +;; You have to install Everything with his command line interface here: +;; http://www.voidtools.com/download.php + +;;; Code: + +(require 'cl-lib) +(require 'helm) +(require 'helm-types) +(require 'helm-help) + +(defvar helm-ff-default-directory) +(declare-function helm-read-file-name "helm-mode") + + +(defgroup helm-locate nil + "Locate related Applications and libraries for Helm." + :group 'helm) + +(defcustom helm-locate-db-file-regexp "m?locate\\.db$" + "Default regexp to match locate database. +If nil Search in all files." + :type 'string) + +(defcustom helm-ff-locate-db-filename "locate.db" + "The basename of the locatedb file you use locally in your directories. +When this is set and Helm finds such a file in the directory from +where you launch locate, it will use this file and will not +prompt you for a db file. +Note that this happen only when locate is launched with a prefix +arg." + :type 'string) + +(defcustom helm-locate-command nil + "A list of arguments for locate program. + +Helm will calculate a default value for your system on startup +unless `helm-locate-command' is non-nil. + +Here are the default values it will use according to your system: + +Gnu/linux: \"locate %s -e -A -N --regex %s\" +berkeley-unix: \"locate %s %s\" +windows-nt: \"es %s %s\" +Others: \"locate %s %s\" + +This string will be passed to format so it should end with `%s'. +The first format spec is used for the \"-i\" value of locate/es, +so don't set it directly but use `helm-locate-case-fold-search' +for this. + +The last option must be the one preceding pattern i.e \"-r\" or +\"--regex\". + +The option \"-N\" may not be available on old locate versions, it is needed on +latest systems as locate send quoted filenames, it is BTW enabled by default, if +this option is not recognized on your system, remove it. + +You will be able to pass other options such as \"-b\" or \"l\" +during Helm invocation after entering pattern only when multi +matching, not when fuzzy matching. + +Note that the \"-b\" option is added automatically by Helm when +var `helm-locate-fuzzy-match' is non-nil and switching back from +multimatch to fuzzy matching (this is done automatically when a +space is detected in pattern)." + :type 'string) + +(defcustom helm-locate-create-db-command + "updatedb -l 0 -o '%s' -U '%s'" + "Command used to create a locale locate db file." + :type 'string) + +(defcustom helm-locate-case-fold-search helm-case-fold-search + "It have the same meaning as `helm-case-fold-search'. +The -i option of locate will be used depending of value of +`helm-pattern' when this is set to \\='smart. +When nil \"-i\" will not be used at all and when non-nil it will +always be used. +NOTE: the -i option of the \"es\" command used on windows does +the opposite of \"locate\" command." + :type 'symbol) + +(defcustom helm-locate-fuzzy-match nil + "Enable fuzzy matching in `helm-locate'. +Note that when this is enabled searching is done on basename." + :type 'boolean) + +(defcustom helm-locate-fuzzy-sort-fn + #'helm-locate-default-fuzzy-sort-fn + "Default fuzzy matching sort function for locate." + :type 'boolean) + +(defcustom helm-locate-project-list nil + "A list of directories, your projects. +When set, allow browsing recursively files in all directories of +this list with `helm-projects-find-files'." + :type '(repeat string)) + +(defcustom helm-locate-recursive-dirs-command "locate -i -e -A --regex '^%s' '%s.*$'" + "Command used for recursive directories completion in `helm-find-files'. + +For Windows and `es' use something like \"es -r ^%s.*%s.*$\" + +The two format specs are mandatory. + +If for some reasons you can't use locate because your filesystem +doesn't have a database, you can use find command from findutils +but be aware that it will be much slower. See `helm-find-files' +embedded help for more infos." + :type 'string + :group 'helm-files) + + +(defvar helm-locate-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map helm-generic-files-map) + (define-key map (kbd "DEL") 'helm-delete-backward-no-update) + map)) + +(defface helm-locate-finish + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "Green")) + "Face used in mode line when locate process is finish." + :group 'helm-locate) + + +(defun helm-ff-find-locatedb (&optional from-ff) + "Try to find if a local locatedb file is available. +The search is done in `helm-ff-default-directory' or falls back to +`default-directory' if FROM-FF is nil." + (helm-aif (and helm-ff-locate-db-filename + (locate-dominating-file + (or (and from-ff + helm-ff-default-directory) + default-directory) + helm-ff-locate-db-filename)) + (expand-file-name helm-ff-locate-db-filename it))) + +(defun helm-locate-create-db-default-function (db-name directory) + "Default function used to create a locale locate db file. +Argument DB-NAME name of the db file. +Argument DIRECTORY root of file system subtree to scan." + (format helm-locate-create-db-command + db-name (expand-file-name directory))) + +(defvar helm-locate-create-db-function + #'helm-locate-create-db-default-function + "Function used to create a locale locate db file. +It should receive the same arguments as +`helm-locate-create-db-default-function'.") + +(defun helm-locate-1 (&optional localdb init from-ff default) + "Generic function to run Locate. +Prefix arg LOCALDB when (4) search and use a local locate db file +when it exists or create it, when (16) force update of existing +db file even if exists. +It has no effect when locate command is \\='es'. INIT is a string +to use as initial input in prompt. +See `helm-locate-with-db' and `helm-locate'." + (require 'helm-mode) + (helm-locate-set-command) + (let ((pfn (lambda (candidate) + (if (file-directory-p candidate) + (message "Error: The locate Db should be a file") + (if (= (shell-command + (funcall helm-locate-create-db-function + candidate + helm-ff-default-directory)) + 0) + (message "New locatedb file `%s' created" candidate) + (error "Failed to create locatedb file `%s'" candidate))))) + (locdb (and localdb + (not (string-match "^es" helm-locate-command)) + (or (and (equal '(4) localdb) + (helm-ff-find-locatedb from-ff)) + (helm-read-file-name + "Create Locate Db file: " + :initial-input (expand-file-name "locate.db" + (or helm-ff-default-directory + default-directory)) + :preselect helm-locate-db-file-regexp + :test (lambda (x) + (if helm-locate-db-file-regexp + ;; Select only locate db files and directories + ;; to allow navigation. + (or (string-match + helm-locate-db-file-regexp x) + (file-directory-p x)) + x))))))) + (when (and locdb (or (equal localdb '(16)) + (not (file-exists-p locdb)))) + (funcall pfn locdb)) + (helm-locate-with-db (and localdb locdb) init default))) + +(defun helm-locate-set-command () + "Setup `helm-locate-command' if not already defined." + (unless helm-locate-command + (setq helm-locate-command + (cl-case system-type + ;; Use -N option by default (bug#2625) + (gnu/linux "locate %s -e -A -N --regex %s") + (berkeley-unix "locate %s %s") + (windows-nt "es %s %s") + (t "locate %s %s"))))) + +(defun helm-locate-initial-setup () + (require 'helm-for-files) + (helm-locate-set-command)) + +(defvar helm-file-name-history nil) +(defun helm-locate-with-db (&optional db initial-input default) + "Run locate -d DB. +If DB is not given or nil use locate without -d option. +Argument DB can be given as a string or list of db files. +Argument INITIAL-INPUT is a string to use as initial-input. +See also `helm-locate'." + (require 'helm-files) + (when (and db (stringp db)) (setq db (list db))) + (helm-locate-set-command) + (let ((helm-locate-command + (if db + (replace-regexp-in-string + "locate" + (format (if helm-locate-fuzzy-match + "locate -b -d '%s'" "locate -d '%s'") + (mapconcat 'identity + ;; Remove eventually + ;; marked directories by error. + (cl-loop for i in db + unless (file-directory-p i) + ;; expand-file-name to resolve + ;; abbreviated fnames not + ;; expanding inside single + ;; quotes i.e. '%s'. + collect (expand-file-name i)) + ":")) + helm-locate-command) + (if (and helm-locate-fuzzy-match + (not (string-match-p "\\`locate -b" helm-locate-command))) + (replace-regexp-in-string + "\\`locate" "locate -b" helm-locate-command) + helm-locate-command)))) + (setq helm-file-name-history (mapcar 'helm-basename file-name-history)) + (helm :sources 'helm-source-locate + :buffer "*helm locate*" + :ff-transformer-show-only-basename nil + :input initial-input + :default default + :history 'helm-file-name-history))) + +(defun helm-locate-update-mode-line (process-name) + "Update mode-line with PROCESS-NAME status information." + (with-helm-window + (setq mode-line-format + `(" " mode-line-buffer-identification " " + (:eval (format "L%s" (helm-candidate-number-at-point))) " " + (:eval (propertize + (format "[%s process finished - (%s results)]" + (max (1- (count-lines + (point-min) (point-max))) + 0) + ,process-name) + 'face 'helm-locate-finish)))) + (force-mode-line-update))) + +(defun helm-locate--default-process-coding-system () + "Fix `default-process-coding-system' in locate for Windows systems." + ;; This is an attempt to fix issue #1322. + (if (and (eq system-type 'windows-nt) + (boundp 'w32-ansi-code-page)) + (let ((code-page-eol + (intern (format "cp%s-%s" w32-ansi-code-page "dos")))) + (if (ignore-errors (check-coding-system code-page-eol)) + (cons code-page-eol code-page-eol) + default-process-coding-system)) + default-process-coding-system)) + +(defun helm-locate-init () + "Initialize async locate process for `helm-source-locate'." + (let* ((default-process-coding-system + (helm-locate--default-process-coding-system)) + (locate-is-es (string-match "\\`es" helm-locate-command)) + (real-locate (string-match "\\`locate" helm-locate-command)) + (case-sensitive-flag (if locate-is-es "-i" "")) + (ignore-case-flag (if (or locate-is-es + (not real-locate)) "" "-i")) + (args (helm-mm-split-pattern helm-pattern)) + (cmd (format helm-locate-command + (cl-case helm-locate-case-fold-search + (smart (let ((case-fold-search nil)) + (if (string-match "[[:upper:]]" helm-pattern) + case-sensitive-flag + ignore-case-flag))) + (t (if helm-locate-case-fold-search + ignore-case-flag + case-sensitive-flag))) + (helm-aif (cdr args) + (concat + ;; The pattern itself. + (shell-quote-argument (car args)) " " + ;; Possible locate args added + ;; after pattern, don't quote them. + (mapconcat 'identity it " ")) + (shell-quote-argument (car args))))) + (default-directory (if (file-directory-p default-directory) + default-directory "/"))) + (helm-log "helm-locat-init" "Starting helm-locate process") + (helm-log "helm-locat-init" "Command line used was:\n\n%s" + (concat ">>> " (propertize cmd 'face 'font-lock-comment-face) "\n\n")) + (prog1 + (start-process-shell-command + "locate-process" helm-buffer + cmd) + (set-process-sentinel + (get-buffer-process helm-buffer) + (lambda (process event) + (let* ((err (process-exit-status process)) + (noresult (= err 1))) + (cond (noresult + (with-helm-buffer + (unless (cdr helm-sources) + (insert (concat "* Exit with code 1, no result found," + " command line was:\n\n " + cmd))))) + ((string= event "finished\n") + (when (and helm-locate-fuzzy-match + (not (string-match-p "\\s-" helm-pattern))) + (helm-redisplay-buffer)) + (helm-locate-update-mode-line "Locate")) + (t + (helm-log "helm-locat-init" "Error: Locate %s" + (replace-regexp-in-string "\n" "" event)))))))))) + +(defun helm-locate-default-fuzzy-sort-fn (candidates) + "Default sort function for files in fuzzy matching. +Sort is done on basename of CANDIDATES." + (helm-fuzzy-matching-default-sort-fn-1 candidates nil t)) + +(defclass helm-locate-override-inheritor (helm-type-file) ()) + +(defclass helm-locate-source (helm-source-async helm-locate-override-inheritor) + ((init :initform 'helm-locate-initial-setup) + (candidates-process :initform 'helm-locate-init) + (requires-pattern :initform 3) + (history :initform 'helm-file-name-history) + (persistent-action :initform 'helm-ff-kill-or-find-buffer-fname) + (candidate-number-limit :initform 9999) + (redisplay :initform (progn helm-locate-fuzzy-sort-fn)))) + +;; Override helm-type-file class keymap. +(cl-defmethod helm--setup-source :after ((source helm-locate-override-inheritor)) + (setf (slot-value source 'keymap) helm-locate-map) + (setf (slot-value source 'group) 'helm-locate)) + +(defvar helm-source-locate + (helm-make-source "Locate" 'helm-locate-source + :pattern-transformer 'helm-locate-pattern-transformer + ;; :match-part is only used here to tell helm which part + ;; of candidate to highlight. + :match-part (lambda (candidate) + (if (or (string-match-p " -b\\'" helm-pattern) + (and helm-locate-fuzzy-match + (not (string-match "\\s-" helm-pattern)))) + (helm-basename candidate) + candidate)))) + +(defun helm-locate-pattern-transformer (pattern) + (if helm-locate-fuzzy-match + ;; When fuzzy is enabled helm add "-b" option on startup. + (cond ((string-match-p " " pattern) + (when (string-match "\\`locate -b" helm-locate-command) + (setq helm-locate-command + (replace-match "locate" t t helm-locate-command))) + pattern) + (t + (unless (string-match-p "\\`locate -b" helm-locate-command) + (setq helm-locate-command + (replace-regexp-in-string + "\\`locate" "locate -b" helm-locate-command))) + (helm--mapconcat-pattern pattern))) + pattern)) + +(defun helm-locate-find-dbs-in-projects (&optional update) + (let* ((pfn (lambda (candidate directory) + (unless (= (shell-command + (funcall helm-locate-create-db-function + candidate + directory)) + 0) + (error "Failed to create locatedb file `%s'" candidate))))) + (cl-loop for p in helm-locate-project-list + for db = (expand-file-name + helm-ff-locate-db-filename + (file-name-as-directory p)) + if (and (null update) (file-exists-p db)) + collect db + else do (funcall pfn db p) + and collect db))) + +;;; Directory completion for hff. +;; +(defclass helm-locate-subdirs-source (helm-source-in-buffer) + ((basedir :initarg :basedir + :initform nil + :custom string) + (subdir :initarg :subdir + :initform nil + :custom 'string) + (data :initform #'helm-locate-init-subdirs) + (group :initform 'helm-locate))) + +(defun helm-locate-init-subdirs () + (with-temp-buffer + (call-process-shell-command + (if (string-match-p "\\`fd" helm-locate-recursive-dirs-command) + (format helm-locate-recursive-dirs-command + ;; fd pass path at end. + (helm-get-attr 'subdir) (helm-get-attr 'basedir)) + (format helm-locate-recursive-dirs-command + (if (string-match-p "\\`es" helm-locate-recursive-dirs-command) + ;; Fix W32 paths. + (replace-regexp-in-string + "/" "\\\\\\\\" (helm-get-attr 'basedir)) + (helm-get-attr 'basedir)) + (helm-get-attr 'subdir))) + nil t nil) + (buffer-string))) + +;;;###autoload +(defun helm-projects-find-files (update) + "Find files with locate in `helm-locate-project-list'. +With a prefix arg refresh the database in each project." + (interactive "P") + (helm-locate-set-command) + (cl-assert (and (string-match-p "\\`locate" helm-locate-command) + (executable-find "updatedb")) + nil "Unsupported locate version") + (let ((dbs (helm-locate-find-dbs-in-projects update))) + (if dbs + (helm-locate-with-db dbs) + (user-error "No projects found, please setup `helm-locate-project-list'")))) + +;;;###autoload +(defun helm-locate (arg) + "Preconfigured `helm' for Locate. +Note: you can add locate options after entering pattern. +See \\='man locate' for valid options and also `helm-locate-command'. + +You can specify a local database with prefix argument ARG. +With two prefix arg, refresh the current local db or create it if +it doesn't exists. + +To create a user specific db, use +\"updatedb -l 0 -o db_path -U directory\". +Where db_path is a filename matched by +`helm-locate-db-file-regexp'." + (interactive "P") + (helm-set-local-variable 'helm-async-outer-limit-hook + (list (lambda () + (when (and helm-locate-fuzzy-match + (not (string-match-p + "\\s-" helm-pattern))) + (helm-redisplay-buffer))))) + (setq helm-ff-default-directory default-directory) + (helm-locate-1 arg nil nil (thing-at-point 'filename))) + +(provide 'helm-locate) + +;;; helm-locate.el ends here diff --git a/code/elpa/helm-20240320.541/helm-man.el b/code/elpa/helm-20240320.541/helm-man.el new file mode 100644 index 0000000..3217051 --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-man.el @@ -0,0 +1,114 @@ +;;; helm-man.el --- Man and woman UI -*- lexical-binding: t -*- + +;; Copyright (C) 2012 ~ 2023 Thierry Volpiatto + +;; 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 'helm) +(require 'helm-help) + +(defvar woman-topic-all-completions) +(defvar woman-manpath) +(defvar woman-path) +(defvar woman-expanded-directory-path) +(declare-function woman-file-name "woman.el" (topic &optional re-cache)) +(declare-function woman-file-name-all-completions "woman.el" (topic)) +(declare-function Man-getpage-in-background "man.el" (topic)) +(declare-function woman-expand-directory-path "woman.el" (path-dirs path-regexps)) +(declare-function woman-topic-all-completions "woman.el" (path)) +(declare-function helm-generic-sort-fn "helm-utils.el" (S1 S2)) +(declare-function helm-comp-read "helm-mode") + +(defgroup helm-man nil + "Man and Woman applications for Helm." + :group 'helm) + +(defcustom helm-man-or-woman-function 'Man-getpage-in-background + "Default command to display a man page." + :group 'helm-man + :type '(radio :tag "Preferred command to display a man page" + (const :tag "Man" Man-getpage-in-background) + (const :tag "Woman" woman))) + +(defcustom helm-man-format-switches (cl-case system-type + ((darwin macos) "%s") + (t "-l %s")) + "Arguments to pass to the `manual-entry' function. +Arguments are passed to `manual-entry' with `format.'" + :group 'helm-man + :type 'string) + +;; Internal +(defvar helm-man--pages nil + "All man pages on system. +Will be calculated the first time you invoke Helm with this +source.") + +(defun helm-man-default-action (candidate) + "Default action for jumping to a woman or man page from Helm." + (let ((wfiles (mapcar #'car (woman-file-name-all-completions candidate)))) + (condition-case nil + (let ((file (if (cdr wfiles) + (helm-comp-read "ManFile: " wfiles :must-match t) + (car wfiles)))) + (if (eq helm-man-or-woman-function 'Man-getpage-in-background) + (manual-entry (format helm-man-format-switches file)) + (condition-case nil + (woman-find-file file) + ;; If woman is unable to format correctly + ;; try Man instead. + (error (kill-buffer) + (manual-entry (format helm-man-format-switches file)))))) + ;; If even Man failed with file as argument, try again with Man + ;; but using Topic candidate instead of the file calculated by + ;; woman. + (error (kill-buffer) + (Man-getpage-in-background candidate))))) + +(defun helm-man--init () + (require 'woman) + (require 'helm-utils) + (unless helm-man--pages + (setq woman-expanded-directory-path + (woman-expand-directory-path woman-manpath woman-path)) + (setq woman-topic-all-completions + (woman-topic-all-completions woman-expanded-directory-path)) + (setq helm-man--pages (mapcar 'car woman-topic-all-completions))) + (helm-init-candidates-in-buffer 'global helm-man--pages)) + +(defvar helm-source-man-pages + (helm-build-in-buffer-source "Manual Pages" + :init #'helm-man--init + :persistent-action #'ignore + :filtered-candidate-transformer + (lambda (candidates _source) + (sort candidates #'helm-generic-sort-fn)) + :action '(("Display Man page" . helm-man-default-action)) + :group 'helm-man)) + +;;;###autoload +(defun helm-man-woman (arg) + "Preconfigured `helm' for Man and Woman pages. +With a prefix arg reinitialize the cache." + (interactive "P") + (when arg (setq helm-man--pages nil)) + (helm :sources 'helm-source-man-pages + :buffer "*helm man woman*")) + +(provide 'helm-man) + +;;; helm-man.el ends here diff --git a/code/elpa/helm-20240320.541/helm-misc.el b/code/elpa/helm-20240320.541/helm-misc.el new file mode 100644 index 0000000..104c9e4 --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-misc.el @@ -0,0 +1,393 @@ +;;; helm-misc.el --- Various functions for helm -*- lexical-binding: t -*- + +;; Copyright (C) 2012 ~ 2023 Thierry Volpiatto + +;; 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 'helm) +(require 'helm-help) +(require 'helm-types) + +(declare-function display-time-world-display "time.el") +(defvar display-time-world-list) +(declare-function LaTeX-math-mode "ext:latex.el") +(declare-function jabber-chat-with "ext:jabber.el") +(declare-function jabber-read-account "ext:jabber.el") +(declare-function helm-comp-read "helm-mode") + + +(defgroup helm-misc nil + "Various Applications and libraries for Helm." + :group 'helm) + +(defcustom helm-time-zone-home-location "Paris" + "The time zone of your home." + :group 'helm-misc + :type 'string) + +(defcustom helm-timezone-actions + '(("Set timezone env (TZ)" . (lambda (candidate) + (setenv "TZ" candidate)))) + "Actions for helm-timezone." + :group 'helm-misc + :type '(alist :key-type string :value-type function)) + +(defface helm-time-zone-current + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "green")) + "Face used to colorize current time in `helm-world-time'." + :group 'helm-misc) + +(defface helm-time-zone-home + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "red")) + "Face used to colorize home time in `helm-world-time'." + :group 'helm-misc) + + + +;;; Latex completion +;; +;; Test +;; (setq LaTeX-math-menu '("Math" +;; ["foo" val0 t] +;; ("bar" +;; ["baz" val1 t]) +;; ("aze" +;; ["zer" val2 t]) +;; ("AMS" +;; ("rec" +;; ["fer" val3 t]) +;; ("rty" +;; ["der" val4 t])) +;; ("ABC" +;; ("xcv" +;; ["sdf" val5 t]) +;; ("dfg" +;; ["fgh" val6 t])))) +;; (helm-latex-math-candidates) +;; => +;; (("foo" . val0) +;; ("baz" . val1) +;; ("zer" . val2) +;; ("fer" . val3) +;; ("der" . val4) +;; ("sdf" . val5) +;; ("fgh" . val6)) + +(defvar LaTeX-math-menu) +(defun helm-latex-math-candidates () + (cl-labels ((helm-latex--math-collect (L) + (cond ((vectorp L) + (list (cons (aref L 0) (aref L 1)))) + ((listp L) + (cl-loop for a in L nconc + (helm-latex--math-collect a)))))) + (helm-latex--math-collect LaTeX-math-menu))) + +(defvar helm-source-latex-math + (helm-build-sync-source "Latex Math Menu" + :init (lambda () + (with-helm-current-buffer + (LaTeX-math-mode 1))) + :candidate-number-limit 9999 + :candidates 'helm-latex-math-candidates + :action (lambda (candidate) + (call-interactively candidate)))) + + +;;; Jabber Contacts (jabber.el) +(defun helm-jabber-online-contacts () + "List online Jabber contacts." + (with-no-warnings + (cl-loop for item in (jabber-concat-rosters) + when (get item 'connected) + collect + (if (get item 'name) + (cons (get item 'name) item) + (cons (symbol-name item) item))))) + +(defvar helm-source-jabber-contacts + (helm-build-sync-source "Jabber Contacts" + :init (lambda () (require 'jabber)) + :candidates (lambda () (mapcar 'car (helm-jabber-online-contacts))) + :action (lambda (x) + (jabber-chat-with + (jabber-read-account) + (symbol-name + (cdr (assoc x (helm-jabber-online-contacts)))))))) + +;;; World time +;; +(defvar zoneinfo-style-world-list) +(defvar legacy-style-world-list) + +(defun helm-time-zone-transformer (candidates _source) + (cl-loop for i in candidates + for (z . p) in display-time-world-list + collect + (cons + (cond ((string-match (format-time-string "%H:%M" (current-time)) i) + (propertize i 'face 'helm-time-zone-current)) + ((string-match helm-time-zone-home-location i) + (propertize i 'face 'helm-time-zone-home)) + (t i)) + z))) + +(defvar helm-source-time-world + (helm-build-in-buffer-source "Time World List" + :init (lambda () + (require 'time) + (unless (and display-time-world-list + (listp display-time-world-list)) + ;; adapted from `time--display-world-list' from + ;; emacs-27 for compatibility as + ;; `display-time-world-list' is set by default to t. + (setq display-time-world-list + ;; Determine if zoneinfo style timezones are + ;; supported by testing that America/New York and + ;; Europe/London return different timezones. + (let ((nyt (format-time-string "%z" nil "America/New_York")) + (gmt (format-time-string "%z" nil "Europe/London"))) + (if (string-equal nyt gmt) + legacy-style-world-list + zoneinfo-style-world-list))))) + :data (lambda () + (with-temp-buffer + (display-time-world-display display-time-world-list) + (buffer-string))) + :action 'helm-timezone-actions + :filtered-candidate-transformer 'helm-time-zone-transformer)) + +;;; Commands +;; +(defun helm-call-interactively (cmd-or-name) + "Execute CMD-OR-NAME as Emacs command. +It is added to `extended-command-history'. +`helm-current-prefix-arg' is used as the command's prefix argument." + (setq extended-command-history + (cons (helm-stringify cmd-or-name) + (delete (helm-stringify cmd-or-name) extended-command-history))) + (let ((current-prefix-arg helm-current-prefix-arg) + (cmd (helm-symbolify cmd-or-name))) + (if (stringp (symbol-function cmd)) + (execute-kbd-macro (symbol-function cmd)) + (setq this-command cmd) + (call-interactively cmd)))) + +;;; Minibuffer History +;; +;; +(defvar helm-minibuffer-history-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map helm-map) + (define-key map [remap helm-minibuffer-history] 'undefined) + map)) + +(defcustom helm-minibuffer-history-must-match t + "Allow inserting non matching elements when nil or \\='confirm." + :group 'helm-misc + :type '(choice + (const :tag "Must match" t) + (const :tag "Confirm" confirm) + (const :tag "Always allow" nil))) + +(defcustom helm-minibuffer-history-key "C-r" + "The key `helm-minibuffer-history' is bound to in minibuffer local maps." + :type '(choice (string :tag "Key") (const :tag "no binding")) + :group 'helm-mode) + +(defconst helm-minibuffer-history-old-key + (cl-loop for map in '(minibuffer-local-completion-map + minibuffer-local-filename-completion-map + minibuffer-local-filename-must-match-map ; Emacs 23.1.+ + minibuffer-local-isearch-map + minibuffer-local-map + minibuffer-local-must-match-filename-map ; Older Emacsen + minibuffer-local-must-match-map + minibuffer-local-ns-map) + when (and (boundp map) (symbol-value map)) + collect (cons map (lookup-key (symbol-value map) "\C-r")))) + +;;;###autoload +(define-minor-mode helm-minibuffer-history-mode + "Bind `helm-minibuffer-history-key' in al minibuffer maps. +This mode is enabled by `helm-mode', so there is no need to enable it directly." + :group 'helm-misc + :global t + (if helm-minibuffer-history-mode + (let ((key helm-minibuffer-history-key)) + (dolist (map '(minibuffer-local-completion-map + minibuffer-local-filename-completion-map + minibuffer-local-filename-must-match-map ; Emacs 23.1.+ + minibuffer-local-isearch-map + minibuffer-local-map + minibuffer-local-must-match-filename-map ; Older Emacsen + minibuffer-local-must-match-map + minibuffer-local-ns-map)) + (let ((vmap (and (boundp map) (symbol-value map)))) + (when (keymapp vmap) + (let ((val (and (boundp 'helm-minibuffer-history-key) + (symbol-value 'helm-minibuffer-history-key)))) + (when val + (define-key vmap + (if (stringp val) (read-kbd-macro val) val) + nil))) + (when key + (define-key (symbol-value map) + (if (stringp key) (read-kbd-macro key) key) + 'helm-minibuffer-history)))))) + (dolist (map '(minibuffer-local-completion-map + minibuffer-local-filename-completion-map + minibuffer-local-filename-must-match-map + minibuffer-local-isearch-map + minibuffer-local-map + minibuffer-local-must-match-filename-map + minibuffer-local-must-match-map + minibuffer-local-ns-map)) + (let ((vmap (and (boundp map) (symbol-value map)))) + (when (keymapp vmap) + (let ((val (and (boundp 'helm-minibuffer-history-key) + (symbol-value 'helm-minibuffer-history-key)))) + (when val + (define-key vmap + (if (stringp val) (read-kbd-macro val) val) + (assoc-default map helm-minibuffer-history-old-key))))))))) + + +;;; Helm ratpoison UI +;; +;; +(defvar helm-source-ratpoison-commands + (helm-build-in-buffer-source "Ratpoison Commands" + :init 'helm-ratpoison-commands-init + :action (helm-make-actions + "Execute the command" 'helm-ratpoison-commands-execute) + :display-to-real 'helm-ratpoison-commands-display-to-real + :candidate-number-limit 999999)) + +(defun helm-ratpoison-commands-init () + (unless (helm-candidate-buffer) + (with-current-buffer (helm-candidate-buffer 'global) + ;; with ratpoison prefix key + (save-excursion + (call-process "ratpoison" nil (current-buffer) nil "-c" "help")) + (while (re-search-forward "^\\([^ ]+\\) \\(.+\\)$" nil t) + (replace-match " \\1: \\2")) + (goto-char (point-max)) + ;; direct binding + (save-excursion + (call-process "ratpoison" nil (current-buffer) nil "-c" "help top")) + (while (re-search-forward "^\\([^ ]+\\) \\(.+\\)$" nil t) + (replace-match "\\1: \\2"))))) + +(defun helm-ratpoison-commands-display-to-real (display) + (and (string-match ": " display) + (substring display (match-end 0)))) + +(defun helm-ratpoison-commands-execute (candidate) + (call-process "ratpoison" nil nil nil "-ic" candidate)) + +;;; Helm stumpwm UI +;; +;; +(defvar helm-source-stumpwm-commands + (helm-build-in-buffer-source "Stumpwm Commands" + :init 'helm-stumpwm-commands-init + :action (helm-make-actions + "Execute the command" 'helm-stumpwm-commands-execute) + :candidate-number-limit 999999)) + +(defun helm-stumpwm-commands-init () + (with-current-buffer (helm-candidate-buffer 'global) + (save-excursion + (call-process "stumpish" nil (current-buffer) nil "commands")) + (while (re-search-forward "[ ]*\\([^ ]+\\)[ ]*\n?" nil t) + (replace-match "\n\\1\n")) + (delete-blank-lines) + (sort-lines nil (point-min) (point-max)) + (goto-char (point-max)))) + +(defun helm-stumpwm-commands-execute (candidate) + (call-process "stumpish" nil nil nil candidate)) + +;;;###autoload +(defun helm-world-time () + "Preconfigured `helm' to show world time. +Default action change TZ environment variable locally to emacs." + (interactive) + (helm-other-buffer 'helm-source-time-world "*helm world time*")) + +;;;###autoload +(defun helm-insert-latex-math () + "Preconfigured helm for latex math symbols completion." + (interactive) + (helm-other-buffer 'helm-source-latex-math "*helm latex*")) + +;;;###autoload +(defun helm-ratpoison-commands () + "Preconfigured `helm' to execute ratpoison commands." + (interactive) + (helm-other-buffer 'helm-source-ratpoison-commands + "*helm ratpoison commands*")) + +;;;###autoload +(defun helm-stumpwm-commands() + "Preconfigured helm for stumpwm commands." + (interactive) + (helm-other-buffer 'helm-source-stumpwm-commands + "*helm stumpwm commands*")) + +;;;###autoload +(defun helm-minibuffer-history () + "Preconfigured `helm' for `minibuffer-history'." + (interactive) + (cl-assert (minibuffer-window-active-p (selected-window)) nil + "Error: Attempt to use minibuffer history outside a minibuffer") + (let* ((enable-recursive-minibuffers t) + (query-replace-p (or (eq last-command 'query-replace) + (eq last-command 'query-replace-regexp))) + (elm (helm-comp-read "Next element matching (regexp): " + (cl-loop for i in + (symbol-value minibuffer-history-variable) + unless (equal "" i) collect i into history + finally return + (if (consp (car history)) + (mapcar 'prin1-to-string history) + history)) + :header-name + (lambda (name) + (format "%s (%s)" name minibuffer-history-variable)) + :buffer "*helm minibuffer-history*" + :must-match helm-minibuffer-history-must-match + :multiline t + :keymap helm-minibuffer-history-map + :allow-nest t))) + ;; Fix Bug#1667 with emacs-25+ `query-replace-from-to-separator'. + (when (and (boundp 'query-replace-from-to-separator) query-replace-p) + (let ((pos (string-match "\0" elm))) + (and pos + (add-text-properties + pos (1+ pos) + `(display ,query-replace-from-to-separator separator t) + elm)))) + (delete-minibuffer-contents) + (insert elm))) + + +(provide 'helm-misc) + +;;; helm-misc.el ends here diff --git a/code/elpa/helm-20240320.541/helm-mode.el b/code/elpa/helm-20240320.541/helm-mode.el new file mode 100644 index 0000000..2d8eb94 --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-mode.el @@ -0,0 +1,2804 @@ +;;; helm-mode.el --- Enable helm completion everywhere. -*- lexical-binding: t -*- + +;; Copyright (C) 2012 ~ 2023 Thierry Volpiatto + +;; 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 'helm) +(require 'helm-lib) +(require 'helm-files) +(require 'helm-misc) + +(defvar crm-separator) +(defvar ido-everywhere) +(defvar completion-flex-nospace) +(defvar helm-completion--sorting-done) +(defvar helm-mode) +(defvar password-cache) +(defvar package--builtins) +(defvar helm--locate-library-doc-cache) +(defvar helm--locate-library-cache) + +;; No warnings in Emacs built --without-x +(declare-function x-file-dialog "xfns.c") + +(declare-function ido-mode "ido.el") +(declare-function helm-apropos-init "helm-elisp") +(declare-function helm-lisp-completion-persistent-action "helm-elisp") +(declare-function helm-lisp-completion-persistent-help "helm-elisp") +(declare-function help--symbol-class "help-fns.el") +(declare-function helm-get-first-line-documentation "helm-elisp") +(declare-function package-desc-summary "package") +(declare-function package-built-in-p "package") +(declare-function package-desc-status "package") +(declare-function package-get-descriptor "package") +(declare-function print-coding-system-briefly "mul-diag.el") +(declare-function color-rgb-to-hex "color.el") +(declare-function find-library-name "find-func.el") + +(defgroup helm-mode nil + "Enable helm completion." + :group 'helm) + +(defcustom helm-completing-read-handlers-alist + '((find-tag . helm-completing-read-default-find-tag) + (ggtags-find-tag-dwim . helm-completing-read-default-find-tag) + (tmm-menubar . nil) + (find-file . nil) + (execute-extended-command . nil) + (dired-do-rename . helm-read-file-name-handler-1) + (dired-do-copy . helm-read-file-name-handler-1) + (dired-do-symlink . helm-read-file-name-handler-1) + (dired-do-relsymlink . helm-read-file-name-handler-1) + (dired-do-hardlink . helm-read-file-name-handler-1) + (basic-save-buffer . helm-read-file-name-handler-1) + (write-file . (default helm-read-file-name-handler-1)) + (write-region . (default helm-read-file-name-handler-1)) + (all-the-icons-insert . helm-mode-all-the-icons-handler)) + "Completing read functions for specific Emacs commands. + +By default `helm-mode' use `helm-completing-read-default-handler' to +provide helm completion in each `completing-read' or `read-file-name' +found, but other functions can be specified here for specific +commands. This also allows disabling helm completion for some commands +when needed. + +Each entry is a cons cell like (EMACS_COMMAND . COMPLETING-READ_HANDLER) +where key and value are symbols. +However if a command is using in its definition both a `completing-read' AND +a `read-file-name' we may want to specify a handler for both of them, +this can be done by specifying value as a list of two symbols instead of +a single symbol where the 1st element of the list specify the handler for the +`completing-read' and the second the handler for the `read-file-name'. +Special symbol \\='default' means use the default helm handler for either +`completing-read' or `read-file-name'. +e.g. (write-region . (default helm-read-file-name-handler-1)) +means helm will use `helm-completing-read-default-handler' when +`write-region' calls `completing-read' and +`helm-read-file-name-handler-1' when it calls `read-file-name'. + +Each key is an Emacs command that use originaly `completing-read' +or/and `read-file-name'. + +Each value maybe a helm function that takes same arguments as +`completing-read' plus NAME and BUFFER, where NAME is the name of the new +helm source and BUFFER the name of the buffer we will use, but it can +be also a function not using helm, in this case the function should +take the same args as `completing-read' and not be prefixed by \"helm-\". + +`helm' will use the name of the command calling `completing-read' as +NAME and BUFFER will be computed as well with NAME but prefixed with +\"*helm-mode-\". + +This function prefix name must start by \"helm-\" when it uses helm, +otherwise `helm' assumes the function is not a helm function and +expects the same args as `completing-read', this allows you to define a +handler not using helm completion. + +Example: + + (defun foo/test () + (interactive) + (message \"%S\" (completing-read \"test: \" \\='(a b c d e)))) + + (defun helm-foo/test-completing-read-handler (prompt collection + predicate require-match + initial-input hist def + inherit-input-method + name buffer) + (helm-comp-read prompt collection :marked-candidates t + :name name + :buffer buffer)) + + (add-to-list \\='helm-completing-read-handlers-alist + \\='(foo/test . helm-foo/test-completing-read-handler)) + + +We want here to make the regular `completing-read' in `foo/test' +return a list of candidate(s) instead of a single candidate. + +Note that this function will be reused for ALL the `completing-read' +of this command, so it should handle all cases. E.g., +if first `completing-read' completes against symbols and +second `completing-read' should handle only buffer, +your specialized function should handle both. + +If the value of an entry is nil completion will fall back to +Emacs vanilla behaviour. +Example: + +If you want to disable helm completion for `describe-function', use: + + (describe-function . nil) + +Ido is also supported, you can use `ido-completing-read' and +`ido-read-file-name' as value of an entry or just \\='ido. +Example: +Enable ido completion for `find-file': + + (find-file . ido) + +same as + + (find-file . ido-read-file-name) + +Note that you don't need to enable `ido-mode' for this to work, see +`helm-mode' documentation." + :group 'helm-mode + :type '(alist + :key-type symbol + :value-type (choice + function + (list :tag "Specify the completing-read and read-file-name handlers" + (choice + (const :tag "Use default helm completing-read handler" default) + (function :tag "Use this helm completing-read function")) + (function :tag "Use this helm read file name function")) + (other :tag "Disabled" nil)))) + +(defcustom helm-comp-read-case-fold-search helm-case-fold-search + "Default Local setting of `helm-case-fold-search' for `helm-comp-read'. +See `helm-case-fold-search' for more info." + :group 'helm-mode + :type 'symbol) + +(defcustom helm-mode-handle-completion-in-region t + "Whether to replace or not `completion-in-region-function'. +This enables support for `completing-read-multiple' and `completion-at-point' +when non--nil." + :group 'helm-mode + :type 'boolean) + +(defcustom helm-mode-no-completion-in-region-in-modes nil + "A list of modes that do not want helm for `completion-in-region'." + :group 'helm-mode + :type 'boolean) + +(defcustom helm-mode-reverse-history t + "Display history source after current source when non nil. + +Apply only in `helm-mode' handled commands." + :group 'helm-mode + :type 'boolean) + +(defcustom helm-completion-in-region-default-sort-fn + 'helm-completion-in-region-sort-fn + "The default sort function to sort candidates in completion-in-region. + +When nil no sorting is done. +The function is a `filtered-candidate-transformer' function which takes +two args CANDIDATES and SOURCE. +The function must use the flag `helm-completion--sorting-done' and +return CANDIDATES unchanged when the flag is nil. +See default function `helm-completion-in-region-sort-fn' as example. +It will be used only when `helm-completion-style' is either Emacs or +helm, otherwise when helm-fuzzy style is used, the fuzzy sort function +will be used." + :group 'helm-mode + :type 'function) + +(defcustom helm-mode-ignore-diacritics nil + "Ignore diacritics in completing-read." + :group 'helm-mode + :type 'boolean) + +(defcustom helm-completion-mark-suffix t + "Push mark at end of suffix when non nil." + :group 'helm-mode + :type 'boolean) + +(defcustom helm-read-file-name-use-default-arg-behavior nil + "Use emacs vanilla `read-file-name' behavior for default arg. + +The behavior of default arg in `read-file-name' and friends is using +the default arg as default value when initial input is not modified, +even if this initial input is a valid value i.e. an existing file. +We expect generally a default arg to be used if nothing is specified +in the prompt or if what is specified is invalid, but the emacs behavior +here is really weird, so we use this variable to disable this +behavior, letting user specify default if needed with `M-n'. +However we keep the emacs default for `read-file-name' and derived +fns, this variable affecting only `helm-read-file-name'." + :type 'boolean + :group 'helm-mode) + +(defvar helm-mode-minibuffer-setup-hook-black-list '(minibuffer-completion-help) + "Incompatible `minibuffer-setup-hook' functions go here. +A list of symbols. `helm-mode' is rejecting all lambda's, byte-code fns +and all functions belonging in this list from `minibuffer-setup-hook'. +This is mainly needed to prevent \"*Completions*\" buffers to popup.") + +(defvar helm-comp-read-require-match-overrides '((describe-function . t) + (describe-command . t) + (describe-minor-mode . t) + (load-theme . t) + (describe-theme . t)) + "Allow overriding REQUIRE-MATCH completing-read arg for a specific function.") + +(defcustom helm-completions-detailed (and (boundp 'completions-detailed) + completions-detailed) + "Allow providing `completions-detailed' for Emacs < 28. +Not guaranteed to work with Emacs < 27." + :type 'boolean + :group 'helm-mode) + +(defvar helm-mode-find-file-target-alist + '(("switch-to-buffer" . helm-buffers-quit-and-find-file-fn)) + "An alist composed of (SOURCE_NAME . FUNCTION) elements. +Where FUNCTION is a function suitable for `helm-quit-and-find-file'.") + +(defface helm-mode-prefix + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + (:background "red" :foreground "black"))) + "Face used for prefix completion." + :group 'helm-mode) + +(defface helm-completion-invalid + '((t :inherit font-lock-property-name-face)) + "Face used to highlight invalid functions." + :group 'helm-mode) + +(defface helm-completions-detailed + '((t :inherit font-lock-warning-face)) + "Face used to highlight completion-detailed informations." + :group 'helm-mode) + +(defface helm-completions-annotations + '((t :inherit font-lock-property-name-face)) + "Face used to highlight annotations in completion." + :group 'helm-mode) + +(defvar helm-comp-read-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map helm-map) + (define-key map (kbd "") 'helm-cr-empty-string) + (define-key map (kbd "M-RET") 'helm-cr-empty-string) + map) + "Keymap for `helm-comp-read'.") + +(defvar helm-comp-in-region-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map helm-comp-read-map) + map) + "Keymap for completion-at-point and friends.") + +(defun helm-mode-delete-char-backward-1 () + (interactive) + (condition-case err + (call-interactively 'delete-backward-char) + (text-read-only + (if (with-selected-window (minibuffer-window) + (not (string= (minibuffer-contents) ""))) + (message "Trying to delete prefix completion, next hit will quit") + (user-error "%s" (car err)))))) +(put 'helm-mode-delete-char-backward-1 'helm-only t) + +(defun helm-mode-delete-char-backward-2 () + (interactive) + (condition-case _err + (call-interactively 'delete-backward-char) + (text-read-only + (unless (with-selected-window (minibuffer-window) + (string= (minibuffer-contents) "")) + (with-helm-current-buffer + (run-with-timer 0.1 nil (lambda () + (call-interactively 'delete-backward-char)))) + (helm-keyboard-quit))))) +(put 'helm-mode-delete-char-backward-2 'helm-only t) + +(helm-multi-key-defun helm-mode-delete-char-backward-maybe + "Delete char backward when text is not the prefix helm is completing against. +First call warns user about deleting prefix completion. +Second call deletes backward char in current-buffer and quits helm completion, +letting the user start a new completion with a new prefix." + '(helm-mode-delete-char-backward-1 helm-mode-delete-char-backward-2) 1) + +(defcustom helm-completion-style 'helm + "Style of completion to use in `completion-in-region'. + +This affects only `completion-at-point' and friends, and +the `completing-read' using the default handler +i.e. `helm-completing-read-default-handler'. + +NB: This has nothing to do with `completion-styles', it is independent from +helm, but when using \\='emacs as helm-completion-style helm +will use the `completion-styles' for its completions. +Up to the user to configure `completion-styles'. + +There are three possible values to use: + +- helm, use multi match regular helm completion. + +- helm-fuzzy, use fuzzy matching. Note that as usual when + entering a space helm switches to multi matching mode. + +- emacs, use regular Emacs completion according to + `completion-styles'. Note that even in this style, helm allows using + multi match. Emacs-27 provides a style called `flex' that can be used + aside `helm' style (see `completion-styles-alist'). When `flex' style + is not available (Emacs<27) helm provides `helm-flex' style which is + similar to `flex' and helm fuzzy matching. + +For a better experience with emacs style, if you don't know what to use, set +`completion-styles' to \\='(flex) if you are using emacs-27 or to +\\='(helm-flex) if you are using emacs-26 and keep \\='emacs as default +value for `helm-completion-style'. Advanced users can also have a +look to `completion-category-overrides' to set styles according to category. +You can as well use `helm-completion-styles-alist' to override +`helm-completion-style' in specific modes. + +Of course when using `helm' or `helm-fuzzy' as `helm-completion-style' +emacs `completion-styles' have no effect. + +Please use custom interface or `customize-set-variable' to set this, +NOT `setq'." + :group 'helm-mode + :type '(choice (const :tag "Emacs" emacs) + (const :tag "Helm" helm) + (const :tag "Helm-fuzzy" helm-fuzzy)) + :set (lambda (var val) + (set var val) + (if (memq val '(helm helm-fuzzy)) + (define-key helm-comp-in-region-map (kbd "DEL") 'helm-mode-delete-char-backward-maybe) + (define-key helm-comp-in-region-map (kbd "DEL") 'delete-backward-char)))) + +(defconst helm-completion--all-styles + (let ((flex (if (assq 'flex completion-styles-alist) + 'flex 'helm-flex))) + (helm-fast-remove-dups + (append (list 'helm flex) + (mapcar 'car completion-styles-alist))))) + +(defconst helm-completion--styles-type + `(repeat :tag "with other completion styles" + (choice ,@(mapcar (lambda (x) (list 'const x)) + helm-completion--all-styles)))) + +(defcustom helm-completion-styles-alist '((gud-mode . helm) + ;; See https://github.com/djcb/mu/issues/2181. + (mu4e-compose-mode . emacs) + (wfnames-mode . (emacs helm flex))) + "Allow configuring `helm-completion-style' per mode or command. + +NOTE: Use a mode for a completion that will be used in a buffer +i.e. completion-in-region, whereas you have to specify instead a +command to affect the completing-read trigerred by this +command. Commands specified in `helm-completing-read-handlers-alist' take +precedence on commands you put here. + +Each entry is a cons cell like (mode . style) where style must be +a suitable value for `helm-completion-style'. When specifying +emacs as style for a mode or a command, `completion-styles' can +be specified by using a cons cell specifying completion-styles to +use with helm emacs style, e.g. (foo-mode . (emacs helm flex)) +will set `completion-styles' to \\='(helm flex) for foo-mode." + :group 'helm-mode + :type + `(alist :key-type (symbol :tag "Major Mode") + :value-type + (choice :tag "Use helm style or completion styles" + (radio :tag "Helm Style" + (const helm) + (const helm-fuzzy) + (const emacs)) + (cons :tag "Completion Styles" + (const :tag "Using Helm `emacs' style" emacs) + ,helm-completion--styles-type)))) + +;;; helm-comp-read +;; +;; +(defvar helm-comp-read-use-marked nil + "[INTERNAL] When non nil `helm-comp-read' will return marked candidates. + +Use this ONLY in `let', NOT globally, this allows third party packages +to use a list as return value when `helm-mode' is enabled, e.g. + + (let ((helm-comp-read-use-marked t)) + (completing-read \"test: \" \\='(a b c d e f g))) + +") + +(defun helm-cr-empty-string () + "Return empty string." + (interactive) + (with-helm-alive-p + (helm-exit-and-execute-action + (lambda (_candidate) + (identity ""))))) +(put 'helm-cr-empty-string 'helm-only t) + +(defun helm-mode--keyboard-quit () + ;; Use this instead of `keyboard-quit' + ;; to avoid deactivating mark in current-buffer. + (let ((debug-on-quit nil)) + (signal 'quit nil))) + +(cl-defun helm-comp-read-get-candidates (collection &optional + test sort-fn alistp + (input helm-pattern)) + "Convert COLLECTION to list removing elements that don't match TEST. +See `helm-comp-read' about supported COLLECTION arguments. + +SORT-FN is a predicate to sort COLLECTION. + +ALISTP when non--nil will not use `all-completions' to collect +candidates because it doesn't handle alists correctly for helm. +i.e In `all-completions' the car of each pair is used as value. +In helm we want to use the cdr instead like (display . real), +so we return the alist as it is with no transformation by +`all-completions'. + +e.g + +\(setq A \\='((a . 1) (b . 2) (c . 3))) +==>((a . 1) (b . 2) (c . 3)) +\(helm-comp-read \"test: \" A :alistp nil + :exec-when-only-one t + :initial-input \"a\") +==>\"a\" Which is not what we expect. + +\(helm-comp-read \"test: \" A :alistp t + :exec-when-only-one t + :initial-input \"1\") +==>\"1\" + +See docstring of `all-completions' for more info. + +INPUT is the string you want to complete against, defaulting to +`helm-pattern' which is the value of what you enter in minibuffer. +Note that when using a function as COLLECTION this value will be +available with the input argument of the function only when using a +sync source from `helm-comp-read', i.e. not using +`:candidates-in-buffer', otherwise the function is called only once +with an empty string as value for `helm-pattern' because +`helm-pattern' is not yet computed, which is what we want otherwise +data would not be fully collected at init time. + +If COLLECTION is an `obarray', a TEST should be needed. See `obarray'." + ;; Ensure COLLECTION is computed from `helm-current-buffer' + ;; because some functions used as COLLECTION work + ;; only in the context of current-buffer (Bug#1030) . + (with-helm-current-buffer + (let ((cands + (cond ((and alistp (hash-table-p collection)) + (cl-loop for k being the hash-keys of collection + using (hash-values v) + collect (cons k v))) + ((vectorp collection) + (all-completions input collection test)) + ((and (symbolp collection) (boundp collection) + ;; Bug#324 history is let-bounded and given + ;; quoted as hist argument of completing-read. + ;; See example in `rcirc-browse-url'. + (symbolp (symbol-value collection))) + nil) + ;; When collection is a symbol, most of the time + ;; it should be a symbol used as a minibuffer-history. + ;; The value of this symbol in this case return a list + ;; of string which maybe are converted later as symbol + ;; in special cases. + ;; we treat here commandp as a special case as it return t + ;; also with a string unless its last arg is provided. + ;; Also, the history collections generally collect their + ;; elements as string, so intern them to call predicate. + ((and (symbolp collection) (boundp collection) test) + (let ((predicate (lambda (elm) + (condition-case _err + (if (eq test 'commandp) + (funcall test (intern elm)) + (funcall test elm)) + (wrong-type-argument + (funcall test (intern elm))))))) + (all-completions input (symbol-value collection) predicate))) + ((and (symbolp collection) (boundp collection)) + (all-completions input (symbol-value collection))) + ;; Normally file completion should not be handled here, + ;; but special cases like `find-file-at-point' do it. + ;; Handle here specially such cases. + ((and (functionp collection) (not (string= input "")) + (or minibuffer-completing-file-name + (eq (completion-metadata-get + (completion-metadata input collection test) + 'category) + 'file))) + (cl-loop for f in (funcall collection input test t) + unless (member f '("./" "../")) + if (string-match helm--url-regexp input) + collect f + else + collect (concat (file-name-as-directory + (helm-basedir input)) + f))) + ((functionp collection) + (funcall collection input test t)) + ((and alistp (null test)) collection) + ;; Next test ensure circular objects are removed + ;; with `all-completions' (Bug#1530). + (t (all-completions input collection test))))) + (if sort-fn (sort cands sort-fn) cands)))) + +(cl-defun helm-cr--pattern-in-candidates-p (candidates &optional (pattern helm-pattern)) + (or (assoc pattern candidates) + (assoc (concat " " pattern) candidates) + (assq (intern pattern) candidates) + (member pattern candidates) + (member (downcase pattern) candidates) + (member (upcase pattern) candidates))) + +(defun helm-cr-default-transformer (candidates source) + "Default filter candidate function for `helm-comp-read'." + (let ((must-match (helm-get-attr 'must-match source))) + ;; Annotation and affixation are already handled in completion-in-region and + ;; in helm-completing-read-default-2 when emacs style is in use. + ;; For helm-completing-read-default-1 we handle them in an extra FCT; This + ;; allows extracting annotation and affixation from metadata which is not + ;; accessible from here. + (cl-loop for c in candidates + for cand = (let ((elm (if (stringp c) + (replace-regexp-in-string "\\s\\" "" c) + c))) + (cond ((and (stringp elm) + (string-match "\n" elm)) + (cons (replace-regexp-in-string "\n" "->" elm) c)) + (t c))) + collect cand into lst + finally return + ;; Unquote helm-pattern when it is added as candidate + ;; (Bug#2015). + (let ((pat (replace-regexp-in-string "\\s\\" "" helm-pattern))) + (if (or (string= pat "") + (eq must-match t) + (helm-cr--pattern-in-candidates-p lst pat)) + lst + (append (list (cons (helm-aand (propertize "[?]" 'face 'helm-ff-prefix) + (propertize " " 'display it 'unknown t) + (concat it pat)) + pat)) + lst)))))) + +(defun helm-comp-read--move-to-first-real-candidate () + (helm-aif (helm-get-selection nil 'withprop) + ;; Avoid error with candidates with an image as display (Bug#2296). + (when (helm-candidate-prefixed-p it) + (helm-next-line)))) + +(defun helm-cr-default (default cands) + (delq nil + (cond ((and (consp default) (string= helm-pattern "")) + (append (cl-loop for d in default + ;; Don't convert + ;; nil to "nil" (i.e the string) + ;; it will be delq'ed on top. + for str = (if (null d) d (helm-stringify d)) + when (member str cands) + do (setq cands (delete d cands)) + when str collect str) + cands)) + ;; Some functions like debug-on-entry use (symbol-name sym) + ;; without checking if sym is non nil, so the return value become + ;; "nil". + ((and (not (member default '("" "nil"))) + (string= helm-pattern "")) + (cons default (delete (helm-stringify default) + cands))) + (t cands)))) + +;;;###autoload +(cl-defun helm-comp-read (prompt collection + &key + test + initial-input + default + preselect + (buffer "*Helm Completions*") + must-match + fuzzy + reverse-history + (requires-pattern 0) + (history nil shistory) + raw-history + input-history + (case-fold helm-comp-read-case-fold-search) + (persistent-action nil) + (persistent-help "DoNothing") + (mode-line helm-comp-read-mode-line) + help-message + (keymap helm-comp-read-map) + (name "Helm Completions") + header-name + candidates-in-buffer + (get-line #'buffer-substring) + diacritics + match-part + match-dynamic + exec-when-only-one + quit-when-no-cand + (volatile t) + sort + fc-transformer + hist-fc-transformer + (marked-candidates helm-comp-read-use-marked) + nomark + (alistp t) + (candidate-number-limit helm-candidate-number-limit) + multiline + allow-nest + coerce + (group 'helm)) + "Read a string in the minibuffer, with helm completion. + +It is helm `completing-read' equivalent. + +- PROMPT is the prompt name to use. + +- COLLECTION can be a list, alist, vector, obarray or hash-table. + For alists and hash-tables their car are use as real value of + candidate unless ALISTP is non-nil. + It can be also a function that receives three arguments: + the values string, predicate and t. See `all-completions' for more details. + +Keys description: + +- TEST: A predicate called with one arg i.e candidate. + +- INITIAL-INPUT: Same as input arg in `helm'. + +- PRESELECT: See preselect arg of `helm'. + +- DEFAULT: This option is used only for compatibility with regular + Emacs `completing-read' (Same as DEFAULT arg of `completing-read'). + +- BUFFER: Name of helm-buffer. + +- MUST-MATCH: Candidate selected must be one of COLLECTION. + +- FUZZY: Enable fuzzy matching. + +- REVERSE-HISTORY: When non--nil display history source after current + source completion. + +- REQUIRES-PATTERN: Same as helm attribute, default is 0. + +- HISTORY: A symbol where each result will be saved. + If not specified as a symbol an error will popup. + When specified, all elements of HISTORY are displayed in + a special source before or after COLLECTION according to REVERSE-HISTORY. + The main difference with INPUT-HISTORY is that the result of the + completion is saved whereas in INPUT-HISTORY it is the minibuffer + contents which is saved when you exit. + Don't use the same symbol for INPUT-HISTORY and HISTORY. + NOTE: As mentionned above this has nothing to do with + `minibuffer-history-variable', therefore if you want to save this + history persistently, you will have to add this variable to the + relevant variable of your favorite tool for persistent emacs session + i.e. psession, desktop etc... + +- RAW-HISTORY: When non-nil do not remove backslashs if some in + HISTORY candidates. + +- INPUT-HISTORY: A symbol. The minibuffer input history will be + stored there, if nil or not provided, `minibuffer-history' + will be used instead. You can navigate in this history with + `M-p' and `M-n'. + Don't use the same symbol for INPUT-HISTORY and HISTORY. + +- CASE-FOLD: Same as `helm-case-fold-search'. + +- PERSISTENT-ACTION: A function called with one arg i.e candidate. + +- PERSISTENT-HELP: A string to document PERSISTENT-ACTION. + +- MODE-LINE: A string or list to display in mode line. + Default is `helm-comp-read-mode-line'. + +- KEYMAP: A keymap to use in this `helm-comp-read'. + (the keymap will be shared with history source) + +- NAME: The name related to this local source. + +- HEADER-NAME: A function to alter NAME, see `helm'. + +- EXEC-WHEN-ONLY-ONE: Bound `helm-execute-action-at-once-if-one' + to non--nil. (possibles values are t or nil). + +- VOLATILE: Use volatile attribute. + +- SORT: A predicate to give to `sort' e.g `string-lessp' + Use this only on small data as it is inefficient. + If you want to sort faster add a sort function to + FC-TRANSFORMER. + Note that FUZZY when enabled is already providing a sort function. + +- FC-TRANSFORMER: A `filtered-candidate-transformer' function + or a list of functions. + +- HIST-FC-TRANSFORMER: A `filtered-candidate-transformer' + function for the history source. + +- MARKED-CANDIDATES: If non-nil return candidate or marked candidates as a list. + +- NOMARK: When non--nil don't allow marking candidates. + +- ALISTP: + When non-nil (default) pass the value of (DISPLAY . REAL) + candidate in COLLECTION to action when COLLECTION is an alist or a + hash-table, otherwise DISPLAY is always returned as result on exit, + which is the default when using `completing-read'. + See `helm-comp-read-get-candidates'. + +- CANDIDATES-IN-BUFFER: when non--nil use a source build with + `helm-source-in-buffer' which is much faster. + Argument VOLATILE have no effect when CANDIDATES-IN-BUFFER is non--nil. + +- GET-LINE: Specify the :get-line slot of `helm-source-in-buffer', has no effect + when CANDIDATES-IN-BUFFER is nil. + +- MATCH-PART: Allow matching only one part of candidate. + See match-part documentation in `helm-source'. + +- MATCH-DYNAMIC: See match-dynamic in `helm-source-sync' + It has no effect when used with CANDIDATES-IN-BUFFER. + +- ALLOW-NEST: Allow nesting this `helm-comp-read' in a helm session. + See `helm'. + +- MULTILINE: See multiline in `helm-source'. + +- COERCE: See coerce in `helm-source'. + +- GROUP: See group in `helm-source'. + +Any prefix args passed during `helm-comp-read' invocation will be recorded +in `helm-current-prefix-arg', otherwise if prefix args were given before +`helm-comp-read' invocation, the value of `current-prefix-arg' will be used. +That means you can pass prefix args before or after calling a command +that use `helm-comp-read'. See `helm-M-x' for example." + ;; Handle error with HISTORY: + ;; + ;; Should show helm with one source at first run and save result on + ;; exit, should show the history source along candidates source on + ;; next run as soon as `test-hist' value is feeded. + ;; (setq test-hist nil) + ;; (helm-comp-read "test: " '(a b c d e) + ;; :history 'test-hist) + ;; + ;; Should run normally as long as `test-hist' is bound and nil. As + ;; soon `test-hist' becomes non-nil throw an error. + ;; (helm-comp-read "test: " '(a b c d e) + ;; :history test-hist) + ;; + ;; Should run normally. + ;; (completing-read "test: " '(a b c d e)) + (cl-assert (if shistory + (or (null history) + (and history (symbolp history))) + t) + nil "Error: History should be specified as a symbol") + (when (get-buffer helm-action-buffer) + (kill-buffer helm-action-buffer)) + ;; The value of MUST-MATCH is given to + ;; `helm--set-minibuffer-completion-confirm' which compute it and propagate it + ;; to `minibuffer-completion-confirm' which is then used by + ;; `helm-confirm-and-exit-minibuffer'. + (unless (or (memq must-match '(confirm confirm-after-completion t nil)) + (functionp must-match)) + ;; Fix completing-read's using something else than (confirm + ;; confirm-after-completion t nil) or a function e.g. 1 or + ;; whatever (bug #2527). + (setq must-match t)) + (let ((action-fn `(("Sole action (Identity)" + . (lambda (candidate) + (if ,marked-candidates + (helm-marked-candidates) + (identity candidate))))))) + (let* ((minibuffer-completion-predicate test) + (minibuffer-completion-table + (or minibuffer-completion-table collection)) + (helm-read-file-name-mode-line-string + (replace-regexp-in-string "helm-maybe-exit-minibuffer" + "helm-confirm-and-exit-minibuffer" + helm-read-file-name-mode-line-string)) + (get-candidates + (lambda () + (let ((cands (helm-comp-read-get-candidates + ;; If `helm-pattern' is passed as INPUT + ;; and :alistp is nil INPUT is passed to + ;; `all-completions' which defeat helm + ;; matching functions (multi match, fuzzy + ;; etc...) Bug#2134. + collection test sort alistp + (if (and match-dynamic (null candidates-in-buffer)) + helm-pattern "")))) + (helm-cr-default default cands)))) + (history-get-candidates + (lambda () + (let ((cands (helm-comp-read-get-candidates + history test nil alistp))) + (when cands + (delete "" (helm-cr-default default cands)))))) + (src-hist (helm-build-sync-source (format "%s History" name) + :candidates history-get-candidates + :fuzzy-match fuzzy + :multiline multiline + :match-part match-part + :filtered-candidate-transformer + (append `((lambda (candidates _source) + (if ,raw-history + candidates + (cl-loop for i in candidates + ;; Input is added to history in completing-read's + ;; and may be regexp-quoted, so unquote it + ;; but check if cand is a string (it may be at this stage + ;; a symbol or nil) Bug#1553. + when (stringp i) + collect (replace-regexp-in-string "\\s\\" "" i))))) + (and hist-fc-transformer (helm-mklist hist-fc-transformer))) + :persistent-action persistent-action + :persistent-help persistent-help + :keymap keymap + :must-match must-match + :group group + :coerce coerce + :mode-line mode-line + :help-message help-message + :action action-fn)) + (src (helm-build-sync-source name + :candidates get-candidates + :match-part match-part + :multiline multiline + :header-name header-name + :filtered-candidate-transformer + (let ((transformers (helm-mklist fc-transformer))) + (append transformers + (unless (member 'helm-cr-default-transformer transformers) + '(helm-cr-default-transformer)))) + :requires-pattern requires-pattern + :persistent-action persistent-action + :persistent-help persistent-help + :fuzzy-match fuzzy + :diacritics diacritics + :keymap keymap + :must-match must-match + :group group + :coerce coerce + :mode-line mode-line + :match-dynamic match-dynamic + :help-message help-message + :action action-fn + :volatile volatile)) + (src-1 (helm-build-in-buffer-source name + :data get-candidates + :match-part match-part + :get-line get-line + :multiline multiline + :header-name header-name + :filtered-candidate-transformer + (let ((transformers (helm-mklist fc-transformer))) + (append transformers + (unless (member 'helm-cr-default-transformer transformers) + '(helm-cr-default-transformer)))) + :requires-pattern requires-pattern + :persistent-action persistent-action + :fuzzy-match fuzzy + :diacritics diacritics + :keymap keymap + :must-match must-match + :group group + :coerce coerce + :persistent-help persistent-help + :mode-line mode-line + :help-message help-message + :action action-fn)) + (src-list (list src-hist + (if candidates-in-buffer + src-1 src))) + (helm-execute-action-at-once-if-one exec-when-only-one) + (helm-quit-if-no-candidate quit-when-no-cand) + result) + (when nomark + (setq src-list (cl-loop for src in src-list + collect (cons '(nomark) src)))) + (when reverse-history (setq src-list (nreverse src-list))) + (add-hook 'helm-after-update-hook 'helm-comp-read--move-to-first-real-candidate) + (unwind-protect + (setq result (helm + :sources src-list + :input initial-input + :default default + :preselect preselect + :prompt prompt + :resume 'noresume + :keymap keymap ;; Needed with empty collection. + :allow-nest allow-nest + :candidate-number-limit candidate-number-limit + :case-fold-search case-fold + :history (and (symbolp input-history) input-history) + :buffer buffer)) + (remove-hook 'helm-after-update-hook 'helm-comp-read--move-to-first-real-candidate)) + ;; If `history' is a symbol save it, except when it is t. + (when (and result history (symbolp history) (not (eq history t))) + (set history + ;; RESULT may be a a string or a list of strings bug #2461. + (delete-dups (append (mapcar #'substring-no-properties (helm-mklist result)) + (symbol-value history))))) + (or result (helm-mode--keyboard-quit))))) + + +;; Generic completing-read +;; +;; Support also function as collection. +;; e.g M-x man is supported. +;; Support hash-table and vectors as collection. +;; NOTE: +;; Some crap emacs functions may not be supported +;; like ffap-alternate-file (bad use of completing-read) +;; and maybe others. +;; Provide a mode `helm-mode' which turn on +;; helm in all `completing-read' and `read-file-name' in Emacs. +;; +(defvar helm-completion-mode-string " Helm") + +(defvar helm-completion-mode-quit-message + "Helm completion disabled") + +(defvar helm-completion-mode-start-message + "Helm completion enabled") + +;;; Specialized handlers +;; +;; +(defun helm-completing-read-symbols + (prompt _collection test _require-match init + hist default _inherit-input-method name buffer) + "Specialized function for fast symbols completion in `helm-mode'." + (require 'helm-elisp) + (or + (helm + :sources (helm-build-in-buffer-source name + :init (lambda () + (helm-apropos-init (lambda (x) + (and (funcall test x) + (not (keywordp x)))) + (or (car-safe default) default))) + :filtered-candidate-transformer 'helm-apropos-default-sort-fn + :help-message #'helm-comp-read-help-message + :fuzzy-match (eq helm-completion-style 'helm-fuzzy) + :persistent-action + (lambda (candidate) + (helm-lisp-completion-persistent-action + candidate name)) + :persistent-help (helm-lisp-completion-persistent-help)) + :prompt prompt + :buffer buffer + :input init + :history hist + :resume 'noresume + :default (or default "")) + (helm-mode--keyboard-quit))) + + +;;; Extra metadata for completions-detailed +;; +;; +(defvar helm-completing-read-extra-metadata + '((buffer . (metadata + (affixation-function . helm-completing-read-buffer-affixation) + (category . buffer) + (flags . (helm-completing-read--buffer-lgst-mode)))) + (symbol-help . (metadata + (affixation-function . helm-symbol-completion-table-affixation) + (category . symbol-help))) + (package . (metadata + (affixation-function . helm-completion-package-affixation) + (category . package))) + (theme . (metadata + (affixation-function . helm-completion-theme-affixation) + (category . theme))) + (coding-system . (metadata + (affixation-function . helm-completion-coding-system-affixation) + (category . coding-system))) + (color . (metadata + (affixation-function . helm-completion-color-affixation) + (category . color))) + (library . (metadata + (affixation-function . helm-completion-library-affixation) + (category . library))) + (charset . (metadata + (affixation-function . helm-completion-charset-affixation) + (category . charset)))) + "Extra metadata for completing-read. + +Alist composed of (CATEGORY . METADATA). +CATEGORY is extracted from original metadata and METADATA is a list composed +like this: + (metadata (affixation-function . fun) + (annotation-function . fun) + (category . category) + (flags . flags)) + +FLAGS is a list of variables to renitialize to nil when exiting or quitting. + +It is used to add `affixation-function' or `annotation-function' if original +metadata doesn't have some and `completions-detailed' is non nil. +When using emacs as `helm-completion-style', this has no effect, keeping same +behavior as emacs vanilla.") + +(defvar helm-completing-read-command-categories + '(("customize-variable" . symbol-help) + ("customize-set-variable" . symbol-help) + ("customize-set-value" . symbol-help) + ("customize-save-variable" . symbol-help) + ("describe-function" . symbol-help); For Emacs-27. + ("describe-variable" . symbol-help); For Emacs-27. + ("describe-symbol" . symbol-help) ; For Emacs-27. + ("describe-command" . symbol-help) ; For Emacs-27. + ("set-variable" . symbol-help) + ("customize-group" . symbol-help) + ("find-function" . symbol-help) + ("find-variable" . symbol-help) + ("trace-function" . symbol-help) + ("trace-function-foreground" . symbol-help) + ("trace-function-background" . symbol-help) + ("describe-minor-mode" . symbol-help) + ("where-is" . symbol-help) + ("execute-extended-command" . symbol-help) + ("info-lookup-symbol" . symbol-help) + ("Info-goto-emacs-command-node" . symbol-help) + ("find-library" . library) + ("locate-library" . library) + ("kill-buffer" . buffer) + ("package-install" . package) + ("package-vc-install" . package) + ("package-vc-checkout" . package) + ("describe-package" . package) + ("load-theme" . theme) + ("describe-theme" . theme) + ("describe-coding-system" . coding-system) + ("set-file-name-coding-system" . coding-system) + ("set-keyboard-coding-system" . coding-system) + ("set-terminal-coding-system" . coding-system) + ("set-process-coding-system" . coding-system) + ("set-buffer-process-coding-system" . coding-system) + ("set-buffer-file-coding-system" . coding-system) + ("set-selection-coding-system" . coding-system) + ("set-next-selection-coding-system" . coding-system) + ("set-clipboard-coding-system" . coding-system) + ("universal-coding-system-argument" . coding-system) + ("read-color" . color) + ("list-charset-chars" . charset)) + "An alist to specify metadata category by command. + +Some commands provide a completion-table with no category +specified in metadata, we allow here specifying the category of +the completion provided by a specific command. The command +should be specified as a string and the category as a symbol.") + +(defvar helm-completing-read--buffer-lgst-mode nil) +(defun helm-completing-read-buffer-affixation (completions) + (let ((len-mode (or helm-completing-read--buffer-lgst-mode + (setq helm-completing-read--buffer-lgst-mode + (cl-loop for bn in completions + maximize (with-current-buffer bn + (length (symbol-name major-mode)))))))) + (lambda (comp) + (let* ((buf (get-buffer comp)) + (fname (buffer-file-name buf)) + (modified (and fname (buffer-modified-p buf))) + (prefix (cond (modified + (propertize + "fm " 'face 'font-lock-comment-face)) + (fname + (propertize + " f " 'face 'helm-completions-annotations)) + (t (propertize "nf " 'face 'font-lock-doc-face)))) + (mode (with-current-buffer comp + (propertize + (symbol-name major-mode) 'face 'helm-completions-detailed))) + (size (helm-buffer-size buf)) + (max-len helm-buffer-max-length) + (bname (truncate-string-to-width + comp helm-buffer-max-length nil nil + helm-buffers-end-truncated-string)) + (suffix (format "%s%s%s%s%s(in %s)" + (make-string (1+ (- max-len (length bname))) ? ) + (propertize size + 'face 'helm-buffer-size) + (make-string (- 7 (length size)) ? ) + mode + (make-string (1+ (- len-mode (length mode))) ? ) + (helm-aif fname + (propertize + (abbreviate-file-name (file-name-directory it)) + 'face 'font-lock-type-face) + (propertize + (with-current-buffer comp + (abbreviate-file-name default-directory)) + 'face 'font-lock-doc-face))))) + (list (propertize + bname 'face (if fname + 'font-lock-builtin-face + 'font-lock-doc-face)) + (propertize " " 'display prefix) + (propertize " " 'display suffix)))))) + +(defun helm-symbol-completion-table-affixation (_completions) + "Override `help--symbol-completion-table-affixation'. + +Normally affixation functions use COMPLETIONS as arg, and return a list of +modified COMPLETIONS. Now we allow affixations functions to return a +function instead, just like annotation functions. The function should return a +list of three elements like (comp prefix suffix). This increase significantly +the speed avoiding one useless loop on complete list of candidates. + +Returns a function and not a list of completions. + +It affects actually describe-variable/function/command/symbol functions. +It uses `helm-get-first-line-documentation' which allow providing documentation +for `describe-variable' symbols and align properly documentation when helm style +is used." + (lambda (comp) + (require 'help-fns) + (let* ((sym (intern comp)) + ;; When using in-buffer implementation we should have the + ;; longest len to align documentation for free. + ;; Check for style as well in case user switches to emacs + ;; style and a candidate buffer remains (with its local vars + ;; still available). + (max-len (and (memq helm-completion-style '(helm helm-fuzzy)) + (helm-in-buffer-get-longest-candidate))) + (sep (if (or (null max-len) (zerop max-len)) + " --" ; Default separator. + (helm-make-separator comp max-len))) + (doc (ignore-errors + (helm-get-first-line-documentation sym))) + (symbol-class (help--symbol-class sym)) + (group (helm-group-p sym)) + (key (helm-completion-get-key sym))) + (list + ;; Symbol (comp). + (if (or (symbol-function sym) (boundp sym) + (facep sym) group) + comp + ;; Not already defined function. To test add an advice on a non + ;; existing function. + (propertize comp 'face 'helm-completion-invalid)) + ;; Prefix. + (helm-aand (cond ((and symbol-class group) + (concat "g" symbol-class)) + ((and (not (string= symbol-class "")) + symbol-class)) + (group "g") + (t "i")) + (propertize it 'face 'helm-completions-detailed) + (propertize + ;; (format "%-4s" it) makes spaces inheriting text props. + " " 'display (concat it (make-string (- 5 (length it)) ? )))) + ;; Suffix. + (if doc + (helm-aand (propertize doc 'face 'helm-completions-detailed) + (propertize " " 'display (concat sep it key))) + ""))))) + +(defun helm-completion-get-key (sym) + "Return key description on symbol SYM." + (with-helm-current-buffer + (let* ((key (and (commandp sym) (where-is-internal sym nil 'first-only))) + (binding (and key (key-description key)))) + (when binding + (propertize (format " (%s)" binding) 'face 'shadow))))) + +(defun helm-completion-package-affixation (_completions) + (lambda (comp) + (let* ((sym (intern-soft comp)) + (id (package-get-descriptor sym)) + (built-in (package-built-in-p sym)) + (status (and id (package-desc-status id))) + (desc (if built-in + (aref (assoc-default sym package--builtins) 2) + (and id (package-desc-summary id)))) + (sep (helm-make-separator comp))) + (list comp + (propertize + (if status + (format "%s " (substring status 0 1)) + "b ") + 'face 'helm-completions-annotations) + (or (helm-aand desc + (propertize it 'face 'helm-completions-detailed) + (propertize " " 'display (concat sep it))) + ""))))) + +(defun helm-completion-theme-affixation (_completions) + (lambda (comp) + (let* ((sym (intern-soft comp)) + (sep (helm-make-separator comp)) + (doc (if (custom-theme-p sym) + (helm-get-first-line-documentation sym) + (helm--get-theme-doc-1 sym)))) + (list comp + "" + (helm-aand (propertize doc 'face 'helm-completions-detailed) + (propertize " " 'display (concat sep it))))))) + +(defun helm--get-theme-doc-1 (sym) + (let ((fn (locate-file (concat (symbol-name sym) "-theme.el") + (custom-theme--load-path) + '("" "c"))) + doc) + ;; Avoid loading theme as much as possible. + (when fn + (with-temp-buffer + (insert-file-contents fn) + (helm-awhile (let ((read-circle nil)) + (condition-case nil + (read (current-buffer)) + (end-of-file nil))) + (when (eq (car-safe it) 'deftheme) + (cl-return (setq doc (car (split-string (nth 2 it) "\n")))))) + (unless doc + (setq doc (helm--get-theme-doc-from-header))))) + doc)) + +(defun helm--get-theme-doc-from-header () + "Extract doc in first line of theme file." + (goto-char (point-min)) + (let (beg end) + (when (re-search-forward "--- " (pos-eol) t) + (setq beg (point))) + (if (re-search-forward " -\\*-" (pos-eol) t) + (setq end (match-beginning 0)) + (setq end (pos-eol))) + (when (and beg end) + (buffer-substring beg end)))) + +(defun helm-completion-coding-system-affixation (_comps) + (require 'mule-diag) + (lambda (comp) + (let ((doc (with-output-to-string + (with-current-buffer standard-output + (print-coding-system-briefly (intern comp) 'tightly)))) + (sep (helm-make-separator comp))) + (list comp "" (helm-aand (replace-regexp-in-string "^ *" "" doc) + (replace-regexp-in-string "[\n]" "" it) + (propertize it 'face 'helm-completions-detailed) + (propertize " " 'display (concat sep it))))))) + +(defun helm-completion-charset-affixation (_comps) + (lambda (comp) + (let ((doc (charset-description (intern comp))) + (sep (helm-make-separator comp))) + (list comp "" (helm-aand (propertize doc 'face 'helm-completions-detailed) + (propertize " " 'display (concat sep it))))))) + +(defun helm-completion-color-affixation (_comps) + (lambda (comp) + (let ((sep (helm-make-separator comp)) + (rgb (condition-case nil + (helm-acase comp + ("foreground at point" (with-helm-current-buffer + (foreground-color-at-point))) + ("background at point" (with-helm-current-buffer + (background-color-at-point))) + (t + (apply #'color-rgb-to-hex (color-name-to-rgb comp)))) + (error "SAMPLE")))) + (list comp + "" + (helm-aand (propertize rgb 'face `(:background ,rgb + :distant-foreground "black")) + (propertize " " 'display (concat sep it))))))) + +(defun helm-completion-library-affixation (_comps) + (require 'helm-elisp) + (lambda (comp) + ;; Because find-library-include-other-files default to t, we have all the + ;; unrelated files and directories coming in ... Even if this modify the + ;; behavior of find-library-include-other-files remove them for the benefit + ;; of everybody. + (unless (or (string-match "\\(\\.elc\\|/\\)\\'" comp) + (string-match "\\`\\.#" comp)) ; (bug#2526) + (let* ((sep (helm-make-separator comp)) + (path (or (assoc-default comp helm--locate-library-cache) + (let ((p (find-library-name comp))) + (push (cons comp p) helm--locate-library-cache) + p))) + (doc (or (gethash comp helm--locate-library-doc-cache) + (puthash comp (helm-locate-lib-get-summary path) + helm--locate-library-doc-cache)))) + (list comp + "" + (helm-aand (propertize doc 'face 'font-lock-warning-face) + (propertize " " 'display (concat sep it)))))))) + +;;; Generic completing read +;; +;; +(defun helm-completing-read-default-1 + (prompt collection test require-match + init hist default _inherit-input-method + name buffer &optional cands-in-buffer exec-when-only-one alistp get-line) + "Helm `completing-read' handler not rebuilding its candidates dynamically. + +It is used usually with helm or helm-fuzzy `helm-completion-style'. +Call `helm-comp-read' with same args as `completing-read'. + +Extra optional arg CANDS-IN-BUFFER means use `candidates-in-buffer' +method which is faster. + +EXEC-WHEN-ONLY-ONE allow exiting when COLLECTION contains only one candidate. + +ALISTP is same as `helm-comp-read' :alistp slot. + +When using CANDS-IN-BUFFER, GET-LINE can be specified to exit with candidate +handling properties, see `helm-comp-read'. + +This handler should be used when candidate list doesn't need to be rebuilt +dynamically otherwise use `helm-completing-read-default-2'." + (let* ((history (or (car-safe hist) hist)) + (initial-input (helm-acase init + ((guard (stringp it)) it) + ((guard (consp it)) (car it)))) + (minibuffer-completion-table collection) + (metadata (or (completion-metadata (or initial-input "") collection test) + '(metadata))) + (afun (or (plist-get completion-extra-properties :annotation-function) + (completion-metadata-get metadata 'annotation-function))) + (afix (or (plist-get completion-extra-properties :affixation-function) + (completion-metadata-get metadata 'affixation-function))) + (category (completion-metadata-get metadata 'category)) + (sort-fn (unless (eq helm-completion-style 'helm-fuzzy) + (or + (completion-metadata-get + metadata 'display-sort-function) + (lambda (candidates) + (sort candidates #'helm-generic-sort-fn))))) + flags) + (helm-aif (and (null category) + (assoc-default name helm-completing-read-command-categories)) + (setq metadata `(metadata (category . ,it)) + category it)) + (helm-aif (and (or (and (boundp 'completions-detailed) completions-detailed) + helm-completions-detailed) + (assoc-default category helm-completing-read-extra-metadata)) + (progn + (setq metadata it) + (setq afun (completion-metadata-get metadata 'annotation-function) + afix (completion-metadata-get metadata 'affixation-function) + flags (completion-metadata-get metadata 'flags)))) + (unwind-protect + (helm-comp-read + prompt collection + :test test + :history history + :reverse-history helm-mode-reverse-history + :input-history history + :must-match require-match + :alistp alistp + :diacritics helm-mode-ignore-diacritics + :help-message #'helm-comp-read-help-message + :name name + :requires-pattern (if (and (stringp default) + (string= default "") + (memq require-match + '(confirm confirm-after-completion))) + 1 0) + :fc-transformer (append (and (or afix afun (memq category '(file library)) sort-fn) + (list (lambda (candidates _source) + (helm-completion--initial-filter + (if (and sort-fn (> (length helm-pattern) 0)) + (funcall sort-fn candidates) + candidates) + afun afix category)))) + '(helm-cr-default-transformer)) + :quit-when-no-cand (eq require-match t) + :nomark (null helm-comp-read-use-marked) + :candidates-in-buffer cands-in-buffer + :get-line (or get-line #'buffer-substring) + :exec-when-only-one exec-when-only-one + :fuzzy (eq helm-completion-style 'helm-fuzzy) + :buffer buffer + ;; If DEF is not provided, fallback to empty string + ;; to avoid `thing-at-point' to be appended on top of list + :default (or default "") + ;; Fail with special characters (e.g in gnus "nnimap+gmail:") + ;; if regexp-quote is not used. + ;; when init is added to history, it will be unquoted by + ;; helm-comp-read. + :initial-input initial-input) + (dolist (f flags) (set f nil))))) + +(defun helm-completing-read-default-2 + (prompt collection predicate require-match + init hist default _inherit-input-method + name buffer &optional _cands-in-buffer exec-when-only-one) + "Helm `completing-read' handler with dynamic matching. + +Call `helm-comp-read' with same args as `completing-read'. +For the meaning of optional args see `helm-completing-read-default-1'. +This handler uses dynamic matching which allows honouring `completion-styles'." + (let* ((history (or (car-safe hist) hist)) + (input (helm-acase init + ((guard (stringp it)) it) + ((guard (consp it)) (car it)))) + (completion-flex-nospace t) + (minibuffer-completion-table collection) + ;; (completion-styles + ;; (helm--prepare-completion-styles 'nomode)) + (metadata (or (completion-metadata (or input "") collection predicate) + '(metadata))) + (afun (or (plist-get completion-extra-properties :annotation-function) + (completion-metadata-get metadata 'annotation-function))) + (afix (or (plist-get completion-extra-properties :affixation-function) + (completion-metadata-get metadata 'affixation-function))) + (category (completion-metadata-get metadata 'category)) + (compfn (lambda (str _predicate _action) + (let* ((completion-ignore-case (helm-set-case-fold-search)) + (comps + (completion-all-completions + str ; This is helm-pattern + collection + predicate + (length str) + metadata)) + (last-data (last comps)) + ;; Helm syle sort fn is added to + ;; metadata only in emacs-27, so in + ;; emacs-26 use helm-generic-sort-fn + ;; which handle both helm and + ;; helm-flex styles. When + ;; helm-completion-style is helm or + ;; helm-fuzzy, sorting will be done + ;; later in FCT. + (sort-fn + (and (eq helm-completion-style 'emacs) + (or + ;; Emacs-27 + (completion-metadata-get + metadata 'display-sort-function) + ;; Emacs-26 + (lambda (candidates) + (sort candidates #'helm-generic-sort-fn))))) + all) + (when (cdr last-data) + ;; Remove the last element of + ;; comps by side-effect. + (setcdr last-data nil)) + (setq helm-completion--sorting-done (and sort-fn t)) + (setq all (copy-sequence comps)) + ;; Default is passed here only with helm + ;; h-c-styles, otherwise with emacs style it is + ;; passed with the :default arg of helm-comp-read + ;; and computed in its get-candidates function. + (append (and default + (memq helm-completion-style '(helm helm-fuzzy)) + (list default)) + (helm-completion--initial-filter + (let ((lst (if (and sort-fn (> (length str) 0)) + (funcall sort-fn all) + all))) + (if (and default afix) + (prog1 (append (list default) + (delete default lst)) + (setq default nil)) + lst)) + afun afix category))))) + (data (if (memq helm-completion-style '(helm helm-fuzzy)) + (funcall compfn (or input "") nil nil) + compfn)) + (helm-completion-in-region-default-sort-fn + (lambda (candidates _source) + (if (or helm-completion--sorting-done + (string= helm-pattern "")) + candidates + (sort candidates 'helm-generic-sort-fn))))) + (unwind-protect + (helm-comp-read + ;; Completion-at-point and friends have no prompt. + prompt + data + :name name + :initial-input input + :buffer buffer + :history history + :nomark (null helm-comp-read-use-marked) + :reverse-history helm-mode-reverse-history + ;; In helm h-c-styles default is passed directly in + ;; candidates. + :default (and (eq helm-completion-style 'emacs) (null afix) default) + :fc-transformer + ;; Ensure sort fn is at the end. + (append '(helm-cr-default-transformer) + (and helm-completion-in-region-default-sort-fn + (list helm-completion-in-region-default-sort-fn))) + :match-dynamic (eq helm-completion-style 'emacs) + :diacritics helm-mode-ignore-diacritics + :fuzzy (eq helm-completion-style 'helm-fuzzy) + :exec-when-only-one exec-when-only-one + :quit-when-no-cand (eq require-match t) + :must-match require-match) + (setq helm-completion--sorting-done nil)))) + +(defun helm-mode-all-the-icons-handler (prompt collection test require-match + init hist default inherit-input-method + name buffer) + "Helm `completing-read' handler for `all-the-icons-insert'." + (let* ((max-len 0) + sname + (cands (cl-loop for (desc . str) in collection + ;; When the FAMILY argument is passed to + ;; `all-the-icons-insert' DESC is the name of icon only + ;; otherwise it is "name [family]" with unpredictable + ;; spaces or tab numbers between name and [family]. + for descnp = (substring-no-properties desc) + for sdesc = (if (string-match + "\\(.*\\)[[:blank:]]+\\(\\[.*\\]\\)" descnp) + ;; This is all-the-icons-insert function. + (match-string 1 descnp) + ;; This is one of + ;; all-the-icons-insert- + ;; functions, extract the family name. + (prog1 descnp + (unless sname + (setq sname (plist-get + (get-text-property + 0 'font-lock-face + (get-text-property 0 'display desc)) + :family))))) + for sdesc2 = (match-string 2 descnp) + do (setq max-len (max max-len (string-width sdesc))) + collect (cons (concat sdesc " " str " " sdesc2) desc))) + (fn (lambda () + (with-helm-buffer + (save-excursion + (goto-char (point-min)) + (helm-skip-header-and-separator-line 'next) + (while (re-search-forward "^[[:alnum:]_-]+" nil t) + (insert (make-string (- max-len (current-column)) ? ))))))) + (helm-after-update-hook (append helm-after-update-hook `(,fn)))) + (helm-completing-read-default-1 prompt cands test require-match + init hist default inherit-input-method + (or sname name) buffer t nil t 'buffer-substring))) + +(defun helm-completing-read-default-find-tag + (prompt collection test require-match + init hist default inherit-input-method + name buffer) + "Helm `completing-read' handler for `find-tag'." + ;; Some commands like find-tag may use `read-file-name' from inside + ;; the calculation of collection. in this case it clash with + ;; candidates-in-buffer that reuse precedent data (files) which is wrong. + ;; So (re)calculate collection outside of main helm-session. + (let* ((cands (helm-comp-read-get-candidates + collection test nil nil))) + (helm-completing-read-default-1 prompt cands test require-match + init hist default inherit-input-method + name buffer t))) + +(defun helm-completing-read-sync-default-handler + (prompt collection test require-match + init hist default inherit-input-method + name buffer) + "Helm `completing-read' handler using sync source as backend." + (helm-completing-read-default-1 prompt collection test require-match + init hist default inherit-input-method + name buffer)) + +(defun helm-completing-read-inbuffer-default-handler + (prompt collection test require-match + init hist default inherit-input-method + name buffer) + "Helm `completing-read' handler using inbuffer source as backend." + (helm-completing-read-default-1 prompt collection test require-match + init hist default inherit-input-method + name buffer t)) + +(defun helm-completing-read-default-handler + (prompt collection test require-match + init hist default inherit-input-method + name buffer) + "Default Helm `completing-read' handler. + +Use either `helm-completing-read-default-1' or `helm-completing-read-default-2' +according to `helm-completion-style'." + (let* (;; Standard will be used as CANDS-IN-BUFFER arg. + (standard (and (memq helm-completion-style '(helm helm-fuzzy)) t)) + (def (or default (helm-mode--find-default-in-prompt prompt))) + (fn (if standard + #'helm-completing-read-default-1 + #'helm-completing-read-default-2))) + (funcall fn + prompt collection test require-match + init hist def inherit-input-method name buffer + ;; CANDS-IN-BUFFER + standard))) + +(defun helm-mode--find-default-in-prompt (prompt) + ;; Some completing-read's are providing DEFAULT in prompt but the DEFAULT + ;; argument of completing-read is not provided, try here to extract DEFAULT + ;; from PROMPT which is typically a prompt builded with format-prompt. + ;; See `describe-language-environment' as example. + (when (string-match "\\`.*\\([(]default \\(.*\\)[)]\\):" prompt) + (match-string 2 prompt))) + +(defun helm-mode--read-buffer-to-switch (prompt) + "[INTERNAL] This is used to advice `read-buffer-to-switch'. +Don't use it directly." + ;; `read-buffer-to-switch' is passing `minibuffer-completion-table' + ;; to `read-buffer' through `minibuffer-setup-hook' which is too + ;; late to be known by `read-buffer-function', in our case + ;; `helm--generic-read-buffer'. It should let bind it to allow us + ;; using it. + (let ((minibuffer-completion-table (internal-complete-buffer-except))) + (read-buffer prompt (other-buffer (current-buffer)) + (confirm-nonexistent-file-or-buffer)))) + +(defun helm--generic-read-buffer (prompt &optional default require-match predicate) + "The `read-buffer-function' for `helm-mode'. +Affects `switch-to-buffer' `kill-buffer' and related." + ;; `read-buffer' is using internally `Vbuffer_alist' which is an + ;; alist with elements like (BUF-NAME . BUF-OBJ), therefore some + ;; predicates in Emacs are working only on such cons cells. + ;; However, helm is transforming COLLECTION in a list of strings and + ;; such predicates are failing because they expect cons cells (see + ;; bug#2506 with `project-switch-to-buffer'), even if they should + ;; handle strings as well according to `read-buffer' + ;; documentation. + (let ((pred (when predicate + (lambda (buffer) + (let ((buf (cons buffer (get-buffer buffer)))) + (condition-case _err + (funcall predicate buffer) + (wrong-type-argument + (funcall predicate buf)))))))) + (helm--completing-read-default + prompt (or minibuffer-completion-table + (internal-complete-buffer "" nil t)) + pred require-match nil nil default))) + +(defun helm-mode--get-default-handler-for (comp-or-file entry) + ;; Use 'comp for completing-read and 'file for 'read-file-name as + ;; COMP-OR-FILE value. + (let ((val (cdr-safe entry)) + (reading-file (eq comp-or-file 'file))) + (if (consp val) + (helm-acase (if reading-file (cadr val) (car val)) + (default (if reading-file + #'helm-read-file-name + #'helm-completing-read-default-handler)) + (t it)) + val))) + +(defun helm-mode--apply-helm-handler (handler arg-list) + "Ensure `minibuffer-complete' is disabled when running HANDLER. +ARG-LIST is a list of arguments to pass to HANDLER." + ;; Some functions are calling `minibuffer-complete' + ;; within `minibuffer-setup-hook' when calling their + ;; `completing-read', like `woman-file-name' (bug #2527). + ;; This defeat Helm which is already + ;; completing minibuffer, so deactivate + ;; minibuffer-complete one time for all [1]. + (cl-letf (((symbol-function 'minibuffer-complete) #'ignore)) + (apply handler arg-list))) + +(cl-defun helm--completing-read-default + (prompt collection &optional + predicate require-match + initial-input hist def + inherit-input-method) + "An helm replacement of `completing-read'. +This function should be used only as a `completing-read-function'. + +Don't use it directly, use instead `helm-comp-read' in your programs. + +See documentation of `completing-read' and `all-completions' for details." + (let* ((current-command (or (helm-this-command) this-command)) + (str-command (if current-command + (helm-symbol-name current-command) + "completing-read")) + (buf-name (format "*helm-mode-%s*" str-command)) + (entry (assq current-command + helm-completing-read-handlers-alist)) + (def-com (helm-mode--get-default-handler-for 'comp entry)) + (str-defcom (and def-com (helm-symbol-name def-com))) + (def-args (list prompt collection predicate + (helm-aif (assq current-command + helm-comp-read-require-match-overrides) + (cdr it) require-match) + initial-input hist def inherit-input-method)) + ;; Append the two extra args needed to set the buffer and source name + ;; in helm specialized functions. + (others-args (append def-args (list str-command buf-name))) + helm-completion-mode-start-message ; Be quiet + helm-completion-mode-quit-message + ;; Be sure this pesty *completion* buffer doesn't popup. + ;; Note: `minibuffer-with-setup-hook' may setup a lambda + ;; calling `minibuffer-completion-help' or other minibuffer + ;; functions we DONT WANT here, in these cases removing the hook + ;; (a symbol) have no effect. Bug#448. + ;; Because `minibuffer-completion-table' and + ;; `minibuffer-completion-predicate' are not bound + ;; anymore here, these functions should have no effect now, + ;; except in some rare cases like in `woman-file-name', + ;; so remove all incompatible functions + ;; from `minibuffer-setup-hook' (Bug#1205, Bug#1240). + ;; otherwise helm have not the time to close its initial session. + (minibuffer-setup-hook + (cl-loop for h in minibuffer-setup-hook + unless (or (consp h) ; a lambda. + (byte-code-function-p h) + (helm-subr-native-elisp-p h) + (memq h helm-mode-minibuffer-setup-hook-black-list)) + collect h)) + ;; Disable hack that could be used before `completing-read'. + ;; i.e (push ?\t unread-command-events). + unread-command-events + ;; Let-bounding here helm-completion-style according to + ;; helm-completion-styles-alist allow using helm style per commands. + (helm-completion-style (helm-aif (cdr (assq current-command helm-completion-styles-alist)) + (if (cdr-safe it) (car it) it) + (default-value 'helm-completion-style))) + (completion-styles + (helm--prepare-completion-styles current-command)) + (default-handler + ;; If nothing is found in + ;; helm-completing-read-handlers-alist use default + ;; handler which will itself use `helm-completion-style'. + #'helm-completing-read-default-handler)) + (when (eq def-com 'ido) (setq def-com 'ido-completing-read)) + (unless (or (not entry) def-com) + ;; An entry in *read-handlers-alist exists but have + ;; a nil value, so we exit from here, disable `helm-mode' + ;; and run the command again with it original behavior. + ;; `helm-mode' will be restored on exit. + (cl-return-from helm--completing-read-default + (unwind-protect + (progn + (helm-mode -1) + (apply completing-read-function def-args)) + (helm-mode 1)))) + ;; If we use now `completing-read' we MUST turn off `helm-mode' + ;; to avoid infinite recursion and CRASH. It will be reenabled on exit. + (when (or (eq def-com 'completing-read) + ;; All specialized functions are prefixed by "helm" + (and (stringp str-defcom) + (not (string-match "^helm" str-defcom)))) + (helm-mode -1)) + (unwind-protect + (cond (;; An helm specialized function exists, run it. + (and def-com helm-mode) + ;; Disable `minibuffer-complete' for handlers using + ;; helm (bug #2533). + (helm-mode--apply-helm-handler + def-com others-args)) + (;; Try to handle `ido-completing-read' everywhere. + (and def-com (eq def-com 'ido-completing-read)) + (setcar (memq collection def-args) + (all-completions "" collection predicate)) + (apply def-com def-args)) + (;; A non helm function specified in + ;; `helm-completing-read-handlers-alist' use it with + ;; exactly the same args as in `completing-read'. If + ;; we are here `helm-mode' is now disabled. + def-com + (apply def-com def-args)) + (;; Use by default a in-buffer handler unless + ;; COLLECTION is a function. + t + ;; Disable `minibuffer-complete' for handlers using + ;; helm (bug #2533). + (helm-mode--apply-helm-handler + default-handler others-args))) + (helm-mode 1) + ;; When exiting minibuffer, `this-command' is set to + ;; `helm-exit-minibuffer', which is unwanted when starting + ;; on another `completing-read', so restore `this-command' to + ;; initial value when exiting. + (setq this-command current-command)))) + +;;; Generic read-file-name +;; +;; +;;;###autoload +(cl-defun helm-read-file-name + (prompt + &key + (name "Read File Name") + initial-input + (buffer "*Helm file completions*") + test + noret + (case-fold helm-file-name-case-fold-search) + preselect + history + must-match + (fuzzy t) + default + marked-candidates + (candidate-number-limit helm-ff-candidate-number-limit) + nomark + (alistp t) + (persistent-action-if 'helm-find-files-persistent-action-if) + (persistent-help "Hit1 Expand Candidate, Hit2 or (C-u) Find file") + (mode-line helm-read-file-name-mode-line-string)) + "Read a file name with helm completion. + +It is helm `read-file-name' emulation. + +Argument PROMPT is the default prompt to use. + +Keys description: + +- NAME: Source name, default to \"Read File Name\". + +- INITIAL-INPUT: Where to start reading file name, + default to `default-directory' or $HOME. + +- BUFFER: `helm-buffer' name, defaults to \"*Helm Completions*\". + +- TEST: A predicate called with one arg \\='candidate'. + +- NORET: Allow disabling helm-ff-RET (have no effect if helm-ff-RET + isn't bound to RET). + +- CASE-FOLD: Same as `helm-case-fold-search'. + +- PRESELECT: helm preselection. + +- HISTORY: Display HISTORY in a special source. + +- MUST-MATCH: Can be \\='confirm, nil, or t. + +- FUZZY: Enable fuzzy matching when non-nil (Enabled by default). + +- MARKED-CANDIDATES: When non--nil return a list of marked candidates. + +- NOMARK: When non--nil don't allow marking candidates. + +- ALISTP: Don't use `all-completions' in history + (take effect only on history). + +- PERSISTENT-ACTION-IF: a persistent if action function. + +- PERSISTENT-HELP: persistent help message. + +- MODE-LINE: A mode line message, default is + `helm-read-file-name-mode-line-string'." + (require 'tramp) + (unless initial-input + (setq initial-input (or default-directory (getenv "HOME")))) + (when (get-buffer helm-action-buffer) + (kill-buffer helm-action-buffer)) + (mapc (lambda (hook) + (add-hook 'helm-after-update-hook hook)) + '(helm-ff-move-to-first-real-candidate + helm-ff-update-when-only-one-matched + helm-ff-auto-expand-to-home-or-root)) + (let* ((action-fn `(("Sole action (Identity)" + . (lambda (candidate) + (if ,marked-candidates + (helm-marked-candidates :with-wildcard t) + (identity candidate)))))) + ;; Be sure we don't erase the underlying minibuffer if some. + (helm-ff-auto-update-initial-value + (and helm-ff-auto-update-initial-value + (not (minibuffer-window-active-p (minibuffer-window))))) + helm-follow-mode-persistent + (helm-ff-fuzzy-matching + (and fuzzy + (not (memq helm-mm-matching-method '(multi1 multi3p))))) + (hist (and history (helm-comp-read-get-candidates + history nil nil alistp))) + (helm-ff--RET-disabled noret) + (minibuffer-completion-predicate test) + (minibuffer-completing-file-name t) + ;; Ensure not being prompted for password each time we + ;; navigate to a directory. + (password-cache t) + (helm--completing-file-name t) + (helm-read-file-name-mode-line-string + (replace-regexp-in-string "helm-maybe-exit-minibuffer" + "helm-confirm-and-exit-minibuffer" + helm-read-file-name-mode-line-string)) + (src-list + (list + ;; History source. + (helm-build-sync-source (format "%s History" name) + :header-name (lambda (name) + (concat name (substitute-command-keys + helm-find-files-doc-header))) + :mode-line mode-line + :candidates hist + :nohighlight t + :fuzzy-match fuzzy + :persistent-action-if persistent-action-if + :persistent-help persistent-help + :keymap helm-read-file-map + :must-match must-match + :nomark nomark + :action action-fn) + ;; Other source. + (helm-build-sync-source name + :header-name (lambda (name) + (concat name (substitute-command-keys + helm-find-files-doc-header))) + :init (lambda () + (setq helm-ff-auto-update-flag + helm-ff-auto-update-initial-value) + (setq helm-ff--auto-update-state + helm-ff-auto-update-flag)) + :mode-line mode-line + :help-message 'helm-read-file-name-help-message + :nohighlight helm-ff-nohighlight-matches + :candidate-number-limit 'helm-ff-candidate-number-limit + :candidates + (lambda () + (if test + (append (and (not (file-exists-p helm-pattern)) + (not (helm-ff--invalid-tramp-name-p helm-pattern)) + (list (helm-ff-filter-candidate-one-by-one + helm-pattern nil t))) + (cl-loop with hn = (helm-ff--tramp-hostnames) + ;; helm-find-files-get-candidates is + ;; returning a list of cons cells. + for (d . r) in (helm-find-files-get-candidates + must-match) + when (or (member r hn) ; A tramp host + (funcall test r)) ; Test ok + collect (cons d r))) + (helm-find-files-get-candidates must-match))) + :update (lambda () + (remhash helm-ff-default-directory + helm-ff--list-directory-cache)) + :match-on-real t + :filtered-candidate-transformer '(helm-ff-fct + helm-ff-maybe-show-thumbnails + helm-ff-sort-candidates) + :persistent-action-if persistent-action-if + :persistent-help persistent-help + :volatile t + :keymap helm-read-file-map + :must-match must-match + :cleanup 'helm-find-files-cleanup + :nomark nomark + :action action-fn))) + ;; Helm result. + (result (helm + :sources (if helm-mode-reverse-history + (reverse src-list) src-list) + :input (if (string-match helm-ff-url-regexp initial-input) + initial-input + (expand-file-name initial-input)) + :prompt prompt + :candidate-number-limit candidate-number-limit + :resume 'noresume + :case-fold-search case-fold + :default default + :buffer buffer + :full-frame nil + :preselect preselect))) + (or + (cond ((and result (stringp result) + (string= result "") "")) + ((and result + (stringp result) + (file-equal-p result initial-input) + helm-read-file-name-use-default-arg-behavior + default) + (if (listp default) (car default) default)) + ((and result (listp result)) + (mapcar #'expand-file-name result)) + ((and result (file-directory-p result)) + (file-name-as-directory (expand-file-name result))) + (result (expand-file-name result))) + (helm-mode--keyboard-quit)))) + +(defun helm-mode--default-filename (fname dir initial) + (unless dir (setq dir default-directory)) + (unless (file-name-absolute-p dir) + (setq dir (expand-file-name dir))) + (unless (or fname (consp fname)) + (setq fname (expand-file-name + (or initial buffer-file-name dir) + dir))) + (if (and fname (consp fname)) + (setq fname (cl-loop for f in fname + collect (if (file-name-absolute-p fname) + (expand-file-name + f (helm-mode-root-dir dir)) + (expand-file-name fname dir)))) + (if (file-name-absolute-p fname) + (if (file-remote-p fname) + fname + (substitute-in-file-name + (concat (helm-mode-root-dir dir) fname))) + (expand-file-name fname dir)))) + +(defun helm-mode-root-dir (dir) + (if (file-remote-p dir) + (let* ((host (file-remote-p dir 'host)) + (method (file-remote-p dir 'method)) + (user (file-remote-p dir 'user))) + (format "/%s:%s@%s:/" method user host)) + "/")) + +(cl-defun helm--generic-read-file-name + (prompt &optional dir default-filename mustmatch initial predicate) + "Generic helm replacement of `read-file-name'. +Don't use it directly, use instead `helm-read-file-name' in your programs." + (let* ((init (or initial dir default-directory)) + (helm-read-file-name-use-default-arg-behavior t) + (current-command (or (helm-this-command) this-command)) + (str-command (if current-command + (helm-symbol-name current-command) + "read-file-name")) + (helm--file-completion-sources + (cons str-command + (remove str-command helm--file-completion-sources))) + (buf-name (format "*helm-mode-%s*" str-command)) + (entry (assq current-command + helm-completing-read-handlers-alist)) + (def-com (helm-mode--get-default-handler-for 'file entry)) + (str-defcom (and def-com (helm-symbol-name def-com))) + ;; Don't modify the original args list for emacs generic functions. + (def-args (list prompt dir default-filename mustmatch initial predicate)) + ;; Append the two extra args needed to set the buffer and source name + ;; in helm specialized functions. + (others-args (append def-args (list str-command buf-name))) + (reading-directory (eq predicate 'file-directory-p)) + (use-dialog (and (next-read-file-uses-dialog-p) + ;; Graphical file dialogs can't handle + ;; remote files. + (not (file-remote-p init)) + use-file-dialog)) + helm-completion-mode-start-message ; Be quiet + helm-completion-mode-quit-message ; Same here + add-to-history fname) + ;; Build `default-filename' with `dir'+`initial' when + ;; `default-filename' is not specified. + ;; See `read-file-name' docstring for more infos. + (setq default-filename (helm-mode--default-filename + default-filename dir initial)) + ;; Some functions that normally call `completing-read' can switch + ;; brutally to `read-file-name' (e.g find-tag), in this case + ;; the helm specialized function will fail because it is build + ;; for `completing-read', so set it to 'incompatible to be sure + ;; we switch to `helm-read-file-name' and don't try to call it + ;; with wrong number of args. + (when (eq def-com 'ido) + (setq def-com 'ido-read-file-name)) + (when (and def-com (> (length (help-function-arglist def-com)) 8)) + (setq def-com 'incompatible)) + (unless (or (not entry) def-com) + (cl-return-from helm--generic-read-file-name + (unwind-protect + (progn + (helm-mode -1) + (apply read-file-name-function def-args)) + (helm-mode 1)))) + ;; If we use now `read-file-name' or dialog we MUST turn off `helm-mode' + ;; to avoid infinite recursion and CRASH. It will be reenabled on exit. + (when (or (memq def-com '(read-file-name ido-read-file-name)) + use-dialog + (and (stringp str-defcom) + (not (string-match "^helm" str-defcom)))) + (helm-mode -1)) + (unwind-protect + (setq fname + (cond (use-dialog + (let ((dialog-mustmatch + (not (memq mustmatch + '(nil confirm confirm-after-completion))))) + ;; Dialogs don't support a list of default fnames. + (when (and default-filename (consp default-filename)) + (setq default-filename + (expand-file-name (car default-filename) init))) + (setq add-to-history t) + (x-file-dialog prompt init default-filename + dialog-mustmatch + reading-directory))) + ;; A specialized function exists, run it + ;; with the two extra args specific to helm. + ;; Note that the helm handler should ensure + ;; :initial-input is not nil i.e. Use init + ;; which fallback to default-directory instead + ;; of INITIAL. + ((and def-com helm-mode + (not (eq def-com 'ido-read-file-name)) + (not (eq def-com 'incompatible)) + ;; The entry in + ;; `helm-completing-read-handlers-alist' is + ;; a cons cell specifying a completing-read + ;; and a read-file-name handler default + ;; e.g. (foo (default default)). + (not (eq def-com 'helm-read-file-name))) + (apply def-com others-args)) + (;; Def-com value is `ido-read-file-name' + ;; run it with default args. + (and def-com (eq def-com 'ido-read-file-name)) + (ido-mode 1) + (apply def-com def-args)) + (;; Def-com value is `read-file-name' + ;; run it with default args. + (eq def-com 'read-file-name) + (apply def-com def-args)) + (t ; Fall back to classic `helm-read-file-name'. + (helm-read-file-name + prompt + :name str-command + :buffer buf-name + :default default-filename + ;; Helm handlers should always have a non nil INITIAL arg. + :initial-input (if (string-match helm-ff-url-regexp init) + init + (if (file-name-absolute-p init) + (if (file-remote-p init) + init + (substitute-in-file-name + (concat (helm-mode-root-dir + (or dir init)) + init))) + (expand-file-name init dir))) + :alistp nil + :nomark (null helm-comp-read-use-marked) + :marked-candidates helm-comp-read-use-marked + :must-match mustmatch + :test predicate + :noret reading-directory)))) + (and ido-mode (ido-mode -1)) + (helm-mode 1) + ;; Same comment as in `helm--completing-read-default'. + (setq this-command current-command)) + (when add-to-history + (add-to-history 'file-name-history + (minibuffer-maybe-quote-filename fname))) + (if (and + ;; Using `read-directory-name'. + reading-directory + ;; `file-name-as-directory' return "./" when FNAME is + ;; empty string. + (not (string= fname ""))) + (file-name-as-directory fname) + fname))) + +;; Read file name handler with history (Bug#1652) +(defun helm-read-file-name-handler-1 (prompt dir default-filename + mustmatch initial predicate + name buffer) + "A `read-file-name' handler with history. +Can be added to `helm-completing-read-handlers-alist' for functions +that need a `read-file-name' function with directory history. +The `helm-find-files' history `helm-ff-history' is used here." + (let ((helm-always-two-windows t) + (helm-split-window-default-side + (if (eq helm-split-window-default-side 'same) + 'below helm-split-window-default-side)) + helm-reuse-last-window-split-state + ;; Helm handlers should always have a non nil INITIAL arg. + (init (or initial dir default-directory))) + (helm-read-file-name + prompt + :name name + :history helm-ff-history + :buffer buffer + :default default-filename + :initial-input (expand-file-name init dir) + :alistp nil + :must-match mustmatch + :test predicate))) + + +;;; Completion in region and Helm style +;; +(defun helm-mode--advice-lisp--local-variables (old--fn &rest args) + (ignore-errors + (apply old--fn args))) + +(defvar helm-completion--sorting-done nil + "Flag that notifies the FCT if sorting has been done in completion function.") +(defun helm-completion-in-region-sort-fn (candidates _source) + "Default sort function for completion-in-region." + (if helm-completion--sorting-done + candidates + (sort candidates 'helm-generic-sort-fn))) + +(defun helm-mode--completion-in-region-initial-input (str) + "Highlight prefix in helm and helm-fuzzy `helm-completion-styles'." + (if (memq helm-completion-style '(helm helm-fuzzy)) + (propertize str 'read-only t 'face 'helm-mode-prefix 'rear-nonsticky t) + str)) + +(defun helm-completion--initial-filter (comps afun afix category) + "Compute COMPS with function AFIX or AFUN. + +When CATEGORY is file or library remove dot files from COMPS. + +If both AFUN and AFIX are provided, AFIX takes precedence. + +When AFUN, AFIX are nil and CATEGORY is not file return COMPS unmodified." + ;; Normally COMPS should be a list of + ;; string but in some cases it is given as a list of strings containing a list + ;; of string e.g. ("a" "b" "c" ("d" "e" "f")) ; This happen in rgrep + ;; (bug#2607) and highlight-* fns (bug #2610), so ensure the list is flattened to + ;; avoid e.g. wrong-type argument: stringp '("d" "e" "f") + ;; FIXME: If this create a new bug with completion-in-region, flatten COMPS + ;; directly in the caller i.e. helm-completing-read-default-1. + (when (or afix afun (memq category '(file library))) + (setq comps (helm-fast-remove-dups + (helm-flatten-list comps) + :test 'equal))) + ;; Filter out dot files in file completion. + ;; We were previously exiting directly without handling afix and afun, but + ;; maybe some file completion tables have an afix or afun in their metadata so + ;; let them a chance to run these functions if some. + (when (memq category '(file library)) + (setq comps + (cl-loop for f in comps + unless (string-match "\\`\\.\\{1,2\\}/\\'" f) + collect f))) + (cond (afix (let ((affixations (funcall afix comps))) + (if (functionp affixations) + (cl-loop for comp in comps + for cand = (funcall affixations comp) + when cand + collect (cons (propertize (concat (nth 1 cand) ;prefix + (nth 0 cand) ;comp + (nth 2 cand)) ;suffix + 'match-part (nth 0 cand)) + comp)) + (cl-loop for (comp prefix suffix) in affixations + collect (cons (propertize + (concat prefix comp suffix) + 'match-part comp) + comp))))) + (afun + ;; Add annotation at end of + ;; candidate if needed, e.g. foo, this happen when + ;; completing against a quoted symbol. + (mapcar (lambda (s) + (let ((ann (funcall afun s))) + (or (helm-aand + ann + (propertize ann 'face 'helm-completions-annotations) + (cons (concat s (propertize " " 'display it)) s)) + s))) + comps)) + (t comps))) + +;; Helm multi matching style + +(defun helm-completion-try-completion (string table pred point) + "The try completion function for `completing-styles-alist'. +Actually does nothing." + ;; AFAIU the try-completions style functions + ;; are here to check if what is at point is suitable for TABLE but + ;; there is no way to pass a multiple pattern from what is at point + ;; apart sending STRING in a minibuffer like helm does. Perhaps + ;; minibuffer-complete should benefit of this but for now just do + ;; nothing as this is used nowhere. It is anyway not clear what the + ;; try-completions functions do in emacs so just do nothing for now. + (ignore string table pred point)) + +(defun helm-completion-all-completions (string table pred point) + "The all completions function for `completing-styles-alist'." + (cl-multiple-value-bind (all _pattern prefix _suffix _carbounds) + (helm-completion--multi-all-completions string table pred point) + (when all (nconc all (length prefix))))) + +(defun helm-completion--multi-all-completions-1 (string collection &optional predicate) + "Allow `all-completions' multi matching on its candidates." + ;; Doing an initial call of all-completions on the first element of + ;; STRING speedup completion and fix file completion when CAPF + ;; returns relative paths to initial pattern (eshell and shell). + (let* ((split (helm-mm-split-pattern string)) + (fpat (or (car split) "")) + (file-comp-p (or minibuffer-completing-file-name + (eq + (completion-metadata-get + (completion-metadata string collection predicate) + 'category) + 'file))) + (all (and file-comp-p + (or (cdr split) + (and (not (cdr split)) + ;; Kickin when STRING is a simple string. + ;; Handle as well "foo " (space at end). + (not (string= fpat ""))) + (string= string "")) + (not (string-match "\\`!" fpat)) + ;; all-completions should return nil if FPAT is a + ;; regexp, it is what we expect. + (all-completions fpat collection + (lambda (x &optional _y) + (let ((elm (if (listp x) (car x) x))) + (funcall (or predicate #'identity) elm)))))) + (pattern (helm-aand all (string-match " " string) + ;; Returns the part of STRING after space + ;; e.g. "foo bar baz" => "bar baz". + (substring string (1+ it))))) + (if (or (and all (not (cdr split))) + (equal pattern "")) ; e.g. STRING == "foo ". + all + (all-completions "" (or all collection) + (lambda (x &optional _y) + ;; Second arg _y is needed when + ;; COLLECTION is a hash-table (Bug#2231) + ;; (C-x 8 RET). + ;; Elements of COLLECTION may be + ;; lists or alists, in this case consider the + ;; car of element (Bug#2219 org-refile). + (let ((elm (if (listp x) (car x) x))) + ;; PREDICATE have been already called in + ;; initial all-completions, no need to call + ;; it a second time, thus ALL is now a list + ;; of strings maybe not supported by + ;; PREDICATE (e.g. symbols vs strings). + (if (and predicate (null all)) + (and (funcall predicate elm) + ;; ALL is nil so use whole STRING + ;; against COLLECTION. + (helm-mm-match (helm-stringify elm) string)) + (helm-mm-match (helm-stringify elm) + (or (and all pattern) string))))))))) + +(defun helm-completion--multi-all-completions (string table pred point) + "Collect completions from TABLE for helm completion style." + (let* ((beforepoint (substring string 0 point)) + (afterpoint (substring string point)) + (bounds (completion-boundaries beforepoint table pred afterpoint)) + (prefix (substring beforepoint 0 (car bounds))) + (suffix (substring afterpoint (cdr bounds))) + (all (helm-completion--multi-all-completions-1 + ;; Using `regexp-quote' on STRING fixes bug#2355 but + ;; breaks regexp matching in multi match, actually with + ;; Helm-3.7.1 and emacs-27+ it seems using plain STRING + ;; works for both so use it. + ;;(regexp-quote string) + string table pred))) + (list all string prefix suffix point))) + +;; The adjust-metadata functions run only in emacs-27, they are NOT +;; used otherwise. +(defun helm-completion--adjust-metadata (metadata) + (if (memq helm-completion-style '(helm helm-fuzzy)) + metadata + (let ((compose-helm-sort-fn + (lambda (candidates) + (sort candidates #'helm-generic-sort-fn)))) + `(metadata + (display-sort-function + . ,compose-helm-sort-fn) + (cycle-sort-function + . ,compose-helm-sort-fn) + ,@(cdr metadata))))) +(put 'helm 'completion--adjust-metadata 'helm-completion--adjust-metadata) + +;; Helm-flex style. +;; This is more or less the same as emacs-27 flex style. +(defun helm-flex-completion-try-completion (string table pred point) + "The try completion function for `completing-styles-alist'." + ;; It is needed here to make minibuffer-complete work in emacs-26, + ;; e.g. with regular M-x. + (unless (string-match-p " " string) + (cl-multiple-value-bind (all pattern prefix suffix _carbounds) + (helm-completion--flex-all-completions string table pred point) + (when minibuffer-completing-file-name + (setq all (completion-pcm--filename-try-filter all))) + (completion-pcm--merge-try pattern all prefix suffix)))) + +(defun helm-flex-completion-all-completions (string table pred point) + "The all completions function for `completing-styles-alist'." + ;; FIXME: No need to bind all these value. + (unless (string-match-p " " string) + (cl-multiple-value-bind (all pattern prefix _suffix _carbounds) + (helm-completion--flex-all-completions + string table pred point + #'helm-completion--flex-transform-pattern) + (let ((regexp (completion-pcm--pattern->regex pattern 'group))) + (when all (nconc (helm-flex-add-score-as-prop all regexp) + (length prefix))))))) + +;; Same as emacs-27 completion-substring--all-completions. +(defun helm-completion--flex-all-completions + (string table pred point &optional transform-pattern-fn) + "Match the presumed substring STRING to the entries in TABLE. +Respect PRED and POINT. The pattern used is a PCM-style substring +pattern, but it will be massaged by TRANSFORM-PATTERN-FN, if that +is non-nil." + (let* ((beforepoint (substring string 0 point)) + (afterpoint (substring string point)) + (bounds (completion-boundaries beforepoint table pred afterpoint)) + (suffix (substring afterpoint (cdr bounds))) + (prefix (substring beforepoint 0 (car bounds))) + (basic-pattern (completion-basic--pattern + beforepoint afterpoint bounds)) + (pattern (if (not (stringp (car basic-pattern))) + basic-pattern + (cons 'prefix basic-pattern))) + (pattern (if transform-pattern-fn + (funcall transform-pattern-fn pattern) + pattern)) + (all (completion-pcm--all-completions prefix pattern table pred))) + (list all pattern prefix suffix (car bounds)))) + +(defun helm-completion-in-region--selection () + (with-helm-buffer + (setq helm-saved-selection (helm-get-selection nil 'withprop)))) + +;; Completion-in-region-function + +(defvar helm--completing-region nil + "[INTERNAL] flag let-bounded to nil when completing in region.") + +(defun helm--completion-in-region (origfun start end collection &optional predicate) + "Helm replacement of `completion--in-region'. + +Can be used for `completion-in-region-function' by advicing it with an +:around advice to allow passing the old +`completion-in-region-function' value in ORIGFUN." + (cl-declare (special require-match prompt)) + (if (memq major-mode helm-mode-no-completion-in-region-in-modes) + (funcall origfun start end collection predicate) + (advice-add + 'lisp--local-variables + :around #'helm-mode--advice-lisp--local-variables) + (let ((old--helm-completion-style helm-completion-style) + (exit-fun (plist-get completion-extra-properties :exit-function)) + ;; Always start with prefix to allow completing without + ;; the need of inserting a space after cursor or + ;; relaying on crap old completion-styles emacs22 which + ;; add suffix after prefix. e.g. def|else. + (initial-input (buffer-substring-no-properties start (point))) + string) + (helm-aif (cdr (assq major-mode helm-completion-styles-alist)) + (customize-set-variable 'helm-completion-style + (if (cdr-safe it) (car it) it))) + ;; This hook force usage of the display part of candidate with + ;; its properties, this is needed for lsp-mode in its + ;; :exit-function see Bug#2265. + (add-hook 'helm-before-action-hook 'helm-completion-in-region--selection) + (unwind-protect + (let* ((enable-recursive-minibuffers t) + (completion-flex-nospace t) + (helm--completing-region t) + (completion-styles (helm--prepare-completion-styles)) + (input (buffer-substring-no-properties start end)) + (prefix (and (eq helm-completion-style 'emacs) initial-input)) + (point (point)) + (current-command (or (helm-this-command) + this-command + ;; Some backends are async and + ;; use a callback, in those + ;; cases, we can't retrieve from + ;; frames the last interactive + ;; command, so fallback to + ;; `last-command' which may be + ;; the one that called the callback. + last-command)) + (crm (eq current-command 'crm-complete)) + (str-command (helm-symbol-name current-command)) + (buf-name (format "*helm-mode-%s*" str-command)) + (require-match (or (and (boundp 'require-match) require-match) + minibuffer-completion-confirm + ;; If prompt have not been propagated here, that's + ;; probably mean we have no prompt and we are in + ;; completion-at-point or friend, so use a non--nil + ;; value for require-match. + (not (boundp 'prompt)))) + (metadata (completion-metadata input collection predicate)) + ;; `completion-extra-properties' is let-bounded in `completion-at-point'. + ;; `afun' is a closure to call against each string in `data'. + ;; it provide the annotation info for each string. + ;; e.g "foo" => "foo " where foo is a function. + ;; See Bug#407. + (afun (or (plist-get completion-extra-properties :annotation-function) + (completion-metadata-get metadata 'annotation-function))) + ;; Not sure if affixations are provided in + ;; completion-in-region, try anyway never know. + (afix (or (plist-get completion-extra-properties :affixation-function) + (completion-metadata-get metadata 'affixation-function))) + (init-space-suffix (unless (or (memq helm-completion-style '(helm-fuzzy emacs)) + (string-suffix-p " " input) + (string= input "")) + " ")) + (category (or (eq (completion-metadata-get metadata 'category) 'file) + (eq (plist-get completion-extra-properties :category) 'file))) + (file-comp-p (or (eq category 'file) + (helm-guess-filename-at-point))) + ;; `completion-all-completions' store the base-size in the last `cdr', + ;; so data looks like this: '(a b c d . 0) and (last data) == (d . 0). + base-size + (compfn (lambda (str _predicate _action) + (let* ((completion-ignore-case (helm-set-case-fold-search)) + (comps + (completion-all-completions + str ; This is helm-pattern + collection + predicate + ;; Use prefix length at first call to + ;; allow styles matching + ;; "prefix*suffix" to kick in. + (length (or prefix str)) + metadata)) + (last-data (last comps)) + (bs (helm-aif (cdr last-data) + (prog1 it + ;; Remove the last element of + ;; comps by side-effect. + (setcdr last-data nil)) + 0)) + ;; Helm syle sort fn is added to + ;; metadata only in emacs-27, so in + ;; emacs-26 use helm-generic-sort-fn + ;; which handle both helm and + ;; helm-flex styles. When + ;; helm-completion-style is helm or + ;; helm-fuzzy, sorting will be done + ;; later in FCT. + (sort-fn + (and (eq helm-completion-style 'emacs) + (or + ;; Emacs-27 + (completion-metadata-get + metadata 'display-sort-function) + ;; Emacs-26 + (lambda (candidates) + (sort candidates #'helm-generic-sort-fn))))) + all) + ;; Reset prefix to allow using length of + ;; helm-pattern on next calls (this avoid + ;; args-out-of-range error). + (and prefix (setq prefix nil)) + ;; base-size needs to be set only once at + ;; first call. + (unless base-size (setq base-size bs)) + (setq helm-completion--sorting-done (and sort-fn t)) + (setq all (copy-sequence comps)) + (helm-completion--initial-filter + (if (and sort-fn (> (length str) 0)) + (funcall sort-fn all) + all) + afun afix category)))) + (data (if (memq helm-completion-style '(helm helm-fuzzy)) + (funcall compfn input nil nil) + compfn)) + (result (if (stringp data) + data + (helm-comp-read + ;; Completion-at-point and friends have no prompt. + (or (and (boundp 'prompt) prompt) "Pattern: ") + data + :name str-command + :nomark (null crm) + :marked-candidates crm + :initial-input + (cond ((and file-comp-p + (not (string-match "/\\'" initial-input))) + (concat (helm-mode--completion-in-region-initial-input + (if (memq helm-completion-style '(helm helm-fuzzy)) + (helm-basename initial-input) + initial-input)) + init-space-suffix)) + ((string-match "/\\'" initial-input) + (and (eq helm-completion-style 'emacs) initial-input)) + ((or (null require-match) + (stringp require-match)) + (helm-mode--completion-in-region-initial-input initial-input)) + (t (concat (helm-mode--completion-in-region-initial-input initial-input) + init-space-suffix))) + :buffer buf-name + :fc-transformer + ;; Ensure sort fn is at the end. + (append '(helm-cr-default-transformer) + (and helm-completion-in-region-default-sort-fn + (list helm-completion-in-region-default-sort-fn))) + :match-dynamic (eq helm-completion-style 'emacs) + :fuzzy (eq helm-completion-style 'helm-fuzzy) + :exec-when-only-one t + :keymap helm-comp-in-region-map + :quit-when-no-cand + (lambda () + ;; Delay message to overwrite "Quit". + (run-with-timer + 0.01 nil + (lambda () + (message "[No matches]"))) + t) ; exit minibuffer immediately. + :must-match require-match)))) + ;; `helm-completion-in-region--insert-result' is stripping + ;; out properties on RESULT by side-effect (perhaps + ;; `choose-completion-string'?) so make a copy of STRING + ;; to not loose props. + (setq string (copy-sequence result)) + (helm-completion-in-region--insert-result + result start point end base-size)) + ;; Allow running extra property `:exit-function' (Bug#2265, + ;; Bug#2356). Function is called with 'exact if the return value of + ;; `try-completion' is a string (possibly a directory Bug#2274 if the + ;; string ends with /), otherwise it is always called with 'finished. + ;; However it is still not clear what to use, the documentation on this + ;; beeing really bad (bug#2646). + (when (and (stringp string) exit-fun) + (funcall exit-fun string + (helm-acase (try-completion initial-input collection predicate) + ;; FIXME: Should I limit 'exact only for strings ending + ;; with / ? + ((guard (stringp it)) 'exact) + (t 'finished)))) + (remove-hook 'helm-before-action-hook 'helm-completion-in-region--selection) + (customize-set-variable 'helm-completion-style old--helm-completion-style) + (setq helm-completion--sorting-done nil) + (advice-remove 'lisp--local-variables + #'helm-mode--advice-lisp--local-variables))))) + +(defvar helm-crm-default-separator "," + "Default separator for `completing-read-multiple'. + +`crm-separator' will take precedence on this when it is a string composed +of a single character. +If used globally, it is a string composed of a single character, +if let-bounded, it can be also nil or a symbol which mean no +separator. Don't set this to a string composed of more than one +character. +Be sure to know what you are doing when modifying this.") +(defun helm-completion-in-region--insert-result (result start point end base-size) + (cond ((stringp result) + ;; When RESULT have annotation, annotation is displayed + ;; in it with a display property attached to a space + ;; added at end of string, take care of removing this + ;; space (Bug#2360). However keep RESULT intact to + ;; pass it to `:exit-function' i.e. Don't store the + ;; modified string in STRING. + (choose-completion-string + (replace-regexp-in-string " \\'" "" result) + (current-buffer) + (list (+ start base-size) point) + completion-list-insert-choice-function) + (when helm-completion-mark-suffix + (run-with-idle-timer 0.01 nil + (lambda () + (helm-aand + (+ (- (point) point) end) + (and (> it (point)) it) + (push-mark it t t)))))) + ((consp result) ; crm. + (let ((beg (+ start base-size)) + (sep (or (and + ;; If `crm-separator' is a string of length 1 + ;; assume it can be used as separator (Bug#2298), + ;; otherwise it is a regexp and use the value + ;; it matches or default to "," if no match. + (eq (length crm-separator) 1) + crm-separator) + helm-crm-default-separator))) + ;; Try to find a default separator. If `crm-separator' is a + ;; regexp use the string the regexp is matching. + ;; If SEP is not a string, it have been probably bound to a + ;; symbol or nil through `helm-crm-default-separator' that serve + ;; as a flag to say "Please no separator" (Bug#2353 with + ;; `magit-completing-read-multiple'). + (if (stringp sep) + (save-excursion + (goto-char beg) + (when (looking-back crm-separator (1- (point))) + (setq sep (match-string 0)))) + (setq sep nil)) + (funcall completion-list-insert-choice-function + beg end (mapconcat 'identity (append result '("")) sep)))) + (t nil))) + +(defun helm-mode--disable-ido-maybe (&optional from-hook) + (when (and (boundp 'ido-everywhere) ido-everywhere) + (remove-function read-file-name-function #'ido-read-file-name) + (remove-function read-buffer-function #'ido-read-buffer) + (setq ido-everywhere nil) + (if from-hook + (user-error "Unable to turn on Ido-everywhere while Helm-mode is enabled") + (user-error "Helm-mode enabled (Ido-everywhere is incompatible with Helm-mode, disabling it)")))) + +(defun helm-mode--ido-everywhere-hook () + ;; Called only when user calls directly ido-everywhere + ;; and helm-mode is enabled. + (when helm-mode + (helm-mode--disable-ido-maybe t))) + +;;;###autoload +(define-minor-mode helm-mode + "Toggle generic helm completion. + +All functions in Emacs that use `completing-read', +`read-file-name', `completion-in-region' and friends will use helm +interface when this mode is turned on. + +However you can modify this behavior for functions of your choice +with `helm-completing-read-handlers-alist'. + +Called with a positive arg, turn on unconditionally, with a +negative arg turn off. +You can toggle it with M-x `helm-mode'. + +About `ido-mode': +DO NOT enable `ido-everywhere' when using `helm-mode'. Instead of +using `ido-mode', add the commands where you want to use ido to +`helm-completing-read-handlers-alist' with `ido' as value. + +Note: This mode is incompatible with Emacs23." + :group 'helm-mode + :global t + :lighter helm-completion-mode-string + (cl-assert (boundp 'completing-read-function) nil + "`helm-mode' not available, upgrade to Emacs-24") + (if helm-mode + (progn + (add-function :override completing-read-function + #'helm--completing-read-default) + (add-function :override read-file-name-function + #'helm--generic-read-file-name) + (add-function :override read-buffer-function + #'helm--generic-read-buffer) + (when helm-mode-handle-completion-in-region + (add-function :around completion-in-region-function + #'helm--completion-in-region)) + ;; If user have enabled ido-everywhere BEFORE enabling + ;; helm-mode disable it and warn user about its + ;; incompatibility with helm-mode (Bug#2085). + (helm-mode--disable-ido-maybe) + ;; If ido-everywhere is not enabled yet anticipate and + ;; disable it if user attempt to enable it while helm-mode + ;; is running (Bug#2085). + (add-hook 'ido-everywhere-hook #'helm-mode--ido-everywhere-hook) + (when (fboundp 'ffap-read-file-or-url-internal) + ;; `ffap-read-file-or-url-internal' have been removed in + ;; emacs-27 and `ffap-read-file-or-url' is fixed, so no need + ;; to advice it. + (advice-add 'ffap-read-file-or-url :override #'helm-advice--ffap-read-file-or-url)) + (advice-add 'read-buffer-to-switch :override #'helm-mode--read-buffer-to-switch) + (helm-minibuffer-history-mode 1)) + (progn + (remove-function completing-read-function #'helm--completing-read-default) + (remove-function read-file-name-function #'helm--generic-read-file-name) + (remove-function read-buffer-function #'helm--generic-read-buffer) + (remove-function completion-in-region-function #'helm--completion-in-region) + (remove-hook 'ido-everywhere-hook #'helm-mode--ido-everywhere-hook) + (when (fboundp 'ffap-read-file-or-url-internal) + (advice-remove 'ffap-read-file-or-url #'helm-advice--ffap-read-file-or-url)) + (advice-remove 'read-buffer-to-switch #'helm-mode--read-buffer-to-switch) + (helm-minibuffer-history-mode -1)))) + +(provide 'helm-mode) + +;;; helm-mode.el ends here diff --git a/code/elpa/helm-20240320.541/helm-net.el b/code/elpa/helm-20240320.541/helm-net.el new file mode 100644 index 0000000..a0ad9c8 --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-net.el @@ -0,0 +1,436 @@ +;;; helm-net.el --- helm browse url and search web. -*- lexical-binding: t -*- + +;; Copyright (C) 2012 ~ 2023 Thierry Volpiatto + +;; 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 'helm) +(require 'helm-help) +(require 'url) +(require 'xml) +(require 'browse-url) + +(declare-function helm-comp-read "helm-mode") + + +(defgroup helm-net nil + "Net related applications and libraries for Helm." + :group 'helm) + +(defcustom helm-google-suggest-default-browser-function nil + "The browse url function you prefer to use with Google suggest. +When nil, use the first browser function available +See `helm-browse-url-default-browser-alist'." + :group 'helm-net + :type 'symbol) + +(defcustom helm-home-url "https://www.google.com" + "Default url to use as home url." + :group 'helm-net + :type 'string) + +(defcustom helm-surfraw-default-browser-function nil + "The browse url function you prefer to use with surfraw. +When nil, fallback to `browse-url-browser-function'." + :group 'helm-net + :type 'symbol) + +(defcustom helm-google-suggest-url + "https://encrypted.google.com/complete/search?output=toolbar&q=%s" + "URL used for looking up Google suggestions. +This is a format string, don't forget the `%s'." + :type 'string + :group 'helm-net) + +(defcustom helm-google-suggest-search-url + "https://encrypted.google.com/search?ie=utf-8&oe=utf-8&q=%s" + "URL used for Google searching. +This is a format string, don't forget the `%s'." + :type 'string + :group 'helm-net) + +(defvaralias 'helm-google-suggest-use-curl-p 'helm-net-prefer-curl) +(make-obsolete-variable 'helm-google-suggest-use-curl-p 'helm-net-prefer-curl "1.7.7") + +(defcustom helm-net-prefer-curl nil + "When non--nil use CURL external program to fetch data. +Otherwise `url-retrieve-synchronously' is used." + :type 'boolean + :group 'helm-net) + +(defcustom helm-surfraw-duckduckgo-url + "https://duckduckgo.com/lite/?q=%s&kp=1" + "The Duckduckgo url. +This is a format string, don't forget the `%s'. +If you have personal settings saved on duckduckgo you should have +a personal url, see your settings on duckduckgo." + :type 'string + :group 'helm-net) + +(defcustom helm-search-suggest-action-wikipedia-url + "https://en.wikipedia.org/wiki/Special:Search?search=%s" + "The Wikipedia search url. +This is a format string, don't forget the `%s'." + :type 'string + :group 'helm-net) + +(defcustom helm-search-suggest-action-youtube-url + "https://www.youtube.com/results?aq=f&search_query=%s" + "The Youtube search url. +This is a format string, don't forget the `%s'." + :type 'string + :group 'helm-net) + +(defcustom helm-search-suggest-action-imdb-url + "http://www.imdb.com/find?s=all&q=%s" + "The IMDb search url. +This is a format string, don't forget the `%s'." + :type 'string + :group 'helm-net) + +(defcustom helm-search-suggest-action-google-maps-url + "https://maps.google.com/maps?f=q&source=s_q&q=%s" + "The Google Maps search url. +This is a format string, don't forget the `%s'." + :type 'string + :group 'helm-net) + +(defcustom helm-search-suggest-action-google-news-url + "https://www.google.com/search?safe=off&prmd=nvlifd&source=lnms&tbs=nws:1&q=%s" + "The Google News search url. +This is a format string, don't forget the `%s'." + :type 'string + :group 'helm-net) + +(defcustom helm-google-suggest-actions + '(("Google Search" . helm-google-suggest-action) + ("Wikipedia" . (lambda (candidate) + (helm-search-suggest-perform-additional-action + helm-search-suggest-action-wikipedia-url + candidate))) + ("Youtube" . (lambda (candidate) + (helm-search-suggest-perform-additional-action + helm-search-suggest-action-youtube-url + candidate))) + ("IMDb" . (lambda (candidate) + (helm-search-suggest-perform-additional-action + helm-search-suggest-action-imdb-url + candidate))) + ("Google Maps" . (lambda (candidate) + (helm-search-suggest-perform-additional-action + helm-search-suggest-action-google-maps-url + candidate))) + ("Google News" . (lambda (candidate) + (helm-search-suggest-perform-additional-action + helm-search-suggest-action-google-news-url + candidate)))) + "List of actions for google suggest sources." + :group 'helm-net + :type '(alist :key-type string :value-type function)) + +(defcustom helm-browse-url-firefox-new-window "--new-tab" + "Allow choosing to browse url in new window or new tab. +Can be \"--new-tab\" (default), \"--new-window\" or \"--private-window\"." + :group 'helm-net + :type '(radio + (const :tag "New tab" "--new-tab") + (const :tag "New window" "--new-window") + (const :tag "New private window" "--private-window"))) + +(defcustom helm-net-curl-switches '("-s" "-L") + "Arguments list passed to curl when using `helm-net-prefer-curl'." + :group 'helm-net + :type '(repeat string)) + +;;; Additional actions for search suggestions +;; +;; +;; Internal +(defvar helm-net-curl-log-file (expand-file-name "helm-curl.log" user-emacs-directory)) +(defun helm-search-suggest-perform-additional-action (url query) + "Perform the search via URL using QUERY as input." + (browse-url (format url (url-hexify-string query)))) + +(defun helm-net--url-retrieve-sync (request parser) + (if helm-net-prefer-curl + (with-temp-buffer + (apply #'call-process "curl" + nil `(t ,helm-net-curl-log-file) nil request helm-net-curl-switches) + (funcall parser)) + (with-current-buffer (url-retrieve-synchronously request) + (funcall parser)))) + + +;;; Google Suggestions +;; +;; +(defun helm-google-suggest-parser () + (cl-loop + with result-alist = (xml-get-children + (car (xml-parse-region + (point-min) (point-max))) + 'CompleteSuggestion) + for i in result-alist collect + (cdr (cl-caadr (assq 'suggestion i))))) + +(defun helm-google-suggest-fetch (input) + "Fetch suggestions for INPUT from XML buffer." + (let ((request (format helm-google-suggest-url + (url-hexify-string input)))) + (helm-net--url-retrieve-sync + request #'helm-google-suggest-parser))) + +(defun helm-google-suggest-set-candidates (&optional request-prefix) + "Set candidates with result and number of Google results found." + (let ((suggestions (helm-google-suggest-fetch + (or (and request-prefix + (concat request-prefix + " " helm-pattern)) + helm-pattern)))) + (if (member helm-pattern suggestions) + suggestions + ;; if there is no suggestion exactly matching the input then + ;; prepend a Search on Google item to the list + (append + suggestions + (list (cons (format "Search for '%s' on Google" helm-input) + helm-input)))))) + +(defun helm-ggs-set-number-result (num) + (if num + (progn + (and (numberp num) (setq num (number-to-string num))) + (cl-loop for i in (reverse (split-string num "" t)) + for count from 1 + append (list i) into C + when (= count 3) + append (list ",") into C + and do (setq count 0) + finally return + (replace-regexp-in-string + "^," "" (mapconcat 'identity (reverse C) "")))) + "?")) + +(defun helm-google-suggest-action (candidate) + "Default action to jump to a Google suggested candidate." + (let ((arg (format helm-google-suggest-search-url + (url-hexify-string candidate)))) + (helm-aif helm-google-suggest-default-browser-function + (funcall it arg) + (helm-browse-url arg)))) + +(defvar helm-google-suggest-default-function + 'helm-google-suggest-set-candidates + "Default function to use in `helm-google-suggest'.") + +(defvar helm-source-google-suggest + (helm-build-sync-source "Google Suggest" + :candidates (lambda () + (funcall helm-google-suggest-default-function)) + :action 'helm-google-suggest-actions + :match-dynamic t + :keymap helm-map + :requires-pattern 3)) + +(defun helm-google-suggest-emacs-lisp () + "Try to emacs lisp complete with Google suggestions." + (helm-google-suggest-set-candidates "emacs lisp")) + + +;;; Web browser functions. +;; +;; +;; If default setting of `w3m-command' is not +;; what you want and you modify it, you will have to reeval +;; also `helm-browse-url-default-browser-alist'. + +(defvar helm-browse-url-chromium-program "chromium-browser") +(defvar helm-browse-url-uzbl-program "uzbl-browser") +(defvar helm-browse-url-nyxt-program "nyxt") +(defvar helm-browse-url-conkeror-program "conkeror") +(defvar helm-browse-url-opera-program "opera") +(defvar helm-browse-url-w3m-program (or (and (boundp 'w3m-command) w3m-command) + (executable-find "w3m"))) +(defvar helm-browse-url-default-browser-alist + '((helm-browse-url-w3m-program . w3m-browse-url) + (browse-url-firefox-program . browse-url-firefox) + (helm-browse-url-chromium-program . helm-browse-url-chromium) + (helm-browse-url-conkeror-program . helm-browse-url-conkeror) + (helm-browse-url-opera-program . helm-browse-url-opera) + (helm-browse-url-uzbl-program . helm-browse-url-uzbl) + (helm-browse-url-nyxt-program . helm-browse-url-nyxt) + (browse-url-kde-program . browse-url-kde) + (browse-url-gnome-moz-program . browse-url-gnome-moz) + (browse-url-mozilla-program . browse-url-mozilla) + (browse-url-galeon-program . browse-url-galeon) + (browse-url-netscape-program . browse-url-netscape) + (browse-url-xterm-program . browse-url-text-xterm) + ("emacs" . eww-browse-url)) + "Alist of (browse_url_variable . function) to try to find a suitable url browser.") + +(cl-defun helm-generic-browser (url cmd-name &rest args) + "Browse URL with NAME browser." + (let ((proc (concat cmd-name " " url))) + (message "Starting %s..." cmd-name) + (apply 'start-process proc nil cmd-name + (append args (list url))) + (set-process-sentinel + (get-process proc) + (lambda (process event) + (when (string= event "finished\n") + (message "%s process %s" process event)))))) + +;;;###autoload +(defun helm-browse-url-firefox (url &optional _ignore) + "Same as `browse-url-firefox' but detach from Emacs. + +So when you quit Emacs you can keep your Firefox session open and +not be prompted to kill the Firefox process. + +NOTE: Probably not supported on some systems (e.g., Windows)." + (interactive (list (read-string "URL: " (browse-url-url-at-point)) + nil)) + (setq url (browse-url-encode-url url)) + (let ((process-environment (browse-url-process-environment))) + (call-process-shell-command + (format "(%s %s %s &)" + browse-url-firefox-program + helm-browse-url-firefox-new-window + (shell-quote-argument url))))) + +;;;###autoload +(defun helm-browse-url-opera (url &optional _ignore) + "Browse URL with Opera browser and detach from Emacs. + +So when you quit Emacs you can keep your Opera session open and +not be prompted to kill the Opera process. + +NOTE: Probably not supported on some systems (e.g., Windows)." + (interactive (list (read-string "URL: " (browse-url-url-at-point)) + nil)) + (setq url (browse-url-encode-url url)) + (let ((process-environment (browse-url-process-environment))) + (call-process-shell-command + (format "(%s %s &)" + helm-browse-url-opera-program (shell-quote-argument url))))) + +;;;###autoload +(defun helm-browse-url-chromium (url &optional _ignore) + "Browse URL with Google Chrome browser." + (interactive "sURL: ") + (helm-generic-browser + url helm-browse-url-chromium-program)) + +;;;###autoload +(defun helm-browse-url-uzbl (url &optional _ignore) + "Browse URL with uzbl browser." + (interactive "sURL: ") + (helm-generic-browser url helm-browse-url-uzbl-program "-u")) + +;;;###autoload +(defun helm-browse-url-conkeror (url &optional _ignore) + "Browse URL with conkeror browser." + (interactive "sURL: ") + (helm-generic-browser url helm-browse-url-conkeror-program)) + +;;;###autoload +(defun helm-browse-url-nyxt (url &optional _ignore) + "Browse URL with nyxt browser." + (interactive "sURL: ") + (helm-generic-browser url helm-browse-url-nyxt-program)) + +(defun helm-browse-url-default-browser (url &rest args) + "Find the first available browser and ask it to load URL." + (let ((default-browser-fn + (cl-loop for (var . fn) in helm-browse-url-default-browser-alist + for exe = (if (stringp var) + var + (and (boundp var) (symbol-value var))) + thereis (and exe (executable-find exe) (fboundp fn) fn)))) + (if default-browser-fn + (apply default-browser-fn url args) + (error "No usable browser found")))) + +(defun helm-browse-url (url &rest args) + "Default command to browse URL." + (if browse-url-browser-function + (browse-url url args) + (helm-browse-url-default-browser url args))) + + +;;; Surfraw +;; +;; Need external program surfraw. +;; + +;; Internal +(defvar helm-surfraw-engines-history nil) +(defvar helm-surfraw-input-history nil) +(defvar helm-surfraw--elvi-cache nil) + +(defun helm-build-elvi-list () + "Return list of all engines and descriptions handled by surfraw." + (or helm-surfraw--elvi-cache + (setq helm-surfraw--elvi-cache + (cdr (with-temp-buffer + (call-process "surfraw" nil t nil "-elvi") + (split-string (buffer-string) "\n")))))) + +;;;###autoload +(defun helm-surfraw (pattern engine) + "Preconfigured `helm' to search PATTERN with search ENGINE." + (interactive + (list + (let* ((default (if (use-region-p) + (buffer-substring-no-properties + (region-beginning) (region-end)) + (thing-at-point 'symbol))) + (prompt (if default + (format "SearchFor (default %s): " default) + "SearchFor: "))) + (read-string prompt nil 'helm-surfraw-input-history default)) + (helm-comp-read + "Engine: " + (helm-build-elvi-list) + :must-match t + :name "Surfraw Search Engines" + :history 'helm-surfraw-engines-history))) + (let* ((engine-nodesc (car (split-string engine))) + (url (if (string= engine-nodesc "duckduckgo") + ;; "sr duckduckgo -p foo" is broken, workaround. + (format helm-surfraw-duckduckgo-url + (url-hexify-string pattern)) + (with-temp-buffer + (apply 'call-process "surfraw" nil t nil + (append (list engine-nodesc "-p") (split-string pattern))) + (replace-regexp-in-string + "\n" "" (buffer-string))))) + (browse-url-browser-function (or helm-surfraw-default-browser-function + browse-url-browser-function))) + (if (string= engine-nodesc "W") + (helm-browse-url helm-home-url) + (helm-browse-url url)))) + +;;;###autoload +(defun helm-google-suggest () + "Preconfigured `helm' for Google search with Google suggest." + (interactive) + (helm-other-buffer 'helm-source-google-suggest "*helm google*")) + +(provide 'helm-net) + +;;; helm-net.el ends here diff --git a/code/elpa/helm-20240320.541/helm-occur.el b/code/elpa/helm-20240320.541/helm-occur.el new file mode 100644 index 0000000..21be121 --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-occur.el @@ -0,0 +1,894 @@ +;;; helm-occur.el --- Incremental Occur for Helm. -*- lexical-binding: t -*- + +;; Copyright (C) 2012 ~ 2023 Thierry Volpiatto + +;; 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 'helm) +(require 'helm-help) +(require 'helm-utils) + +(declare-function helm-buffers-get-visible-buffers "helm-buffers") +(declare-function helm-buffer-list "helm-buffers") +(declare-function helm-grep-split-line "helm-grep") +(declare-function helm-grep-highlight-match "helm-grep") +(declare-function helm-comp-read "helm-mode") + +(defvar helm-current-error) + +;;; Internals +;; +(defvar helm-source-occur nil + "This will be the name of the source related to `current-buffer'. +Don't use it as it value changes always.") +(defvar helm-source-moccur nil + "This is just a flag to add to `helm-sources-using-default-as-input'. +Don't set it to any value, it will have no effect.") +(defvar helm-occur--buffer-list nil) +(defvar helm-occur--buffer-tick nil) +(defvar helm-occur-history nil) +(defvar helm-occur--search-buffer-regexp "\\`\\([0-9]*\\)\\s-\\(.*\\)\\'" + "The regexp matching candidates in helm-occur candidate buffer.") +(defvar helm-occur-mode--last-pattern nil) +(defvar helm-occur--initial-pos 0) + +(defvar helm-occur-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map helm-map) + (define-key map (kbd "C-c o") 'helm-occur-run-goto-line-ow) + (define-key map (kbd "C-c C-o") 'helm-occur-run-goto-line-of) + (define-key map (kbd "C-x C-s") 'helm-occur-run-save-buffer) + map) + "Keymap used in occur source.") + +(defgroup helm-occur nil + "Regexp related Applications and libraries for Helm." + :group 'helm) + +(defcustom helm-occur-actions + '(("Go to Line" . helm-occur-goto-line) + ("Goto line other window (C-u vertically)" . helm-occur-goto-line-ow) + ("Goto line new frame" . helm-occur-goto-line-of) + ("Save buffer" . helm-occur-save-results) + ) + "Actions for helm-occur." + :type '(alist :key-type string :value-type function)) + +(defcustom helm-occur-use-ioccur-style-keys nil + "Similar to `helm-grep-use-ioccur-style-keys' but for multi occur. + +Note that if you define this variable with `setq' your change will +have no effect, use customize instead." + :type 'boolean + :set (lambda (var val) + (set var val) + (if val + (progn + (define-key helm-occur-map (kbd "") 'helm-occur-right) + (define-key helm-occur-map (kbd "") 'helm-occur-run-default-action)) + (define-key helm-occur-map (kbd "") nil) + (define-key helm-occur-map (kbd "") nil)))) + +(defcustom helm-occur-always-search-in-current nil + "Helm multi occur always search in current buffer when non--nil." + :type 'boolean) + +(defcustom helm-occur-truncate-lines t + "Truncate lines in occur buffer when non nil." + :type 'boolean) + +(defcustom helm-occur-auto-update-on-resume nil + "Allow auto updating helm-occur buffer when outdated. +noask => Always update without asking +nil => Don't update but signal buffer needs update +never => Never update and do not signal buffer needs update +Any other non--nil value update after confirmation." + :type '(radio :tag "Allow auto updating helm-occur buffer when outdated." + (const :tag "Always update without asking" noask) + (const :tag "Never update and do not signal buffer needs update" never) + (const :tag "Don't update but signal buffer needs update" nil) + (const :tag "Update after confirmation" t))) + +(defcustom helm-occur-candidate-number-limit 99999 + "Value of `helm-candidate-number-limit' for helm-occur." + :type 'integer) + +(defcustom helm-occur-buffer-substring-fn-for-modes + '((mu4e-headers-mode . buffer-substring)) + "Function used to display buffer contents per major-mode. + +Use this to display lines with their text properties in helm-occur +buffer. Can be one of `buffer-substring' or `buffer-substring-no-properties'. +See `helm-occur-buffer-substring-default-mode' to setup this globally. + +Note that when using `buffer-substring' initialization will be slower." + :type '(alist :key-type (symbol :tag "Mode") + :value-type (radio (const :tag "With text properties" + buffer-substring) + (const :tag "Without text properties" + buffer-substring-no-properties)))) + +(defcustom helm-occur-buffer-substring-default-mode + 'buffer-substring-no-properties + "Function used to display buffer contents in helm-occur buffer. + +Default mode for major modes not defined in +`helm-occur-buffer-substring-fn-for-modes'. +Can be one of `buffer-substring' or `buffer-substring-no-properties'. + +Note that when using `buffer-substring' initialization will be +slower. If buffer-substring, all buffers with the modes not +defined in helm-occur-buffer-substring-fn-for-modes will be +displayed with colors and properties in the helm-occur buffer" + :type '(radio + (const :tag "With text properties" buffer-substring) + (const :tag "Without text properties" buffer-substring-no-properties))) + +(defcustom helm-occur-keep-closest-position t + "When non nil select closest candidate from point after update. +This happen only in `helm-source-occur' which is always related to +`current-buffer'." + :type 'boolean) + +(defcustom helm-occur-ignore-diacritics nil + "When non nil helm-occur will ignore diacritics in patterns." + :type 'boolean) + +(defcustom helm-occur-match-shorthands nil + "Transform pattern according to `read-symbol-shorthands' when non nil." + :type 'boolean) + +(defface helm-moccur-buffer + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "DarkTurquoise" :underline t)) + "Face used to highlight occur buffer names.") + +(defface helm-resume-need-update + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :background "red")) + "Face used to flash occur buffer when it needs update.") + + +(defun helm-occur--select-closest-candidate () + ;; Prevent error with `with-helm-window' when switching to help. + (unless (or (not (get-buffer-window helm-buffer 'visible)) + (string-equal helm-pattern "")) + (with-helm-window + (let ((lst '()) + (name (helm-get-attr 'name helm-source-occur)) + closest beg end) + (while-no-input + (goto-char (point-min)) + (if (string= name "Helm occur") + (setq beg (point) + end (point-max)) + (helm-awhile (helm-get-next-header-pos) + (when (string= name (buffer-substring-no-properties + (pos-bol) (pos-eol))) + (forward-line 1) + (setq beg (point) + end (or (helm-get-next-header-pos) (point-max))) + (cl-return)))) + (save-excursion + (when (and beg end) + (goto-char beg) + (while (re-search-forward "^[0-9]+" end t) + (push (string-to-number (match-string 0)) lst)) + (setq closest (helm-closest-number-in-list + helm-occur--initial-pos lst)))) + (when (and closest (re-search-forward (format "^%s" closest) end t)) + (helm-mark-current-line) + (goto-char (overlay-start + helm-selection-overlay)))))))) + +;;;###autoload +(defun helm-occur () + "Preconfigured helm for searching lines matching pattern in `current-buffer'. + +When `helm-source-occur' is member of +`helm-sources-using-default-as-input' which is the default, +symbol at point is searched at startup. + +When a region is marked search only in this region by narrowing. + +To search in multiples buffers start from one of the commands listing +buffers (i.e. a helm command using `helm-source-buffers-list' like +`helm-mini') and use the multi occur buffers action. + +This is the helm implementation that collect lines matching pattern +like vanilla Emacs `occur' but have nothing to do with it, the search +engine beeing completely different and also much faster." + (interactive) + (setq helm-source-occur + (car (helm-occur-build-sources (list (current-buffer)) "Helm occur"))) + (helm-set-local-variable 'helm-occur--buffer-list (list (current-buffer)) + 'helm-occur--buffer-tick + (list (buffer-chars-modified-tick (current-buffer)))) + (helm-set-attr 'header-name (lambda (_name) + (format "HO [%s]" + (buffer-name helm-current-buffer))) + helm-source-occur) + (when helm-occur-keep-closest-position + (setq helm-occur--initial-pos (line-number-at-pos)) + (add-hook 'helm-after-update-hook 'helm-occur--select-closest-candidate)) + (save-restriction + (let ((helm-sources-using-default-as-input + (unless (> (buffer-size) 2000000) + helm-sources-using-default-as-input)) + def pos) + (when (use-region-p) + ;; When user mark defun with `mark-defun' with intention of + ;; using helm-occur on this region, it is relevant to use the + ;; thing-at-point located at previous position which have been + ;; pushed to `mark-ring', if it's within the active region. + (let ((beg (region-beginning)) + (end (region-end)) + (prev-pos (car mark-ring))) + (when (and prev-pos (>= prev-pos beg) (< prev-pos end)) + (setq def (save-excursion + (goto-char (setq pos prev-pos)) + (helm-aif (thing-at-point 'symbol) (regexp-quote it))))) + (narrow-to-region beg end))) + (unwind-protect + (helm :sources 'helm-source-occur + :buffer "*helm occur*" + :history 'helm-occur-history + :default (or def (helm-aif (thing-at-point 'symbol) + (regexp-quote it))) + :preselect (and (memq 'helm-source-occur + helm-sources-using-default-as-input) + (format "^%d:" (line-number-at-pos + (or pos (point))))) + :truncate-lines helm-occur-truncate-lines) + (deactivate-mark t) + (remove-hook 'helm-after-update-hook 'helm-occur--select-closest-candidate))))) + +;;;###autoload +(defun helm-occur-visible-buffers () + "Run helm-occur on all visible buffers in frame." + (interactive) + (require 'helm-buffers) + (if (or (one-window-p) (region-active-p)) + (call-interactively #'helm-occur) + (let ((buffers (helm-buffers-get-visible-buffers))) + (helm-multi-occur-1 (mapcar 'get-buffer buffers))))) + +(defun helm-occur-transformer (candidates source) + "Return CANDIDATES prefixed with line number." + (cl-loop with buf = (helm-get-attr 'buffer-name source) + for c in candidates + for disp-linum = (when (string-match helm-occur--search-buffer-regexp c) + (let ((linum (match-string 1 c)) + (disp (match-string 2 c))) + (list + linum + (format "%s:%s" + (propertize + linum 'face 'helm-grep-lineno + 'help-echo (buffer-file-name + (get-buffer buf))) + disp)))) + for linum = (car disp-linum) + for disp = (cadr disp-linum) + when (and disp (not (string= disp ""))) + collect (cons disp (string-to-number linum)))) + +(defvar helm-occur--gshorthands nil) +(defun helm-occur-symbol-shorthands-pattern-transformer (pattern buffer gshorthands) + "Maybe transform PATTERN to its `read-symbol-shorthands' counterpart in BUFFER. + +GSHORTHANDS is the concatenation of all `read-symbol-shorthands' value found in +all buffers i.e. `buffer-list'. +When GSHORTHANDS is nil use PATTERN unmodified." + (if gshorthands + (let* ((lshorthands (buffer-local-value 'read-symbol-shorthands buffer)) + (prefix (cl-loop for (k . v) in gshorthands + if (string-match (concat "\\`" k) pattern) + return k + else + if (string-match (concat "\\`" v) pattern) + return v)) + (lgstr (cdr (or (assoc prefix gshorthands) + (rassoc prefix gshorthands))))) + (if (and lgstr lshorthands) + (concat (car (rassoc lgstr lshorthands)) + (replace-regexp-in-string prefix "" pattern)) + pattern)) + pattern)) + +(defclass helm-moccur-class (helm-source-in-buffer) + ((buffer-name :initarg :buffer-name + :initform nil) + (moccur-buffers :initarg :moccur-buffers + :initform nil) + (find-file-target :initform #'helm-occur-quit-an-find-file-fn))) + +(defun helm-occur-build-sources (buffers &optional source-name) + "Build sources for `helm-occur' for each buffer in BUFFERS list." + (setq helm-occur--gshorthands nil) + (and helm-occur-match-shorthands + (setq helm-occur--gshorthands + (cl-loop for b in (buffer-list) + for rss = (buffer-local-value + 'read-symbol-shorthands + b) + when rss append rss))) + (let (sources) + (dolist (buf buffers) + (let ((bname (buffer-name buf))) + (push (helm-make-source (or source-name bname) + 'helm-moccur-class + :header-name (lambda (name) + (format "HO [%s]" (if (string= name "Helm occur") + bname name))) + :buffer-name bname + :match-part + (lambda (candidate) + ;; The regexp should match what is in candidate buffer, + ;; not what is displayed in helm-buffer e.g. "12 foo" + ;; and not "12:foo". + (when (string-match helm-occur--search-buffer-regexp + candidate) + (match-string 2 candidate))) + :diacritics helm-occur-ignore-diacritics + :search (lambda (pattern) + (when (string-match "\\`\\^\\([^ ]*\\)" pattern) + (setq pattern (concat "^[0-9]*\\s-" (match-string 1 pattern)))) + (condition-case _err + (re-search-forward pattern nil t) + (invalid-regexp nil))) + :pattern-transformer (lambda (pattern) + (helm-occur-symbol-shorthands-pattern-transformer + pattern buf helm-occur--gshorthands)) + :init (lambda () + (with-current-buffer buf + (let* ((bsfn (or (cdr (assq + major-mode + helm-occur-buffer-substring-fn-for-modes)) + helm-occur-buffer-substring-default-mode)) + (contents (funcall bsfn (point-min) (point-max)))) + (helm-set-attr 'get-line bsfn) + (with-current-buffer (helm-candidate-buffer 'global) + (insert contents) + (goto-char (point-min)) + (let ((linum 1)) + (insert (format "%s " linum)) + (while (re-search-forward "\n" nil t) + (cl-incf linum) + (insert (format "%s " linum)))))))) + :filtered-candidate-transformer 'helm-occur-transformer + :help-message 'helm-moccur-help-message + :nomark t + :migemo t + ;; Needed for resume. + :history 'helm-occur-history + :candidate-number-limit helm-occur-candidate-number-limit + :action 'helm-occur-actions + :requires-pattern 2 + :follow 1 + :group 'helm-occur + :keymap helm-occur-map + :resume 'helm-occur-resume-fn + :moccur-buffers buffers) + sources))) + (nreverse sources))) + +(defun helm-multi-occur-1 (buffers &optional input default) + "Run `helm-occur' on a list of buffers. +Each buffer's result is displayed in a separated source. +Arg INPUT if specified will be inserted as initial input in minibuffer. +Arg DEFAULT if specified will be inserted in minibuffer with M-n. +Arg INPUT takes precedence on DEFAULT if both are specified. +If `helm-source-moccur' is member of `helm-sources-using-default-as-input' +helm-occur will start immediately with DEFAULT as INPUT. +Always prefer using DEFAULT instead of INPUT, they have the same effect but +DEFAULT keep the minibuffer empty, allowing the user to write immediately +without having to delete its contents before." + (let* ((curbuf (current-buffer)) + (bufs (if helm-occur-always-search-in-current + (cons curbuf (remove curbuf buffers)) + buffers)) + (helm-sources-using-default-as-input + (unless (cl-loop with total_size = 0 + for b in bufs + do (setq total_size (buffer-size b)) + finally return (> total_size 2000000)) + helm-sources-using-default-as-input)) + (sources (helm-occur-build-sources bufs (and (eql curbuf (car bufs)) + (not (cdr bufs)) + "Helm occur"))) + (helm-maybe-use-default-as-input + (not (null (memq 'helm-source-moccur + helm-sources-using-default-as-input))))) + (helm-set-local-variable 'helm-occur--buffer-list bufs + 'helm-occur--buffer-tick + (cl-loop for b in bufs collect + (buffer-chars-modified-tick + (get-buffer b)))) + (when (and helm-occur-always-search-in-current + helm-occur-keep-closest-position) + (setq helm-source-occur + (cl-loop for s in sources + when (eql helm-current-buffer + (get-buffer (helm-get-attr 'buffer-name s))) + return s)) + (setq helm-occur--initial-pos (line-number-at-pos)) + (add-hook 'helm-after-update-hook 'helm-occur--select-closest-candidate)) + (unwind-protect + (helm :sources sources + :buffer "*helm moccur*" + :history 'helm-occur-history + :default (or default + (helm-aif (thing-at-point 'symbol) + (regexp-quote it))) + :input input + :truncate-lines helm-occur-truncate-lines) + (remove-hook 'helm-after-update-hook 'helm-occur--select-closest-candidate)))) + +;;; Actions +;; +(cl-defun helm-occur-action (lineno + &optional (method (quote buffer))) + "Jump to line number LINENO with METHOD. +METHOD can be one of buffer, buffer-other-window, buffer-other-frame." + (require 'helm-grep) + (let ((buf (if (eq major-mode 'helm-occur-mode) + (get-text-property (point) 'buffer-name) + (helm-get-attr 'buffer-name))) + (split-pat (helm-mm-split-pattern helm-input))) + (cl-case method + (buffer (switch-to-buffer buf)) + (buffer-other-window (helm-window-show-buffers (list buf) t)) + (buffer-other-frame (switch-to-buffer-other-frame buf))) + (with-current-buffer buf + (helm-goto-line lineno) + ;; Move point to the nearest matching regexp from bol. + (cl-loop for str in split-pat + for reg = (helm-occur-symbol-shorthands-pattern-transformer + str (get-buffer buf) helm-occur--gshorthands) + when (save-excursion + (condition-case _err + (if helm-migemo-mode + (helm-mm-migemo-forward reg (pos-eol) t) + (re-search-forward reg (pos-eol) t)) + (invalid-regexp nil))) + collect (match-beginning 0) into pos-ls + finally (when pos-ls (goto-char (apply #'min pos-ls))))))) + +(defun helm-occur-goto-line (candidate) + "From multi occur, switch to buffer and CANDIDATE line." + (helm-occur-action + candidate 'buffer)) + +(defun helm-occur-goto-line-ow (candidate) + "Go to CANDIDATE line in other window. +Same as `helm-occur-goto-line' but go in other window." + (helm-occur-action + candidate 'buffer-other-window)) + +(defun helm-occur-goto-line-of (candidate) + "Go to CANDIDATE line in new frame. +Same as `helm-occur-goto-line' but go in new frame." + (helm-occur-action + candidate 'buffer-other-frame)) + +(helm-make-command-from-action helm-occur-run-goto-line-ow + "Run goto line other window action from `helm-occur'." + 'helm-occur-goto-line-ow) + +(helm-make-command-from-action helm-occur-run-goto-line-of + "Run goto line new frame action from `helm-occur'." + 'helm-occur-goto-line-of) + +(helm-make-command-from-action helm-occur-run-default-action + "Goto matching line from helm-occur buffer." + 'helm-occur-goto-line) + +(helm-make-command-from-action helm-occur-run-save-buffer + "Run moccur save results action from `helm-moccur'." + 'helm-occur-save-results) + +(defun helm-occur-right () + "`helm-occur' action for right arrow. +This is used when `helm-occur-use-ioccur-style-keys' is enabled. +If follow is enabled (default) go to next source, otherwise execute +persistent action." + (interactive) + (if (helm-aand (helm-get-attr 'follow) (> it 0)) + (helm-next-source) + (helm-execute-persistent-action))) +(put 'helm-occur-right 'helm-only t) + +(defun helm-occur-quit-an-find-file-fn (source) + (let* ((sel (helm-get-selection nil nil source)) + (occur-fname (helm-aand (numberp sel) + (helm-get-attr 'buffer-name) + (buffer-file-name (get-buffer it))))) + (when (and occur-fname (file-exists-p occur-fname)) + (expand-file-name occur-fname)))) + +;;; helm-occur-mode +;; +;; +(defvar helm-occur-mode-map + (let ((map (make-sparse-keymap))) + (define-key map (kbd "RET") 'helm-occur-mode-goto-line) + (define-key map (kbd "C-o") 'helm-occur-mode-goto-line-ow) + (define-key map (kbd "") 'helm-occur-mode-goto-line-ow-forward) + (define-key map (kbd "") 'helm-occur-mode-goto-line-ow-backward) + (define-key map (kbd "") 'helm-gm-next-file) + (define-key map (kbd "") 'helm-gm-precedent-file) + (define-key map (kbd "M-n") 'helm-occur-mode-goto-line-ow-forward) + (define-key map (kbd "M-p") 'helm-occur-mode-goto-line-ow-backward) + (define-key map (kbd "M-N") 'helm-gm-next-file) + (define-key map (kbd "M-P") 'helm-gm-precedent-file) + (define-key map (kbd "C-c b") 'helm-occur-mode-resume-session) + map)) + +(defun helm-occur-mode-goto-line () + (interactive) + (setq next-error-last-buffer (current-buffer)) + (setq-local helm-current-error (point-marker)) + (helm-aif (get-text-property (point) 'helm-realvalue) + (progn (helm-occur-goto-line it) (helm-match-line-cleanup-pulse)))) + +(defun helm-occur-mode-goto-line-ow () + (interactive) + (setq next-error-last-buffer (current-buffer)) + (setq-local helm-current-error (point-marker)) + (helm-aif (get-text-property (point) 'helm-realvalue) + (progn (helm-occur-goto-line-ow it) (helm-match-line-cleanup-pulse)))) + +(defun helm-occur-mode-goto-line-ow-forward-1 (arg) + (condition-case nil + (progn + (when (or (eq last-command 'helm-occur-mode-goto-line-ow-forward) + (eq last-command 'helm-occur-mode-goto-line-ow-backward)) + (forward-line arg)) + (save-selected-window + (helm-occur-mode-goto-line-ow) + (recenter))) + (error nil))) + +(defun helm-occur-mode-goto-line-ow-forward (arg) + (interactive "p") + (helm-occur-mode-goto-line-ow-forward-1 arg)) + +(defun helm-occur-mode-goto-line-ow-backward (arg) + (interactive "p") + (helm-occur-mode-goto-line-ow-forward-1 (- arg))) + +(defun helm-occur-save-results (_candidate) + "Save helm moccur results in a `helm-moccur-mode' buffer." + (let ((buf "*hmoccur*") + new-buf) + (when (get-buffer buf) + (setq new-buf (helm-read-string "OccurBufferName: " buf)) + (cl-loop for b in (helm-buffer-list) + when (and (string= new-buf b) + (not (y-or-n-p + (format "Buffer `%s' already exists overwrite? " + new-buf)))) + do (setq new-buf (helm-read-string + "OccurBufferName: " "*hmoccur "))) + (setq buf new-buf)) + (with-current-buffer (get-buffer-create buf) + (kill-all-local-variables) + (setq buffer-read-only t) + (buffer-disable-undo) + (let ((inhibit-read-only t) + (map (make-sparse-keymap)) + buf-name) + (erase-buffer) + (insert "-*- mode: helm-occur -*-\n\n" + (format "Occur Results for `%s':\n\n" helm-input)) + (save-excursion + (insert (with-current-buffer helm-buffer + (goto-char (point-min)) + (forward-line 1) + (buffer-substring (point) (point-max))))) + (save-excursion + (forward-line -2) + (while (not (eobp)) + (if (helm-pos-header-line-p) + (let ((beg (pos-bol)) + (end (pos-eol))) + (set-text-properties beg (1+ end) nil) + (delete-region (1- beg) end)) + (helm-aif (setq buf-name (assoc-default + 'buffer-name + (get-text-property (point) 'helm-cur-source))) + (progn + (insert (propertize (concat it ":") + 'face 'helm-moccur-buffer + 'helm-realvalue (get-text-property (point) 'helm-realvalue))) + (add-text-properties + (pos-bol) (pos-eol) + `(buffer-name ,buf-name)) + (add-text-properties + (pos-bol) (pos-eol) + `(keymap ,map + help-echo ,(concat + (buffer-file-name + (get-buffer buf-name)) + "\nmouse-1: set point\nmouse-2: jump to selection") + mouse-face highlight + invisible nil)) + (define-key map [mouse-1] 'mouse-set-point) + (define-key map [mouse-2] 'helm-occur-mode-mouse-goto-line) + (define-key map [mouse-3] 'ignore)))) + (forward-line 1)))) + (buffer-enable-undo) + (helm-occur-mode)) + (pop-to-buffer buf) + (setq next-error-last-buffer (get-buffer buf)) + (message "Helm occur Results saved in `%s' buffer" buf))) + +(defun helm-occur-mode-mouse-goto-line (event) + (interactive "e") + (let* ((window (posn-window (event-end event))) + (pos (posn-point (event-end event)))) + (with-selected-window window + (when (eq major-mode 'helm-occur-mode) + (goto-char pos) + (helm-occur-mode-goto-line))))) +(put 'helm-moccur-mode-mouse-goto-line 'helm-only t) + +(defun helm-occur-mode-resume-session () + (interactive) + (cl-assert (eq major-mode 'helm-occur-mode) nil "Helm command called in wrong context") + (helm-multi-occur-1 helm-occur--buffer-list helm-occur-mode--last-pattern)) + +(defun helm-occur-buffer-substring-with-linums () + "Return current-buffer contents as a string with all lines +numbered. The property \\='buffer-name is added to the whole string." + (let ((bufstr (buffer-substring-no-properties (point-min) (point-max))) + (bufname (buffer-name))) + (with-temp-buffer + (save-excursion + (insert bufstr)) + (let ((linum 1)) + (insert (format "%s " linum)) + (while (re-search-forward "\n" nil t) + (cl-incf linum) + (insert (format "%s " linum))) + (add-text-properties (point-min) (point-max) `(buffer-name ,bufname))) + (buffer-string)))) + +(defun helm-occur-mode--revert-buffer-function (&optional _ignore-auto _noconfirm) + "The `revert-buffer-function' for `helm-occur-mode'." + (goto-char (point-min)) + (let (pattern) + (when (re-search-forward "^Occur Results for `\\(.*\\)'" nil t) + (setq pattern (match-string 1)) + (forward-line 0) + (when (re-search-forward "^$" nil t) + (forward-line 1)) + (let ((inhibit-read-only t) + (buffer (current-buffer)) + (buflst helm-occur--buffer-list)) + (delete-region (point) (point-max)) + (message "Reverting buffer...") + (save-excursion + (with-temp-buffer + (insert + "\n" + (cl-loop for buf in buflst + for bufstr = (or (and (buffer-live-p (get-buffer buf)) + (with-current-buffer buf + (helm-occur-buffer-substring-with-linums))) + "") + concat bufstr) + "\n") + (goto-char (point-min)) + (cl-loop with linum + with mpart + ;; Bind helm-pattern used by `helm-grep-split-line'. + with helm-pattern = pattern + while (helm-mm-search pattern) ; point is at eol. + ;; Calculate line number (linum) and extract real + ;; part of line (mpart). + do (when (save-excursion + ;; `helm-mm-search' puts point at eol. + (forward-line 0) + (re-search-forward "^\\([0-9]*\\)\\s-\\{1\\}\\(.*\\)$" + (pos-eol) t)) + (setq linum (string-to-number (match-string 1)) + mpart (match-string 2))) + ;; Match part after line number. + when (and mpart (helm-mm-match mpart pattern)) + for line = (format "%s:%d:%s" + (get-text-property (point) 'buffer-name) + linum + mpart) + when line + do (with-current-buffer buffer + (insert + (propertize + (car (helm-occur-filter-one-by-one line)) + 'helm-realvalue linum) + "\n")))) + (when (fboundp 'wgrep-cleanup-overlays) + (wgrep-cleanup-overlays (point-min) (point-max))) + (message "Reverting buffer done") + (when executing-kbd-macro (sit-for 1))))))) + +(defun helm-occur-filter-one-by-one (candidate) + "`filter-one-by-one' function for `helm-source-moccur'." + (require 'helm-grep) + (let* ((split (helm-grep-split-line candidate)) + (buf (car split)) + (lineno (nth 1 split)) + (str (nth 2 split))) + (cons (concat (propertize + buf + 'face 'helm-moccur-buffer + 'help-echo (buffer-file-name + (get-buffer buf)) + 'buffer-name buf) + ":" + (propertize lineno 'face 'helm-grep-lineno) + ":" + (helm-grep-highlight-match str)) + candidate))) + +(define-derived-mode helm-occur-mode + special-mode "helm-moccur" + "Major mode to provide actions in helm moccur saved buffer. + +Special commands: +\\{helm-occur-mode-map}" + (set (make-local-variable 'helm-occur--buffer-list) + (with-helm-buffer helm-occur--buffer-list)) + (set (make-local-variable 'revert-buffer-function) + #'helm-occur-mode--revert-buffer-function) + (set (make-local-variable 'helm-occur-mode--last-pattern) + helm-input) + (set (make-local-variable 'next-error-function) + #'helm-occur-next-error) + (set (make-local-variable 'helm-current-error) nil)) +(put 'helm-moccur-mode 'helm-only t) + +(defun helm-occur-next-error (&optional argp reset) + "Goto ARGP position from a `helm-occur-mode' buffer. +RESET non-nil means rewind to the first match. +This is the `next-error-function' for `helm-occur-mode'." + (interactive "p") + (goto-char (cond (reset (point-min)) + ((and (< argp 0) helm-current-error) + (line-beginning-position)) + ((and (> argp 0) helm-current-error) + (line-end-position)) + ((point)))) + (let ((fun (if (> argp 0) + #'next-single-property-change + #'previous-single-property-change))) + (helm-aif (funcall fun (point) 'buffer-name) + (progn + (goto-char it) + (forward-line 0) + ;; `helm-current-error' is set in + ;; `helm-occur-mode-goto-line'. + (helm-occur-mode-goto-line)) + (user-error "No more matches")))) + +;;; Resume +;; +(defun helm-occur-resume-fn () + (with-helm-buffer + (let (new-tick-ls buffer-is-modified) + (set (make-local-variable 'helm-occur--buffer-list) + (cl-loop for b in helm-occur--buffer-list + when (buffer-live-p (get-buffer b)) + collect b)) + (setq buffer-is-modified (/= (length helm-occur--buffer-list) + (length (helm-get-attr 'moccur-buffers)))) + (helm-set-attr 'moccur-buffers helm-occur--buffer-list) + (setq new-tick-ls (cl-loop for b in helm-occur--buffer-list + collect (buffer-chars-modified-tick + (get-buffer b)))) + (when buffer-is-modified + (setq helm-occur--buffer-tick new-tick-ls)) + (cl-assert (> (length helm-occur--buffer-list) 0) nil + "helm-resume error: helm-(m)occur buffer list is empty") + (unless (eq helm-occur-auto-update-on-resume 'never) + (when (or buffer-is-modified + (cl-loop for b in helm-occur--buffer-list + for new-tick = (buffer-chars-modified-tick + (get-buffer b)) + for tick in helm-occur--buffer-tick + thereis (/= tick new-tick))) + (helm-aif helm-occur-auto-update-on-resume + (when (or (eq it 'noask) + (y-or-n-p "Helm (m)occur Buffer outdated, update? ")) + (run-with-idle-timer + 0.1 nil (lambda () + (with-helm-buffer + (helm-force-update) + (message "Helm (m)occur Buffer have been udated") + (sit-for 1) (message nil)))) + (unless buffer-is-modified (setq helm-occur--buffer-tick + new-tick-ls))) + (run-with-idle-timer + 0.1 nil + (lambda () + (with-helm-buffer + (let ((ov (make-overlay (save-excursion + (goto-char (point-min)) + (forward-line 1) + (point)) + (point-max)))) + (overlay-put ov 'face 'helm-resume-need-update) + (sit-for 0) + (delete-overlay ov) + (message "[Helm occur Buffer outdated (C-c C-u to update)]"))))) + (unless buffer-is-modified + (with-helm-after-update-hook + (setq helm-occur--buffer-tick new-tick-ls) + (message "Helm (m)occur Buffer have been udated"))))))))) + +;;; Helm occur from isearch +;; +;;;###autoload +(defun helm-occur-from-isearch () + "Invoke `helm-occur' from isearch. + +To use this bind it to a key in `isearch-mode-map'." + (interactive) + (let ((input (if isearch-regexp + isearch-string + (regexp-quote isearch-string))) + (bufs (list (current-buffer))) + ;; Use `helm-occur-always-search-in-current' as a flag for + ;; `helm-occur--select-closest-candidate'. + (helm-occur-always-search-in-current t)) + (isearch-exit) + (helm-multi-occur-1 bufs input))) + +;;;###autoload +(defun helm-multi-occur-from-isearch () + "Invoke `helm-multi-occur' from isearch. + +With a prefix arg, reverse the behavior of +`helm-moccur-always-search-in-current'. +The prefix arg can be set before calling +`helm-multi-occur-from-isearch' or during the buffer selection. + +To use this bind it to a key in `isearch-mode-map'." + (interactive) + (let (buf-list + helm-moccur-always-search-in-current + (input (if isearch-regexp + isearch-string + (regexp-quote isearch-string)))) + (isearch-exit) + (setq buf-list (mapcar 'get-buffer + (helm-comp-read "Buffers: " + (helm-buffer-list) + :name "Occur in buffer(s)" + :marked-candidates t))) + (setq helm-moccur-always-search-in-current + (if (or current-prefix-arg + helm-current-prefix-arg) + (not helm-moccur-always-search-in-current) + helm-moccur-always-search-in-current)) + (helm-multi-occur-1 buf-list input))) + +(provide 'helm-occur) + +;;; helm-occur.el ends here diff --git a/code/elpa/helm-20240320.541/helm-packages.el b/code/elpa/helm-20240320.541/helm-packages.el new file mode 100644 index 0000000..8d7f589 --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-packages.el @@ -0,0 +1,288 @@ +;;; helm-packages.el --- helm interface to manage packages -*- lexical-binding: t; -*- + +;; Copyright (C) 2012 ~ 2023 Thierry Volpiatto + +;; 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 'helm) +(require 'package) +(require 'helm-utils) ; For with-helm-display-marked-candidates. + + +(defclass helm-packages-class (helm-source-in-buffer) + ((coerce :initform #'helm-symbolify) + (find-file-target :initform #'helm-packages-quit-an-find-file) + (filtered-candidate-transformer + :initform + '(helm-packages-transformer + (lambda (candidates _source) + (sort candidates #'helm-generic-sort-fn)))) + (update :initform #'helm-packages--refresh-contents)) + "A class to define `helm-packages' sources.") + +;;; Actions +;; +;; +(defun helm-packages-upgrade (_candidate) + "Helm action for upgrading marked packages." + (let ((mkd (helm-marked-candidates))) + (with-helm-display-marked-candidates + helm-marked-buffer-name + (mapcar #'symbol-name mkd) + (when (y-or-n-p (format "Upgrade %s packages? " (length mkd))) + (mapc #'package-upgrade mkd))))) + +(defun helm-packages-describe (candidate) + "Helm action for describing package CANDIDATE." + (describe-package candidate)) + +(defun helm-packages-visit-homepage (candidate) + "Helm action for visiting package CANDIDATE home page." + (let* ((id (package-get-descriptor candidate)) + (name (package-desc-name id)) + (extras (package-desc-extras id)) + (url (and (listp extras) (cdr-safe (assoc :url extras))))) + (if (stringp url) + (browse-url url) + (message "Package %s has no homepage" + (propertize (symbol-name name) + 'face 'font-lock-keyword-face))))) + +(defun helm-packages-package-reinstall (_candidate) + "Helm action for reinstalling marked packages." + (let ((mkd (helm-marked-candidates))) + (with-helm-display-marked-candidates + helm-marked-buffer-name + (mapcar #'symbol-name mkd) + (when (y-or-n-p (format "Reinstall %s packages? " (length mkd))) + (mapc #'package-reinstall mkd))))) + +(defun helm-packages-delete-1 (packages &optional force) + "Run `package-delete' on PACKAGES. +If FORCE is non nil force deleting packages." + (mapc (lambda (x) + (package-delete (package-get-descriptor x) force)) + packages)) + +(defun helm-packages-uninstall (_candidate) + "Helm action for uninstalling marked packages. +Unlike `helm-packages-delete' this will refuse to delete packages when they are +needed by others packages as dependencies." + (let ((mkd (helm-marked-candidates))) + (with-helm-display-marked-candidates + helm-marked-buffer-name + (mapcar #'symbol-name mkd) + (when (y-or-n-p (format "Uninstall %s packages? " (length mkd))) + (helm-packages-delete-1 mkd))))) + +(defun helm-packages-delete (_candidate) + "Helm action for deleting marked packages. +Unlike `helm-packages-uninstall' this delete packages even when they are needed +as dependencies." + (let ((mkd (helm-marked-candidates))) + (with-helm-display-marked-candidates + helm-marked-buffer-name + (mapcar #'symbol-name mkd) + (when (y-or-n-p (format "Delete %s packages? " (length mkd))) + (helm-packages-delete-1 mkd 'force))))) + +(defun helm-packages-recompile (_candidate) + "Helm action for recompiling marked packages." + (let ((mkd (helm-marked-candidates))) + (with-helm-display-marked-candidates + helm-marked-buffer-name + (mapcar #'symbol-name mkd) + (when (y-or-n-p (format "Recompile %s packages? " (length mkd))) + (mapc #'package-recompile mkd))))) + +(defun helm-packages-install (_candidate) + "Helm action for installing marked packages." + (let ((mkd (helm-marked-candidates))) + (with-helm-display-marked-candidates + helm-marked-buffer-name + (mapcar #'symbol-name mkd) + (when (y-or-n-p (format "Install %s packages? " (length mkd))) + (condition-case err + (mapc #'package-install mkd) + (error "%S:\n Please refresh package list before installing" err)))))) + +(defun helm-packages-isolate-1 (packages) + "Start an Emacs with only PACKAGES loaded. +Arg PACKAGES is a list of strings." + (let* ((name (concat "package-isolate-" (mapconcat #'identity packages "_"))) + (deps (cl-loop for p in packages + for sym = (intern p) + nconc (package--dependencies sym)))) + (apply #'start-process name nil + (list (expand-file-name invocation-name invocation-directory) + "-Q" "--debug-init" + (format "--eval=%S" + `(progn + (require 'package) + (setq package-load-list + ',(append (mapcar (lambda (p) (list (intern p) t)) + packages) + (mapcar (lambda (p) (list p t)) deps))) + (package-initialize))))))) + +(defun helm-packages-isolate (_candidate) + "Start a new Emacs with only marked packages loaded." + (let* ((mkd (helm-marked-candidates)) + (pkg-names (mapcar #'symbol-name mkd)) + (isolate (if (fboundp 'package-isolate) + #'package-isolate + #'helm-packages-isolate-1))) + (with-helm-display-marked-candidates + helm-marked-buffer-name + pkg-names + (when (y-or-n-p "Start a new Emacs with only package(s)? ") + (funcall isolate pkg-names))))) + +(defun helm-packages-quit-an-find-file (source) + "`find-file-target' function for `helm-packages'." + (let* ((sel (helm-get-selection nil nil source)) + (pkg (package-get-descriptor (intern sel)))) + (if (and pkg (package-installed-p pkg)) + (expand-file-name (package-desc-dir pkg)) + package-user-dir))) + +;;; Transformers +;; +;; +(defun helm-packages-transformer (candidates _source) + "Transformer function for `helm-packages'." + (cl-loop for c in candidates + for sym = (intern-soft c) + for archive = (assq sym package-archive-contents) + for id = (package-get-descriptor sym) + for provider = (and archive (package-desc-archive (cadr archive))) + for status = (and id (package-desc-status id)) + for version = (and id (mapconcat #'number-to-string (package-desc-version id) ".")) + for description = (and id (package-desc-summary id)) + for disp = (format "%s%s%s%s%s%s%s%s%s" + ;; Package name. + (propertize + c + 'face (if (equal status "dependency") + font-lock-type-face + 'font-lock-keyword-face) + 'match-part c) + ;; Separator. + (make-string (1+ (- (helm-in-buffer-get-longest-candidate) + (length c))) + ? ) + ;; Package status. + (propertize + (or status "") + 'face (if (equal status "dependency") + 'bold-italic + 'default)) + ;; Separator. + (make-string (1+ (- 10 (length status))) ? ) + ;; Package provider. + (or provider "") + ;; Separator. + (make-string (1+ (- 10 (length provider))) ? ) + ;; Package version. + (or version "") + ;; Separator. + (make-string (1+ (- 20 (length version))) ? ) + ;; Package description. + (if description + (propertize description 'face 'font-lock-warning-face) + "")) + collect (cons disp c))) + +(defun helm-packages-transformer-1 (candidates _source) + "Transformer function for `helm-packages' upgrade and delete sources." + (cl-loop for c in candidates + collect (cons (propertize c 'face 'font-lock-keyword-face) c))) + +(defvar helm-packages--updated nil) +(defun helm-packages--refresh-contents () + (unless helm-packages--updated (package-refresh-contents)) + (helm-set-local-variable 'helm-packages--updated t)) + + +;;;###autoload +(defun helm-packages (&optional arg) + "Helm interface to manage packages. + +With a prefix arg ARG refresh package list. + +When installing or upgrading ensure to refresh the package list +to avoid errors with outdated packages no more availables." + (interactive "P") + (package-initialize) + (when arg (helm-packages--refresh-contents)) + (let ((upgrades (package--upgradeable-packages)) + (removables (package--removable-packages))) + (helm :sources (list + (helm-make-source "Availables for upgrade" 'helm-packages-class + :init (lambda () + (helm-init-candidates-in-buffer 'global upgrades)) + :filtered-candidate-transformer #'helm-packages-transformer-1 + :action '(("Upgrade package(s)" + . helm-packages-upgrade))) + (helm-make-source "Packages to delete" 'helm-packages-class + :init (lambda () + (helm-init-candidates-in-buffer 'global removables)) + :filtered-candidate-transformer #'helm-packages-transformer-1 + :action '(("Delete package(s)" . helm-packages-delete))) + (helm-make-source "Installed packages" 'helm-packages-class + :init (lambda () + (helm-init-candidates-in-buffer 'global + (mapcar #'car package-alist))) + :action '(("Describe package" . helm-packages-describe) + ("Visit homepage" . helm-packages-visit-homepage) + ("Reinstall package(s)" + . helm-packages-package-reinstall) + ("Recompile package(s)" . helm-packages-recompile) + ("Uninstall package(s)" . helm-packages-uninstall) + ("Isolate package(s)" . helm-packages-isolate))) + (helm-make-source "Available external packages" 'helm-packages-class + :data (cl-loop for p in package-archive-contents + for sym = (car p) + for id = (package-get-descriptor sym) + for status = (package-desc-status id) + unless (or (and id (member + status + '("installed" "dependency" "source"))) + (and id (assoc sym package--builtins))) + nconc (list (car p))) + :action '(("Describe package" . helm-packages-describe) + ("Visit homepage" . helm-packages-visit-homepage) + ("Install packages(s)" + . helm-packages-install))) + (helm-make-source "Available built-in packages" 'helm-packages-class + :data (cl-loop for p in package--builtins + ;; Show only builtins that are available as + ;; well on (m)elpa. Other builtins don't + ;; have a package-descriptor, the format is + ;; (sym . [version reqs summary]). + when (package-desc-p (package-get-descriptor (car p))) + collect (car p)) + :action '(("Describe package" . helm-packages-describe) + ("Visit homepage" . helm-packages-visit-homepage) + ("Install packages(s)" + . helm-packages-install)))) + :buffer "*helm packages*"))) + +(provide 'helm-packages) + +;;; helm-packages ends here diff --git a/code/elpa/helm-20240320.541/helm-pkg.el b/code/elpa/helm-20240320.541/helm-pkg.el new file mode 100644 index 0000000..009740d --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-pkg.el @@ -0,0 +1,14 @@ +(define-package "helm" "20240320.541" "Helm is an Emacs incremental and narrowing framework" + '((helm-core "3.9.7") + (wfnames "1.1") + (popup "0.5.3")) + :commit "45224ceb82b96267d12085f0cb116124b041e8bd" :authors + '(("Thierry Volpiatto" . "thievol@posteo.net")) + :maintainers + '(("Thierry Volpiatto" . "thievol@posteo.net")) + :maintainer + '("Thierry Volpiatto" . "thievol@posteo.net") + :url "https://emacs-helm.github.io/helm/") +;; Local Variables: +;; no-byte-compile: t +;; End: diff --git a/code/elpa/helm-20240320.541/helm-regexp.el b/code/elpa/helm-20240320.541/helm-regexp.el new file mode 100644 index 0000000..73f0021 --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-regexp.el @@ -0,0 +1,132 @@ +;;; helm-regexp.el --- In buffer regexp searching and replacement for helm. -*- lexical-binding: t -*- + +;; Copyright (C) 2012 ~ 2023 Thierry Volpiatto + +;; 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 'helm) +(require 'helm-help) +(require 'helm-utils) + +(declare-function helm-mm-split-pattern "helm-multi-match") + + +(defgroup helm-regexp nil + "Regexp related Applications and libraries for Helm." + :group 'helm) + + + +;; History vars +(defvar helm-build-regexp-history nil) + +(defun helm-query-replace-regexp (_candidate) + "Query replace regexp from `helm-regexp'. +With a prefix arg replace only matches surrounded by word boundaries, +i.e. don't replace inside a word, regexp is surrounded with \\bregexp\\b." + (let ((regexp helm-input)) + (apply 'query-replace-regexp + (helm-query-replace-args regexp)))) + +(defun helm-kill-regexp-as-sexp (_candidate) + "Kill regexp in a format usable in lisp code." + (helm-regexp-kill-new + (prin1-to-string helm-input))) + +(defun helm-kill-regexp (_candidate) + "Kill regexp as it is in `helm-pattern'." + (helm-regexp-kill-new helm-input)) + +(defun helm-query-replace-args (regexp) + "Create arguments of `query-replace-regexp' action in `helm-regexp'." + (let ((region-only (helm-region-active-p))) + (list + regexp + (query-replace-read-to regexp + (format "Query replace %sregexp %s" + (if helm-current-prefix-arg "word " "") + (if region-only "in region " "")) + t) + helm-current-prefix-arg + (when region-only (region-beginning)) + (when region-only (region-end))))) + +(defvar helm-source-regexp + (helm-build-in-buffer-source "Regexp Builder" + :init (lambda () + (helm-init-candidates-in-buffer + 'global (with-temp-buffer + (insert-buffer-substring helm-current-buffer) + (buffer-string)))) + :get-line #'helm-regexp-get-line + :persistent-action #'helm-regexp-persistent-action + :persistent-help "Show this line" + :multiline t + :multimatch nil + :requires-pattern 2 + :group 'helm-regexp + :mode-line "Press TAB to select action." + :action '(("Kill Regexp as sexp" . helm-kill-regexp-as-sexp) + ("Query Replace Regexp (C-u Not inside word.)" + . helm-query-replace-regexp) + ("Kill Regexp" . helm-kill-regexp)))) + +(defun helm-regexp-get-line (s e) + (let ((matches (match-data)) + (line (buffer-substring s e))) + (propertize + (cl-loop with ln = (format "%5d: %s" (1- (line-number-at-pos s)) line) + for i from 0 to (1- (/ (length matches) 2)) + if (match-string i) + concat (format "\n%s%s'%s'" + (make-string 10 ? ) (format "Group %d: " i) it) + into ln1 + finally return (concat ln ln1)) + 'helm-realvalue s))) + +(defun helm-regexp-persistent-action (pt) + (helm-goto-char pt) + (helm-highlight-current-line)) + +(defun helm-regexp-kill-new (input) + (kill-new (substring-no-properties input)) + (message "Killed: %s" input)) + + +;;; Predefined commands +;; +;; + +;;;###autoload +(defun helm-regexp () + "Preconfigured helm to build regexps. +`query-replace-regexp' can be run from there against found regexp." + (interactive) + (save-restriction + (when (and (helm-region-active-p) + ;; Don't narrow to region if buffer is already narrowed. + (not (helm-current-buffer-narrowed-p (current-buffer)))) + (narrow-to-region (region-beginning) (region-end))) + (helm :sources helm-source-regexp + :buffer "*helm regexp*" + :prompt "Regexp: " + :history 'helm-build-regexp-history))) + + +(provide 'helm-regexp) + +;;; helm-regexp.el ends here diff --git a/code/elpa/helm-20240320.541/helm-ring.el b/code/elpa/helm-20240320.541/helm-ring.el new file mode 100644 index 0000000..0252199 --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-ring.el @@ -0,0 +1,642 @@ +;;; helm-ring.el --- kill-ring, mark-ring, and register browsers for helm. -*- lexical-binding: t -*- + +;; Copyright (C) 2012 ~ 2023 Thierry Volpiatto + +;; 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 'helm) +(require 'helm-utils) +(require 'helm-help) +(require 'helm-elisp) + +(declare-function undo-tree-restore-state-from-register "ext:undo-tree.el" (register)) +(declare-function kmacro--keys "kmacro.el") +(declare-function frameset-register-p "frameset") + +(defgroup helm-ring nil + "Ring related Applications and libraries for Helm." + :group 'helm) + +(defcustom helm-kill-ring-threshold 3 + "Minimum length of a candidate to be listed by `helm-source-kill-ring'." + :type 'integer + :group 'helm-ring) + +(defcustom helm-kill-ring-max-offset 400 + "Max number of chars displayed per candidate in kill-ring browser. +When `t', don't truncate candidate, show all. +By default it is approximatively the number of bits contained in five lines +of 80 chars each, i.e. 80*5. +Note that if you set this to nil multiline will be disabled, i.e. you +will not have separators between candidates any more." + :type '(choice (const :tag "Disabled" t) + (integer :tag "Max candidate offset")) + :group 'helm-ring) + +(defcustom helm-kill-ring-actions + '(("Yank marked" . helm-kill-ring-action-yank) + ("Delete marked" . helm-kill-ring-action-delete) + ("Search from candidate" . helm-kill-ring-search-from-string)) + "List of actions for kill ring source." + :group 'helm-ring + :type '(alist :key-type string :value-type function)) + +(defcustom helm-kill-ring-separator "\n" + "The separator used to separate marked candidates when yanking." + :group 'helm-ring + :type 'string) + +(defcustom helm-register-max-offset 160 + "Max size of string register entries before truncating." + :group 'helm-ring + :type 'integer) + +;;; Kill ring +;; +;; +(defvar helm-kill-ring-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map helm-map) + (define-key map (kbd "M-y") 'helm-next-line) + (define-key map (kbd "M-u") 'helm-previous-line) + (define-key map (kbd "M-D") 'helm-kill-ring-delete) + (define-key map (kbd "C-s") 'helm-kill-ring-run-search-from-string) + (define-key map (kbd "C-]") 'helm-kill-ring-toggle-truncated) + (define-key map (kbd "C-c C-k") 'helm-kill-ring-kill-selection) + (define-key map (kbd "C-c d") 'helm-kill-ring-run-persistent-delete) + map) + "Keymap for `helm-show-kill-ring'.") + +(defvar helm-source-kill-ring + (helm-build-sync-source "Kill Ring" + :init (lambda () + (helm-set-attr 'last-command last-command) + (helm-set-attr 'multiline helm-kill-ring-max-offset)) + :candidates #'helm-kill-ring-candidates + :filtered-candidate-transformer #'helm-kill-ring-transformer + :action 'helm-kill-ring-actions + :persistent-action 'ignore + :help-message 'helm-kill-ring-help-message + :persistent-help "DoNothing" + :keymap helm-kill-ring-map + :migemo t + :multiline 'helm-kill-ring-max-offset + :group 'helm-ring) + "Source for browse and insert contents of kill-ring.") + +(defun helm-kill-ring-candidates () + (cl-loop with cands = (helm-fast-remove-dups kill-ring :test 'equal) + for kill in (if (eq (helm-get-attr 'last-command) 'yank) + (cdr cands) + cands) + unless (or (< (length kill) helm-kill-ring-threshold) + (string-match "\\`[\n[:blank:]]+\\'" kill)) + collect kill)) + +(defun helm-kill-ring-transformer (candidates _source) + "Ensure CANDIDATES are not read-only." + (cl-loop for i in candidates + when (get-text-property 0 'read-only i) + do (set-text-properties 0 (length i) '(read-only nil) i) + collect i)) + +(defvar helm-kill-ring--truncated-flag nil) +(defun helm-kill-ring-toggle-truncated () + "Toggle truncated view of candidates in helm kill-ring browser." + (interactive) + (with-helm-alive-p + (setq helm-kill-ring--truncated-flag (not helm-kill-ring--truncated-flag)) + (let* ((cur-cand (helm-get-selection)) + (presel-fn (lambda () + (helm-kill-ring--preselect-fn cur-cand))) + helm-display-source-at-screen-top) + (helm-set-attr 'multiline + (if helm-kill-ring--truncated-flag + 15000000 + helm-kill-ring-max-offset)) + (helm-update presel-fn)))) +(put 'helm-kill-ring-toggle-truncated 'helm-only t) + +(defun helm-kill-ring-kill-selection () + "Store the real value of candidate in kill-ring. +Same as `helm-kill-selection-and-quit' called with a prefix arg." + (interactive) + (helm-kill-selection-and-quit t)) +(put 'helm-kill-ring-kill-selection 'helm-only t) + +(defun helm-kill-ring--preselect-fn (candidate) + "Internal, used to preselect CANDIDATE when toggling truncated view." + ;; Preselection by regexp may not work if candidate is huge, so walk + ;; the helm buffer until selection is on CANDIDATE. + (helm-awhile (condition-case-unless-debug nil + (and (not (helm-pos-header-line-p)) + (helm-get-selection)) + (error nil)) + (if (string= it candidate) + (cl-return) + (helm-next-line)))) + +(defun helm-kill-ring-action-yank (_str) + "Insert concatenated marked candidates in current-buffer. + +When two prefix args are given prompt to choose separator, otherwise +use `helm-kill-ring-separator' as default." + (let ((marked (helm-marked-candidates)) + (sep (if (equal helm-current-prefix-arg '(16)) + (read-string "Separator: ") + helm-kill-ring-separator))) + (helm-kill-ring-action-yank-1 + (cl-loop for c in (butlast marked) + concat (concat c sep) into str + finally return (concat str (car (last marked))))))) + +(defun helm-kill-ring-action-yank-1 (str) + "Insert STR in `kill-ring' and set STR to the head. + +When called with a prefix arg, point and mark are exchanged +without activating region. +If this action is executed just after `yank', replace with STR as +yanked string." + (let ((yank-fn (lambda (&optional before yank-pop) + (insert-for-yank str) + ;; Set the window start back where it was in + ;; the yank command, if possible. + (when yank-pop + (set-window-start (selected-window) yank-window-start t)) + (when (or (equal helm-current-prefix-arg '(4)) before) + ;; Same as exchange-point-and-mark but without + ;; activating region. + (goto-char (prog1 (mark t) + (set-marker (mark-marker) + (point) + helm-current-buffer))))))) + ;; Prevent inserting and saving highlighted items. + (set-text-properties 0 (length str) nil str) + (with-helm-current-buffer + (unwind-protect + (progn + (setq kill-ring (delete str kill-ring)) + ;; Adding a `delete-selection' property + ;; to `helm-kill-ring-action' is not working + ;; because `this-command' will be `helm-maybe-exit-minibuffer', + ;; so use this workaround (Bug#1520). + (when (and (region-active-p) delete-selection-mode) + (delete-region (region-beginning) (region-end))) + (if (not (eq (helm-get-attr 'last-command helm-source-kill-ring) 'yank)) + (progn + ;; Ensure mark is at beginning of inserted text. + (push-mark) + ;; When yanking in a helm minibuffer we need a small + ;; delay to detect the mark in previous minibuffer. [1] + (run-with-timer 0.01 nil yank-fn)) + ;; from `yank-pop' + (let ((inhibit-read-only t) + (before (< (point) (mark t)))) + (if before + (funcall (or yank-undo-function 'delete-region) (point) (mark t)) + (funcall (or yank-undo-function 'delete-region) (mark t) (point))) + (setq yank-undo-function nil) + (set-marker (mark-marker) (point) helm-current-buffer) + ;; Same as [1] but use the same mark and point as in + ;; the initial yank according to BEFORE even if no + ;; prefix arg is given. + (run-with-timer 0.01 nil yank-fn before 'pop)))) + (kill-new str))))) +(define-obsolete-function-alias 'helm-kill-ring-action 'helm-kill-ring-action-yank "2.4.0") + +(defun helm-kill-ring-search-from-string (candidate) + (let ((str (car (split-string candidate "\n")))) + (helm-multi-occur-1 + (list (current-buffer)) + (regexp-quote (substring-no-properties str))))) + +(helm-make-command-from-action helm-kill-ring-run-search-from-string + "Run helm-occur from kill ring." + 'helm-kill-ring-search-from-string) + +(defun helm-kill-ring-action-delete (_candidate) + "Delete marked candidates from `kill-ring'." + (cl-loop for c in (helm-marked-candidates) + do (setq kill-ring + (delete c kill-ring)))) + +(defun helm-kill-ring-persistent-delete (_candidate) + (unwind-protect + (cl-loop for c in (helm-marked-candidates) + do (progn + (helm-preselect (format "^%s" (regexp-quote c))) + (setq kill-ring (delete c kill-ring)) + (helm-delete-current-selection) + (helm--remove-marked-and-update-mode-line c))) + (with-helm-buffer + (setq helm-marked-candidates nil + helm-visible-mark-overlays nil)) + (helm-force-update (helm-aif (helm-get-selection nil t) (regexp-quote it))))) + +(helm-make-persistent-command-from-action helm-kill-ring-run-persistent-delete + "Delete current candidate without quitting." + 'quick-delete 'helm-kill-ring-persistent-delete) + +(helm-make-command-from-action helm-kill-ring-delete + "Delete marked candidates from `kill-ring'." + 'helm-kill-ring-action-delete) + + +;;;; +;; DO NOT use these sources with other sources use +;; the commands `helm-mark-ring', `helm-global-mark-ring' or +;; `helm-all-mark-rings' instead. + +(defun helm-mark-ring-line-string-at-pos (pos) + "Return line string at position POS." + (save-excursion + (goto-char pos) + (forward-line 0) + (let ((line (car (split-string (thing-at-point 'line) "[\n\r]")))) + (remove-text-properties 0 (length line) '(read-only) line) + (if (string= "" line) + "" + line)))) + +(defun helm-mark-ring-get-candidates () + (with-helm-current-buffer + (cl-loop with marks = (if (mark t) + (cons (mark-marker) mark-ring) + mark-ring) + for marker in marks + with max-line-number = (line-number-at-pos (point-max)) + with width = (length (number-to-string max-line-number)) + for m = (format (concat "%" (number-to-string width) "d: %s") + (line-number-at-pos marker) + (helm-mark-ring-line-string-at-pos marker)) + unless (and recip (assoc m recip)) + collect (cons m marker) into recip + finally return recip))) + +(defun helm-mark-ring-default-action (candidate) + (let ((target (copy-marker candidate))) + (helm-aif (marker-buffer candidate) + (progn + (switch-to-buffer it) + (helm-log-run-hook "helm-mark-ring-default-action" 'helm-goto-line-before-hook) + (helm-match-line-cleanup) + (with-helm-current-buffer + (unless helm-yank-point (setq helm-yank-point (point)))) + (helm-goto-char target) + (helm-highlight-current-line)) + ;; marker points to no buffer, no need to dereference it, just + ;; delete it. + (setq mark-ring (delete target mark-ring)) + (error "Marker points to no buffer")))) + +(defvar helm-source-mark-ring + (helm-build-sync-source "mark-ring" + :candidates #'helm-mark-ring-get-candidates + :action '(("Goto line" . helm-mark-ring-default-action)) + :persistent-help "Show this line" + :group 'helm-ring)) + +;;; Global-mark-ring +(defvar helm-source-global-mark-ring + (helm-build-sync-source "global-mark-ring" + :candidates #'helm-global-mark-ring-get-candidates + :action '(("Goto line" . helm-mark-ring-default-action)) + :persistent-help "Show this line" + :group 'helm-ring)) + +(defun helm-global-mark-ring-format-buffer (marker) + (with-current-buffer (marker-buffer marker) + (goto-char marker) + (forward-line 0) + (let ((line (helm-acase (thing-at-point 'line) + ((guard (and (stringp it) + (not (string-match-p "\\`\n?\\'" it)))) + (car (split-string it "[\n\r]"))) + (t "")))) + (remove-text-properties 0 (length line) '(read-only) line) + (format "%7d:%s: %s" + (line-number-at-pos) (marker-buffer marker) line)))) + +(defun helm-global-mark-ring-get-candidates () + (let ((marks global-mark-ring)) + (when marks + (cl-loop for marker in marks + for mb = (marker-buffer marker) + for gm = (unless (or (string-match "^ " (format "%s" mb)) + (null mb)) + (helm-global-mark-ring-format-buffer marker)) + when (and gm (not (assoc gm recip))) + collect (cons gm marker) into recip + finally return recip)))) + +;;;; +;;; Insert from register +(defvar helm-source-register + (helm-build-sync-source "Registers" + :candidates #'helm-register-candidates + :action-transformer #'helm-register-action-transformer + :persistent-help "" + :multiline t + :action '(("Delete Register(s)" . + (lambda (_candidate) + (cl-loop for candidate in (helm-marked-candidates) + for register = (car candidate) + do (setq register-alist + (delq (assoc register register-alist) + register-alist)))))) + :group 'helm-ring) + "See (info \"(emacs)Registers\")") + +(defun helm-register-candidates () + "Collecting register contents and appropriate commands." + (require 'frameset) + (cl-loop for (char . rval) in register-alist + for key = (single-key-description char) + for e27 = (registerv-p rval) + for val = (if e27 ; emacs-27 + (registerv-data rval) + rval) + for string-actions = + (cond + ((numberp val) + (list (int-to-string val) + 'insert-register + 'increment-register)) + ((markerp val) + (let ((buf (marker-buffer val))) + (if (null buf) + (list "a marker in no buffer") + (list (concat + "a buffer position:" + (buffer-name buf) + ", position " + (int-to-string (marker-position val))) + 'jump-to-register + 'insert-register)))) + ((and (consp val) (window-configuration-p (car val))) + (list (if (fboundp 'describe-register-1) + (describe-register-1 char) "window configuration.") + 'jump-to-register)) + ((and (vectorp val) + (fboundp 'undo-tree-register-data-p) + (undo-tree-register-data-p (if e27 val (elt val 1)))) + (list + "Undo-tree entry." + 'undo-tree-restore-state-from-register)) + ((or (and (vectorp val) (eq 'registerv (aref val 0))) + (and (consp val) (frame-configuration-p (car val))) + (or (frame-configuration-p val) + (frameset-register-p val))) + (list (if (fboundp 'describe-register-1) + (describe-register-1 char) "Frame configuration") + 'jump-to-register)) + ((and (consp val) (eq (car val) 'file)) + (list (concat "file:" + (prin1-to-string (cdr val)) + ".") + 'jump-to-register)) + ((and (consp val) (eq (car val) 'buffer)) + (list (concat "buffer:" + (prin1-to-string (cdr val)) + ".") + 'jump-to-register)) + ((and (consp val) (eq (car val) 'file-query)) + (list (concat "file:a file-query reference: file " + (car (cdr val)) + ", position " + (int-to-string (car (cdr (cdr val)))) + ".") + 'jump-to-register)) + ((consp val) + (let ((lines (format "%4d" (length val)))) + (list (format "%s: %s\n" lines + (truncate-string-to-width + (mapconcat 'identity (list (car val)) + "^J") + (- (window-width) 15))) + 'insert-register))) + ((stringp val) + (list + (concat (substring-no-properties + val 0 (min (length val) helm-register-max-offset)) + (if (> (length val) helm-register-max-offset) + "[...]" "")) + 'insert-register + 'kill-new + 'append-to-register + 'prepend-to-register))) + unless (null string-actions) ; Fix Bug#1107. + collect (cons (format "Register %3s:\n %s" key (car string-actions)) + (cons char (cdr string-actions))))) + +(defun helm-register-action-transformer (actions register-and-functions) + "Decide actions by the contents of register." + (cl-loop with func-actions = + '((insert-register + "Insert Register" . + (lambda (c) (insert-register (car c)))) + (kill-new + "Kill Register" . + (lambda (c) (with-temp-buffer + (insert-register (car c)) + (kill-new (buffer-string))))) + (jump-to-register + "Jump to Register" . + (lambda (c) (jump-to-register (car c)))) + (append-to-register + "Append Region to Register" . + (lambda (c) (append-to-register + (car c) (region-beginning) (region-end)))) + (prepend-to-register + "Prepend Region to Register" . + (lambda (c) (prepend-to-register + (car c) (region-beginning) (region-end)))) + (increment-register + "Increment Prefix Arg to Register" . + (lambda (c) (increment-register + helm-current-prefix-arg (car c)))) + (undo-tree-restore-state-from-register + "Restore Undo-tree register" . + (lambda (c) (and (fboundp 'undo-tree-restore-state-from-register) + (undo-tree-restore-state-from-register (car c)))))) + for func in (cdr register-and-functions) + when (assq func func-actions) + collect (cdr it) into transformer-actions + finally return (append transformer-actions actions))) + +;;;###autoload +(defun helm-mark-ring () + "Preconfigured `helm' for `helm-source-mark-ring'." + (interactive) + (helm :sources 'helm-source-mark-ring + :resume 'noresume + :buffer "*helm mark*")) + +;;;###autoload +(defun helm-global-mark-ring () + "Preconfigured `helm' for `helm-source-global-mark-ring'." + (interactive) + (helm :sources 'helm-source-global-mark-ring + :resume 'noresume + :buffer "*helm global mark*")) + +;;;###autoload +(defun helm-all-mark-rings () + "Preconfigured `helm' for mark rings. +Source used are `helm-source-global-mark-ring' and +`helm-source-mark-ring'." + (interactive) + (helm :sources '(helm-source-mark-ring + helm-source-global-mark-ring) + :resume 'noresume + :buffer "*helm mark ring*")) + +;;;###autoload +(defun helm-register () + "Preconfigured `helm' for Emacs registers." + (interactive) + (helm :sources 'helm-source-register + :resume 'noresume + :buffer "*helm register*")) + +;;;###autoload +(defun helm-show-kill-ring () + "Preconfigured `helm' for `kill-ring'. +It is drop-in replacement of `yank-pop'. + +First call open the kill-ring browser, next calls move to next line." + (interactive) + (setq helm-kill-ring--truncated-flag nil) + (let ((enable-recursive-minibuffers t)) + (helm :sources helm-source-kill-ring + :buffer "*helm kill ring*" + ;; :display-source-at-screen-top nil + :resume 'noresume + :allow-nest t))) + +;;;###autoload +(defun helm-execute-kmacro () + "Preconfigured helm for keyboard macros. +Define your macros with `f3' and `f4'. +See (info \"(emacs) Keyboard Macros\") for detailed infos." + (interactive) + (let ((helm-quit-if-no-candidate + (lambda () (message "No kbd macro has been defined")))) + (helm :sources + (helm-build-sync-source "Kmacro" + :candidates (lambda () + (delq nil + (helm-fast-remove-dups + (cons (kmacro-ring-head) + kmacro-ring) + :test 'equal))) + + :multiline t + :candidate-transformer + (lambda (candidates) + (cl-loop for c in candidates + for keys = (if (functionp c) + ;; Emacs-29+ (Oclosure). + (kmacro--keys c) + ;; Emacs-28 and below (list). + (car c)) + collect (propertize (help-key-description keys nil) + 'helm-realvalue c))) + :persistent-action 'ignore + :persistent-help "Do nothing" + :help-message 'helm-kmacro-help-message + :action + (helm-make-actions + "Execute kmacro (`C-u ' to execute times)" + 'helm-kbd-macro-execute + "Concat marked macros" + 'helm-kbd-macro-concat-macros + "Delete marked macros" + 'helm-kbd-macro-delete-macro + "Edit marked macro" + 'helm-kbd-macro-edit-macro + "Insert kbd macro" + 'helm-kbd-macro-insert-macro) + :group 'helm-ring) + :buffer "*helm kmacro*"))) + +(defun helm-kbd-macro-make-current (candidate) + "Make CANDIDATE macro the current one." + (setq kmacro-ring (delete candidate kmacro-ring)) + (kmacro-push-ring) + (kmacro-split-ring-element candidate)) + +(defun helm-kbd-macro-insert-macro (candidate) + "Insert macro at point in `helm-current-buffer'." + (let ((desc (read-string "Describe macro briefly: ")) + name key) + (while (fboundp (setq name (intern (read-string "New name for macro: ")))) + (message "Symbol `%s' already exists, choose another name" name) + (sit-for 1.5)) + (helm-kbd-macro-make-current candidate) + (kmacro-name-last-macro name) + (when (y-or-n-p "Bind macro to a new key?") + (helm-awhile (key-binding + (setq key (read-key-sequence-vector "Bind macro to key: "))) + (message "`%s' already run command `%s', choose another one" + (help-key-description key nil) it) + (sit-for 1.5)) + (global-set-key key name)) + (with-helm-current-buffer + (insert (format ";; %s%s\n" + desc + (and key (format " (bound to `%s')" + (help-key-description key nil))))) + (insert-kbd-macro name (not (null key)))))) + +(defun helm-kbd-macro-execute (candidate) + ;; Move candidate on top of list for next use. + (helm-kbd-macro-make-current candidate) + (kmacro-exec-ring-item + candidate helm-current-prefix-arg)) + +(defun helm-kbd-macro-concat-macros (_candidate) + (let ((mkd (helm-marked-candidates))) + (when (cdr mkd) + (kmacro-push-ring) + (setq last-kbd-macro + (cl-loop for km in mkd + for keys = (if (functionp km) + (kmacro--keys km) + (helm-acase (car km) + ((guard (vectorp it)) it) + ((guard (stringp it)) + (kmacro--to-vector it)))) + vconcat keys))))) + +(defun helm-kbd-macro-delete-macro (_candidate) + (let ((mkd (helm-marked-candidates)) + (head (kmacro-ring-head))) + (cl-loop for km in mkd + do (setq kmacro-ring (delete km kmacro-ring))) + (when (member head mkd) + (kmacro-delete-ring-head)))) + +(defun helm-kbd-macro-edit-macro (candidate) + (kmacro-push-ring) + (setq kmacro-ring (delete candidate kmacro-ring)) + (kmacro-split-ring-element candidate) + (kmacro-edit-macro)) + +(provide 'helm-ring) + +;;; helm-ring.el ends here diff --git a/code/elpa/helm-20240320.541/helm-semantic.el b/code/elpa/helm-20240320.541/helm-semantic.el new file mode 100644 index 0000000..025019e --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-semantic.el @@ -0,0 +1,233 @@ +;;; helm-semantic.el --- Helm interface for Semantic -*- lexical-binding: t -*- + +;; Copyright (C) 2012 ~ 2017 Daniel Hackney +;; 2012 ~ 2023 Thierry Volpiatto + +;; Author: Daniel Hackney + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; Uses `candidates-in-buffer' for speed. + +;;; Code: + +(require 'cl-lib) +(require 'semantic) +(require 'helm-help) +(require 'helm-imenu) + +(declare-function pulse-momentary-highlight-one-line "pulse.el" (point &optional face)) + +(defgroup helm-semantic nil + "Semantic tags related libraries and applications for helm." + :group 'helm) + +(defcustom helm-semantic-display-style + '((python-mode . semantic-format-tag-summarize) + (c-mode . semantic-format-tag-concise-prototype-c-mode) + (emacs-lisp-mode . semantic-format-tag-abbreviate-emacs-lisp-mode)) + "Function to present a semantic tag according to `major-mode'. + +It is an alist where the `car' of each element is a `major-mode' and +the `cdr' a `semantic-format-tag-*' function. + +If no function is found for current `major-mode', fall back to +`semantic-format-tag-summarize' default function. + +You can have more or less informations depending of the `semantic-format-tag-*' +function you choose. + +All the supported functions are prefixed with \"semantic-format-tag-\", +you have completion on these functions with `C-M i' in the customize interface." + :group 'helm-semantic + :type '(alist :key-type symbol :value-type symbol)) + +;;; keymap +(defvar helm-semantic-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map helm-map) + map)) + +(defcustom helm-semantic-lynx-style-map nil + "Use Arrow keys to jump to occurences." + :group 'helm-semantic + :type 'boolean + :set (lambda (var val) + (set var val) + (if val + (progn + (define-key helm-semantic-map (kbd "") 'helm-execute-persistent-action) + (define-key helm-semantic-map (kbd "") 'helm-maybe-exit-minibuffer)) + (define-key helm-semantic-map (kbd "") nil) + (define-key helm-semantic-map (kbd "") nil)))) + +;; Internals vars +(defvar helm-semantic--tags-cache nil) + +(defun helm-semantic--fetch-candidates (tags depth &optional class) + "Write the contents of TAGS to the current buffer." + (let ((class class) cur-type + (stylefn (or (with-helm-current-buffer + (assoc-default major-mode helm-semantic-display-style)) + #'semantic-format-tag-summarize))) + (dolist (tag tags) + (when (listp tag) + (cl-case (setq cur-type (semantic-tag-class tag)) + ((function variable type) + (let ((spaces (make-string (* depth 2) ?\s)) + (type-p (eq cur-type 'type))) + (unless (and (> depth 0) (not type-p)) + (setq class nil)) + (insert + (if (and class (not type-p)) + (format "%s%s(%s) " + spaces (if (< depth 2) "" "├►") class) + spaces) + ;; Save the tag for later + (propertize (funcall stylefn tag nil t) + 'semantic-tag tag) + "\n") + (and type-p (setq class (car tag))) + ;; Recurse to children + (unless (eq cur-type 'function) + (helm-semantic--fetch-candidates + (semantic-tag-components tag) (1+ depth) class)))) + + ;; Don't do anything with packages or includes for now + ((package include) + (insert + (propertize (funcall stylefn tag nil t) + 'semantic-tag tag) + "\n") + ) + ;; Catch-all + (t)))))) + +(defun helm-semantic-default-action (_candidate &optional persistent) + ;; By default, helm doesn't pass on the text properties of the selection. + ;; Fix this. + (helm-log-run-hook "helm-semantic-default-action" + 'helm-goto-line-before-hook) + (with-current-buffer helm-buffer + (when (looking-at " ") + (goto-char (next-single-property-change + (pos-bol) 'semantic-tag nil (pos-eol)))) + (let ((tag (get-text-property (point) 'semantic-tag))) + (semantic-go-to-tag tag) + (unless persistent + (pulse-momentary-highlight-one-line (point)))))) + +(defun helm-semantic--maybe-set-needs-update () + (with-helm-current-buffer + (when (semantic-parse-tree-needs-update-p) + (semantic-parse-tree-set-needs-update)))) + +(defvar helm-source-semantic nil) + +(defclass helm-semantic-source (helm-source-in-buffer) + ((init :initform (lambda () + (helm-semantic--maybe-set-needs-update) + (setq helm-semantic--tags-cache (semantic-fetch-tags)) + (with-current-buffer (helm-candidate-buffer 'global) + (let ((major-mode (with-helm-current-buffer major-mode))) + (helm-semantic--fetch-candidates helm-semantic--tags-cache 0))))) + (get-line :initform 'buffer-substring) + (persistent-help :initform "Show this entry") + (keymap :initform 'helm-semantic-map) + (help-message :initform 'helm-semantic-help-message) + (persistent-action :initform (lambda (elm) + (helm-semantic-default-action elm t) + (helm-highlight-current-line))) + (action :initform 'helm-semantic-default-action))) + +(defcustom helm-semantic-fuzzy-match nil + "Enable fuzzy matching in `helm-source-semantic'." + :group 'helm-semantic + :type 'boolean + :set (lambda (var val) + (set var val) + (setq helm-source-semantic + (helm-make-source "Semantic Tags" 'helm-semantic-source + :fuzzy-match helm-semantic-fuzzy-match)))) + +;;;###autoload +(defun helm-semantic (arg) + "Preconfigured `helm' for `semantic'. +If ARG is supplied, pre-select symbol at point instead of current." + (interactive "P") + (let ((tag (helm-aif (car (semantic-current-tag-parent)) + (let ((curtag (car (semantic-current-tag)))) + (if (string= it curtag) + (format "\\_<%s\\_>" curtag) + (cons (format "\\_<%s\\_>" it) + (format "\\_<%s\\_>" curtag)))) + (format "\\_<%s\\_>" (car (semantic-current-tag))))) + (helm-highlight-matches-around-point-max-lines 'never)) + (unless helm-source-semantic + (setq helm-source-semantic + (helm-make-source "Semantic Tags" 'helm-semantic-source + :fuzzy-match helm-semantic-fuzzy-match))) + (helm :sources 'helm-source-semantic + :candidate-number-limit 9999 + :preselect (if arg + (thing-at-point 'symbol) + tag) + :buffer "*helm semantic*"))) + +;;;###autoload +(defun helm-semantic-or-imenu (arg) + "Preconfigured helm for `semantic' or `imenu'. +If ARG is supplied, pre-select symbol at point instead of current +semantic tag in scope. + +If `semantic-mode' is active in the current buffer, then use +semantic for generating tags, otherwise fall back to `imenu'. +Fill in the symbol at point by default." + (interactive "P") + (unless helm-source-semantic + (setq helm-source-semantic + (helm-make-source "Semantic Tags" 'helm-semantic-source + :fuzzy-match helm-semantic-fuzzy-match))) + (unless helm-source-imenu + (setq helm-source-imenu + (helm-make-source "Imenu" 'helm-imenu-source + :fuzzy-match helm-imenu-fuzzy-match))) + (let* ((source (if (semantic-active-p) + 'helm-source-semantic + 'helm-source-imenu)) + (helm-highlight-matches-around-point-max-lines 'never) + (imenu-p (eq source 'helm-source-imenu)) + (imenu-auto-rescan imenu-p) + (str (thing-at-point 'symbol)) + (helm-execute-action-at-once-if-one + (and imenu-p + helm-imenu-execute-action-at-once-if-one)) + (tag (helm-aif (car (semantic-current-tag-parent)) + (let ((curtag (car (semantic-current-tag)))) + (if (string= it curtag) + (format "\\_<%s\\_>" curtag) + (cons (format "\\_<%s\\_>" it) + (format "\\_<%s\\_>" curtag)))) + (format "\\_<%s\\_>" (car (semantic-current-tag)))))) + (helm :sources source + :candidate-number-limit 9999 + :default (and imenu-p (list (concat "\\_<" (and str (regexp-quote str)) "\\_>") str)) + :preselect (if (or arg imenu-p) str tag) + :buffer "*helm semantic/imenu*"))) + +(provide 'helm-semantic) + +;;; helm-semantic.el ends here diff --git a/code/elpa/helm-20240320.541/helm-sys.el b/code/elpa/helm-20240320.541/helm-sys.el new file mode 100644 index 0000000..b7dc357 --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-sys.el @@ -0,0 +1,472 @@ +;;; helm-sys.el --- System related functions for helm. -*- lexical-binding: t -*- + +;; Copyright (C) 2012 ~ 2023 Thierry Volpiatto + +;; 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 'helm) +(require 'helm-help) +(require 'helm-utils) + + +(defgroup helm-sys nil + "System related helm library." + :group 'helm) + +(defface helm-top-columns + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :inherit helm-header)) + "Face for helm help string in minibuffer." + :group 'helm-sys) + + +(defcustom helm-top-command + (cl-case system-type + (darwin "env COLUMNS=%s ps -axo pid,user,pri,nice,ucomm,tty,start_time,vsz,%%cpu,%%mem,etime,command") + (t "env COLUMNS=%s top -b -n 1")) + "Top command used to display output of top. +A format string where %s will be replaced with `frame-width'. + +To use top command, a version supporting batch mode (-b option) +is needed. On Mac OSX top command doesn't support this, so the +ps command is used instead by default. + +Normally top command output have 12 columns, but in some +versions you may have less than this, so you can either customize +top to use 12 columns with the interactives f and W commands +of top, or modify `helm-top-sort-columns-alist' to fit with the +number of columns your top command is using. + +If you modify ps command be sure that pid comes in first and +\"env COLUMNS=%s\" is specified at beginning of command. Ensure +also that no elements contain spaces (e.g., use start_time and +not start). Same as for top: you can customize +`helm-top-sort-columns-alist' to make sort commands working +properly according to your settings." + :group 'helm-sys + :type 'string) + +(defcustom helm-top-sort-columns-alist '((com . 11) + (mem . 9) + (cpu . 8) + (user . 1)) + "Allow defining which column to use when sorting output of top/ps command. +Only com, mem, cpu and user are sorted, so no need to put something +else there,it will have no effect. +Note that column numbers are counted from zero, i.e. column 1 is the +nth 0 column." + :group 'helm-sys + :type '(alist :key-type symbol :value-type (integer :tag "Column number"))) + +(defcustom helm-top-poll-delay 1.5 + "Helm top poll after this delay when `helm-top-poll-mode' is enabled. +The minimal delay allowed is 1.5, if less than this helm-top will use 1.5." + :group 'helm-sys + :type 'float) + +(defcustom helm-top-poll-delay-post-command 1.0 + "Helm top stop polling during this delay. +This delay is added to `helm-top-poll-delay' after Emacs stops +being idle." + :group 'helm-sys + :type 'float) + +(defcustom helm-top-poll-preselection 'linum + "Stay on same line or follow candidate when `helm-top-poll' updates display. +Possible values are \\='candidate or \\='linum. +This affects also sorting functions in the same way." + :group'helm-sys + :type '(radio :tag "Preferred preselection action for helm-top" + (const :tag "Follow candidate" candidate) + (const :tag "Stay on same line" linum))) + +;;; Top (process) +;; +;; +(defvar helm-top-sort-fn nil) +(defvar helm-top-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map helm-map) + (define-key map (kbd "M-P") 'helm-top-run-sort-by-cpu) + (define-key map (kbd "M-C") 'helm-top-run-sort-by-com) + (define-key map (kbd "M-M") 'helm-top-run-sort-by-mem) + (define-key map (kbd "M-U") 'helm-top-run-sort-by-user) + map)) + +(defvar helm-top-after-init-hook nil + "Local hook for helm-top.") + +(defvar helm-top--poll-timer nil) + +(defun helm-top-poll (&optional no-update delay) + (when helm-top--poll-timer + (cancel-timer helm-top--poll-timer)) + (condition-case nil + (progn + (when (and (helm--alive-p) (null no-update)) + ;; Fix quitting while process is running + ;; by binding `with-local-quit' in init function + ;; Bug#1521. + (helm-force-update + (cl-ecase helm-top-poll-preselection + (candidate (replace-regexp-in-string + "[0-9]+" "[0-9]+" + (regexp-quote (helm-get-selection nil t)))) + (linum `(lambda () + (goto-char (point-min)) + (forward-line ,(helm-candidate-number-at-point))))))) + (setq helm-top--poll-timer + (run-with-idle-timer + (helm-aif (current-idle-time) + (time-add it (seconds-to-time + (or delay (helm-top--poll-delay)))) + (or delay (helm-top--poll-delay))) + nil + 'helm-top-poll))) + (quit (cancel-timer helm-top--poll-timer)))) + +(defun helm-top--poll-delay () + (max 1.5 helm-top-poll-delay)) + +(defun helm-top-poll-no-update () + (helm-top-poll t (+ (helm-top--poll-delay) + helm-top-poll-delay-post-command))) + +(defun helm-top-initialize-poll-hooks () + ;; When Emacs is idle during say 20s + ;; the idle timer will run in 20+1.5 s. + ;; This is fine when Emacs stays idle, because the next timer + ;; will run at 21.5+1.5 etc... so the display will be updated + ;; at every 1.5 seconds. + ;; But as soon as emacs looses its idleness, the next update + ;; will occur at say 21+1.5 s, so we have to reinitialize + ;; the timer at 0+1.5. + (add-hook 'post-command-hook 'helm-top-poll-no-update) + (add-hook 'focus-in-hook 'helm-top-poll-no-update)) + +;;;###autoload +(define-minor-mode helm-top-poll-mode + "Refresh automatically helm top buffer once enabled." + :group 'helm-top + :global t + (if helm-top-poll-mode + (progn + (add-hook 'helm-top-after-init-hook 'helm-top-poll-no-update) + (add-hook 'helm-top-after-init-hook 'helm-top-initialize-poll-hooks)) + (remove-hook 'helm-top-after-init-hook 'helm-top-poll-no-update) + (remove-hook 'helm-top-after-init-hook 'helm-top-initialize-poll-hooks))) + +(defvar helm-source-top + (helm-build-in-buffer-source "Top" + :header-name (lambda (name) + (concat name (if helm-top-poll-mode + " (auto updating)" + " (Press C-c C-u to refresh)"))) + :init #'helm-top-init + :after-init-hook 'helm-top-after-init-hook + :cleanup (lambda () + (when helm-top--poll-timer + (cancel-timer helm-top--poll-timer)) + (remove-hook 'post-command-hook 'helm-top-poll-no-update) + (remove-hook 'focus-in-hook 'helm-top-poll-no-update)) + :display-to-real #'helm-top-display-to-real + :persistent-action '(helm-top-sh-persistent-action . never-split) + :persistent-help "SIGTERM" + :help-message 'helm-top-help-message + :mode-line 'helm-top-mode-line + :follow 'never + :keymap helm-top-map + :filtered-candidate-transformer #'helm-top-sort-transformer + :action-transformer #'helm-top-action-transformer + :group 'helm-sys)) + +(defvar helm-top--line nil) +(defun helm-top-transformer (candidates _source) + "Transformer for `helm-top'. +Return empty string for non--valid candidates." + (cl-loop for disp in candidates collect + (cond ((string-match "^ *[0-9]+" disp) disp) + ((string-match "^ *PID" disp) + (setq helm-top--line (cons (propertize disp 'face 'helm-top-columns) ""))) + (t (cons disp ""))) + into lst + finally return (or (member helm-top--line lst) + (cons helm-top--line lst)))) + +(defun helm-top--skip-top-line () + (let* ((src (helm-get-current-source)) + (src-name (assoc-default 'name src))) + (helm-aif (and (stringp src-name) + (string= src-name "Top") + (helm-get-selection nil t src)) + (when (string-match-p "^ *PID" it) + (helm-next-line))))) + +(defun helm-top-action-transformer (actions _candidate) + "Action transformer for `top'. +Show actions only on line starting by a PID." + (let ((disp (helm-get-selection nil t))) + (cond ((string-match "\\` *[0-9]+" disp) + (list '("kill (SIGTERM)" . (lambda (_pid) + (helm-top-sh "TERM" (helm-top--marked-pids)))) + '("kill (SIGKILL)" . (lambda (_pid) + (helm-top-sh "KILL" (helm-top--marked-pids)))) + '("kill (SIGINT)" . (lambda (_pid) + (helm-top-sh "INT" (helm-top--marked-pids)))) + '("kill (Choose signal)" + . (lambda (_pid) + (let ((pids (helm-top--marked-pids))) + (helm-top-sh + (helm-comp-read (format "Kill %d pids with signal: " + (length pids)) + '("ALRM" "HUP" "INT" "KILL" "PIPE" "POLL" + "PROF" "TERM" "USR1" "USR2" "VTALRM" + "STKFLT" "PWR" "WINCH" "CHLD" "URG" + "TSTP" "TTIN" "TTOU" "STOP" "CONT" + "ABRT" "FPE" "ILL" "QUIT" "SEGV" + "TRAP" "SYS" "EMT" "BUS" "XCPU" "XFSZ") + :must-match t) + pids)))))) + (t actions)))) + +(defun helm-top--marked-pids () + (helm-remove-if-not-match "\\`[0-9]+\\'" (helm-marked-candidates))) + +(defun helm-top-sh (sig pids) + "Run kill shell command with signal SIG on PIDS for `helm-top'." + (message "kill -%s %s exited with status %s" + sig (mapconcat 'identity pids " ") + (apply #'call-process + "kill" nil nil nil (format "-%s" sig) pids))) + +(defun helm-top-sh-persistent-action (pid) + (helm-top-sh "TERM" (list pid)) + (helm-delete-current-selection)) + +(defun helm-top-init () + "Insert output of top command in candidate buffer." + (with-local-quit + (unless helm-top-sort-fn (helm-top-set-mode-line "CPU")) + (with-current-buffer (helm-candidate-buffer 'global) + (call-process-shell-command + (format helm-top-command (frame-width)) + nil (current-buffer))))) + +(defun helm-top-display-to-real (line) + "Return pid only from LINE." + (car (split-string line))) + +;; Sort top command + +(defun helm-top-set-mode-line (str) + (if (string-match "Sort:\\[\\(.*\\)\\] " helm-top-mode-line) + (setq helm-top-mode-line (replace-match str nil nil helm-top-mode-line 1)) + (setq helm-top-mode-line (concat (format "Sort:[%s] " str) helm-top-mode-line)))) + +(defun helm-top-sort-transformer (candidates source) + (helm-top-transformer + (if helm-top-sort-fn + (cl-loop for c in candidates + if (string-match "^ *[0-9]+" c) + collect c into pid-cands + else collect c into header-cands + finally return (append + header-cands + (sort pid-cands helm-top-sort-fn))) + candidates) + source)) + +(defun helm-top-sort-by-com (s1 s2) + (let* ((split-1 (split-string s1)) + (split-2 (split-string s2)) + (col (cdr (assq 'com helm-top-sort-columns-alist))) + (com-1 (nth col split-1)) + (com-2 (nth col split-2))) + (string< com-1 com-2))) + +(defun helm-top-sort-by-mem (s1 s2) + (let* ((split-1 (split-string s1)) + (split-2 (split-string s2)) + (col (cdr (assq 'mem helm-top-sort-columns-alist))) + (mem-1 (string-to-number (nth col split-1))) + (mem-2 (string-to-number (nth col split-2)))) + (> mem-1 mem-2))) + +(defun helm-top-sort-by-cpu (s1 s2) + (let* ((split-1 (split-string s1)) + (split-2 (split-string s2)) + (col (cdr (assq 'cpu helm-top-sort-columns-alist))) + (cpu-1 (string-to-number (nth col split-1))) + (cpu-2 (string-to-number (nth col split-2)))) + (> cpu-1 cpu-2))) + +(defun helm-top-sort-by-user (s1 s2) + (let* ((split-1 (split-string s1)) + (split-2 (split-string s2)) + (col (cdr (assq 'user helm-top-sort-columns-alist))) + (user-1 (nth col split-1)) + (user-2 (nth col split-2))) + (string< user-1 user-2))) + +(defun helm-top--preselect-fn () + (if (eq helm-top-poll-preselection 'linum) + `(lambda () + (goto-char (point-min)) + (forward-line ,(helm-candidate-number-at-point))) + (replace-regexp-in-string + "[0-9]+" "[0-9]+" + (regexp-quote (helm-get-selection nil t))))) + +(defun helm-top-run-sort-by-com () + (interactive) + (helm-top-set-mode-line "COM") + (setq helm-top-sort-fn 'helm-top-sort-by-com) + (helm-update (helm-top--preselect-fn))) + +(defun helm-top-run-sort-by-cpu () + (interactive) + (helm-top-set-mode-line "CPU") + ;; Force sorting by CPU even if some versions of top are using by + ;; default CPU sorting (Bug#1908). + (setq helm-top-sort-fn 'helm-top-sort-by-cpu) + (helm-update (helm-top--preselect-fn))) + +(defun helm-top-run-sort-by-mem () + (interactive) + (helm-top-set-mode-line "MEM") + (setq helm-top-sort-fn 'helm-top-sort-by-mem) + (helm-update (helm-top--preselect-fn))) + +(defun helm-top-run-sort-by-user () + (interactive) + (helm-top-set-mode-line "USER") + (setq helm-top-sort-fn 'helm-top-sort-by-user) + (helm-update (helm-top--preselect-fn))) + + +;;; X RandR resolution change +;; +;; +;;; FIXME I do not care multi-display. + +(defun helm-xrandr-info () + "Return a pair with current X screen number and current X display name." + (with-temp-buffer + (call-process "xrandr" nil (current-buffer) nil + "--current") + (let (screen output) + (goto-char (point-min)) + (save-excursion + (when (re-search-forward "\\(^Screen \\)\\([0-9]\\):" nil t) + (setq screen (match-string 2)))) + (when (re-search-forward "^\\(.*\\) connected" nil t) + (setq output (match-string 1))) + (list screen output)))) + +(defun helm-xrandr-screen () + "Return current X screen number." + (car (helm-xrandr-info))) + +(defun helm-xrandr-output () + "Return current X display name." + (cadr (helm-xrandr-info))) + +(defvar helm-source-xrandr-change-resolution + (helm-build-sync-source "Change Resolution" + :candidates + (lambda () + (with-temp-buffer + (call-process "xrandr" nil (current-buffer) nil + "--screen" (helm-xrandr-screen) "-q") + (goto-char 1) + (cl-loop while (re-search-forward " \\([0-9]+x[0-9]+\\)" nil t) + for mode = (match-string 1) + unless (member mode modes) + collect mode into modes + finally return modes))) + :action + (helm-make-actions "Change Resolution" + (lambda (mode) + (call-process "xrandr" nil nil nil + "--screen" (helm-xrandr-screen) + "--output" (helm-xrandr-output) + "--mode" mode))))) + + +;;; Emacs process +;; +;; +(defvar helm-source-emacs-process + (helm-build-sync-source "Emacs Process" + :init (lambda () + (let (tabulated-list-use-header-line) + (list-processes--refresh))) + :candidates (lambda () (mapcar #'process-name (process-list))) + :candidate-transformer + (lambda (candidates) + (cl-loop for c in candidates + for command = (mapconcat + 'identity + (process-command (get-process c)) " ") + if (and command (not (string= command ""))) collect + (cons (concat c " --> " + (mapconcat 'identity + (process-command (get-process c)) " ")) + c) + else collect c)) + :multiline t + :persistent-action (lambda (elm) + (delete-process (get-process elm)) + (helm-delete-current-selection)) + :persistent-help "Kill Process" + :action (helm-make-actions "Kill Process" + (lambda (_elm) + (cl-loop for p in (helm-marked-candidates) + do (delete-process (get-process p))))))) + + +;;;###autoload +(defun helm-top () + "Preconfigured `helm' for top command." + (interactive) + (add-hook 'helm-after-update-hook 'helm-top--skip-top-line) + (unwind-protect + (helm :sources 'helm-source-top + :buffer "*helm top*" :full-frame t + :candidate-number-limit 9999 + :preselect "^\\s-*[0-9]+" + :truncate-lines helm-show-action-window-other-window) + (remove-hook 'helm-after-update-hook 'helm-top--skip-top-line))) + +;;;###autoload +(defun helm-list-emacs-process () + "Preconfigured `helm' for Emacs process." + (interactive) + (helm :sources 'helm-source-emacs-process + :truncate-lines t + :buffer "*helm process*")) + +;;;###autoload +(defun helm-xrandr-set () + "Preconfigured helm for xrandr." + (interactive) + (helm :sources 'helm-source-xrandr-change-resolution + :buffer "*helm xrandr*")) + +(provide 'helm-sys) + +;;; helm-sys.el ends here diff --git a/code/elpa/helm-20240320.541/helm-tags.el b/code/elpa/helm-20240320.541/helm-tags.el new file mode 100644 index 0000000..efbd9ce --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-tags.el @@ -0,0 +1,337 @@ +;;; helm-tags.el --- Helm for Etags. -*- lexical-binding: t -*- + +;; Copyright (C) 2012 ~ 2023 Thierry Volpiatto + +;; 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 'helm) +(require 'helm-help) +(require 'helm-utils) +(require 'helm-grep) + +(defvar helm-etags-fuzzy-match) +(declare-function xref-push-marker-stack "xref") + + +(defgroup helm-tags nil + "Tags related Applications and libraries for Helm." + :group 'helm) + +(defcustom helm-etags-tag-file-name "TAGS" + "Etags tag file name." + :type 'string) + +(defcustom helm-etags-tag-file-search-limit 10 + "The limit level of directory to search tag file. +Don't search tag file deeply if outside this value." + :type 'number) + +(defcustom helm-etags-match-part-only 'tag + "Allow choosing the tag part of CANDIDATE in `helm-source-etags-select'. +A tag looks like this: + filename: (defun foo +You can choose matching against the tag part (i.e \"(defun foo\"), +or against the whole candidate (i.e \"(filename:5:(defun foo\")." + :type '(choice + (const :tag "Match only tag" tag) + (const :tag "Match all file+tag" all))) + +(defcustom helm-etags-execute-action-at-once-if-one t + "Whether to jump straight to the selected tag if there's only +one match." + :type 'boolean) + + +(defgroup helm-tags-faces nil + "Customize the appearance of helm-tags faces." + :prefix "helm-" + :group 'helm-tags + :group 'helm-faces) + +(defface helm-etags-file + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "Lightgoldenrod4" + :underline t)) + "Face used to highlight etags filenames." + :group 'helm-tags-faces) + + +;;; Etags +;; +;; +(defun helm-etags-find-file (candidate) + "Find file CANDIDATE from helm etags buffer." + (helm-etags-action-goto 'find-file candidate)) + +(defun helm-etags-find-file-other-window (candidate) + "Find file other window from helm etags buffer." + (helm-etags-action-goto 'find-file-other-window candidate)) + +(defun helm-etags-find-file-other-frame (candidate) + "Find file other frame from helm etags buffer." + (helm-etags-action-goto 'find-file-other-frame candidate)) + +(helm-make-command-from-action helm-etags-run-switch-other-window + "Run switch to other window action from `helm-source-etags-select'." + 'helm-etags-find-file-other-window) + +(helm-make-command-from-action helm-etags-run-switch-other-frame + "Run switch to other frame action from `helm-source-etags-select'." + 'helm-etags-find-file-other-frame) + +(defvar helm-etags-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map helm-map) + (define-key map (kbd "M-") 'helm-goto-next-file) + (define-key map (kbd "M-") 'helm-goto-precedent-file) + (define-key map (kbd "C-c o") 'helm-etags-run-switch-other-window) + (define-key map (kbd "C-c C-o") 'helm-etags-run-switch-other-frame) + map) + "Keymap used in Etags.") + +(defvar helm-etags-mtime-alist nil + "Store the last modification time of etags files here.") +(defvar helm-etags-cache (make-hash-table :test 'equal) + "Cache content of etags files used here for faster access.") + +(defun helm-etags-get-tag-file (&optional directory) + "Return the path of etags file if found in DIRECTORY. +Look recursively in parents directorys for a +`helm-etags-tag-file-name' file." + ;; Get tag file from `default-directory' or upper directory. + (let ((current-dir (helm-etags-find-tag-file-directory + (or directory default-directory)))) + ;; Return nil if not find tag file. + (when current-dir + (expand-file-name helm-etags-tag-file-name current-dir)))) + +(defun helm-etags-all-tag-files () + "Find Etags files. +Return files from the following sources: + 1) An automatically located file in the parent directories, + by `helm-etags-get-tag-file'. + 2) `tags-file-name', which is commonly set by `find-tag' command. + 3) `tags-table-list' which is commonly set by `visit-tags-table' command." + (helm-fast-remove-dups + (delq nil + (append (list (helm-etags-get-tag-file) + tags-file-name) + tags-table-list)) + :test 'equal)) + +(defun helm-etags-find-tag-file-directory (current-dir) + "Try to find the directory containing tag file. +If not found in CURRENT-DIR search in upper directory." + (let ((file-exists? (lambda (dir) + (let ((tag-path (expand-file-name + helm-etags-tag-file-name dir))) + (and (stringp tag-path) + (file-regular-p tag-path) + (file-readable-p tag-path)))))) + (cl-loop with count = 0 + until (funcall file-exists? current-dir) + ;; Return nil if outside the value of + ;; `helm-etags-tag-file-search-limit'. + if (= count helm-etags-tag-file-search-limit) + do (cl-return nil) + ;; Or search upper directories. + else + do (cl-incf count) + (setq current-dir (expand-file-name (concat current-dir "../"))) + finally return current-dir))) + +(defun helm-etags-get-header-name (_x) + "Create header name for this helm etags session." + (concat "Etags in " + (with-helm-current-buffer + (helm-etags-get-tag-file)))) + +(defun helm-etags-create-buffer (file) + "Create the `helm-buffer' based on contents of etags tag FILE." + (let* (max + (split (with-temp-buffer + (insert-file-contents file) + (prog1 + (split-string (buffer-string) "\n" 'omit-nulls) + (setq max (line-number-at-pos (point-max)))))) + (progress-reporter (make-progress-reporter "Loading tag file..." 0 max))) + (cl-loop + with fname + with cand + for i in split for count from 0 + for elm = (unless (string-match "^\x0c" i) ;; "^L" + (helm-aif (string-match "\177" i) ;; "^?" + (substring i 0 it) + i)) + for linum = (when (string-match "[0-9]+,?[0-9]*$" i) + (car (split-string (match-string 0 i) ","))) + do (cond ((and elm (string-match "^\\([^,]+\\),[0-9]+$" elm)) + (setq fname (propertize (match-string 1 elm) + 'face 'helm-etags-file))) + (elm (setq cand (format "%s:%s:%s" fname linum elm))) + (t (setq cand nil))) + when cand do (progn + (insert (propertize (concat cand "\n") 'linum linum)) + (progress-reporter-update progress-reporter count))))) + +(defun helm-etags-init () + "Feed `helm-buffer' using `helm-etags-cache' or tag file. +If there is no entry in cache, create one." + (let ((tagfiles (helm-etags-all-tag-files))) + (when tagfiles + (with-current-buffer (helm-candidate-buffer 'global) + (dolist (f tagfiles) + (helm-aif (gethash f helm-etags-cache) + ;; An entry is present in cache, insert it. + (insert it) + ;; No entry, create a new buffer using content of tag file (slower). + (helm-etags-create-buffer f) + ;; Store content of buffer in cache. + (puthash f (buffer-string) helm-etags-cache) + ;; Store or set the last modification of tag file. + (helm-aif (assoc f helm-etags-mtime-alist) + ;; If an entry exists modify it. + (setcdr it (helm-etags-mtime f)) + ;; No entry create a new one. + (cl-pushnew (cons f (helm-etags-mtime f)) + helm-etags-mtime-alist + :test 'equal)))))))) + +(defvar helm-source-etags-select nil + "Helm source for Etags.") + +(defun helm-etags-build-source () + (helm-build-in-buffer-source "Etags" + :header-name 'helm-etags-get-header-name + :init 'helm-etags-init + :get-line 'buffer-substring + :match-part (lambda (candidate) + ;; Match only the tag part of CANDIDATE + ;; and not the filename. + (cl-case helm-etags-match-part-only + (tag (cl-caddr (helm-grep-split-line candidate))) + (t candidate))) + :fuzzy-match helm-etags-fuzzy-match + :help-message 'helm-etags-help-message + :keymap helm-etags-map + :action '(("Go to tag" . helm-etags-find-file) + ("Go to tag in other window" . helm-etags-find-file-other-window) + ("Go to tag in other frame" . helm-etags-find-file-other-frame)) + :group 'helm-tags + :persistent-help "Go to line" + :persistent-action (lambda (candidate) + (helm-etags-action-goto 'find-file candidate) + (helm-highlight-current-line)))) + +(defcustom helm-etags-fuzzy-match nil + "Use fuzzy matching in `helm-etags-select'." + :group 'helm-tags + :type 'boolean + :set (lambda (var val) + (set var val) + (setq helm-source-etags-select + (helm-etags-build-source)))) + +(defsubst helm-etags--file-from-tag (fname) + (cl-loop for ext in + (cons "" (remove "" tags-compression-info-list)) + for file = (concat fname ext) + when (file-exists-p file) + return file)) + +(defun helm-etags-action-goto (switcher candidate) + "Helm default action to jump to an etags entry in other window." + (require 'etags) + (deactivate-mark t) + (helm-log-run-hook "helm-etags-action-goto " 'helm-goto-line-before-hook) + (let* ((split (helm-grep-split-line candidate)) + (fname (cl-loop for tagf being the hash-keys of helm-etags-cache + for f = (expand-file-name + (car split) (file-name-directory tagf)) + ;; Try to find an existing file, possibly compressed. + when (helm-etags--file-from-tag f) + return it)) + (elm (cl-caddr split)) + (linum (string-to-number (cadr split)))) + (if (null fname) + (error "file %s not found" fname) + (xref-push-marker-stack) + (funcall switcher fname) + (helm-goto-line linum t) + (when (search-forward elm nil t) + (goto-char (match-beginning 0)))))) + +(defun helm-etags-mtime (file) + "Last modification time of etags tag FILE." + (cadr (nth 5 (file-attributes file)))) + +(defun helm-etags-file-modified-p (file) + "Check if tag FILE have been modified in this session. +If FILE is nil return nil." + (let ((last-modif (and file + (assoc-default file helm-etags-mtime-alist)))) + (and last-modif + (/= last-modif (helm-etags-mtime file))))) + +;;;###autoload +(defun helm-etags-select (reinit) + "Preconfigured helm for etags. +If called with a prefix argument REINIT +or if any of the tag files have been modified, reinitialize cache. + +This function aggregates three sources of tag files: + + 1) An automatically located file in the parent directories, + by `helm-etags-get-tag-file'. + 2) `tags-file-name', which is commonly set by `find-tag' command. + 3) `tags-table-list' which is commonly set by `visit-tags-table' command." + (interactive "P") + (let ((tag-files (helm-etags-all-tag-files)) + (helm-execute-action-at-once-if-one + helm-etags-execute-action-at-once-if-one) + (str (if (region-active-p) + (buffer-substring-no-properties + (region-beginning) (region-end)) + (thing-at-point 'symbol)))) + (if (cl-notany 'file-exists-p tag-files) + (message "Error: No tag file found.\ +Create with etags shell command, or visit with `find-tag' or `visit-tags-table'.") + (cl-loop for k being the hash-keys of helm-etags-cache + unless (member k tag-files) + do (remhash k helm-etags-cache)) + (mapc (lambda (f) + (when (or (equal reinit '(4)) + (and helm-etags-mtime-alist + (helm-etags-file-modified-p f))) + (remhash f helm-etags-cache))) + tag-files) + (unless helm-source-etags-select + (setq helm-source-etags-select + (helm-etags-build-source))) + (helm :sources 'helm-source-etags-select + :keymap helm-etags-map + :default (and (stringp str) + (if (or helm-etags-fuzzy-match + (and (eq major-mode 'haskell-mode) + (string-match "[']\\'" str))) + str + (list (concat "\\_<" str "\\_>") str))) + :buffer "*helm etags*")))) + +(provide 'helm-tags) + +;;; helm-tags.el ends here diff --git a/code/elpa/helm-20240320.541/helm-types.el b/code/elpa/helm-20240320.541/helm-types.el new file mode 100644 index 0000000..6f129b2 --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-types.el @@ -0,0 +1,337 @@ +;;; helm-types.el --- Helm types classes and methods. -*- lexical-binding: t -*- + +;; Copyright (C) 2015 ~ 2020 Thierry Volpiatto + +;; Author: Thierry Volpiatto +;; URL: http://github.com/emacs-helm/helm + +;; 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 'eieio) +(eval-when-compile (require 'helm-source)) + +(defvar helm-map) +(defvar helm-mode-line-string) +(defvar helm-bookmark-map) +(declare-function helm-make-actions "helm-lib") +(declare-function helm-ediff-marked-buffers "helm-buffers") +(declare-function helm-make-type "helm-source") + + +;; Files +(defclass helm-type-file (helm-source) () + "A class to define helm type file.") + +(cl-defmethod helm-source-get-action-from-type ((object helm-type-file)) + (slot-value object 'action)) + +(defun helm-actions-from-type-file () + (let ((source (make-instance 'helm-type-file))) + (helm--setup-source source) + (helm-source-get-action-from-type source))) + +(defvar helm-generic-files-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map helm-map) + (define-key map (kbd "C-]") 'helm-ff-run-toggle-basename) + (define-key map (kbd "C-s") 'helm-ff-run-grep) + (define-key map (kbd "M-g s") 'helm-ff-run-grep) + (define-key map (kbd "M-g z") 'helm-ff-run-zgrep) + (define-key map (kbd "M-g p") 'helm-ff-run-pdfgrep) + (define-key map (kbd "M-R") 'helm-ff-run-rename-file) + (define-key map (kbd "M-C") 'helm-ff-run-copy-file) + (define-key map (kbd "M-B") 'helm-ff-run-byte-compile-file) + (define-key map (kbd "M-L") 'helm-ff-run-load-file) + (define-key map (kbd "M-S") 'helm-ff-run-symlink-file) + (define-key map (kbd "M-H") 'helm-ff-run-hardlink-file) + (define-key map (kbd "M-D") 'helm-ff-run-delete-file) + (define-key map (kbd "C-=") 'helm-ff-run-ediff-file) + (define-key map (kbd "C-c =") 'helm-ff-run-ediff-merge-file) + (define-key map (kbd "C-c o") 'helm-ff-run-switch-other-window) + (define-key map (kbd "C-c r") 'helm-ff-run-find-file-as-root) + (define-key map (kbd "C-c C-o") 'helm-ff-run-switch-other-frame) + (define-key map (kbd "M-i") 'helm-ff-properties-persistent) + (define-key map (kbd "C-c C-x") 'helm-ff-run-open-file-externally) + (define-key map (kbd "C-c X") 'helm-ff-run-open-file-with-default-tool) + (define-key map (kbd "C-c @") 'helm-ff-run-insert-org-link) + (define-key map (kbd "C-x C-q") 'helm-ff-run-marked-files-in-dired) + (define-key map (kbd "C-c C-a") 'helm-ff-run-mail-attach-files) + map) + "Generic Keymap for files.") + +(defcustom helm-type-file-actions + (helm-make-actions + "Find file" 'helm-find-file-or-marked + "Find file as root" 'helm-find-file-as-root + "Find file other window" 'helm-find-files-other-window + "Find file other frame" 'find-file-other-frame + "Open dired in file's directory" 'helm-open-dired + "Attach file(s) to mail buffer `C-c C-a'" 'helm-ff-mail-attach-files + "Marked files in dired" 'helm-marked-files-in-dired + "Grep File(s) `C-u recurse'" 'helm-find-files-grep + "Zgrep File(s) `C-u Recurse'" 'helm-ff-zgrep + "Pdfgrep File(s)" 'helm-ff-pdfgrep + "Insert as org link" 'helm-files-insert-as-org-link + "Checksum File" 'helm-ff-checksum + "Ediff File" 'helm-find-files-ediff-files + "Ediff Merge File" 'helm-find-files-ediff-merge-files + "View file" 'view-file + "Insert file" 'insert-file + "Add marked files to file-cache" 'helm-ff-cache-add-file + "Delete file(s)" 'helm-ff-delete-files + "Copy file(s) `M-C, C-u to follow'" 'helm-find-files-copy + "Rename file(s) `M-R, C-u to follow'" 'helm-find-files-rename + "Symlink files(s) `M-S, C-u to follow'" 'helm-find-files-symlink + "Relsymlink file(s) `C-u to follow'" 'helm-find-files-relsymlink + "Hardlink file(s) `M-H, C-u to follow'" 'helm-find-files-hardlink + "Open file externally (C-u to choose)" 'helm-open-file-externally + "Open file with default tool" 'helm-open-file-with-default-tool + "Find file in hex dump" 'hexl-find-file) + "Default actions for type files." + :group 'helm-files + :type '(alist :key-type string :value-type function)) + +(cl-defmethod helm--setup-source ((_source helm-type-file))) + +(cl-defmethod helm--setup-source :before ((source helm-type-file)) + (setf (slot-value source 'action) 'helm-type-file-actions) + (setf (slot-value source 'persistent-help) "Show this file") + (setf (slot-value source 'action-transformer) + '(helm-transform-file-load-el + helm-transform-file-browse-url + helm-transform-file-cache)) + (setf (slot-value source 'candidate-transformer) + '(helm-skip-boring-files + helm-w32-pathname-transformer)) + (setf (slot-value source 'filtered-candidate-transformer) + 'helm-highlight-files) + (setf (slot-value source 'help-message) 'helm-generic-file-help-message) + (setf (slot-value source 'mode-line) (list "File(s)" helm-mode-line-string)) + (setf (slot-value source 'keymap) helm-generic-files-map) + (setf (slot-value source 'group) 'helm-files)) + + +;; Bookmarks +(defclass helm-type-bookmark (helm-source) () + "A class to define type bookmarks.") + +(defcustom helm-type-bookmark-actions + (helm-make-actions + "Jump to bookmark" 'helm-bookmark-jump + "Jump to BM other window" 'helm-bookmark-jump-other-window + "Jump to BM other frame" 'helm-bookmark-jump-other-frame + "Jump to BM other tab" 'helm-bookmark-jump-other-tab + "Bookmark edit annotation" 'bookmark-edit-annotation + "Bookmark show annotation" 'bookmark-show-annotation + "Delete bookmark(s)" 'helm-delete-marked-bookmarks + "Edit Bookmark" 'helm-bookmark-edit-bookmark + "Rename bookmark" 'helm-bookmark-rename + "Relocate bookmark" 'bookmark-relocate) + "Default actions for type bookmarks." + :group 'helm-bookmark + :type '(alist :key-type string + :value-type function)) + +(cl-defmethod helm-source-get-action-from-type ((object helm-type-bookmark)) + (slot-value object 'action)) + +(cl-defmethod helm--setup-source ((_source helm-type-bookmark))) + +(cl-defmethod helm--setup-source :before ((source helm-type-bookmark)) + (setf (slot-value source 'action) 'helm-type-bookmark-actions) + (setf (slot-value source 'keymap) helm-bookmark-map) + (setf (slot-value source 'mode-line) (list "Bookmark(s)" helm-mode-line-string)) + (setf (slot-value source 'help-message) 'helm-bookmark-help-message) + (setf (slot-value source 'migemo) t) + (setf (slot-value source 'follow) 'never) + (setf (slot-value source 'group) 'helm-bookmark)) + + +;; Buffers +(defclass helm-type-buffer (helm-source) () + "A class to define type buffer.") + +(defcustom helm-type-buffer-actions + (helm-make-actions + "Switch to buffer(s)" 'helm-buffer-switch-buffers + "Switch to buffer(s) other window `C-c o'" + 'helm-buffer-switch-buffers-other-window + "Switch to buffer(s) other frame `C-c C-o'" + 'helm-buffer-switch-to-buffer-other-frame + "Raise buffer frame maybe" + 'helm-buffers-maybe-raise-buffer-frame + (lambda () (and (fboundp 'tab-bar-mode) + "Switch to buffer(s) other tab `C-c C-t'")) + 'helm-buffers-switch-to-buffer-other-tab + "Switch to buffer at line number" + 'helm-switch-to-buffer-at-linum + "Browse project `C-x C-d'" + 'helm-buffers-browse-project + "Switch to shell" + 'helm-buffer-switch-to-shell + "Query replace regexp `C-M-%'" + 'helm-buffer-query-replace-regexp + "Query replace `M-%'" 'helm-buffer-query-replace + "View buffer" 'view-buffer + "Display buffer" 'display-buffer + "Rename buffer `M-R'" 'helm-buffers-rename-buffer + "Grep buffer(s) `M-g s' (C-u grep all buffers)" + 'helm-zgrep-buffers + "Multi occur buffer(s) `C-s (C-u search also in current)'" + 'helm-multi-occur-as-action + "Revert buffer(s) `M-G'" 'helm-revert-marked-buffers + "Insert buffer" 'insert-buffer + "Kill buffer(s) `M-D'" 'helm-kill-marked-buffers + "Diff with file `C-='" 'diff-buffer-with-file + "Ediff Marked buffers `C-c ='" 'helm-ediff-marked-buffers + "Ediff Merge marked buffers `M-='" + (lambda (candidate) + (helm-ediff-marked-buffers candidate t))) + "Default actions for type buffers." + :group 'helm-buffers + :type '(alist :key-type string :value-type function)) + +(cl-defmethod helm-source-get-action-from-type ((object helm-type-buffer)) + (slot-value object 'action)) + +(cl-defmethod helm--setup-source ((_source helm-type-buffer))) + +(cl-defmethod helm--setup-source :before ((source helm-type-buffer)) + (setf (slot-value source 'action) 'helm-type-buffer-actions) + (setf (slot-value source 'persistent-help) "Show this buffer") + (setf (slot-value source 'mode-line) + ;; Use default-value of `helm-mode-line-string' in case user + ;; starts with a helm buffer as current-buffer otherwise the + ;; local value of this helm buffer is used (bug#1517, bug#2377). + (list "Buffer(s)" (default-value 'helm-mode-line-string))) + (setf (slot-value source 'filtered-candidate-transformer) + '(helm-skip-boring-buffers + helm-buffers-sort-transformer + helm-highlight-buffers)) + (setf (slot-value source 'group) 'helm-buffers)) + +;; Functions +(defclass helm-type-function (helm-source) () + "A class to define helm type function.") + +(defcustom helm-type-function-actions + (helm-make-actions + "Describe function" 'helm-describe-function + "Find function (C-u for source)" 'helm-find-function + "Info lookup" 'helm-info-lookup-symbol + "Debug on entry" 'debug-on-entry + "Cancel debug on entry" 'cancel-debug-on-entry + "Trace function" 'trace-function + "Trace function (background)" 'trace-function-background + "Untrace function" 'untrace-function) + "Default actions for type functions." + :group 'helm-elisp + ;; Use symbol as value type because some functions may not be + ;; autoloaded (like untrace-function). + :type '(alist :key-type string :value-type symbol)) + +(cl-defmethod helm-source-get-action-from-type ((object helm-type-function)) + (slot-value object 'action)) + +(defun helm-actions-from-type-function () + (let ((source (make-instance 'helm-type-function))) + (helm--setup-source source) + (helm-source-get-action-from-type source))) + +(cl-defmethod helm--setup-source ((_source helm-type-function))) + +(cl-defmethod helm--setup-source :before ((source helm-type-function)) + (setf (slot-value source 'action) 'helm-type-function-actions) + (setf (slot-value source 'action-transformer) + 'helm-transform-function-call-interactively) + (setf (slot-value source 'candidate-transformer) + 'helm-mark-interactive-functions) + (setf (slot-value source 'coerce) 'helm-symbolify)) + + +;; Commands +(defclass helm-type-command (helm-source) () + "A class to define helm type command.") + +(defun helm-actions-from-type-command () + (let ((source (make-instance 'helm-type-command))) + (helm--setup-source source) + (helm-source-get-action-from-type source))) + +(defcustom helm-type-command-actions + (append (helm-make-actions + "Execute command" 'helm-M-x-execute-command) + (symbol-value + (helm-actions-from-type-function))) + "Default actions for type command." + :group 'helm-command + :type '(alist :key-type string :value-type symbol)) + +(cl-defmethod helm--setup-source ((_source helm-type-command))) + +(cl-defmethod helm--setup-source :before ((source helm-type-command)) + (setf (slot-value source 'action) 'helm-type-command-actions) + (setf (slot-value source 'coerce) 'helm-symbolify) + (setf (slot-value source 'persistent-action) 'helm-M-x-persistent-action) + (setf (slot-value source 'persistent-help) "Describe this command") + (setf (slot-value source 'group) 'helm-command)) + +;; Timers +(defclass helm-type-timers (helm-source) () + "A class to define helm type timers.") + +(defcustom helm-type-timers-actions + '(("Cancel Timer" . (lambda (_timer) + (let ((mkd (helm-marked-candidates))) + (cl-loop for timer in mkd + do (cancel-timer timer))))) + ("Describe Function" . (lambda (tm) + (describe-function (timer--function tm)))) + ("Find Function" . (lambda (tm) + (helm-aif (timer--function tm) + (if (or (byte-code-function-p it) + (helm-subr-native-elisp-p it)) + (message "Can't find anonymous function `%s'" it) + (find-function it)))))) + "Default actions for type timers." + :group 'helm-elisp + :type '(alist :key-type string :value-type function)) + +(cl-defmethod helm--setup-source ((_source helm-type-timers))) + +(cl-defmethod helm--setup-source :before ((source helm-type-timers)) + (setf (slot-value source 'action) 'helm-type-timers-actions) + (setf (slot-value source 'persistent-action) + (lambda (tm) + (describe-function (timer--function tm)))) + (setf (slot-value source 'persistent-help) "Describe Function") + (setf (slot-value source 'group) 'helm-elisp)) + +;; Builders. +(defun helm-build-type-file () + (helm-make-type 'helm-type-file)) + +(defun helm-build-type-function () + (helm-make-type 'helm-type-function)) + +(defun helm-build-type-command () + (helm-make-type 'helm-type-command)) + +(provide 'helm-types) + +;;; helm-types.el ends here diff --git a/code/elpa/helm-20240320.541/helm-utils.el b/code/elpa/helm-20240320.541/helm-utils.el new file mode 100644 index 0000000..2099963 --- /dev/null +++ b/code/elpa/helm-20240320.541/helm-utils.el @@ -0,0 +1,1151 @@ +;;; helm-utils.el --- Utilities Functions for helm. -*- lexical-binding: t -*- + +;; Copyright (C) 2012 ~ 2023 Thierry Volpiatto + +;; 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 'helm) +(require 'helm-help) + +(declare-function helm-find-files-1 "helm-files" (fname &optional preselect)) +(declare-function helm-grep-split-line "helm-grep" (line)) +(declare-function popup-tip "ext:popup") +(declare-function markdown-show-entry "ext:markdown-mode.el") +(declare-function outline-show-subtree "outline") +(declare-function org-reveal "org") +(declare-function hs-show-block "hideshow.el") +(declare-function hs-show-all "hideshow.el") +(declare-function tab-bar-tabs "tab-bar") +(declare-function tab-bar-select-tab "tab-bar") +(declare-function dired-goto-file "dired") +(declare-function bookmark-get-filename "bookmark") +(declare-function package-installed-p "package") +(declare-function package-desc-dir "package") + +(defvar hs-minor-mode) +(defvar hs-show-hook) +(defvar org-directory) +(defvar winner-boring-buffers) +(defvar bookmark-alist) +(defvar dired-buffers) +(defvar helm-show-completion-overlay) +(defvar helm-buffers-maybe-switch-to-tab) +(defvar helm-ff-transformer-show-only-basename) +(defvar helm-popup-tip-mode) +(defvar helm-ff-last-expanded-candidate-regexp) +(defvar helm-mode-find-file-target-alist) + +(defgroup helm-utils nil + "Utilities routines for Helm." + :group 'helm) + +(defcustom helm-su-or-sudo "sudo" + "What command to use for root access." + :type 'string + :group 'helm-utils) + +(defcustom helm-default-kbsize 1024.0 + "Default Kbsize to use for showing files size. +It is a float, usually 1024.0 but could be 1000.0 on some systems." + :group 'helm-utils + :type 'float) + +(define-obsolete-variable-alias + 'helm-highlight-number-lines-around-point + 'helm-highlight-matches-around-point-max-lines + "20160119") + +(defcustom helm-highlight-matches-around-point-max-lines '(15 . 15) + "Number of lines around point where matched items are highlighted. + +Possible value are: +- A cons cell (x . y) + Match x lines before point and y lines after point. +- An integer + Positive means this number lines after point. + Negative means this number lines before point. + A zero value means highlight only inside matched lines. +- The symbol never + Means do not highlight matched items. " + :group 'helm-utils + :type '(choice (cons (integer :tag "Match before") + (integer :tag "Match after")) + (const :tag "Match in line only" 0) + (integer :tag "Match after or before (+/-)") + (const :tag "Never match" never))) + +(defcustom helm-highlight-only-all-matches nil + "Highlight only when all items match on the line when non nil. +See `helm-highlight-current-line'." + :group 'helm-utils + :type 'boolean) + +(defcustom helm-buffers-to-resize-on-pa nil + "A list of helm buffers where the helm-window should be reduced on PA. +Where PA means persistent action." + :group 'helm-utils + :type '(repeat (choice string))) + +(defcustom helm-resize-on-pa-text-height 12 + "The size of the helm-window when resizing on persistent action." + :group 'helm-utils + :type 'integer) + +(defcustom helm-sources-using-help-echo-popup '("Ack-Grep" "AG" "RG" "Gid" "Git-Grep") + "Show the buffer name or the filename in a popup at selection." + :group 'helm-utils + :type '(repeat (choice string))) + +(defcustom helm-html-decode-entities-function #'helm-html-decode-entities-string + "Function used to decode HTML entities in HTML bookmarks. +Helm comes by default with `helm-html-decode-entities-string', if +you need something more sophisticated you can use +`w3m-decode-entities-string' if available. + +In Emacs itself org-entities seem broken and `xml-substitute-numeric-entities' +supports only numeric entities." + :group 'helm-utils + :type 'function) + + +(defvar helm-goto-line-before-hook '(helm-save-current-pos-to-mark-ring) + "Run before jumping to line. +This hook runs when jumping from `helm-goto-line', `helm-etags-default-action', +and `helm-imenu-default-action'. +This allows you to retrieve a previous position after using the different helm +tools for searching (etags, grep, gid, (m)occur etc...). +By default positions are added to `mark-ring'. +You can also add to register by using (or adding) +`helm-save-pos-to-register-before-jump' instead. In this case +last position is added to the register `helm-save-pos-before-jump-register'.") + +(defvar helm-save-pos-before-jump-register ?_ + "The register where `helm-save-pos-to-register-before-jump' saves position.") + +(defconst helm-html-entities-alist + '((""" . 34) ;; " + (">" . 62) ;; > + ("<" . 60) ;; < + ("&" . 38) ;; & + ("€" . 8364) ;; € + ("Ÿ" . 89) ;; Y + ("¡" . 161) ;; ¡ + ("¢" . 162) ;; ¢ + ("£" . 163) ;; £ + ("¤" . 164) ;; ¤ + ("¥" . 165) ;; ¥ + ("¦" . 166) ;; ¦ + ("§" . 167) ;; § + ("¨" . 32) ;; SPC + (" " . 160) ;;   (non breaking space) + ("©" . 169) ;; © + ("ª" . 97) ;; a + ("«" . 171) ;; « + ("¬" . 172) ;; ¬ + ("&masr;" . 174) ;; ® + ("°" . 176) ;; ° + ("±" . 177) ;; ± + ("²" . 50) ;; 2 + ("³" . 51) ;; 3 + ("´" . 39) ;; ' + ("µ" . 956) ;; μ + ("¶" . 182) ;; ¶ + ("·" . 183) ;; · + ("¸" . 32) ;; SPC + ("¹" . 49) ;; 1 + ("º" . 111) ;; o + ("»" . 187) ;; » + ("¼" . 49) ;; 1 + ("½" . 49) ;; 1 + ("¾" . 51) ;; 3 + ("¿" . 191) ;; ¿ + ("À" . 192) ;; À + ("Á" . 193) ;; Á + ("Â" . 194) ;; Â + ("Ã" . 195) ;; Ã + ("Ä" . 196) ;; Ä + ("Å" . 197) ;; Å + ("&Aelig" . 198) ;; Æ + ("Ç" . 199) ;; Ç + ("È" . 200) ;; È + ("É" . 201) ;; É + ("Ê" . 202) ;; Ê + ("Ë" . 203) ;; Ë + ("Ì" . 204) ;; Ì + ("Í" . 205) ;; Í + ("Î" . 206) ;; Î + ("Ï" . 207) ;; Ï + ("ð" . 208) ;; Ð + ("Ñ" . 209) ;; Ñ + ("Ò" . 210) ;; Ò + ("Ó" . 211) ;; Ó + ("Ô" . 212) ;; Ô + ("Õ" . 213) ;; Õ + ("Ö" . 214) ;; Ö + ("×" . 215) ;; × + ("Ø" . 216) ;; Ø + ("Ù" . 217) ;; Ù + ("Ú" . 218) ;; Ú + ("Û" . 219) ;; Û + ("Ü" . 220) ;; Ü + ("Ý" . 221) ;; Ý + ("þ" . 222) ;; Þ + ("ß" . 223) ;; ß + ("à" . 224) ;; à + ("á" . 225) ;; á + ("â" . 226) ;; â + ("ã" . 227) ;; ã + ("ä" . 228) ;; ä + ("å" . 229) ;; å + ("æ" . 230) ;; æ + ("ç" . 231) ;; ç + ("è" . 232) ;; è + ("é" . 233) ;; é + ("ê" . 234) ;; ê + ("ë" . 235) ;; ë + ("ì" . 236) ;; ì + ("í" . 237) ;; í + ("î" . 238) ;; î + ("ï" . 239) ;; ï + ("ð" . 240) ;; ð + ("ñ" . 241) ;; ñ + ("ò" . 242) ;; ò + ("ó" . 243) ;; ó + ("ô" . 244) ;; ô + ("õ" . 245) ;; õ + ("ö" . 246) ;; ö + ("÷" . 247) ;; ÷ + ("ø" . 248) ;; ø + ("ù" . 249) ;; ù + ("ú" . 250) ;; ú + ("û" . 251) ;; û + ("ü" . 252) ;; ü + ("ý" . 253) ;; ý + ("þ" . 254) ;; þ + ("ÿ" . 255) ;; ÿ + ("®" . 174) ;; ® + ("­" . 173)) ;; ­ + + "Table of html character entities and values. +See https://www.freeformatter.com/html-entities.html") + +(defvar helm-find-many-files-after-hook nil + "Hook that runs at end of `helm-find-many-files'.") + +(defvar helm-marked-buffer-name "*helm marked*") + +;;; Faces. +;; +(defface helm-selection-line + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :inherit highlight :distant-foreground "black")) + "Face used in the `helm-current-buffer' when jumping to a candidate." + :group 'helm-faces) + +(defface helm-match-item + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :inherit isearch)) + "Face used to highlight the item matched in a selected line." + :group 'helm-faces) + + +;;; Utils functions +;; +;; +(defcustom helm-window-prefer-horizontal-split nil + "Maybe switch to other window vertically when non nil. + +Possible values are t, nil and `decide'. + +When t switch vertically. +When nil switch horizontally. +When `decide' try to guess if it is possible to switch vertically +according to the setting of `split-width-threshold' and the size of +the window from where splitting is done. + +Note that when using `decide' and `split-width-threshold' is nil, the +behavior is the same as with a nil value." + :group 'helm-utils + :type '(choice + (const :tag "Split window vertically" t) + (const :tag "Split window horizontally" nil) + (symbol :tag "Guess how to split window" 'decide))) + +(defcustom helm-window-show-buffers-function #'helm-window-decide-split-fn + "The default function to use when opening several buffers at once. +It is typically used to rearrange windows." + :group 'helm-utils + :type '(choice + (function :tag "Decide how to split according to number of candidates" + helm-window-decide-split-fn) + (function :tag "Split windows vertically or horizontally" + helm-window-default-split-fn) + (function :tag "Split in alternate windows" + helm-window-alternate-split-fn) + (function :tag "Split windows in mosaic" + helm-window-mosaic-fn))) + +(defun helm-window-show-buffers (buffers &optional other-window) + "Show BUFFERS. + +With more than one buffer marked switch to these buffers in separate windows. +If OTHER-WINDOW is non-nil, keep current buffer and switch to other buffers +in separate windows. +If a prefix arg is given split windows vertically." + (let ((initial-ow-fn (if (cdr (window-list)) + #'switch-to-buffer-other-window + #'helm-window-other-window))) + (if (cdr buffers) + (funcall helm-window-show-buffers-function buffers + (and other-window initial-ow-fn)) + (if other-window + (funcall initial-ow-fn (car buffers)) + (helm-buffers-switch-to-buffer-or-tab (car buffers)))))) + +(defvar tab-bar-tab-name-function) +(declare-function tab-bar-switch-to-tab "tab-bar.el") +(declare-function tab-bar-tab-name-all "tab-bar.el") + +(defun helm-buffers-switch-to-buffer-or-tab (buffer) + "Switch to BUFFER in its tab if some." + (if (and (fboundp 'tab-bar-mode) + helm-buffers-maybe-switch-to-tab + tab-bar-mode) + (let* ((tab-bar-tab-name-function #'tab-bar-tab-name-all) + (tabs (tab-bar-tabs)) + (tab-names (mapcar (lambda (tab) + (cdr (assq 'name tab))) + tabs)) + (bname (buffer-name (get-buffer buffer))) + (tab (helm-buffers--get-tab-from-name bname tabs))) + (if (helm-buffers--buffer-in-tab-p bname tab-names) + (progn + (tab-bar-switch-to-tab (alist-get 'name tab)) + (select-window (get-buffer-window bname))) + (switch-to-buffer buffer))) + (switch-to-buffer buffer))) + +(defun helm-buffers--get-tab-from-name (tab-name tabs) + "Return tab from TABS when it contains TAB-NAME." + (cl-loop for tab in tabs + when (member tab-name (split-string (cdr (assq 'name tab)) ", " t)) + return tab)) + +(defun helm-buffers--buffer-in-tab-p (buffer-name tab-names) + "Check if BUFFER-NAME is in TAB-NAMES list." + (cl-loop for name in tab-names + ;; Buf names are separated with "," in TAB-NAMES + ;; e.g. '("tab-bar.el" "*scratch*, helm-buffers.el"). + thereis (member buffer-name (split-string name ", " t)))) + +(defun helm-window-decide-split-fn (candidates &optional other-window-fn) + "Try to find the best split window fn according to the number of CANDIDATES." + (let ((fn (cond ((>= (length candidates) 3) + #'helm-window-mosaic-fn) + ((>= (length candidates) 2) + #'helm-window-alternate-split-fn) + (t #'helm-window-default-split-fn)))) + (funcall fn candidates other-window-fn))) + +(defun helm-window-default-split-fn (candidates &optional other-window-fn) + "Split windows in one direction and balance them. + +Direction can be controlled via `helm-window-prefer-horizontal-split'. +If a prefix arg is given split windows the other direction. +This function is suitable for `helm-window-show-buffers-function'." + (if other-window-fn + (funcall other-window-fn (car candidates)) + (switch-to-buffer (car candidates))) + (save-selected-window + (cl-loop with nosplit + for b in (cdr candidates) + when nosplit return + (message "Too many buffers to visit simultaneously") + do (condition-case _err + (helm-window-other-window b 'balance) + (error (setq nosplit t) nil))))) + +(defun helm-window-alternate-split-fn (candidates &optional other-window-fn) + "Split windows horizontally and vertically in alternate fashion. + +Direction can be controlled via `helm-window-prefer-horizontal-split'. +If a prefix arg is given split windows the other direction. +This function is suitable for `helm-window-show-buffers-function'." + (if other-window-fn + (funcall other-window-fn (car candidates)) + (switch-to-buffer (car candidates))) + (let (right-side) + (save-selected-window + (cl-loop with nosplit + for b in (cdr candidates) + when nosplit return + (message "Too many buffers to visit simultaneously") + do (condition-case _err + (let ((helm-current-prefix-arg right-side)) + (helm-window-other-window b) + (setq right-side (not right-side))) + (error (setq nosplit t) nil)))))) + +(defun helm-window-mosaic-fn (candidates &optional other-window-fn) + "Make an as-square-as-possible window mosaic of the CANDIDATES buffers. + +If rectangular, the long side is in the direction given by +`helm-window-prefer-horizontal-split': if non-nil, it is horizontal, vertical +otherwise. +If OTHER-WINDOW-FN is non-nil, current windows are included in the mosaic. +This function is suitable for `helm-window-show-buffers-function'." + (when other-window-fn + (setq candidates (append (mapcar 'window-buffer (window-list)) candidates))) + (delete-other-windows) + (let* ((helm-window-prefer-horizontal-split + (if (eq helm-window-prefer-horizontal-split 'decide) + (and (numberp split-width-threshold) + (>= (window-width (selected-window)) + split-width-threshold)) + helm-window-prefer-horizontal-split)) + mosaic-length-tile-count + mosaic-width-tile-count + mosaic-length-tile-size + mosaic-width-tile-size + next-window) + ;; If 4 tiles, make 2x2 mosaic. + ;; If 5-6 tiles, make 2x3 mosaic with direction depending on `helm-window-prefer-horizontal-split'. + ;; If 7-9 tiles, make 3x3 mosaic. And so on. + (setq mosaic-length-tile-count (ceiling (sqrt (length candidates)))) + (setq mosaic-width-tile-count + (if (<= (length candidates) (* mosaic-length-tile-count (1- mosaic-length-tile-count))) + (1- mosaic-length-tile-count) + mosaic-length-tile-count)) + ;; We lower-bound the tile size, otherwise the function would + ;; fail during the first inner split. + ;; There is consequently no need to check for errors when + ;; splitting. + (let ((frame-mosaic-length-direction-size (frame-height)) + (frame-mosaic-width-direction-size (frame-width)) + (window-mosaic-length-direction-min-size window-min-height) + (window-mosaic-width-direction-min-size window-min-width)) + (if helm-window-prefer-horizontal-split + (setq frame-mosaic-length-direction-size (frame-width) + frame-mosaic-width-direction-size (frame-height) + window-mosaic-length-direction-min-size window-min-width + window-mosaic-width-direction-min-size window-min-height)) + (setq mosaic-length-tile-size (max + (/ frame-mosaic-length-direction-size mosaic-length-tile-count) + window-mosaic-length-direction-min-size) + mosaic-width-tile-size (max + (/ frame-mosaic-width-direction-size mosaic-width-tile-count) + window-mosaic-width-direction-min-size)) + ;; Shorten `candidates' to `max-tiles' elements. + (let ((max-tiles (* (/ frame-mosaic-length-direction-size mosaic-length-tile-size) + (/ frame-mosaic-width-direction-size mosaic-width-tile-size)))) + (when (> (length candidates) max-tiles) + (message "Too many buffers to visit simultaneously") + (setcdr (nthcdr (- max-tiles 1) candidates) nil)))) + ;; Make the mosaic. + (while candidates + (when (> (length candidates) mosaic-length-tile-count) + (setq next-window (split-window nil + mosaic-width-tile-size + (not helm-window-prefer-horizontal-split)))) + (switch-to-buffer (pop candidates)) + (dotimes (_ (min (1- mosaic-length-tile-count) (length candidates))) + (select-window (split-window nil + mosaic-length-tile-size + helm-window-prefer-horizontal-split)) + (switch-to-buffer (pop candidates))) + (when next-window + (select-window next-window))))) + +(defun helm-window-other-window (buffer-or-name &optional balance) + "Switch to BUFFER-OR-NAME in other window. +Direction can be controlled via `helm-window-prefer-horizontal-split'. +If a prefix arg is given split windows the other direction. +When argument BALANCE is provided `balance-windows'." + (let* ((helm-window-prefer-horizontal-split + (if (eq helm-window-prefer-horizontal-split 'decide) + (and (numberp split-width-threshold) + (>= (window-width (selected-window)) + split-width-threshold)) + helm-window-prefer-horizontal-split)) + (right-side (if helm-window-prefer-horizontal-split + (not helm-current-prefix-arg) + helm-current-prefix-arg))) + (select-window (split-window nil nil right-side)) + (and balance (balance-windows)) + (switch-to-buffer buffer-or-name))) + +(cl-defun helm-current-buffer-narrowed-p (&optional + (buffer helm-current-buffer)) + "Check if BUFFER is narrowed. +Default is `helm-current-buffer'." + (with-current-buffer buffer + (let ((beg (point-min)) + (end (point-max)) + (total (buffer-size))) + (or (/= beg 1) (/= end (1+ total)))))) + +(defun helm-goto-char (loc) + "Go to char, revealing if necessary." + (goto-char loc) + (let ((fn (cond ((eq major-mode 'org-mode) + ;; On some old Emacs versions org may not be loaded. + (require 'org) + #'org-reveal) + ((and (boundp 'outline-minor-mode) + outline-minor-mode) + #'outline-show-subtree) + ((and (boundp 'hs-minor-mode) + hs-minor-mode) + #'hs-show-all) + ((and (boundp 'markdown-mode-map) + (derived-mode-p 'markdown-mode)) + #'markdown-show-entry))) + (hs-show-hook (list (lambda () (goto-char loc))))) + ;; outline may fail in some conditions e.g. with markdown enabled + ;; (Bug#1919). + (condition-case-unless-debug nil + (and fn (funcall fn)) + (error nil)))) + +(defun helm-goto-line (lineno &optional noanim) + "Goto LINENO opening only outline headline if needed. +Animation is used unless NOANIM is non--nil." + (helm-log-run-hook "helm-goto-line" + 'helm-goto-line-before-hook) + (helm-match-line-cleanup) + (unless helm-alive-p + (with-helm-current-buffer + (unless helm-yank-point (setq helm-yank-point (point))))) + (goto-char (point-min)) + (helm-goto-char (pos-bol lineno)) + (unless noanim + (helm-highlight-current-line))) + +(defun helm-save-pos-to-register-before-jump () + "Save current buffer position to `helm-save-pos-before-jump-register'. +To use this add it to `helm-goto-line-before-hook'." + (with-helm-current-buffer + (unless helm-in-persistent-action + (point-to-register helm-save-pos-before-jump-register)))) + +(defun helm-save-current-pos-to-mark-ring () + "Save current buffer position to mark ring. +To use this add it to `helm-goto-line-before-hook'." + (with-helm-current-buffer + (unless helm-in-persistent-action + (set-marker (mark-marker) (point)) + (push-mark (point) 'nomsg)))) + +(defun helm-displaying-source-names () + "Return the list of sources name for this helm session." + (with-current-buffer helm-buffer + (goto-char (point-min)) + (cl-loop with pos + while (setq pos (next-single-property-change (point) 'helm-header)) + do (goto-char pos) + collect (buffer-substring-no-properties (pos-bol)(pos-eol)) + do (forward-line 1)))) + +(defun helm-handle-winner-boring-buffers () + "Add `helm-buffer' to `winner-boring-buffers' when quitting/exiting helm. +Add this function to `helm-cleanup-hook' when you don't want to see helm buffers +after running winner-undo/redo." + (require 'winner) + (cl-pushnew helm-buffer winner-boring-buffers :test 'equal)) +(add-hook 'helm-cleanup-hook #'helm-handle-winner-boring-buffers) + +(defun helm-quit-and-find-file () + "Drop into `helm-find-files' from `helm'. +If current selection is a buffer or a file, `helm-find-files' +from its directory." + (interactive) + (with-helm-alive-p + (require 'helm-grep) + (require 'helm-elisp) + (require 'bookmark) ; For bookmark-alist + (let ((src (helm-get-current-source))) + (helm-run-after-exit + (lambda (f) + ;; Ensure specifics `helm-execute-action-at-once-if-one' + ;; fns don't run here. + (let (helm-execute-action-at-once-if-one + helm-actions-inherit-frame-settings) ; use this-command + (if (file-exists-p f) + (helm-find-files-1 (file-name-directory f) + (format + helm-ff-last-expanded-candidate-regexp + (regexp-quote + (if helm-ff-transformer-show-only-basename + (helm-basename f) f)))) + (helm-find-files-1 f)))) + (helm--quit-and-find-file-default-file src))))) +(put 'helm-quit-and-find-file 'helm-only t) + +(defun helm--quit-and-find-file-default-file (source) + (let ((target-fn (or (helm-get-attr 'find-file-target source) + (assoc-default (helm-get-attr 'name source) + helm-mode-find-file-target-alist)))) + ;; target-fn function may return nil, in this case fallback to default. + (helm-aif (and target-fn (funcall target-fn source)) + it + (let* ((sel (helm-get-selection nil nil source)) + (default-preselection (or (helm-default-directory) + (buffer-file-name helm-current-buffer) + default-directory))) + (cond + ((and (stringp sel) (or (file-remote-p sel) + (file-exists-p sel))) + (expand-file-name sel)) + ;; Url. + ((and (stringp sel) + helm--url-regexp + (string-match helm--url-regexp sel)) + sel) + ;; Exit brutally from a `with-helm-show-completion' + ((and helm-show-completion-overlay + (overlayp helm-show-completion-overlay)) + (delete-overlay helm-show-completion-overlay) + (remove-hook 'helm-move-selection-after-hook 'helm-show-completion) + (expand-file-name default-preselection)) + ;; Default. + (t (expand-file-name default-preselection))))))) + +(defun helm-generic-sort-fn (s1 s2) + "Sort predicate function for helm candidates. +Args S1 and S2 can be single or (display . real) candidates, +that is sorting is done against real value of candidate." + (let* ((qpattern (regexp-quote helm-pattern)) + (reg1 (concat "\\_<" qpattern "\\_>")) + (reg2 (concat "\\_<" qpattern)) + (reg3 helm-pattern) + (split (helm-remove-if-match + "\\`!" (helm-mm-split-pattern helm-pattern))) + (str1 (if (consp s1) (cdr s1) s1)) + (str2 (if (consp s2) (cdr s2) s2)) + (score (lambda (str r1 r2 r3 lst) + (condition-case nil + (+ (if (string-match (concat "\\`" qpattern) str) 1 0) + (cond ((string-match r1 str) 5) + ((and (string-match " " qpattern) + (car lst) + (string-match + (concat "\\_<" (regexp-quote (car lst))) str) + (cl-loop for r in (cdr lst) + always (string-match r str))) + 4) + ((and (string-match " " qpattern) + (cl-loop for r in lst + always (string-match r str))) + 3) + ((string-match r2 str) 2) + ((string-match r3 str) 1) + (t 0))) + (invalid-regexp 0)))) + (sc1 (get-text-property 0 'completion-score str1)) + (sc2 (get-text-property 0 'completion-score str2)) + (sc3 (if sc1 0 (funcall score str1 reg1 reg2 reg3 split))) + (sc4 (if sc2 0 (funcall score str2 reg1 reg2 reg3 split)))) + (cond ((and sc1 sc2) ; helm-flex style. + (> sc1 sc2)) + ((or (zerop (string-width qpattern)) + (and (zerop sc3) (zerop sc4))) + (string-lessp str1 str2)) + ((= sc3 sc4) + (< (length str1) (length str2))) + (t (> sc3 sc4))))) + +(cl-defun helm-file-human-size (size &optional (kbsize helm-default-kbsize)) + "Return a string showing SIZE of a file in human readable form. +SIZE can be an integer or a float depending on it's value. +`file-attributes' will take care of that to avoid overflow error. +KBSIZE is a floating point number, defaulting to `helm-default-kbsize'." + (cl-loop with result = (cons "B" size) + for i in '("k" "M" "G" "T" "P" "E" "Z" "Y") + while (>= (cdr result) kbsize) + do (setq result (cons i (/ (cdr result) kbsize))) + finally return + (helm-acase (car result) + ("B" (format "%s" size)) + (t (format "%.1f%s" (cdr result) it))))) + +(defun helm-directory-size (directory &optional recursive human) + "Return the resulting size of the sum of all files in DIRECTORY. + +If RECURSIVE is non nil return the size of all files in DIRECTORY and +its subdirectories. With arg HUMAN format the size in a human +readable format,see `helm-file-human-size'." + (cl-loop with files = (if recursive + (helm-walk-directory + directory + :path 'full + :directories t) + (directory-files + directory t + directory-files-no-dot-files-regexp)) + for file in files + sum (nth 7 (file-attributes file)) into total + finally return (if human + (helm-file-human-size total) + total))) + +(cl-defun helm-file-attributes + (file &key type links uid gid access-time modif-time + status size mode gid-change inode device-num dired human-size + mode-type mode-owner mode-group mode-other octal (string t)) + "Return `file-attributes' elements of FILE separately according to key value. +Availables keys are: +- TYPE: Same as nth 0 `files-attributes' if STRING is nil + otherwise return either symlink, directory or file (default). +- LINKS: See nth 1 `files-attributes'. +- UID: See nth 2 `files-attributes'. +- GID: See nth 3 `files-attributes'. +- ACCESS-TIME: See nth 4 `files-attributes', however format time + when STRING is non--nil (the default). +- MODIF-TIME: See nth 5 `files-attributes', same as above. +- STATUS: See nth 6 `files-attributes', same as above. +- SIZE: See nth 7 `files-attributes'. +- MODE: See nth 8 `files-attributes'. +- GID-CHANGE: See nth 9 `files-attributes'. +- INODE: See nth 10 `files-attributes'. +- DEVICE-NUM: See nth 11 `files-attributes'. +- DIRED: A line similar to what \\='ls -l' return. +- HUMAN-SIZE: The size in human form, see `helm-file-human-size'. +- MODE-TYPE, mode-owner,mode-group, mode-other: Split what + nth 8 `files-attributes' return in four categories. +- OCTAL: The octal value of MODE-OWNER+MODE-GROUP+MODE-OTHER. +- STRING: When non--nil (default) `helm-file-attributes' return + more friendly values. +If you want the same behavior as `files-attributes' , +\(but with return values in proplist) use a nil value for STRING. +However when STRING is non--nil, time and type value are different from what +you have in `file-attributes'." + (helm-aif (file-attributes file string) + (let* ((all (cl-destructuring-bind + (type links uid gid access-time modif-time + status size mode gid-change inode device-num) + it + (list :type (if string + (cond ((stringp type) "symlink") ; fname + (type "directory") ; t + (t "file")) ; nil + type) + :links links + :uid uid + :gid gid + :access-time (if string + (format-time-string + "%Y-%m-%d %R" access-time) + access-time) + :modif-time (if string + (format-time-string + "%Y-%m-%d %R" modif-time) + modif-time) + :status (if string + (format-time-string + "%Y-%m-%d %R" status) + status) + :size size + :mode mode + :gid-change gid-change + :inode inode + :device-num device-num))) + (perms (cl-getf all :mode)) + (modes (helm-split-mode-file-attributes perms))) + (cond (type (cl-getf all :type)) + (links (cl-getf all :links)) + (uid (cl-getf all :uid)) + (gid (cl-getf all :gid)) + (access-time (cl-getf all :access-time)) + (modif-time (cl-getf all :modif-time)) + (status (cl-getf all :status)) + (size (cl-getf all :size)) + (mode perms) + (gid-change (cl-getf all :gid-change)) + (inode (cl-getf all :inode)) + (device-num (cl-getf all :device-num)) + (dired (helm-file-attributes-dired-line all human-size)) + (human-size (helm-file-human-size (cl-getf all :size))) + (mode-type (cl-getf modes :mode-type)) + (mode-owner (cl-getf modes :user)) + (mode-group (cl-getf modes :group)) + (mode-other (cl-getf modes :other)) + (octal (cl-getf modes :octal)) + (t (append all modes)))))) + +(defun helm-file-attributes-dired-line (all &optional human-size) + (format "%s %s %s:%s %s %s" + (helm-split-mode-file-attributes + (cl-getf all :mode) t) + (number-to-string (cl-getf all :links)) + (cl-getf all :uid) + (cl-getf all :gid) + (if human-size + (helm-file-human-size (cl-getf all :size)) + (int-to-string (cl-getf all :size))) + (cl-getf all :modif-time))) + +(defun helm-split-mode-file-attributes (modes &optional string) + "Split MODES in a list of modes. +MODES is same as what (nth 8 (file-attributes \"foo\")) would return." + (if (string-match "\\`\\(.\\)\\(...\\)\\(...\\)\\(...\\)\\'" modes) + (let* ((type (match-string 1 modes)) + (user (match-string 2 modes)) + (group (match-string 3 modes)) + (other (match-string 4 modes)) + (octal (helm-ff-numeric-permissions (list user group other)))) + (if string + (mapconcat 'identity (list type user group other octal) " ") + (list :mode-type type :user user + :group group :other other + :octal octal))) + (error "Wrong modes specification for %s" modes))) + +(defun helm-ff-numeric-permissions (perms) + "Return the numeric representation of PERMS. +PERMS is the list of permissions for owner, group and others." + ;; `file-modes-symbolic-to-number' interpret its MODES argument as what would + ;; result when calling such mode on a file with chmod, BTW we have to remove + ;; all "-" like read-file-modes does. + (helm-aand (listp perms) + (apply 'format "u=%s,g=%s,o=%s" perms) + (replace-regexp-in-string "-" "" it) + (format "%o" (file-modes-symbolic-to-number it)))) + +(defun helm-format-columns-of-files (files) + "Same as `dired-format-columns-of-files'. +Inlined here for compatibility." + (let ((beg (point))) + (completion--insert-strings files) + (put-text-property beg (point) 'mouse-face nil))) + +(defmacro with-helm-display-marked-candidates (buffer-or-name candidates &rest body) + (declare (indent 0) (debug t)) + (helm-with-gensyms (buffer window winconf) + `(let* ((,buffer (temp-buffer-window-setup ,buffer-or-name)) + (,winconf helm-last-frame-or-window-configuration) + (helm-always-two-windows t) + (helm-split-window-default-side + (if (eq helm-split-window-default-side 'same) + 'below helm-split-window-default-side)) + helm-split-window-inside-p + helm-reuse-last-window-split-state + ,window) + (with-current-buffer ,buffer + (helm-format-columns-of-files ,candidates)) + (unwind-protect + (with-selected-window + (setq ,window (temp-buffer-window-show + ,buffer + '(display-buffer-below-selected + (window-height . fit-window-to-buffer)))) + (progn ,@body)) + (quit-window 'kill ,window) + (and ,winconf (set-window-configuration ,winconf)))))) + +;;; Persistent Action Helpers +;; +;; +;; Internal +(defvar helm-match-line-overlay nil) +(defvar helm--match-item-overlays nil) + +(cl-defun helm-highlight-current-line (&optional start end buf face) + "Highlight current line and all matching items around it. + +The number of lines around matched line where the matching items are +highlighted are defined by `helm-highlight-matches-around-point-max-lines'. +When the variable `helm-highlight-only-all-matches' is non nil only +the lines containing all matches (in case of multi match) are highlighted. + +Optional arguments START, END and FACE are only here for debugging purpose." + (let* ((start (or start (line-beginning-position))) + (end (or end (1+ (line-end-position)))) + start-match end-match + (args (list start end buf)) + (case-fold-search (if helm-alive-p + (helm-set-case-fold-search) + case-fold-search))) + ;; Highlight the current line. + (if (not helm-match-line-overlay) + (setq helm-match-line-overlay (apply 'make-overlay args)) + (apply 'move-overlay helm-match-line-overlay args)) + (overlay-put helm-match-line-overlay + 'face (or face 'helm-selection-line)) + ;; Now highlight matches only if we are in helm session, we are + ;; maybe coming from helm-grep-mode or helm-moccur-mode buffers. + (when helm-alive-p + (helm-acase helm-highlight-matches-around-point-max-lines + ;; Next 2 clauses must precede others otherwise + ;; `helm-highlight-matches-around-point-max-lines' is + ;; compared as a number by other clauses and return an error. + (never (cl-return-from helm-highlight-current-line)) + ((guard (consp it)) + (setq start-match (save-excursion (forward-line (- (car it))) (pos-bol)) + end-match (save-excursion (forward-line (cdr it)) (pos-bol)))) + ((guard (or (null it) (zerop it))) + (setq start-match start + end-match end)) + ((guard (< it 0)) + (setq start-match (save-excursion (forward-line it) (pos-bol)) + end-match start)) + ((guard (> it 0)) + (setq start-match start + end-match (save-excursion (forward-line it) (pos-bol))))) + (catch 'empty-line + (let* ((regex-list (helm-remove-if-match + "\\`!" (helm-mm-split-pattern + (if (with-helm-buffer + ;; Needed for highlighting AG matches. + (assq 'pcre (helm-get-current-source))) + (helm--translate-pcre-to-elisp helm-input) + helm-input)))) + (num-regex (length regex-list))) + (save-excursion + (goto-char start-match) + (while (< (point) end-match) + (let* ((start-line (line-beginning-position)) + (end-line (line-end-position)) + all-matches) + (dolist (r regex-list) + (let ((match-list '())) + (save-excursion + (goto-char start-line) + (while (condition-case _err + (and (not (= start-line end-line)) + (if helm-migemo-mode + (helm-mm-migemo-forward r end-line t) + (re-search-forward r end-line t))) + (invalid-regexp nil)) + (let ((s (match-beginning 0)) + (e (match-end 0))) + (if (= s e) + (throw 'empty-line nil) + (push (cons s e) match-list))))) + (when match-list + (push match-list all-matches)))) + (when (and all-matches + (or (not helm-highlight-only-all-matches) + (eql (length all-matches) num-regex))) + (cl-loop for ml in all-matches + do (cl-loop for (s . e) in ml + for ov = (make-overlay s e) + do (progn + (push ov helm--match-item-overlays) + (overlay-put ov 'face 'helm-match-item) + (overlay-put ov 'priority 1)))))) + (forward-line 1)))))) + (recenter))) + +(defun helm--translate-pcre-to-elisp (regexp) + "Should translate pcre REGEXP to elisp regexp. +Assume regexp is a pcre based regexp." + (with-temp-buffer + (insert " " regexp " ") + (goto-char (point-min)) + (save-excursion + ;; match (){}| unquoted + (helm-awhile (and (re-search-forward "\\([(){}|]\\)" nil t) + (match-string 1)) + (let ((pos (match-beginning 1))) + (if (eql (char-before pos) ?\\) + (delete-region pos (1- pos)) + (replace-match (concat "\\" it) t t nil 1))))) + ;; match \s or \S + (helm-awhile (and (re-search-forward "\\S\\?\\(\\s\\[sS]\\)[^-]" nil t) + (match-string 1)) + (replace-match (concat it "-") t t nil 1)) + (buffer-substring (1+ (point-min)) (1- (point-max))))) + +(defun helm-match-line-cleanup () + (when helm-match-line-overlay + (delete-overlay helm-match-line-overlay) + (setq helm-match-line-overlay nil)) + (when helm--match-item-overlays + (mapc 'delete-overlay helm--match-item-overlays))) + +(defun helm-match-line-cleanup-maybe () + (when (helm-empty-buffer-p) + (helm-match-line-cleanup))) + +(defun helm-match-line-update () + (when helm--match-item-overlays + (mapc 'delete-overlay helm--match-item-overlays)) + (when helm-match-line-overlay + (delete-overlay helm-match-line-overlay) + (helm-highlight-current-line))) + +(defun helm-persistent-autoresize-hook () + (when (and helm-buffers-to-resize-on-pa + (member helm-buffer helm-buffers-to-resize-on-pa) + (eq helm-split-window-state 'vertical)) + (set-window-text-height (helm-window) helm-resize-on-pa-text-height))) + +(defun helm-match-line-cleanup-pulse () + (run-with-timer 0.3 nil #'helm-match-line-cleanup)) + +(add-hook 'helm-after-update-hook 'helm-match-line-cleanup-maybe) +(add-hook 'helm-after-persistent-action-hook 'helm-persistent-autoresize-hook) +(add-hook 'helm-cleanup-hook 'helm-match-line-cleanup) +(add-hook 'helm-after-action-hook 'helm-match-line-cleanup-pulse) +(add-hook 'helm-after-persistent-action-hook 'helm-match-line-update) + +;;; Popup buffer-name or filename in grep/moccur/imenu-all. +;; +(defvar helm--show-help-echo-timer nil) + +(defun helm-cancel-help-echo-timer () + (when helm--show-help-echo-timer + (cancel-timer helm--show-help-echo-timer) + (setq helm--show-help-echo-timer nil))) + +(defun helm-maybe-show-help-echo () + (when helm--show-help-echo-timer + (cancel-timer helm--show-help-echo-timer) + (setq helm--show-help-echo-timer nil)) + (when (and helm-alive-p + helm-popup-tip-mode + (member (assoc-default 'name (helm-get-current-source)) + helm-sources-using-help-echo-popup)) + (setq helm--show-help-echo-timer + (run-with-timer + 1 nil + (lambda () + (save-selected-window + (with-helm-window + (helm-aif (get-text-property (pos-bol) 'help-echo) + (popup-tip (concat " " (abbreviate-file-name + (replace-regexp-in-string "\n.*" "" it))) + :around nil + :point (save-excursion + (end-of-visual-line) (point))))))))))) + +;;;###autoload +(define-minor-mode helm-popup-tip-mode + "Show help-echo informations in a popup tip at end of line." + :global t + (require 'popup) + (if helm-popup-tip-mode + (progn + (add-hook 'helm-move-selection-after-hook 'helm-maybe-show-help-echo) + (add-hook 'helm-cleanup-hook 'helm-cancel-help-echo-timer)) + (remove-hook 'helm-move-selection-after-hook 'helm-maybe-show-help-echo) + (remove-hook 'helm-cleanup-hook 'helm-cancel-help-echo-timer))) + +(defun helm-open-file-with-default-tool (file) + "Open FILE with the default tool on this platform." + (let (process-connection-type) + (if (eq system-type 'windows-nt) + (helm-w32-shell-execute-open-file file) + (start-process "helm-open-file-with-default-tool" + nil + (helm-acase system-type + (gnu/linux "xdg-open") + ((darwin macos) "open") + (cygwin "cygstart")) + file)))) + +(defun helm-open-dired (file) + "Open a dired buffer in FILE's directory. +If FILE is a directory, open this directory." + (require 'dired) + (if (file-directory-p file) + (dired file) + (dired (file-name-directory file)) + (dired-goto-file file))) + +(defun helm-find-file-as-root (candidate) + (let* ((buf (helm-basename candidate)) + (host (file-remote-p candidate 'host)) + (remote-path (format "/%s:%s:%s" + helm-su-or-sudo + (or host "") + (expand-file-name + (if host + (file-remote-p candidate 'localname) + candidate)))) + non-essential) + (if (buffer-live-p (get-buffer buf)) + (progn + (set-buffer buf) + (find-alternate-file remote-path)) + (find-file remote-path)))) + +(defun helm-find-many-files (_ignore) + "Simple action that run `find-file' on marked candidates. +Run `helm-find-many-files-after-hook' at end." + (let ((helm--reading-passwd-or-string t)) + (mapc 'find-file (helm-marked-candidates)) + (helm-log-run-hook "helm-find-many-files" + 'helm-find-many-files-after-hook))) + +(defun helm-read-repeat-string (prompt &optional count) + "Prompt as many time PROMPT is not empty. +If COUNT is non--nil add a number after each prompt. +Return the list of strings entered in each prompt." + (cl-loop with prt = prompt + with elm + while (not (string= elm "")) + for n from 1 + do (when count + (setq prt (format "%s (%s): " + (replace-regexp-in-string + ": " "" prompt) + (int-to-string n)))) + collect (setq elm (helm-read-string prt)) into lis + finally return (remove "" lis))) + +(defun helm-html-bookmarks-to-alist (file url-regexp bmk-regexp) + "Parse HTML bookmark FILE and return an alist with (title . url) as elements." + (let (bookmarks-alist url title) + (with-temp-buffer + (insert-file-contents file) + (goto-char (point-min)) + (while (re-search-forward "href=\\|^ *
. + +;;; Commentary: + +;;; Code: + +(require 'helm-for-files) + + +;;; List of files gleaned from every dired buffer +;; +;; +(defvar dired-buffers) +(defvar directory-files-no-dot-files-regexp) +(defun helm-files-in-all-dired-candidates () + "Return a list of files from live `dired' buffers." + (save-excursion + (cl-loop for (f . b) in dired-buffers + when (buffer-live-p b) + append (let ((dir (with-current-buffer b dired-directory))) + (if (listp dir) (cdr dir) + (directory-files f t directory-files-no-dot-files-regexp)))))) + +;; (dired '("~/" "~/.emacs.d/.emacs-custom.el" "~/.emacs.d/.emacs.bmk")) + +(defclass helm-files-dired-source (helm-source-sync helm-type-file) + ((candidates :initform #'helm-files-in-all-dired-candidates))) + +(defvar helm-source-files-in-all-dired + (helm-make-source "Files in all dired buffer." 'helm-files-dired-source)) + +;;; session.el files +;; +;; session (http://emacs-session.sourceforge.net/) is an alternative to +;; recentf that saves recent file history and much more. +(defvar session-file-alist) +(defclass helm-source-session-class (helm-source-sync) + ((candidates :initform (lambda () + (cl-delete-if-not + (lambda (f) + (or (string-match helm-tramp-file-name-regexp f) + (file-exists-p f))) + (mapcar 'car session-file-alist)))) + (keymap :initform 'helm-generic-files-map) + (help-message :initform 'helm-generic-file-help-message) + (action :initform 'helm-type-file-actions))) + +(defvar helm-source-session nil + "File list from emacs-session.") + +(defcustom helm-session-fuzzy-match nil + "Enable fuzzy matching in `helm-source-session' when non--nil." + :group 'helm-files + :type 'boolean + :set (lambda (var val) + (set var val) + (setq helm-source-session + (helm-make-source "Session" 'helm-source-session-class + :fuzzy-match val)))) + + +;;; External searching file tools. +;; +;; Tracker desktop search + +(defun helm-source-tracker-transformer (candidates _source) + "Return file names from tracker CANDIDATES." + ;; loop through tracker candidates selecting out file:// lines + ;; then select part after file:// and url decode to get straight filenames + (cl-loop for cand in candidates + when (and (stringp cand) + (string-match "\\`[[:space:]]*file://\\(.*\\)" cand)) + collect (url-unhex-string (match-string 1 cand)))) + +(defvar helm-source-tracker-search + (helm-build-async-source "Tracker Search" + :candidates-process + (lambda () + ;; the tracker-search command has been deprecated, now invoke via tracker + ;; also, disable the contextual snippets which we don't currently use + (start-process "tracker-search-process" nil + "tracker" "search" + "--disable-snippets" + "--disable-color" + "--limit=512" + helm-pattern)) + ;; new simplified transformer of tracker search results + :filtered-candidate-transformer #'helm-source-tracker-transformer + ;;(multiline) ; https://github.com/emacs-helm/helm/issues/529 + :keymap helm-generic-files-map + :action 'helm-type-file-actions + :action-transformer '(helm-transform-file-load-el + helm-transform-file-browse-url) + :requires-pattern 3) + "Source for the Tracker desktop search engine.") + +;; Spotlight (MacOS X desktop search) +(defclass helm-mac-spotlight-source (helm-source-async helm-type-file) + ((candidates-process :initform + (lambda () + (start-process + "mdfind-process" nil "mdfind" helm-pattern))) + (requires-pattern :initform 3))) + +(defvar helm-source-mac-spotlight + (helm-make-source "mdfind" 'helm-mac-spotlight-source) + "Source for retrieving files via Spotlight's command line utility mdfind.") + +(provide 'helm-x-files) + +;;; helm-x-files.el ends here diff --git a/code/elpa/helm-20240320.541/helm.el b/code/elpa/helm-20240320.541/helm.el new file mode 100644 index 0000000..1a0ade5 --- /dev/null +++ b/code/elpa/helm-20240320.541/helm.el @@ -0,0 +1,52 @@ +;;; helm.el --- Helm is an Emacs incremental and narrowing framework -*- lexical-binding: t -*- + +;; Copyright (C) 2007 Tamas Patrovics +;; 2008 ~ 2011 rubikitch +;; 2011 ~ 2023 Thierry Volpiatto + +;; This is a fork of anything.el wrote by Tamas Patrovics. + +;; Authors of anything.el: Tamas Patrovics +;; rubikitch +;; Thierry Volpiatto + +;; Author: Thierry Volpiatto +;; Version: 3.9.7 +;; URL: https://emacs-helm.github.io/helm/ +;; Package-Requires: ((helm-core "3.9.7") (wfnames "1.1") (popup "0.5.3")) + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; This is just a wrapper for helm-core.el and a place holder we +;; currently use only to hold the package's metadata in the header. + +;;; Code: + +(require 'helm-core) +(require 'helm-global-bindings) + +;; Build info sources and commands once called (bug #2608). We need to autoload +;; only these commands which are bound in helm-global-bindings, if we add more +;; helm-info* commands to helm-global-bindings we will have to autoload them +;; here. Requiring helm-info here instead will make recursive require to helm so +;; don't do that. +(autoload 'helm-info-emacs "helm-info" nil t) +(autoload 'helm-info-gnus "helm-info" nil t) +(autoload 'helm-info-at-point "helm-info" nil t) + +(provide 'helm) + +;;; helm.el ends here diff --git a/code/elpa/helm-core-20240316.1157/helm-core-autoloads.el b/code/elpa/helm-core-20240316.1157/helm-core-autoloads.el new file mode 100644 index 0000000..282f96d --- /dev/null +++ b/code/elpa/helm-core-20240316.1157/helm-core-autoloads.el @@ -0,0 +1,250 @@ +;;; helm-core-autoloads.el --- automatically extracted autoloads (do not edit) -*- lexical-binding: t -*- +;; Generated by the `loaddefs-generate' function. + +;; This file is part of GNU Emacs. + +;;; Code: + +(add-to-list 'load-path (or (and load-file-name (directory-file-name (file-name-directory load-file-name))) (car load-path))) + + + +;;; Generated autoloads from helm-core.el + +(autoload 'helm-define-multi-key "helm-core" "\ +In KEYMAP, define key sequence KEY for function list FUNCTIONS. +Each function runs sequentially for each KEY press. +If DELAY is specified, switch back to initial function of FUNCTIONS list +after DELAY seconds. +The functions in FUNCTIONS list take no args. +E.g. + (defun foo () + (interactive) + (message \"Run foo\")) + (defun bar () + (interactive) + (message \"Run bar\")) + (defun baz () + (interactive) + (message \"Run baz\")) + +(helm-define-multi-key global-map (kbd \" q\") \\='(foo bar baz) 2) + +Each time \" q\" is pressed, the next function is executed. +Waiting more than 2 seconds between key presses switches back to +executing the first function on the next hit. + +(fn KEYMAP KEY FUNCTIONS &optional DELAY)") +(autoload 'helm-multi-key-defun "helm-core" "\ +Define NAME as a multi-key command running FUNS. +After DELAY seconds, the FUNS list is reinitialized. +See `helm-define-multi-key'. + +(fn NAME DOCSTRING FUNS &optional DELAY)" nil t) +(function-put 'helm-multi-key-defun 'lisp-indent-function 2) +(function-put 'helm-multi-key-defun 'doc-string-elt 2) +(autoload 'helm-define-key-with-subkeys "helm-core" "\ +Define in MAP a KEY and SUBKEY to COMMAND. + +This allows typing KEY to call COMMAND the first time and +type only SUBKEY on subsequent calls. + +Arg MAP is the keymap to use, SUBKEY is the initial short +key binding to call COMMAND. + +Arg OTHER-SUBKEYS is an alist specifying other short key bindings +to use once started, e.g.: + + (helm-define-key-with-subkeys global-map + (kbd \"C-x v n\") ?n \\='git-gutter:next-hunk + \\='((?p . git-gutter:previous-hunk))) + +In this example, `C-x v n' will run `git-gutter:next-hunk' +subsequent \"n\" will run this command again and subsequent \"p\" +will run `git-gutter:previous-hunk'. + +If specified PROMPT can be displayed in minibuffer to describe +SUBKEY and OTHER-SUBKEYS. Arg EXIT-FN specifies a function to run +on exit. + +For any other key pressed, run their assigned command as defined +in MAP and then exit the loop running EXIT-FN, if specified. + +If DELAY an integer is specified exit after DELAY seconds. + +NOTE: SUBKEY and OTHER-SUBKEYS bindings support only char syntax +and vectors, so don't use strings to define them. While defining +or executing a kbd macro no SUBKEY or OTHER-SUBKEYS are provided, +i.e. the loop is not entered after running COMMAND. + +(fn MAP KEY SUBKEY COMMAND &optional OTHER-SUBKEYS PROMPT EXIT-FN DELAY DOCSTRING)") +(function-put 'helm-define-key-with-subkeys 'lisp-indent-function 1) +(autoload 'helm-configuration "helm-core" "\ +Customize Helm." t) +(autoload 'helm-debug-open-last-log "helm-core" "\ +Open Helm log file or buffer of last Helm session." t) +(autoload 'helm "helm-core" "\ +Main function to execute helm sources. + +PLIST is a list like + +(:key1 val1 :key2 val2 ...) + + or + +(&optional sources input prompt resume preselect + buffer keymap default history allow-nest). + +** Keywords + +Keywords supported: + +- :sources +- :input +- :prompt +- :resume +- :preselect +- :buffer +- :keymap +- :default +- :history +- :allow-nest + +Extra LOCAL-VARS keywords are supported, see the \"** Other +keywords\" section below. + +Basic keywords are the following: + +*** :sources + +One of the following: + +- List of sources +- Symbol whose value is a list of sources +- Alist representing a Helm source. + - In this case the source has no name and is referenced in + `helm-sources' as a whole alist. + +*** :input + +Initial input of minibuffer (temporary value of `helm-pattern') + +*** :prompt + +Minibuffer prompt. Default value is `helm--prompt'. + +*** :resume + +If t, allow resumption of the previous session of this Helm +command, skipping initialization. + +If \\='noresume, this instance of `helm' cannot be resumed. + +*** :preselect + +Initially selected candidate (string or regexp). + +*** :buffer + +Buffer name for this Helm session. `helm-buffer' will take this value. + +*** :keymap + +[Obsolete] + +Keymap used at the start of this Helm session. + +It is overridden by keymaps specified in sources, and is kept +only for backward compatibility. + +Keymaps should be specified in sources using the :keymap slot +instead. See `helm-source'. + +This keymap is not restored by `helm-resume'. + +*** :default + +Default value inserted into the minibuffer with +\\\\[next-history-element]. + +It can be a string or a list of strings, in this case +\\\\[next-history-element] cycles through +the list items, starting with the first. + +If nil, `thing-at-point' is used. + +If `helm-maybe-use-default-as-input' is non-nil, display is +updated using this value if this value matches, otherwise it is +ignored. If :input is specified, it takes precedence on :default. + +*** :history + +Minibuffer input, by default, is pushed to `minibuffer-history'. + +When an argument HISTORY is provided, input is pushed to +HISTORY. HISTORY should be a valid symbol. + +*** :allow-nest + +Allow running this Helm command in a running Helm session. + +** Other keywords + +Other keywords are interpreted as local variables of this Helm +session. The `helm-' prefix can be omitted. For example, + +(helm :sources \\='helm-source-buffers-list + :buffer \"*helm buffers*\" + :candidate-number-limit 10) + +Starts a Helm session with the variable +`helm-candidate-number-limit' set to 10. + +** Backward compatibility + +For backward compatibility, positional parameters are +supported: + +(helm sources input prompt resume preselect + buffer keymap default history allow-nest) + +However, the use of non-keyword args is deprecated. + +(fn &key SOURCES INPUT PROMPT RESUME PRESELECT BUFFER KEYMAP DEFAULT HISTORY ALLOW-NEST OTHER-LOCAL-VARS)") +(autoload 'helm-cycle-resume "helm-core" "\ +Cycle in `helm-buffers' list and resume when waiting more than 1.2s." t) +(autoload 'helm-other-buffer "helm-core" "\ +Simplified Helm interface with other `helm-buffer'. +Call `helm' only with SOURCES and BUFFER as args. + +(fn SOURCES BUFFER)") +(register-definition-prefixes "helm-core" '("helm-" "with-helm-")) + + +;;; Generated autoloads from helm-lib.el + +(register-definition-prefixes "helm-lib" '("helm-" "with-helm-")) + + +;;; Generated autoloads from helm-multi-match.el + +(register-definition-prefixes "helm-multi-match" '("helm-m")) + + +;;; Generated autoloads from helm-source.el + +(register-definition-prefixes "helm-source" '("helm-")) + +;;; End of scraped data + +(provide 'helm-core-autoloads) + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; no-native-compile: t +;; coding: utf-8-emacs-unix +;; End: + +;;; helm-core-autoloads.el ends here diff --git a/code/elpa/helm-core-20240316.1157/helm-core-pkg.el b/code/elpa/helm-core-20240316.1157/helm-core-pkg.el new file mode 100644 index 0000000..0329d39 --- /dev/null +++ b/code/elpa/helm-core-20240316.1157/helm-core-pkg.el @@ -0,0 +1,13 @@ +(define-package "helm-core" "20240316.1157" "Development files for Helm" + '((emacs "25.1") + (async "1.9.7")) + :commit "4e4a3889e2b19fe871850254132153b349138f96" :authors + '(("Thierry Volpiatto" . "thievol@posteo.net")) + :maintainers + '(("Thierry Volpiatto" . "thievol@posteo.net")) + :maintainer + '("Thierry Volpiatto" . "thievol@posteo.net") + :url "https://emacs-helm.github.io/helm/") +;; Local Variables: +;; no-byte-compile: t +;; End: diff --git a/code/elpa/helm-core-20240316.1157/helm-core.el b/code/elpa/helm-core-20240316.1157/helm-core.el new file mode 100644 index 0000000..f633c28 --- /dev/null +++ b/code/elpa/helm-core-20240316.1157/helm-core.el @@ -0,0 +1,8004 @@ +;;; helm-core.el --- Development files for Helm -*- lexical-binding: t -*- + +;; Copyright (C) 2022 ~ 2023 Thierry Volpiatto + +;; Author: Thierry Volpiatto +;; URL: https://emacs-helm.github.io/helm/ +;; Version: 3.9.7 +;; Package-Requires: ((emacs "25.1") (async "1.9.7")) + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; Contains the main code for Helm. +;; As a package helm-core provides the files helm-core.el, helm-lib.el, +;; helm-source.el and helm-multi-match.el. + +;;; Code: + +(require 'cl-lib) +(require 'async) +(require 'helm-lib) +(require 'helm-multi-match) +(require 'helm-source) + +;; Ensure async-bytecomp is used even with helm-core package. +(declare-function async-bytecomp-package-mode "ext:async-bytecomp.el") +(when (require 'async-bytecomp nil t) + (and (fboundp 'async-bytecomp-package-mode) + (async-bytecomp-package-mode 1))) + +;; Setup completion styles for helm-mode +(helm--setup-completion-styles-alist) + +(declare-function helm-comp-read "helm-mode.el") +(declare-function custom-unlispify-tag-name "cus-edit.el") +(declare-function helm-quit-and-find-file "helm-utils.el") +(declare-function linum-mode "linum.el") +(declare-function minibuffer-depth-setup "mb-depth.el") + +(defvar helm-marked-buffer-name) +(defvar display-buffer-function) +(defvar minibuffer-follows-selected-frame) +(defvar minibuffer-depth-indicate-mode) + + +;;; Internal Variables +;; +;; +(defvar helm-source-filter nil + "A list of source names to be displayed. +Other sources won't appear in the search results. +If nil, no filtering is done. +Don't set this directly, use `helm-set-source-filter' during a +Helm session to modify it.") +(defvar helm-saved-action nil + "Saved value of the currently selected action by key.") +(defvar helm-saved-current-source nil + "Value of the current source when the action list is shown.") +(defvar helm-in-persistent-action nil + "Flag whether in persistent-action or not.") +(defvar helm-last-buffer nil + "`helm-buffer' of a previous Helm session.") +(defvar helm-saved-selection nil + "Value of the currently selected object when the action list is shown.") +(defvar helm-sources nil + "[INTERNAL] Value of current sources in use, a list of alists. +The list of sources (symbols or alists) is normalized to alists +in `helm-initialize'.") +(defvar helm-buffer-file-name nil + "Variable `buffer-file-name' when Helm is invoked.") +(defvar helm-candidate-cache (make-hash-table :test 'equal) + "Holds the available candidate within a single Helm invocation.") +(defvar helm--candidate-buffer-alist nil) +(defvar helm-input "" + "The input typed in the candidates panel.") +(defvar helm-input-local nil + "Internal, store locally `helm-pattern' value for later use in `helm-resume'.") +(defvar helm--source-name nil) +(defvar helm-current-source nil) +(defvar helm-issued-errors nil) +(defvar helm--last-log-file nil + "The name of the log file of the last Helm session.") +(defvar helm--local-variables nil) +(defvar helm-split-window-state nil) +(defvar helm--window-side-state nil) +(defvar helm-selection-point nil + "The value of point at selection.") +(defvar helm-alive-p nil) +(defvar helm-visible-mark-overlays nil) +(defvar helm-update-blacklist-regexps '("^" "^ *" "$" "!" " " "\\b" + "\\<" "\\>" "\\_<" "\\_>" ".*" + "??" "?*" "*?" "?")) +(defvar helm--force-updating-p nil + "[INTERNAL] Don't use this in your programs.") +(defvar helm-exit-status 0 + "Flag to inform if Helm did exit or quit. +0 means Helm did exit when executing an action. +1 means Helm did quit with \\[keyboard-quit] +Knowing this exit-status could help restore a window config when +Helm aborts in some special circumstances. See +`helm-exit-minibuffer' and `helm-keyboard-quit'.") +(defvar helm-minibuffer-confirm-state nil) +(defvar helm--quit nil) +(defvar helm-buffers nil + "Helm buffers listed in order of most recently used.") +(defvar helm-current-position nil + "Cons of (point . window-start) when Helm is invoked. +`helm-current-buffer' uses this to restore position after +`helm-keyboard-quit'") +(defvar helm-last-frame-or-window-configuration nil + "Used to store window or frame configuration at Helm start.") +(defvar helm-onewindow-p nil) +(defvar helm-types nil) +(defvar helm--mode-line-string-real nil) ; The string to display in mode-line. +(defvar helm-persistent-action-display-window nil) +(defvar helm-marked-candidates nil + "Marked candidates. List of (source . real) pair.") +(defvar helm--mode-line-display-prefarg nil) +(defvar helm--temp-follow-flag nil + "[INTERNAL] A simple flag to notify persistent action we are following.") +(defvar helm--reading-passwd-or-string nil) +(defvar helm--in-update nil) +(defvar helm--in-fuzzy nil) +(defvar helm-maybe-use-default-as-input nil + "Flag to notify the use of use-default-as-input. +Use only in let-bindings. +Use :default arg of `helm' as input to update display. +Note that if also :input is specified as `helm' arg, it will take +precedence on :default.") +(defvar helm--temp-hooks nil + "Store temporary hooks added by `with-helm-temp-hook'.") +(defvar helm--prompt nil) +(defvar helm--file-completion-sources + '("Find Files" "Read File Name") + "Sources that use the *find-files mechanism can be added here. +Sources generated by `helm-mode' don't need to be added here +because they are automatically added. + +You should not modify this yourself unless you know what you are +doing.") +(defvar helm--completing-file-name nil + "Non nil when `helm-read-file-name' is running. +Used for `helm-file-completion-source-p'.") +;; Same as `ffap-url-regexp' but keep it here to ensure `ffap-url-regexp' is not nil. +(defvar helm--url-regexp "\\`\\(news\\(post\\)?:\\|mailto:\\|file:\\|\\(ftp\\|https?\\|telnet\\|gopher\\|www\\|wais\\)://\\)") +(defvar helm--ignore-errors nil + "Flag to prevent Helm popping up errors in candidates functions. +Should be set in candidates functions if needed, and will be +restored at end of session.") +(defvar helm--action-prompt "Select action: ") +(defvar helm--cycle-resume-iterator nil) +(defvar helm--buffer-in-new-frame-p nil) +(defvar helm-initial-frame nil + "[INTERNAL] The selected frame before starting Helm. +Helm use this internally to know in which frame it started, don't +modify this yourself.") +(defvar helm-popup-frame nil + "The frame where Helm is displayed. + +This is only used when Helm is using +`helm-display-buffer-in-own-frame' as `helm-display-function' and +`helm-display-buffer-reuse-frame' is non nil.") +(defvar helm--nested nil) +(defconst helm--frame-default-attributes + '(width height tool-bar-lines left top + title undecorated vertical-scroll-bars + visibility fullscreen menu-bar-lines undecorated + alpha foreground-color background-color) + "Frame parameters to save in `helm--last-frame-parameters'.") +(defvar helm--last-frame-parameters nil + "Frame parameters to save for later resuming. +Local to `helm-buffer'.") +(defvar helm--executing-helm-action nil + "Non nil when action is triggering a new helm-session. +This may be let bounded in other places to notify the display +function to reuse the same frame parameters as the previous Helm +session just like resume would do.") +(defvar helm--current-buffer-narrowed nil) +(defvar helm--suspend-update-interactive-flag nil) +(defvar helm-persistent-action-window-buffer nil + "[INTERNAL] Store the buffer where helm is started. +It is generally `helm-current-buffer', but when this one is displayed +in a dedicated buffer, helm can't start in this window and use another +window handling a buffer, it is this one we store.") +(defvar helm--tramp-archive-maybe-loaded nil) +(defvar helm--original-dedicated-windows-alist nil + "[INTERNAL] Store all dedicated windows with their dedicated state on startup") + +;;; Multi keys +;; +;; +;;;###autoload +(defun helm-define-multi-key (keymap key functions &optional delay) + "In KEYMAP, define key sequence KEY for function list FUNCTIONS. +Each function runs sequentially for each KEY press. +If DELAY is specified, switch back to initial function of FUNCTIONS list +after DELAY seconds. +The functions in FUNCTIONS list take no args. +E.g. + (defun foo () + (interactive) + (message \"Run foo\")) + (defun bar () + (interactive) + (message \"Run bar\")) + (defun baz () + (interactive) + (message \"Run baz\")) + +\(helm-define-multi-key global-map (kbd \" q\") \\='(foo bar baz) 2) + +Each time \" q\" is pressed, the next function is executed. +Waiting more than 2 seconds between key presses switches back to +executing the first function on the next hit." + (define-key keymap key (helm-make-multi-command functions delay))) + +;;;###autoload +(defmacro helm-multi-key-defun (name docstring funs &optional delay) + "Define NAME as a multi-key command running FUNS. +After DELAY seconds, the FUNS list is reinitialized. +See `helm-define-multi-key'." + (declare (indent 2) (doc-string 2)) + (setq docstring (if docstring (concat docstring "\n\n") + "This is a helm-ish multi-key command.")) + `(defalias (quote ,name) (helm-make-multi-command ,funs ,delay) ,docstring)) + +(defun helm-make-multi-command (functions &optional delay) + "Return an anonymous multi-key command running FUNCTIONS. +Run each function in the FUNCTIONS list in turn when called within +DELAY seconds." + (declare (indent 1)) + (let ((funs functions) + (iter (list nil)) ; ref-cell[1]. + (timeout delay)) + (lambda () + (interactive) + (helm-run-multi-key-command funs iter timeout)))) + +(defun helm-run-multi-key-command (functions iterator delay) + (let ((fn (lambda () + (cl-loop for count from 1 to (length functions) + collect count))) + next) + ;; By passing a list containing a single 'nil' element [1] as ITERATOR we + ;; avoid using a global var. + (unless (and (car iterator) + ;; Reset iterator when another key is pressed. + (eq this-command real-last-command)) + (setcar iterator (helm-iter-circular (funcall fn)))) + (setq next (helm-iter-next (car iterator))) + (and next (car iterator) + (call-interactively (nth (1- next) functions))) + (when delay (run-with-idle-timer + delay nil (lambda () + (setcar iterator nil)))))) + +(helm-multi-key-defun helm-toggle-resplit-and-swap-windows + "Multi key command to re-split and swap Helm window. +First call runs `helm-toggle-resplit-window', +and second call within 1s runs `helm-swap-windows'." + '(helm-toggle-resplit-window helm-swap-windows) 1) +(put 'helm-toggle-resplit-and-swap-windows 'helm-only t) + +(defun helm-command-with-subkeys (map subkey command + &optional other-subkeys prompt exit-fn delay) + "Build a command that run COMMAND when SUBKEY is read. + +The command runs a loop reading keys and exit when user stops typing after DELAY +seconds. After this DELAY EXIT-FN run if specified. + +Arg OTHER-SUBKEYS should be an alist composed of (command . short-key) where +command is another command than COMMAND bound to short-key. + +A PROMPT can be used to describe bindings of COMMAND and OTHER-SUBKEYS. + +Return an anonymous interactive command to use with +`helm-define-key-with-subkeys'." + (lambda () + (interactive) + (let (timer) + (call-interactively command) + (unless (or defining-kbd-macro executing-kbd-macro) + (unwind-protect + (progn + (when delay + (setq timer (run-with-idle-timer + delay nil (lambda () (keyboard-quit))))) + (while (let ((input (read-key prompt)) other kb com) + (setq last-command-event input) + (cond + ((eq input subkey) + (call-interactively command) + (setq last-command command) + t) + ((setq other (assoc input other-subkeys)) + (call-interactively (cdr other)) + (setq last-command (cdr other)) + t) + (t + (setq kb (vector last-command-event)) + (setq com (lookup-key map kb)) + (if (commandp com) + (call-interactively com) + (setq unread-command-events + (nconc (mapcar #'identity kb) + unread-command-events))) + nil))))) + (when timer (cancel-timer timer)) + (and exit-fn (funcall exit-fn))))))) + +;;;###autoload +(defun helm-define-key-with-subkeys (map key subkey command + &optional other-subkeys + prompt exit-fn delay + docstring) + "Define in MAP a KEY and SUBKEY to COMMAND. + +This allows typing KEY to call COMMAND the first time and +type only SUBKEY on subsequent calls. + +Arg MAP is the keymap to use, SUBKEY is the initial short +key binding to call COMMAND. + +Arg OTHER-SUBKEYS is an alist specifying other short key bindings +to use once started, e.g.: + + (helm-define-key-with-subkeys global-map + (kbd \"C-x v n\") ?n \\='git-gutter:next-hunk + \\='((?p . git-gutter:previous-hunk))) + +In this example, `C-x v n' will run `git-gutter:next-hunk' +subsequent \"n\" will run this command again and subsequent \"p\" +will run `git-gutter:previous-hunk'. + +If specified PROMPT can be displayed in minibuffer to describe +SUBKEY and OTHER-SUBKEYS. Arg EXIT-FN specifies a function to run +on exit. + +For any other key pressed, run their assigned command as defined +in MAP and then exit the loop running EXIT-FN, if specified. + +If DELAY an integer is specified exit after DELAY seconds. + +NOTE: SUBKEY and OTHER-SUBKEYS bindings support only char syntax +and vectors, so don't use strings to define them. While defining +or executing a kbd macro no SUBKEY or OTHER-SUBKEYS are provided, +i.e. the loop is not entered after running COMMAND." + (declare (indent 1)) + (let ((fn (helm-command-with-subkeys + map subkey command other-subkeys prompt exit-fn delay)) + (com (intern (format "helm-%s-with-subkeys" + (symbol-name command))))) + (defalias com fn + (or docstring + ;; When no DOCSTRING, generate a basic one specifying + ;; COMMAND, SUBKEY and OTHER-SUBKEYS. + (concat + (format "Run `%s' and bound it to `%s' for subsequent calls." + command (if (numberp subkey) (single-key-description subkey) subkey)) + (if other-subkeys + (helm-basic-docstring-from-alist other-subkeys) + "")))) + (define-key map key com))) + +(defun helm-basic-docstring-from-alist (alist) + (let* ((len (length alist)) + (osk (cl-loop for (k . v) in alist + for count from 1 + for sep = (cond ((and (= count len) (> len 1)) + " and ") + ((> count 1) ",") + (t "")) + for key = (if (numberp k) (single-key-description k) k) + concat (format "%s`%s'" sep key) into ks + concat (format "%s`%s'" sep v) into kv + finally return (list ks kv)))) + (format "\nBound as well %s to %s%s." + (car osk) (if (> len 1) "respectively " "") (cadr osk)))) + +;;; Keymap +;; +;; +(defvar helm-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map minibuffer-local-map) + (define-key map (kbd "") #'helm-next-line) + (define-key map (kbd "") #'helm-previous-line) + (define-key map (kbd "C-n") #'helm-next-line) + (define-key map (kbd "C-p") #'helm-previous-line) + (define-key map (kbd "") #'helm-follow-action-forward) + (define-key map (kbd "") #'helm-follow-action-backward) + (define-key map (kbd "") #'helm-previous-page) + (define-key map (kbd "") #'helm-next-page) + (define-key map (kbd "M-v") #'helm-scroll-up) + (define-key map (kbd "C-v") #'helm-scroll-down) + (define-key map (kbd "M-<") #'helm-beginning-of-buffer) + (define-key map (kbd "M->") #'helm-end-of-buffer) + (define-key map (kbd "C-g") #'helm-keyboard-quit) + (define-key map (kbd "") #'helm-maybe-exit-minibuffer) + (define-key map (kbd "C-i") #'helm-select-action) + (define-key map (kbd "C-j") #'helm-execute-persistent-action) + (define-key map (kbd "C-o") #'helm-next-source) + (define-key map (kbd "M-o") #'helm-previous-source) + (define-key map (kbd "") #'helm-next-source) + (define-key map (kbd "") #'helm-previous-source) + (define-key map (kbd "C-l") #'helm-recenter-top-bottom-other-window) + (define-key map (kbd "M-C-l") #'helm-reposition-window-other-window) + (define-key map (kbd "C-M-v") #'helm-scroll-other-window) + (define-key map (kbd "M-") #'helm-scroll-other-window) + (define-key map (kbd "C-M-y") #'helm-scroll-other-window-down) + (define-key map (kbd "C-M-S-v") #'helm-scroll-other-window-down) + (define-key map (kbd "M-") #'helm-scroll-other-window-down) + (define-key map (kbd "") #'helm-scroll-other-window) + (define-key map (kbd "") #'helm-scroll-other-window-down) + (define-key map (kbd "C-@") #'helm-toggle-visible-mark) + (define-key map (kbd "C-SPC") #'helm-toggle-visible-mark-forward) + (define-key map (kbd "M-SPC") #'helm-toggle-visible-mark-backward) + (define-key map (kbd "M-[") nil) + (define-key map (kbd "M-(") #'helm-prev-visible-mark) + (define-key map (kbd "M-)") #'helm-next-visible-mark) + (define-key map (kbd "C-k") #'helm-delete-minibuffer-contents) + (define-key map (kbd "DEL") #'helm-delete-char-backward) + (define-key map (kbd "C-x C-f") #'helm-quit-and-find-file) + (define-key map (kbd "M-m") #'helm-toggle-all-marks) + (define-key map (kbd "M-a") #'helm-mark-all) + (define-key map (kbd "M-U") #'helm-unmark-all) + (define-key map (kbd "C-M-a") #'helm-show-all-candidates-in-source) + (define-key map (kbd "C-M-e") #'helm-display-all-sources) + (define-key map (kbd "C-s") #'undefined) + (define-key map (kbd "M-s") #'undefined) + (define-key map (kbd "C-r") #'undefined) + (define-key map (kbd "C-M-r") #'undefined) + (define-key map (kbd "C-M-s") #'undefined) + (define-key map (kbd "C-}") #'helm-narrow-window) + (define-key map (kbd "C-{") #'helm-enlarge-window) + (define-key map (kbd "C-c -") #'helm-swap-windows) + (define-key map (kbd "C-c _") #'helm-toggle-full-frame) + (define-key map (kbd "C-z") #'helm-toggle-full-frame) + (define-key map (kbd "C-c %") #'helm-exchange-minibuffer-and-header-line) + (define-key map (kbd "C-c C-y") #'helm-yank-selection) + (define-key map (kbd "C-c C-k") #'helm-kill-selection-and-quit) + (define-key map (kbd "C-c C-i") #'helm-insert-or-copy) + (define-key map (kbd "C-c C-f") #'helm-follow-mode) + (define-key map (kbd "C-c C-u") #'helm-refresh) + (define-key map (kbd "C-c >") #'helm-toggle-truncate-line) + (define-key map (kbd "C-c l") #'helm-display-line-numbers-mode) + (define-key map (kbd "M-p") #'previous-history-element) + (define-key map (kbd "M-n") #'next-history-element) + ;; Unbind `previous-matching-history-element' which is non sense for helm. + (define-key map (kbd "M-r") #'undefined) + (define-key map (kbd "C-!") #'helm-toggle-suspend-update) + (define-key map (kbd "C-x b") #'helm-resume-previous-session-after-quit) + (define-key map (kbd "C-x C-b") #'helm-resume-list-buffers-after-quit) + (helm-define-key-with-subkeys map (kbd "C-c n") ?n #'helm-run-cycle-resume) + ;; Disable `file-cache-minibuffer-complete'. + (define-key map (kbd "") #'undefined) + ;; Multi keys + (define-key map (kbd "C-t") #'helm-toggle-resplit-and-swap-windows) + ;; Debugging command + (define-key map (kbd "C-h C-d") #'helm-enable-or-switch-to-debug) + (define-key map (kbd "C-h c") #'helm-customize-group) + (define-key map (kbd "C-h d") #'helm-debug-output) + ;; Allow to eval keymap without errors. + (define-key map [f1] nil) + (define-key map (kbd "C-h C-h") #'undefined) + (define-key map (kbd "C-h h") #'undefined) + (helm-define-key-with-subkeys map + (kbd "C-w") ?\C-w #'helm-yank-text-at-point + '((?\C-_ . helm-undo-yank-text-at-point))) + ;; Use `describe-mode' key in `global-map'. + (dolist (k (where-is-internal #'describe-mode global-map)) + (define-key map k #'helm-help)) + ;; Bind all actions from f1 to f12, `helm-select-nth-action' + ;; counts from 0, i.e. (helm-select-nth-action 0) = action 1. + (dotimes (n 12) + (define-key map (kbd (format "" (1+ n))) + (lambda () + (interactive) + (helm-select-nth-action n)))) + map) + "Keymap for helm.") + +(defun helm-customize-group-1 (group) + (require 'cus-edit) + (let ((name (format "*Customize Group: %s*" + (custom-unlispify-tag-name group)))) + (if (buffer-live-p (get-buffer name)) + (switch-to-buffer name) + (custom-buffer-create + (list (list group 'custom-group)) + name + (concat " for group " + (custom-unlispify-tag-name group)))))) + +(defun helm-customize-group () + "Jump to customization group of current source. + +Default to Helm group when group is not defined in source." + (interactive) + (let ((source (or (helm-get-current-source) + (helm-comp-read + "Customize variables for: " + (cl-loop for src in (with-helm-buffer helm-sources) + collect `(,(assoc-default 'name src) . + ,src)) + :allow-nest t + :exec-when-only-one t)))) + (helm-run-after-exit 'helm-customize-group-1 (helm-get-attr 'group source)))) +(put 'helm-customize-group 'helm-only t) + +(defun helm--action-at-nth-set-fn-1 (value &optional negative) + (dotimes (n 9) + (let ((key (format value (1+ n))) + (fn (lambda () + (interactive) + (helm-execute-selection-action-at-nth + (if negative (- (1+ n)) (1+ n)))))) + (define-key helm-map (kbd key) nil) + (define-key helm-map (kbd key) fn)))) + +(defun helm--action-at-nth-set-fn- (var val) + (set var val) + (helm--action-at-nth-set-fn-1 val 'negative)) + +(defun helm--action-at-nth-set-fn+ (var val) + (set var val) + (helm--action-at-nth-set-fn-1 val)) + +(defcustom helm-action-at-nth-negative-prefix-key "C-x %d" + "The prefix key to execute default action on nth <-n> candidate. + +This is a format spec where %d will be replaced by the candidate +number. + +NOTE: `setq' have no effect until you restart Emacs, use +customize for immediate effect." + :group 'helm + :type 'string + :set #'helm--action-at-nth-set-fn-) + +(defcustom helm-action-at-nth-positive-prefix-key "C-c %d" + "The prefix key to execute default action on nth <+n> candidate. + +This is a format spec where %d will be replaced by the candidate +number. + +NOTE: `setq' have no effect until you restart Emacs, use +customize for immediate effect." + :group 'helm + :type 'string + :set #'helm--action-at-nth-set-fn+) + + +(defgroup helm nil + "Open Helm." + :prefix "helm-" :group 'convenience) + +;; Easy access to customize +;;;###autoload +(defun helm-configuration () + "Customize Helm." + (interactive) + (customize-group "helm")) + +(defcustom helm-completion-window-scroll-margin 5 + "`scroll-margin' to use for Helm completion window. +Set to 0 to disable. +NOTE: This has no effect when `helm-display-source-at-screen-top' +id is non-nil." + :group 'helm + :type 'integer) + +(defcustom helm-left-margin-width 0 + "`left-margin-width' value for the `helm-buffer'." + :group 'helm + :type 'integer) + +(defcustom helm-display-source-at-screen-top t + "Display candidates at the top of screen. +This happens with `helm-next-source' and `helm-previous-source'. +NOTE: When non-nil (default), disable +`helm-completion-window-scroll-margin'." + :group 'helm + :type 'boolean) + +(defcustom helm-candidate-number-limit 500 + "Global limit for number of candidates displayed. +When the pattern is empty, the number of candidates shown will be +as set here instead of the entire list, which may be hundreds or +thousands. Since narrowing and filtering rapidly reduces +available candidates, having a small list will keep the interface +responsive. + +Set this value to nil for no limit." + :group 'helm + :type '(choice (const :tag "Disabled" nil) integer)) + +(defcustom helm-input-idle-delay 0.01 + "Idle time before updating, specified in seconds." + :group 'helm + :type 'float) + +(defcustom helm-exit-idle-delay 0 + "Idle time before exiting minibuffer while Helm is updating. +Has no affect when helm-buffer is up to date (i.e. exit without +delay in this condition)." + :group 'helm + :type 'float) + +(defvaralias 'helm-samewindow 'helm-full-frame) +(make-obsolete-variable 'helm-samewindow 'helm-full-frame "1.4.8.1") +(defcustom helm-full-frame nil + "Use current window for showing candidates. +If t, then Helm does not pop-up a new window." + :group 'helm + :type 'boolean) + +(defcustom helm-candidate-separator + (if (fontp (char-displayable-p (read "#x2015"))) + "――――――――――――――――――――――――――――――――――――――" + "--------------------------------------") + "Candidates separator of `multiline' source." + :group 'helm + :type 'string) + +(defcustom helm-save-configuration-functions + '(set-window-configuration . current-window-configuration) + "Functions used to restore or save configurations for frames and windows. +Specified as a pair of functions, where car is the restore +function and cdr is the save function. + +To save and restore frame configuration, set this variable to +\\='(set-frame-configuration . current-frame-configuration) + +NOTE: This may not work properly with own-frame minibuffer +settings. Older versions saves/restores frame configuration, but +the default has changed now to avoid flickering." + :group 'helm + :type 'sexp) + +(defcustom helm-display-function 'helm-default-display-buffer + "Function used to display `helm-buffer'. + +Local value in `helm-buffer' will take precedence on this default +value. Commands that are in `helm-commands-using-frame' will have +`helm-buffer' displayed in frame, `helm-display-function' being +ignored. +If no local value is found and current command is not one of +`helm-commands-using-frame' use this default value. +The function in charge of deciding which value use is +`helm-resolve-display-function'. + +To set it locally to `helm-buffer' in Helm sources use +`helm-set-local-variable' in init function or use +:display-function slot in `helm' call." + :group 'helm + :type 'symbol) + +(defcustom helm-case-fold-search 'smart + "Adds \\='smart' option to `case-fold-search'. +Smart option ignores case for searches as long as there are no +upper case characters in the pattern. + +Use nil or t to turn off smart behavior and use +`case-fold-search' behavior. + +Default is smart. + +NOTE: Case fold search has no effect when searching asynchronous +sources, which relies on customized features implemented directly +into their execution process. See helm-grep.el for an example." + :group 'helm + :type '(choice (const :tag "Ignore case" t) + (const :tag "Respect case" nil) + (other :tag "Smart" smart))) + +(defcustom helm-file-name-case-fold-search + (if (memq system-type + '(cygwin windows-nt ms-dos darwin)) + t + helm-case-fold-search) + "Local setting of `helm-case-fold-search' for reading filenames. + +See `helm-case-fold-search' for more info." + :group 'helm + :type 'symbol) + +(defcustom helm-reuse-last-window-split-state nil + "Use the same state of window split, vertical or horizontal. +`helm-toggle-resplit-window' for the next helm session will use +the same window scheme as the previous session unless +`helm-split-window-default-side' is \\='same or \\='other." + :group 'helm + :type 'boolean) + +(defcustom helm-split-width-threshold nil + "The value of `split-width-threshold' for helm windows. +This affect the behavior of `helm-split-window-default-fn'. +When the value is an integer, `split-window-sensibly' is used inconditionally +and all the helm variables that affect window splitting are ignored." + :group 'helm + :type '(choice + (const :tag "Maybe use `split-window-sensibly'" nil) + (integer :tag "Inconditionally use `split-window-sensibly'"))) + +(defcustom helm-split-window-preferred-function 'helm-split-window-default-fn + "Default function used for splitting window." + :group 'helm + :type 'function) + +(defcustom helm-split-window-default-side 'below + "The default side to display `helm-buffer'. +Must be one acceptable arg for `split-window' SIDE, +that is `below', `above', `left' or `right'. + +Other acceptable values are `same' which always displays +`helm-buffer' in current window and `other' that displays +`helm-buffer' below if only one window or in +`other-window-for-scrolling' when available. + +A nil value has same effect as `below'. If `helm-full-frame' is +non-nil, it take precedence over this setting. + +See also `helm-split-window-inside-p' and +`helm-always-two-windows' that take precedence over this. + +NOTE: this has no effect if +`helm-split-window-preferred-function' is not +`helm-split-window-default-fn' unless this new function can +handle this." + :group 'helm + :type 'symbol) + +(defcustom helm-split-window-other-side-when-one-window 'below + "Place for `helm-window' when `helm-split-window-default-side' is \\='other. + +The default side to display `helm-buffer' when (1) +`helm-split-window-default-side' is \\='other and (2) +the current frame only has one window. Possible values +are acceptable args for `split-window' SIDE, that is `below', +`above', `left' or `right'. + +If `helm-full-frame' is non-nil, it takes precedence over this +setting. + +See also `helm-split-window-inside-p' and `helm-always-two-windows' that +takes precedence over this. + +NOTE: this has no effect if +`helm-split-window-preferred-function' is not +`helm-split-window-default-fn' unless this new function can +handle this." + :group 'helm + :type 'symbol) + +(defcustom helm-display-buffer-default-height nil + "Initial height of `helm-buffer', specified as an integer or a function. + +The function should take one arg and be responsible for re-sizing +the window; function's return value is ignored. Note that this +has no effect when the split is vertical. See `display-buffer' +for more info." + :group 'helm + :type '(choice integer function)) + +(defcustom helm-display-buffer-default-width nil + "Initial width of `helm-buffer', specified as an integer or a function. + +The function should take one arg and be responsible for re-sizing +the window; function's return value is ignored. Note that this +have no effect when the split is horizontal. See `display-buffer' +for more info." + :group 'helm + :type '(choice integer function)) + +(defvaralias 'helm-split-window-in-side-p 'helm-split-window-inside-p) +(make-obsolete-variable 'helm-split-window-in-side-p 'helm-split-window-inside-p "2.8.6") +(defcustom helm-split-window-inside-p nil + "Force split inside selected window when non-nil. +See also `helm-split-window-default-side'. + +NOTE: this has no effect if +`helm-split-window-preferred-function' is not +`helm-split-window-default-fn' unless this new function can +handle this." + :group 'helm + :type 'boolean) + +(defcustom helm-always-two-windows t + "When non-nil Helm uses two windows in this frame. + +I.e. `helm-buffer' in one window and `helm-current-buffer' +in the other. + +Note: this has no effect when `helm-split-window-inside-p' is +non-nil, or when `helm-split-window-default-side' is set to +\\='same. + +When `helm-autoresize-mode' is enabled, setting this to nil +will have no effect. + +Also when non-nil it overrides the effect of +`helm-split-window-default-side' set to `other'." + :group 'helm + :type 'boolean) + +(defcustom helm-display-buffer-width 72 + "Frame width when displaying helm-buffer in own frame." + :group 'helm + :type 'integer) + +(defcustom helm-display-buffer-height 20 + "Frame height when displaying helm-buffer in own frame." + :group 'helm + :type 'integer) + +(defcustom helm-default-display-buffer-functions nil + "Action functions to pass to `display-buffer'. +See (info \"(elisp) Buffer Display Action Functions\"). + +It may override others helm window related variables settings like +`helm-always-two-windows', `helm-split-window-inside-p' etc..." + :group 'helm + :type '(repeat symbol)) + +(defcustom helm-default-display-buffer-alist nil + "Additional alist to pass to `display-buffer' action. +See (info \"(elisp) Action Alists for Buffer Display\"). + +It may override others helm window related variables settings like +`helm-always-two-windows', `helm-split-window-inside-p' etc... + +Note that window-height and window-width have to be configured in +`helm-display-buffer-height' and `helm-display-buffer-width'." + :group 'helm + :type '(alist :key-type symbol :value-type sexp)) + +(defcustom helm-sources-using-default-as-input '(helm-source-imenu + helm-source-imenu-all + helm-source-info-elisp + helm-source-etags-select + helm-source-man-pages + helm-source-occur + helm-source-moccur + helm-source-grep-ag + helm-source-grep-git + helm-source-grep) + "List of Helm sources that need to use `helm-maybe-use-default-as-input'. +When a source is a member of this list, default `thing-at-point' +will be used as input." + :group 'helm + :type '(repeat (choice symbol))) + +(defcustom helm-delete-minibuffer-contents-from-point t + "When non-nil, `helm-delete-minibuffer-contents' deletes region from `point'. +Otherwise it deletes `minibuffer-contents'. +See documentation for `helm-delete-minibuffer-contents'." + :group 'helm + :type 'boolean) + +(defcustom helm-follow-mode-persistent nil + "When non-nil, save last state of `helm-follow-mode' for the next Emacs sessions. + +Each time you turn on or off `helm-follow-mode', the current +source name will be stored or removed from +`helm-source-names-using-follow'. + +Note that this may be disabled in some places where it is unsafe +to use because persistent action is changing according to +context." + :group 'helm + :type 'boolean) + +(defcustom helm-source-names-using-follow nil + "A list of source names to have follow enabled. +This list of source names will be used only +when `helm-follow-mode-persistent' is non-nil. + +You don't have to customize this yourself unless you really want +and know what you are doing, instead just set +`helm-follow-mode-persistent' to non-nil and as soon as you turn +on or off `helm-follow-mode' (C-c C-f) in a source, Helm will +save or remove source name in this variable." + :group 'helm + :type '(repeat (choice string))) + +(defcustom helm-prevent-escaping-from-minibuffer t + "Prevent escaping from minibuffer with `other-window' during the Helm session." + :group 'helm + :type 'boolean) + +(defcustom helm-allow-mouse t + "Allow mouse usage during the Helm session when non-nil. + +Note that this also allows moving out of minibuffer when clicking +outside of `helm-buffer', so it is up to you to get back to Helm +by clicking back in `helm-buffer' or minibuffer." + :group 'helm + :type 'boolean) + +(defcustom helm-move-to-line-cycle-in-source t + "Cycle to the beginning or end of the list after reaching the bottom or top. +This applies when using `helm-next/previous-line'." + :group 'helm + :type 'boolean) + +(defcustom helm-fuzzy-match-fn 'helm-fuzzy-match + "The function for fuzzy matching in `helm-source-sync' based sources." + :group 'helm + :type 'function) + +(defcustom helm-fuzzy-search-fn 'helm-fuzzy-search + "The function for fuzzy matching in `helm-source-in-buffer' based sources." + :group 'helm + :type 'function) + +(defcustom helm-fuzzy-sort-fn 'helm-fuzzy-matching-default-sort-fn + "The sort transformer function used in fuzzy matching." + :group 'helm + :type 'function) + +(defcustom helm-fuzzy-matching-highlight-fn #'helm-fuzzy-default-highlight-match + "The function to highlight fuzzy matches. +The function must have the same signature as +`helm-fuzzy-default-highlight-match' which is the default." + :group 'helm + :type 'function) + +(defcustom helm-autoresize-max-height 40 + "Specify maximum height and defaults to percent of Helm window's frame height. + +See `fit-window-to-buffer' for more infos." + :group 'helm + :type 'integer) + +(defcustom helm-autoresize-min-height 10 + "Specify minimum height and defaults to percent of Helm window's frame height. + +If nil, `window-min-height' is used. +See `fit-window-to-buffer' for details." + :group 'helm + :type 'integer) + +(defcustom helm-input-method-verbose-flag nil + "The default value for `input-method-verbose-flag' used in Helm minibuffer. +It is nil by default, which does not turn off input method. Helm +updates and exits without interruption -- necessary for complex +methods. + +If set to any other value as per `input-method-verbose-flag', +then use `C-\\' to disable the `current-input-method' to exit or +update Helm." + :group 'helm + :type '(radio :tag "A flag to control extra guidance for input methods in helm." + (const :tag "Never provide guidance" nil) + (const :tag "Always provide guidance" t) + (const :tag "Provide guidance only for complex methods" complex-only))) + +(defcustom helm-display-header-line t + "Display header-line when non nil. +It has to be non nil when you want to display minibuffer contents in there with +`helm-echo-input-in-header-line'." + :group 'helm + :type 'boolean) + +(defcustom helm-inherit-input-method t + "Inherit `current-input-method' from `current-buffer' when non-nil. +The default is to enable this by default and then toggle +`toggle-input-method'." + :group 'helm + :type 'boolean) + +(defcustom helm-echo-input-in-header-line nil + "Send current input to header-line when non-nil. +Note that `helm-display-header-line' has to be non nil as well for this to take +effect." + :group 'helm + :type 'boolean) + +(defcustom helm-header-line-space-before-prompt 'left-fringe + "Specify the space before prompt in header-line. + +This will be used when `helm-echo-input-in-header-line' is +non-nil. + +Value can be one of the symbols \\='left-fringe or \\='left-margin or +an integer specifying the number of spaces before prompt. Note +that on input longer that `window-width' the continuation string +will be shown on left side of window without taking care of +this." + :group 'helm + :type '(choice + (symbol + (const :tag "Fringe" left-fringe) + (const :tag "Margin" left-margin)) + integer)) + +(defcustom helm-tramp-connection-min-time-diff 5 + "Value of `tramp-connection-min-time-diff' for Helm remote processes. +If set to zero Helm remote processes are not delayed. + +Setting this to a value less than 5 or disabling it with a zero +value is risky, however on Emacs versions starting at 24.5 it +seems it is now possible to disable it. + +Anyway at any time in Helm you can suspend your processes while +typing by hitting \\ `\\[helm-toggle-suspend-update]'. + +Only async sources than use a sentinel calling +`helm-process-deferred-sentinel-hook' are affected by this." + :type 'integer + :group 'helm) + +(defcustom helm-show-action-window-other-window 'left + "Show action buffer beside `helm-buffer' when non-nil. + +If nil don't split and replace helm-buffer by the action buffer +in same window. +Possible value are left, right, below and above." + :group 'helm + :type '(choice + (const :tag "Split at left" left) + (const :tag "Split at right" right) + (const :tag "Split below" below) + (const :tag "Split above" above) + (const :tag "Don't split" nil))) + +(defcustom helm-cycle-resume-delay 1.0 + "Delay used before resuming in `helm-run-cycle-resume'." + :type 'float + :group 'helm) + +(defcustom helm-display-buffer-reuse-frame nil + "When non nil Helm frame is not deleted and reused in next sessions. + +This was used to workaround a bug in Emacs where frames where +popping up slowly, now that the bug have been fixed upstream +\(emacs-27) probably you don't want to use this any more. On +emacs-26 set `x-wait-for-event-timeout' to nil to have your +frames popping up fast." + :group 'helm + :type 'boolean) + +(defcustom helm-commands-using-frame nil + "A list of commands where `helm-buffer' is displayed in a frame." + :group 'helm + :type '(repeat symbol)) + +(defcustom helm-actions-inherit-frame-settings t + "Actions inherit Helm frame settings of initial command when non nil." + :group 'helm + :type 'boolean) + +(defcustom helm-use-undecorated-frame-option t + "Display Helm frame undecorated when non nil. + +This option has no effect with Emacs versions lower than 26." + :group 'helm + :type 'boolean) + +(defcustom helm-frame-background-color nil + "Background color for Helm frames, a string. +Fallback to default face background when nil." + :group 'helm + :type 'string) + +(defcustom helm-frame-foreground-color nil + "Foreground color for Helm frames, a string. +Fallback to default face foreground when nil" + :group 'helm + :type 'string) + +(defcustom helm-frame-alpha nil + "Alpha parameter for Helm frames, an integer. +Fallback to 100 when nil." + :group 'helm + :type 'integer) + +(defcustom helm-use-frame-when-more-than-two-windows nil + "Display Helm buffer in frame when more than two windows." + :group 'helm + :type 'boolean) + +(defvaralias 'helm-use-frame-when-dedicated-window + 'helm-use-frame-when-no-suitable-window) + +(defcustom helm-use-frame-when-no-suitable-window nil + "Display Helm buffer in frame when Helm is started from a dedicated window." + :group 'helm + :type 'boolean) +(make-obsolete-variable 'helm-use-frame-when-dedicated-window + 'helm-use-frame-when-no-suitable-window + "3.8.1") + +(defcustom helm-default-prompt-display-function + #'helm-set-default-prompt-display + "The function to use to set face of fake cursor in header-line." + :group 'helm + :type 'function) + +(defcustom helm-truncate-lines nil + "The value of `truncate-lines' when Helm starts. +You can toggle later `truncate-lines' with +\\\\[helm-toggle-truncate-line]." + :group 'helm + :type 'boolean) + +(defcustom helm-visible-mark-prefix "*" + "Prefix used in margin for marked candidates. +Set this to an empty string if you don't want prefix in margin when marking." + :group 'helm + :type 'string) + +;;; Faces +;; +;; +(defgroup helm-faces nil + "Customize the appearance of Helm." + :prefix "helm-" + :group 'faces + :group 'helm) + +(defface helm-source-header + `((((background dark)) + ,@(and (>= emacs-major-version 27) '(:extend t)) + :background "#22083397778B" + :foreground "white" + :weight bold :height 1.3 :family "Sans Serif") + (((background light)) + ,@(and (>= emacs-major-version 27) '(:extend t)) + :background "#abd7f0" + :foreground "black" + :weight bold :height 1.3 :family "Sans Serif")) + "Face for source header in the Helm buffer." + :group 'helm-faces) + +(defface helm-visible-mark + `((((min-colors 88) (background dark)) + ,@(and (>= emacs-major-version 27) '(:extend t)) + :background "green1" + :foreground "black") + (((background dark)) + ,@(and (>= emacs-major-version 27) '(:extend t)) + :background "green" + :foreground "black") + (((background light)) + ,@(and (>= emacs-major-version 27) '(:extend t)) + :background "#d1f5ea") + (((min-colors 88)) + ,@(and (>= emacs-major-version 27) '(:extend t)) + :background "green1") + (t ,@(and (>= emacs-major-version 27) '(:extend t)) + :background "green")) + "Face for visible mark." + :group 'helm-faces) + +(defface helm-header + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :inherit header-line)) + "Face for header lines in the Helm buffer." + :group 'helm-faces) + +(defface helm-candidate-number + `((((background dark)) + ,@(and (>= emacs-major-version 27) '(:extend t)) + :background "Yellow" :foreground "black") + (((background light)) + ,@(and (>= emacs-major-version 27) '(:extend t)) + :background "#faffb5" :foreground "black")) + "Face for candidate number in mode-line." + :group 'helm-faces) + +(defface helm-candidate-number-suspended + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :inherit helm-candidate-number :inverse-video t)) + "Face for candidate number in mode-line when Helm is suspended." + :group 'helm-faces) + +(defface helm-selection + `((((background dark)) + ,@(and (>= emacs-major-version 27) '(:extend t)) + :background "ForestGreen" + :distant-foreground "black") + (((background light)) + ,@(and (>= emacs-major-version 27) '(:extend t)) + :background "#b5ffd1" + :distant-foreground "black")) + "Face for currently selected item in the Helm buffer." + :group 'helm-faces) + +(defface helm-separator + `((((background dark)) + ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "red") + (((background light)) + ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "#ffbfb5")) + "Face for multiline source separator." + :group 'helm-faces) + +(defface helm-action + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :underline t)) + "Face for action lines in the Helm action buffer." + :group 'helm-faces) + +(defface helm-prefarg + `((((background dark)) + ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "green") + (((background light)) + ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "red")) + "Face for showing prefix arg in mode-line." + :group 'helm-faces) + +(defface helm-match + `((((background light)) + ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "#b00000") + (((background dark)) + ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "gold1")) + "Face used to highlight matches." + :group 'helm-faces) + +(defface helm-header-line-left-margin + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "black" :background "yellow")) + "Face used to highlight helm-header sign in left-margin. +This face is used only when using `helm-echo-input-in-header-line' and pattern +is wider then screen." + :group 'helm-faces) + +(defface helm-minibuffer-prompt + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :inherit minibuffer-prompt)) + "Face used for the minibuffer/headline prompt (such as Pattern:) in Helm." + :group 'helm-faces) + +(defface helm-eob-line + `((t ,@(and (>= emacs-major-version 27) '(:extend t)) + :inherit default)) + "Face for empty line at end of sources in the Helm buffer. +Allow specifying the height of this line." + :group 'helm-faces) + +(defface helm-mark-prefix + `((t :inherit default)) + "Face for string `helm-visible-mark-prefix'." + :group 'helm-faces) + +;;; Variables. +;; +;; +(defvar helm-selection-overlay nil + "Overlay used to highlight the currently selected item.") + +(defvar helm-async-processes nil + "List of information about asynchronous processes managed by Helm.") + +(defvar helm-before-initialize-hook nil + "Runs before Helm initialization. +This hook runs before init functions in `helm-sources', which is +before creation of `helm-buffer'. Set local variables for +`helm-buffer' that need a value from `current-buffer' with +`helm-set-local-variable'.") + +(defvar helm-after-initialize-hook nil + "Runs after Helm initialization. +This hook runs after `helm-buffer' is created but not from +`helm-buffer'. The hook needs to specify in which buffer to +run.") + +(defvaralias 'helm-update-hook 'helm-after-update-hook) +(make-obsolete-variable 'helm-update-hook 'helm-after-update-hook "1.9.9") + +(defvar helm-after-update-hook nil + "Runs after updating the Helm buffer with the new input pattern.") + +(defvar helm-before-update-hook nil + "Runs before updating the Helm buffer with the new input pattern.") + +(defvar helm-cleanup-hook nil + "Runs after exiting the minibuffer and before performing an +action. + +This hook runs even if Helm exits the minibuffer abnormally (e.g. +via `helm-keyboard-quit').") + +(defvar helm-select-action-hook nil + "Runs when opening the action buffer.") + +(defvar helm-before-action-hook nil + "Runs before executing action. +Unlike `helm-cleanup-hook', this hook runs before Helm closes the +minibuffer and also before performing an action.") + +(defvar helm-after-action-hook nil + "Runs after executing action.") + +(defvar helm-exit-minibuffer-hook nil + "Runs just before exiting the minibuffer. + +This hook runs when Helm exits the minibuffer normally (e.g., via +candidate selection), but does NOT run if Helm exits the +minibuffer abnormally (e.g. via `helm-keyboard-quit').") + +(defvar helm-after-persistent-action-hook nil + "Runs after executing persistent action.") + +(defvar helm-move-selection-before-hook nil + "Runs before moving selection in `helm-buffer'.") + +(defvar helm-move-selection-after-hook nil + "Runs after moving selection in `helm-buffer'.") + +(defvar helm-after-preselection-hook nil + "Runs after pre-selection in `helm-buffer'.") + +(defvar helm-window-configuration-hook nil + "Runs when switching to and from the action buffer. +Should run also at end of `helm-display-function'.") + +(defvar helm-execute-action-at-once-if-one nil + "When non-nil execute the default action and then exit if only one candidate. +If symbol \\='current-source is given as value exit if only one +candidate in current source. This variable accepts a function +with no args that should returns a boolean value or \\='current-source.") + +(defvar helm-quit-if-no-candidate nil + "When non-nil, quit if there are no candidates. +This variable accepts a function.") + +(defvar helm-debug-function #'helm-default-debug-function + "A Function that returns a list of values to print in `helm-debug-output' buffer.") + +(defvar helm-debug-output-buffer "*Helm Debug*") + +(defvar helm-debug-buffer "*Debug Helm Log*") + +(defvar helm-debug nil + "If non-nil, write log message to `helm-debug-buffer'. +Default is nil, which disables writing log messages because the +size of `helm-debug-buffer' grows quickly.") + +(defvar helm-mode-line-string "\ +\\\ +\\[helm-help]:Help \ +\\[helm-select-action]:Act \ +\\[helm-maybe-exit-minibuffer]/\ +f1..f12:NthAct \ +\\[helm-toggle-suspend-update]:Tog.suspend \ +\\[helm-customize-group]:Conf" + "Help string displayed by Helm in the mode-line. +It is either a string or a list of two string arguments where the +first string is the name and the second string is displayed in +the mode-line. When nil, it defaults to `mode-line-format'.") + +(defvar helm-minibuffer-set-up-hook '(helm-hide-minibuffer-maybe) + "Hook that runs at minibuffer initialization. +A hook useful for modifying minibuffer settings in Helm. + +Uses `helm-hide-minibuffer-maybe' by default which hide minibuffer contents with +header-line contents when `helm-echo-input-in-header-line' is non nil.") + +(defvar helm-help-message + "* Helm Generic Help +** Basics + +To navigate in this Help buffer see [[Helm help][here]]. + +Helm narrows down the list of candidates as you type a filter +pattern. See [[Matching in Helm][Matching in Helm]]. + +Helm accepts multiple space-separated patterns, each pattern can +be negated with \"!\". + +Helm also supports fuzzy matching in some places when specified, +you will find several variables to enable fuzzy matching in +diverse [[Helm sources][sources]], see [[https://github.com/emacs-helm/helm/wiki/Fuzzy-matching][fuzzy-matching]] in helm-wiki for more infos. + +Helm generally uses familiar Emacs keys to navigate the list. +Here follow some of the less obvious bindings: + +- `\\\\[helm-maybe-exit-minibuffer]' selects the +candidate from the list, executes the default action upon exiting +the Helm session. + +- `\\\\[helm-execute-persistent-action]' executes the +default action but without exiting the Helm session. Not all +sources support this. + +- `\\\\[helm-select-action]' displays a list of actions +available on current candidate or all marked candidates. The +default binding is ordinarily used for completion, but that +would be redundant since Helm completes upon every character +entered in the prompt. See [[https://github.com/emacs-helm/helm/wiki#helm-completion-vs-emacs-completion][Helm wiki]]. + +Note: In addition to the default actions list, additional actions +appear depending on the type of the selected candidate(s). They +are called filtered actions. + +** Helm sources + +Helm uses what's called sources to provide different kinds of +completions. Each Helm session can handle one or more source. A +source is an alist object which is build from various classes, +see [[Writing your own Helm sources][here]] and [[https://github.com/emacs-helm/helm/wiki/Developing#creating-a-source][Helm wiki]] for more infos. + +*** Configure sources + +You will find in Helm sources already built and bound to a +variable called generally `helm-source-'. In this case +it is an alist and you can change the attributes (keys) values +using `helm-set-attr' function in your configuration. Of course +you have to ensure before calling `helm-set-attr' that the file +containing source is loaded, e.g. with `with-eval-after-load'. Of +course you can also completely redefine the source but this is +generally not elegant as it duplicate for its most part code +already defined in Helm. + +You will find also sources that are not built and even not bound +to any variables because they are rebuilded at each start of a +Helm session. In this case you can add a defmethod called +`helm-setup-user-source' to your config: + +#+begin_src elisp + + (cl-defmethod helm-setup-user-source ((source helm-moccur-class)) + (setf (slot-value source 'follow) -1)) + +#+end_src + +See +[[https://github.com/emacs-helm/helm/wiki/FAQ#why-is-a-customizable-helm-source-nil][here]] +for more infos, and for more complex examples of configuration +[[https://github.com/thierryvolpiatto/emacs-tv-config/blob/master/init-helm.el#L340][here]]. + +** Modify keybindings in Helm + +Helm main keymap is `helm-map', all keys bound in this map apply +to all Helm sources. However, most sources have their own keymap, +with each binding overriding its counterpart in `helm-map', you +can see all bindings in effect in the [[Commands][Commands]] +section (available only if the source has its own keymap and +documentation of course). + +** Matching in Helm + +All that you write in minibuffer is interpreted as a regexp or +multiple regexps if separated by a space. This is true for most +sources unless the developer of the source has disabled it or +have choosen to use fuzzy matching. Even if a source has fuzzy +matching enabled, Helm will switch to multi match as soon as it +detects a space in the pattern. It may also switch to multi match +as well if pattern starts with a \"^\" beginning of line sign. In +those cases each pattern separated with space should be a regexp +and not a fuzzy pattern. When using multi match patterns, each +pattern starting with \"!\" is interpreted as a negation i.e. +match everything but this. + +*** Completion-styles + +UPDATE: At version 3.8.0 Helm default is now to NOT use +`completion-styles' i.e. now `helm-completion-style' default to +'helm and no more to 'emacs. + +If you want to use `completion-styles' in Helm customize +`helm-completion-style' to 'emacs. + +Helm generally fetches its candidates with the :candidates +function up to `helm-candidate-number-limit' and then applies +match functions to these candidates according to `helm-pattern'. +But Helm allows matching candidates directly from the :candidates +function using its own `completion-styles'. +Helm provides 'helm completion style but also 'helm-flex +completion style for Emacs<27 that don't have 'flex completion +style, otherwise (emacs-27) 'flex completion style is used to +provide fuzzy aka flex completion. + +When using helm-fuzzy as `helm-completion-style' helm use its own +fuzzy implementation which have nothing to do with emacs `flex' +style. + +Any Helm sources can use `completion-styles' +by using :match-dynamic slot and building their :candidates +function with `helm-dynamic-completion'. + +Example: + +#+begin_src elisp + + (helm :sources (helm-build-sync-source \"test\" + :candidates (helm-dynamic-completion + '(foo bar baz foab) + 'symbolp) + :match-dynamic t) + :buffer \"*helm test*\") + +#+end_src + +By default Helm sets up `completion-styles' and always adds 'helm +to it. However the flex completion styles are not added. This is +up to the user if she wants to have such completion to enable +this. +As specified above use 'flex for emacs-27 and 'helm-flex for +emacs-26. Anyway, 'helm-flex is not provided in +`completion-styles-alist' if 'flex is present. + +Finally Helm provides two user variables to control +`completion-styles' usage: `helm-completion-style' and +`helm-completion-styles-alist'. Both variables are customizable. +The former allows retrieving previous Helm behavior if needed, by +setting it to `helm' or `helm-fuzzy', default being `emacs' which +allows dynamic completion and usage of `completion-styles'. The +second allows setting `helm-completion-style' per mode and also +specifying `completion-styles' per mode (see its docstring). Note +that these two variables take effect only in helm-mode i.e. in +all that uses `completion-read' or `completion-in-region', IOW all +helmized commands. File completion in `read-file-name' family +doesn't obey completion-styles and has its own file completion +implementation. Native Helm commands using `completion-styles' +doesn't obey `helm-completion-style' and +`helm-completion-styles-alist' (e.g., helm-M-x). + +Also for a better control of styles in native Helm sources (not +helmized by helm-mode) using :match-dynamic, +`helm-dynamic-completion' provides a STYLES argument that allows +specifying explicitely styles for this source. + +NOTE: Some old completion styles are not working fine with Helm +and are disabled by default in +`helm-blacklist-completion-styles'. They are anyway not useful in +Helm because 'helm style supersedes these styles. + +** Helm mode + +`helm-mode' toggles Helm completion in native Emacs functions, so +when you turn `helm-mode' on, commands like `switch-to-buffer' +will use Helm completion instead of the usual Emacs completion +buffer. + +*** What gets or does not get \"helmized\" when `helm-mode' is enabled? + +Helm provides generic completion on all Emacs functions using +`completing-read', `completion-in-region' and their derivatives, +e.g. `read-file-name'. Helm exposes a user variable to control +which function to use for a specific Emacs command: +`helm-completing-read-handlers-alist'. If the function for a +specific command is nil, it turns off Helm completion. See the +variable documentation for more infos. + +*** Helm functions vs helmized Emacs functions + +While there are Helm functions that perform the same completion +as other helmized Emacs functions, e.g. `switch-to-buffer' and +`helm-buffers-list', the native Helm functions like +`helm-buffers-list' can receive new features that allow marking +candidates, have several actions, etc. Whereas the helmized Emacs +functions only have Helm completion, Emacs can provide no more +than one action for this function. This is the intended behavior. + +Generally you are better off using the native Helm command than +the helmized Emacs equivalent. + +*** Completion behavior with Helm and completion-at-point + +Helm is NOT completing dynamically. That means that when you are +completing some text at point, completion is done against this +text and subsequent characters you add AFTER this text. This +allows you to use matching methods provided by Helm, that is multi +matching or fuzzy matching (see [[Matching in Helm][Matching in +Helm]]). + +Completion is not done dynamically (against `helm-pattern') +because backend functions (i.e. `completion-at-point-functions') +are not aware of Helm matching methods. + +By behaving like this, the benefit is that you can fully use Helm +matching methods but you can't start a full completion against a +prefix different than the initial text you have at point. Helm +warns you against this by colorizing the initial input and sends +a user-error message when trying to delete backward text beyond +this limit at first hit on DEL. A second hit on DEL within a +short delay (1s) quits Helm and delete-backward char in +current-buffer. + +** Helm help + +\\[helm-documentation]: Show all Helm documentations concatenated +in one org file. + +From a Helm session, just hit \\\\[helm-help] to have +the documentation for the current source followed by the global +Helm documentation. + +While in the help buffer, most of the Emacs regular key bindings +are available; the most important ones are shown in minibuffer. +However, due to implementation restrictions, no regular Emacs +keymap is used (it runs in a loop when reading the help buffer). +Only simple bindings are available and they are defined in +`helm-help-hkmap', which is a simple alist of (key . function). +You can define or redefine bindings in help with +`helm-help-define-key' or by adding/removing entries directly in +`helm-help-hkmap'. +See `helm-help-hkmap' for restrictions on bindings and functions. + +The documentation of default bindings are: + +| Key | Alternative keys | Command | +|-----------+------------------+---------------------| +| C-v | Space next | Scroll up | +| M-v | b prior | Scroll down | +| C-s | | Isearch forward | +| C-r | | Isearch backward | +| C-a | | Beginning of line | +| C-e | | End of line | +| C-f | right | Forward char | +| C-b | left | Backward char | +| C-n | down | Next line | +| C-p | up | Previous line | +| M-a | | Backward sentence | +| M-e | | Forward sentence | +| M-f | | Forward word | +| M-b | | Backward word | +| M-> | | End of buffer | +| M-< | | Beginning of buffer | +| C- | | Toggle mark | +| C-M-SPACE | | Mark sexp | +| RET | | Follow org link | +| C-% | | Push org mark | +| C-& | | Goto org mark-ring | +| TAB | | Org cycle | +| M- | | Toggle visibility | +| M-w | | Copy region | +| q | | Quit | + +** Customize Helm + +Helm provides a lot of user variables for extensive customization. +From any Helm session, type \\\\[helm-customize-group] +to jump to the current source `custom' group. Helm also has a +special group for faces you can access via `M-x customize-group +RET helm-faces'. + +Note: Some sources may not have their group set and default to +the `helm' group. + +** Display Helm in windows and frames + +You can display the Helm completion buffer in many different +window configurations, see the custom interface to discover the +different windows configurations available (See [[Customize Helm][Customize Helm]] to jump to custom interface). +When using Emacs in a graphic display (i.e. not in a terminal) you can as +well display your Helm buffers in separated frames globally for +all Helm commands or separately for specific Helm commands. +See `helm-display-function' and `helm-commands-using-frame'. +See also [[https://github.com/emacs-helm/helm/wiki/frame][helm wiki]] for more infos. + +There is a variable to allow reusing frame instead of deleting +and creating a new one at each session, see `helm-display-buffer-reuse-frame'. +Normally you don't have to use this, it have been made to workaround +slow frame popup in Emacs-26, to workaround this slowness in Emacs-26 use instead + +#+begin_src elisp + (when (= emacs-major-version 26) + (setq x-wait-for-event-timeout nil)) +#+end_src + +WARNING: +There is a package called Posframe and also one called Helm-posframe, +you DO NOT need these packages to display helm buffers in frames. +Thus Posframe package use child frames which have no minibuffers +and are by the way not compatible with Helm. + +** Helm's basic operations and default key bindings + +| Key| Command| +|----+--------| +| | +| \\[helm-previous-line]| Previous line | +| \\[helm-next-line]| Next line | +| \\[helm-scroll-up]| Scroll up | +| \\[helm-scroll-down]| Scroll down | +| \\[helm-scroll-other-window]| Scroll up other-window | +| \\[helm-scroll-other-window-down]| Scroll down other-window | +| \\[helm-maybe-exit-minibuffer]| Execute first (default) action / Select [1] | +| \\[helm-beginning-of-buffer]| Goto beginning of buffer | +| \\[helm-end-of-buffer]| Goto end of buffer | +| \\[helm-select-action]| Show actions menu | +| \\[helm-previous-source]| Previous source | +| \\[helm-next-source]| Next source | +| \\[helm-delete-minibuffer-contents]| Delete pattern (with prefix arg delete from point to end or all [2]) | +| \\[helm-execute-persistent-action]| Persistent action (Execute and keep Helm session) | +|\\[helm-toggle-resplit-and-swap-windows]|Rotate or swap windows. | +|\\[helm-exchange-minibuffer-and-header-line]|Exchange minibuffer and header-line. | +|\\[helm-quit-and-find-file]|Drop into `helm-find-files'. | +|\\[helm-kill-selection-and-quit]|Kill display value of candidate and quit (with prefix arg, kill the real value). | +|\\[helm-yank-selection]|Yank current selection into pattern. | +|\\[helm-insert-or-copy]|Insert or copy marked candidates (C-u) . | +|\\[helm-follow-mode]|Toggle automatic execution of persistent action. | +|\\[helm-follow-action-forward]|Run persistent action then select next line. | +|\\[helm-follow-action-backward]|Run persistent action then select previous line. | +|\\[helm-refresh]|Recalculate and redisplay candidates. | +|\\[helm-toggle-suspend-update]|Toggle candidate updates. | + +\[1] Behavior may change depending context in some source e.g. `helm-find-files'. + +\[2] Delete from point to end or all depending on the value of +`helm-delete-minibuffer-contents-from-point'. + +NOTE: Any of these bindings are from `helm-map' and may be +overriten by the map specific to the current source in use (each +source can have its own keymap). + +** The actions menu + +You can display the action menu in the same window +as helm candidates (default) or in a side window according to +`helm-show-action-window-other-window' value. + +When the action menu popup, the helm prompt is used to narrow +down this menu, no more candidates. + +When `helm-allow-mouse' is non nil, you can use as well +mouse-3 (right click) in the candidate zone to select actions +with the mouse once your candidate is selected. + +** Action transformers + +You may be surprized to see your actions list changing depending +on the context. This happen when a source has an action +transformer function which checks the current selected candidate +and adds specific actions for this candidate. + +** Shortcuts for n-th first actions + +f1-f12: Execute n-th action where n is 1 to 12. + +** Shortcuts for executing the default action on the n-th candidate + +Helm does not display line numbers by default, with Emacs-26+ you +can enable it permanently in all helm buffers with: + + (add-hook 'helm-after-initialize-hook 'helm-init-relative-display-line-numbers) + +You can also toggle line numbers with +\\\\[helm-display-line-numbers-mode] in current Helm +buffer. + +Of course when enabling `global-display-line-numbers-mode' Helm +buffers will have line numbers as well. \(Don't forget to +customize `display-line-numbers-type' to relative). + +In Emacs versions < to 26 you will have to use +[[https://github.com/coldnew/linum-relative][linum-relative]] +package and `helm-linum-relative-mode'. + +Then when line numbers are enabled with one of the methods above +the following keys are available([1]): + +C-x : Execute default action on the n-th candidate before +currently selected candidate. + +C-c : Execute default action on the n-th candidate after +current selected candidate. + +\"n\" is limited to 1-9. For larger jumps use other navigation +keys. + +\[1] Note that the key bindings are always available even if line +numbers are not displayed. They are just useless in this case. + +** Mouse control in Helm + +A basic support for the mouse is provided when the user sets +`helm-allow-mouse' to non-nil. + +- mouse-1 selects the candidate. +- mouse-2 executes the default action on selected candidate. +- mouse-3 pops up the action menu. + +Note: When mouse control is enabled in Helm, it also lets you +click around and lose the minibuffer focus: you'll have to click +on the Helm buffer or the minibuffer to retrieve control of your +Helm session. + +** Marked candidates + +You can mark candidates to execute an action on all of them +instead of the current selected candidate only. (See bindings +below.) Most Helm actions operate on marked candidates unless +candidate-marking is explicitely forbidden for a specific source. + +- To mark/unmark a candidate, use +\\[helm-toggle-visible-mark]. (See bindings below.) With a +numeric prefix arg mark ARG candidates forward, if ARG is +negative mark ARG candidates backward. + +- To mark all visible unmarked candidates at once in current +source use \\[helm-mark-all]. With a prefix argument, mark all +candidates in all sources. + +- To unmark all visible marked candidates at once use + \\[helm-unmark-all]. + +- To mark/unmark all candidates at once use +\\[helm-toggle-all-marks]. With a prefix argument, mark/unmark +all candidates in all sources. + +Note: When multiple candidates are selected across different +sources, only the candidates of the current source will be used +when executing most actions (as different sources can have +different actions). Some actions support multi-source marking +however. + +** Follow candidates + +When `helm-follow-mode' is on (\\\\[helm-follow-mode] +to toggle it), moving up and down Helm session or updating the +list of candidates will automatically execute the +persistent-action as specified for the current source. + +If `helm-follow-mode-persistent' is non-nil, the state of the +mode will be restored for the following Helm sessions. + +If you just want to follow candidates occasionally without +enabling `helm-follow-mode', you can use +\\\\[helm-follow-action-forward] or +\\[helm-follow-action-backward] instead. Conversely, when +`helm-follow-mode' is enabled, those commands go to previous/next +line without executing the persistent action. + +** Special yes, no or yes for all answers + +You may be prompted in the minibuffer to answer by [y,n,!,q] in +some places for confirmation. + +- y mean yes +- no mean no +- ! mean yes for all +- q mean quit or abort current operation. + +When using ! you will not be prompted for the same thing in +current operation any more, e.g. file deletion, file copy etc... + +** Moving in `helm-buffer' + +You can move in `helm-buffer' with the usual commands used in +Emacs: \(\\\\[helm-next-line], +\\\\[helm-previous-line], etc. See above basic +commands. When `helm-buffer' contains more than one source, +change source with \\\\[helm-next-source] and +\\[helm-previous-source]. + +Note: When reaching the end of a source, +\\\\[helm-next-line] will *not* go to the next source +when variable `helm-move-to-line-cycle-in-source' is non-nil, so +you will have to use \\\\[helm-next-source] and +\\[helm-previous-source]. + +** Resume previous session from current Helm session + +You can use `C-c n' (`helm-run-cycle-resume') to cycle in +resumables sources. `C-c n' is a special key set with +`helm-define-key-with-subkeys' which, after pressing it, allows +you to keep cycling with further `n'. + +Tip: You can bound the same key in `global-map' to + `helm-cycle-resume' with `helm-define-key-with-subkeys' to + let you transparently cycle sessions, Helm fired up or not. + You can also bind the cycling commands to single key + presses (e.g., `S-') this time with a simple + `define-key'. (Note that `S-' is not available in + terminals.) + +Note: `helm-define-key-with-subkeys' is available only once Helm +is loaded. + +You can also use +\\\\[helm-resume-previous-session-after-quit] to resume +the previous session, or +\\\\[helm-resume-list-buffers-after-quit] to have +completion on all resumable buffers. + +** Global commands + +*** Resume Helm session from outside Helm + +\\\\[helm-resume] revives the last Helm session. +Binding a key to this command will greatly improve Helm +interactivity, e.g. when quitting Helm accidentally. + +You can call \\\\[helm-resume] with a prefix argument +to choose \(with completion!) which session you'd like to resume. +You can also cycle in these sources with `helm-cycle-resume' (see +above). + +** Debugging Helm + +Helm exposes the special variable `helm-debug': setting it to +non-nil will enable Helm logging in a special outline-mode +buffer. Helm resets the variable to nil at the end of each +session. + +For convenience, \\\\[helm-enable-or-switch-to-debug] +allows you to turn on debugging for this session only. To avoid +accumulating log entries while you are typing patterns, you can +use \\\\[helm-toggle-suspend-update] to turn off +updating. When you are ready turn it on again to resume logging. + +Once you exit your Helm session you can access the debug buffer +with `helm-debug-open-last-log'. + +Note: Be aware that Helm log buffers grow really fast, so use +`helm-debug' only when needed. + +** Writing your own Helm sources + +Writing simple sources for your own usage is easy. When calling +the `helm' function, the sources are added the :sources slot +which can be a symbol or a list of sources. Sources can be built +with different EIEIO classes depending on what you want to do. To +simplify this, several `helm-build-*' macros are provided. Below +there are simple examples to start with. + +We will not go further here, see +[[https://github.com/emacs-helm/helm/wiki/Developing][Helm wiki]] +and the source code for more information and more complex +examples. + +#+begin_src elisp + + ;; Candidates are stored in a list. + (helm :sources (helm-build-sync-source \"test\" + ;; A function can be used as well + ;; to provide candidates. + :candidates '(\"foo\" \"bar\" \"baz\")) + :buffer \"*helm test*\") + + ;; Candidates are stored in a buffer. + ;; Generally faster but doesn't allow a dynamic updating + ;; of the candidates list i.e the list is fixed on start. + (helm :sources (helm-build-in-buffer-source \"test\" + :data '(\"foo\" \"bar\" \"baz\")) + :buffer \"*helm test*\") + +#+end_src + +** Helm Map +\\{helm-map}" + "Message string containing detailed help for `helm'. +It also accepts function or variable symbol.") + +(defvar helm-autoresize-mode) ;; Undefined in `helm-default-display-buffer'. + +(defvar helm-async-outer-limit-hook nil + "Run in async sources when process output is out of `candidate-number-limit'. +Should be set locally to `helm-buffer' with `helm-set-local-variable'.") + +(defvar helm-quit-hook nil + "A hook that runs when quitting Helm.") + +(defvar helm-resume-after-hook nil + "A hook that runs after resuming a Helm session. +The hook should takes one arg SOURCES.") + +(defvar helm-help-buffer-name "*Helm Help*" + "The name of helm help buffer.") + +;; See bug#2503. +(defvar helm-process-output-split-string-separator "\n" + "Separator to use when splitting helm async output.") + +(defvar helm-last-query "" + "The value of `helm-pattern' is stored here exit or quit.") + +;; Utility: logging +(defun helm-log (from format-string &rest args) + "Log message if `helm-debug' is non-nil. +Messages are written to the `helm-debug-buffer' buffer. + +FROM is the place from where it is called. +Argument FORMAT-STRING is a string to use with `format'. +Use optional arguments ARGS like in `format'." + (when helm-debug + (with-current-buffer (get-buffer-create helm-debug-buffer) + (outline-mode) + (buffer-disable-undo) + (let ((inhibit-read-only t)) + (goto-char (point-max)) + (insert (let ((tm (current-time))) + (format (concat (if (string-match "Start session" format-string) + "* " "** ") + "%s.%06d (%s)\n %s\n") + (format-time-string "%H:%M:%S" tm) + (nth 2 tm) + from + (apply #'format (cons format-string args))))))))) + +(defun helm-log-run-hook (from hook) + "Run HOOK like `run-hooks' and log these actions to Helm log buffer. +FROM is the place from where it is called." + (helm-log from "Executing %s with value = %S" hook (symbol-value hook)) + (helm-log from "Executing %s with global value = %S" hook (default-value hook)) + (run-hooks hook) + (helm-log from "executed %s" hook)) + +(defun helm-log-error (from &rest args) + "Accumulate error messages into `helm-issued-errors'. +FROM is the place from where it is called. +ARGS are args given to `format'. +E.g. (helm-log-error \"Error %s: %s\" (car err) (cdr err))." + (apply 'helm-log from (concat "ERROR: " (car args)) (cdr args)) + (let ((msg (apply 'format args))) + (unless (member msg helm-issued-errors) + (cl-pushnew msg helm-issued-errors :test 'equal)))) + +;;;###autoload +(defun helm-debug-open-last-log () + "Open Helm log file or buffer of last Helm session." + (interactive) + (if helm--last-log-file + (progn + (find-file helm--last-log-file) + (outline-mode) (view-mode 1) (visual-line-mode 1)) + (switch-to-buffer helm-debug-buffer) + (view-mode 1) (visual-line-mode 1))) + +(defun helm-print-error-messages () + "Print error messages in `helm-issued-errors'." + (and helm-issued-errors + (message "Helm issued errors: %s" + (mapconcat 'identity (reverse helm-issued-errors) "\n")))) + + +;; Test tools +(defmacro with-helm-time-after-update (&rest body) + (helm-with-gensyms (start-time time-elapsed) + `(let ((,start-time (float-time)) ,time-elapsed) + (add-hook 'helm-after-update-hook + (lambda () + (setq ,time-elapsed (- (float-time) ,start-time)) + (keyboard-quit))) + (unwind-protect ,@body + (remove-hook 'helm-after-update-hook + (lambda () + (setq ,time-elapsed (- (float-time) ,start-time)) + (keyboard-quit)))) + ,time-elapsed))) + + +;; Helm API +(defmacro with-helm-default-directory (directory &rest body) + (declare (indent 1) (debug t)) + `(let ((default-directory (or (and ,directory + (file-name-as-directory ,directory)) + default-directory))) + ,@body)) + +(defun helm-default-directory () + "Return the local value of `default-directory' in `helm-buffer'." + (buffer-local-value 'default-directory (get-buffer helm-buffer))) + +(defmacro with-helm-temp-hook (hook &rest body) + "Execute temporarily BODY as a function for HOOK." + (declare (indent 1) (debug t)) + `(letrec ((helm--hook (lambda () + (unwind-protect + (progn ,@body) + (remove-hook ,hook helm--hook))))) + (push (cons helm--hook ,hook) helm--temp-hooks) + (add-hook ,hook helm--hook))) + +(defmacro with-helm-after-update-hook (&rest body) + "Execute BODY at end of `helm-update'." + (declare (indent 0) (debug t)) + `(with-helm-temp-hook 'helm-after-update-hook ,@body)) + +(defmacro with-helm-alive-p (&rest body) + "Return error when BODY run outside Helm context." + (declare (indent 0) (debug t)) + `(progn + (if helm-alive-p + (progn ,@body) + (error "Running helm command outside of context")))) + +(defmacro with-helm-in-frame (&rest body) + "Execute Helm function in BODY displaying `helm-buffer' in separate frame." + (declare (debug t) (indent 0)) + `(progn + (helm-set-local-variable + 'helm-display-function 'helm-display-buffer-in-own-frame) + ,@body)) + +(defmacro helm-make-command-from-action (symbol doc action &rest body) + "Make a command SYMBOL from ACTION with docstring DOC. +The command SYMBOL will quit helm before execute. +Argument ACTION should be an existing helm action. +BODY form will run before calling action. + +Example: + + (helm-make-command-from-action foo-command + \"Docstring\" + \\='foo-action + (run body)) + +will produce a command like this: + + (defun foo-command () + \"docstring\" + (interactive) + (with-helm-alive-p + (run body) + (helm-exit-and-execute-action \\='foo-action))) + +And automatically put the symbol \\='helm-only on SYMBOL." + (declare (indent defun) (debug t)) + `(progn + (defun ,symbol () + ,doc + (interactive) + (with-helm-alive-p + (progn ,@body) + (helm-exit-and-execute-action ,action))) + (put ',symbol 'helm-only t))) + +(defmacro helm-make-persistent-command-from-action (symbol doc psymbol action) + "Make a persistent command SYMBOL bound to PSYMBOL from ACTION." + (declare (indent defun) (debug t)) + `(progn + (defun ,symbol () + ,doc + (interactive) + (with-helm-alive-p + (helm-set-attr ,psymbol (cons ,action 'never-split)) + (helm-execute-persistent-action ,psymbol))) + (put ',symbol 'helm-only t))) + + +;;; helm-attributes +;; +(defun helm-get-attr (attribute-name &optional source compute) + "Get the value of ATTRIBUTE-NAME of SRC. + +If SRC is omitted, use current source. + +If COMPUTE is non-`nil' compute value of ATTRIBUTE-NAME with +`helm-interpret-value'. COMPUTE can have also \\='ignorefn as value, +in this case `helm-interpret-value' will return a function as +value unchanged, but will eval a symbol which is bound. + +You can use `setf' to modify value of ATTRIBUTE-NAME unless +COMPUTE is specified, if attribute ATTRIBUTE-NAME is not found in +SOURCE `setf' will create new attribute ATTRIBUTE-NAME with +specified value. You can also use `helm-set-attr' to modify +ATTRIBUTE-NAME." + (declare (gv-setter + (lambda (val) + `(let* ((src (or ,source (helm-get-current-source))) + (attr (assq ,attribute-name src))) + (cl-assert (null ,compute) nil + "`setf' can't set the computed value of attribute `%s'" + ,attribute-name) + (if attr + (setcdr attr ,val) + (and (setcdr src (cons (cons ,attribute-name ,val) + (cdr src))) + ,val)))))) + (let ((src (or source (helm-get-current-source)))) + (helm-aif (assq attribute-name src) + (if compute + (helm-interpret-value (cdr it) src compute) + (cdr it))))) + +(defalias 'helm-attr 'helm-get-attr) +(make-obsolete 'helm-attr 'helm-get-attr "3.7.0") + +(cl-defun helm-set-attr (attribute-name value + &optional + (src (helm-get-current-source))) + "Set the value of ATTRIBUTE-NAME of source SRC to VALUE. + +If ATTRIBUTE-NAME doesn't exists in source it is created with +value VALUE. If SRC is omitted, use current source. If operation +succeed, return value, otherwise nil. + +Using this function is same as using `setf' on `helm-get-attr'." + (setf (helm-get-attr attribute-name src) value)) + +(defalias 'helm-attrset 'helm-set-attr) +(make-obsolete 'helm-attrset 'helm-set-attr "3.7.0") + +(defun helm-add-action-to-source (name fn source &optional index) + "Add new action NAME linked to function FN to SOURCE. +Function FN should be a valid function that takes one arg i.e. +candidate, argument NAME is a string that will appear in action +menu and SOURCE should be an existing helm source already loaded. +If INDEX is specified, action is added to the action list at INDEX, +otherwise added at end. +This allows users to add specific actions to an existing source +without modifying source code." + (let ((actions (helm-get-attr 'action source 'ignorefn)) + (new-action (list (cons name fn)))) + (when (functionp actions) + (setq actions (list (cons "Default action" actions)))) + (helm-set-attr 'action + (if index + (helm-append-at-nth actions new-action index) + (append actions new-action)) + source))) + +(defun helm-delete-action-from-source (action-or-name source) + "Delete ACTION-OR-NAME from SOURCE. +ACTION-OR-NAME can either be the name of action or the symbol +function associated to name." + (let* ((actions (helm-get-attr 'action source 'ignorefn)) + (del-action (if (symbolp action-or-name) + (rassoc action-or-name actions) + (assoc action-or-name actions)))) + (helm-set-attr 'action (delete del-action actions) source))) + +(cl-defun helm-add-action-to-source-if (name fn source predicate + &optional (index 4) test-only) + "Add new action NAME linked to function FN to SOURCE. +Action NAME will be available when the current candidate matches +PREDICATE. +This function adds an entry in the `action-transformer' attribute +of SOURCE (or creates one if not found). +Function PREDICATE must take one candidate as arg. +Function FN should be a valid function that takes one arg i.e. +candidate, argument NAME is a string that will appear in action +menu and SOURCE should be an existing Helm source already loaded. +If INDEX is specified, action is added in action list at INDEX. +Value of INDEX should be always >=1, default to 4. This allows +user to add a specific `action-transformer' to an existing source +without modifying source code. + +E.g. + +Add the action \"Byte compile file async\" linked to function +`async-byte-compile-file' to source `helm-source-find-files' only +when predicate helm-ff-candidates-lisp-p returns non-nil: + +\(helm-add-action-to-source-if \"Byte compile file async\" + \\='async-byte-compile-file + helm-source-find-files + \\='helm-ff-candidates-lisp-p)." + (let* ((actions (helm-get-attr 'action source 'ignorefn)) + (action-transformers (helm-get-attr 'action-transformer source)) + (new-action (list (cons name fn))) + (transformer (lambda (actions _candidate) + (let ((candidate (car (helm-marked-candidates)))) + (cond ((funcall predicate candidate) + (helm-append-at-nth + actions new-action index)) + (t actions)))))) + (when (functionp actions) + (helm-set-attr 'action (list (cons "Default action" actions)) source)) + (when (or (symbolp action-transformers) (functionp action-transformers)) + (setq action-transformers (list action-transformers))) + (if test-only ; debug + (delq nil (append (list transformer) action-transformers)) + (helm-set-attr 'action-transformer + (helm-fast-remove-dups + (delq nil (append (list transformer) action-transformers)) + :test 'equal) + source)))) + + +;;; Source filter +;; +(defun helm-set-source-filter (sources) + "Set the value of `helm-source-filter' to SOURCES and update. + +This function sets a filter for Helm sources and it may be called +while Helm is running. It can be used to toggle displaying of +sources dynamically. For example, additional keys can be bound +into `helm-map' to display only the file-related results if there +are too many matches from other sources and you're after files +only: + +Shift+F shows only file results from some sources: + +\(define-key helm-map \"F\" \\='helm-my-show-files-only) + +\(defun helm-my-show-files-only () + (interactive) + (helm-set-source-filter \\='(\"File Name History\" + \"Files from Current Directory\"))) + +Shift+A shows all results: + +\(define-key helm-map \"A\" \\='helm-my-show-all) + +\(defun helm-my-show-all () + (interactive) + (helm-set-source-filter nil)) + +The -my- part is added to avoid collisions with +existing Helm function names." + (with-helm-buffer + (let ((cur-disp-sel (helm-get-selection nil t))) + (set (make-local-variable 'helm-source-filter) + (helm--normalize-filter-sources sources)) + (helm-log "helm-set-source-filter" "helm-source-filter = %S" helm-source-filter) + ;; Use force-update to run init/update functions. + (helm-update (and (stringp cur-disp-sel) + (regexp-quote cur-disp-sel)))))) + +(defun helm--normalize-filter-sources (sources) + (cl-loop for s in sources collect + (cl-typecase s + (symbol (assoc-default 'name (symbol-value s))) + (list (assoc-default 'name s)) + (string s)))) + +(defun helm-set-sources (sources &optional no-init no-update) + "Set SOURCES during `helm' invocation. +If NO-INIT is non-nil, skip executing init functions of SOURCES. +If NO-UPDATE is non-nil, skip executing `helm-update'." + (with-current-buffer helm-buffer + (setq helm-sources (helm-get-sources sources)) + (helm-log "helm-set-sources" "helm-sources = %S" helm-sources)) + (unless no-init (helm-compute-attr-in-sources 'init)) + (unless no-update (helm-update))) + +(defun helm-show-all-candidates-in-source (arg) + "Toggle all or only candidate-number-limit cands in current source. +With a numeric prefix arg show only the ARG number of candidates. +The prefix arg has no effect when toggling to only +candidate-number-limit." + (interactive "p") + (with-helm-alive-p + (with-helm-buffer + (if helm-source-filter + (progn + (setq-local helm-candidate-number-limit + (default-value 'helm-candidate-number-limit)) + (helm-set-source-filter nil)) + (with-helm-default-directory (helm-default-directory) + (setq-local helm-candidate-number-limit (and (> arg 1) arg)) + (helm-set-source-filter + (list (helm-get-current-source)))))))) +(put 'helm-show-all-candidates-in-source 'helm-only t) + +(defun helm-display-all-sources () + "Display all sources previously hidden by `helm-set-source-filter'." + (interactive) + (with-helm-alive-p + (helm-set-source-filter nil))) +(put 'helm-display-all-sources 'helm-only t) + + +;;; Source infos fns. +;; +(defun helm-get-selection (&optional buffer force-display-part source) + "Return the currently selected candidate from BUFFER. + +If BUFFER is nil or unspecified, use `helm-buffer' as default value. + +If FORCE-DISPLAY-PART is non-nil, return the display part of candidate. + +If FORCE-DISPLAY-PART value is `withprop' the display part of +candidate is returned with its properties. + +When FORCE-DISPLAY-PART is nil the real part of candidate is returned. + +SOURCE default to current-source when unspecified but it is better to +specify SOURCE when it is already available to avoid to call +`helm-get-current-source' uselessly. + +Note that FORCE-DISPLAY-PART when specified takes precedence over +`display-to-real' attribute, that's mean don't use FORCE-DISPLAY-PART +when you want the `display-to-real' function(s) to be applied." + (with-current-buffer (or buffer helm-buffer) + (unless (or (helm-empty-buffer-p (current-buffer)) + (helm-pos-header-line-p)) + (let* ((beg (overlay-start helm-selection-overlay)) + (end (overlay-end helm-selection-overlay)) + (disp-fn (if (eq force-display-part 'withprop) + 'buffer-substring + 'buffer-substring-no-properties)) + ;; If there is no selection at point, the + ;; overlay is at its initial pos, (point-min) + ;; (point-min), that's mean the helm-buffer + ;; is not empty but have no selection yet, + ;; this happen with grep sentinel sending an + ;; error message in helm-buffer when no matches. + (disp (unless (= beg end) (funcall disp-fn beg (1- end)))) + (src (or source (helm-get-current-source))) + (selection (helm-acond (force-display-part disp) + ;; helm-realvalue always takes precedence + ;; over display-to-real. + ((get-text-property beg 'helm-realvalue) it) + ((assoc-default 'display-to-real src) + (helm-apply-functions-from-source source it disp)) + (t disp)))) + (unless (equal selection "") + (helm-log "helm-get-selection" "selection = %S" selection) + selection))))) + +(defun helm-get-actions-from-current-source (&optional source) + "Return the associated action for the selected candidate. +It is a function symbol (sole action) or list +of (action-display . function)." + (unless (helm-empty-buffer-p (helm-buffer-get)) + (let* ((src (or source (helm-get-current-source))) + (marked (helm-marked-candidates)) + (action-transformer (helm-get-attr 'action-transformer src)) + (actions (helm-get-attr 'action src 'ignorefn))) + (if action-transformer + (helm-apply-functions-from-source + src action-transformer actions + ;; When there is marked candidates assume the set of + ;; candidates user selected contains candidates of the same + ;; type so that the actions added by transformer fit with + ;; all marked (previously we were looping on each marked + ;; but it is too costly for the benefit it brings). + (car marked)) + actions)))) + +(defun helm-get-current-source () + "Return the source for the current selection. +Return nil when `helm-buffer' is empty." + (or helm-current-source + (with-helm-buffer + (or (get-text-property (point) 'helm-cur-source) + (progn + ;; This is needed to not loose selection. + (goto-char (overlay-start helm-selection-overlay)) + (let ((header-pos (or (helm-get-previous-header-pos) + (helm-get-next-header-pos)))) + ;; Return nil when no--candidates. + (when header-pos + (cl-loop with source-name = (save-excursion + (goto-char header-pos) + (helm-current-line-contents)) + for source in helm-sources thereis + (and (equal (assoc-default 'name source) source-name) + source))))))))) + +(defun helm-run-after-exit (function &rest args) + "Execute FUNCTION with ARGS after exiting Helm. +The action is to call FUNCTION with arguments ARGS. +Unlike `helm-exit-and-execute-action', this can be used +to call non-actions functions with any ARGS or no ARGS at all. + +Use this on commands invoked from key bindings, but not on action +functions invoked as action from the action menu, i.e. functions +called with RET." + (helm-kill-async-processes) + (helm-log "helm-run-after-exit" "function = %S" function) + (helm-log "helm-run-after-exit" "args = %S" args) + (helm-exit-and-execute-action + (lambda (_candidate) + (apply function args)))) + +(defun helm-exit-and-execute-action (action) + "Exit current Helm session and execute ACTION. +Argument ACTION is a function called with one arg (candidate) and +part of the actions of current source. + +Use this on commands invoked from key bindings, but not +on action functions invoked as action from the action menu, +i.e. functions called with RET." + ;; If ACTION is not an action available in source 'action attribute, + ;; return an error. This allow to remove unneeded actions from + ;; source that inherit actions from type, note that ACTION have to + ;; be bound to a symbol and not to be an anonymous action + ;; i.e. lambda or byte-code. + (helm-log "helm-exit-and-execute-action" "Start executing action") + (let ((actions (helm-get-actions-from-current-source))) + (when actions + (cl-assert (or (eq action actions) + ;; Compiled lambdas + (byte-code-function-p action) + ;; Natively compiled (libgccjit) + (helm-subr-native-elisp-p action) + ;; Lambdas + (and (listp action) (functionp action)) + ;; One of current actions. + (rassq action actions)) + nil "No such action `%s' for this source" action))) + (setq helm-saved-action action) + (setq helm-saved-selection (or (helm-get-selection) "")) + (setq helm--executing-helm-action t) + ;; When toggling minibuffer and header-line, we want next action + ;; inherit this setting. + (helm-set-local-variable 'helm-echo-input-in-header-line + (with-helm-buffer helm-echo-input-in-header-line)) + ;; Ensure next action use same display function as initial helm-buffer when + ;; helm-actions-inherit-frame-settings is non nil. + (when (and helm-actions-inherit-frame-settings + helm--buffer-in-new-frame-p) + (helm-set-local-variable 'helm-display-function + (with-helm-buffer helm-display-function) + 'helm--last-frame-parameters + (with-helm-buffer + (helm--get-frame-parameters))) + ;; The helm-buffer keeps `helm-display-function' and + ;; `helm--get-frame-parameters' values during 0.5 seconds, just + ;; the time to execute the possible helm action with those values. + ;; If no helm based action run within 0.5 seconds, the next helm + ;; session will have to resolve again those variable values. + (run-with-idle-timer 0.5 nil + (lambda () (helm-set-local-variable 'helm-display-function nil + 'helm--last-frame-parameters nil)))) + (helm-exit-minibuffer)) + +(defun helm--get-frame-parameters (&optional frame) + (cl-loop with params = (frame-parameters frame) + for p in helm--frame-default-attributes + when (assq p params) collect it)) + +(defalias 'helm-run-after-quit 'helm-run-after-exit) +(make-obsolete 'helm-run-after-quit 'helm-run-after-exit "1.7.7") +(defalias 'helm-quit-and-execute-action 'helm-exit-and-execute-action) +(make-obsolete 'helm-quit-and-execute-action 'helm-exit-and-execute-action "1.7.7") + +(defun helm-interpret-value (value &optional source compute) + "Interpret VALUE as variable, function or literal and return it. +If VALUE is a function, call it with no arguments and return the value +unless COMPUTE value is \\='ignorefn. +If SOURCE compute VALUE for this source. +If VALUE is a variable, return the value. +If VALUE is a symbol, but it is not a function or a variable, cause an error. +Otherwise, return VALUE itself." + (cond ((and source (functionp value) (not (eq compute 'ignorefn))) + (helm-apply-functions-from-source source value)) + ((and (functionp value) (not (eq compute 'ignorefn))) + (funcall value)) + ((and (symbolp value) (boundp value)) + (symbol-value value)) + ((and (symbolp value) (not (functionp value))) + (error + "helm-interpret-value: Symbol must be a function or a variable")) + (t + value))) + +(defun helm-set-local-variable (&rest args) + "Bind each pair in ARGS locally to `helm-buffer'. + +Use this to set local vars before calling helm. + +When used from an init or update function +\(i.e. when `helm-force-update' is running) the variables are set +using `make-local-variable' within the `helm-buffer'. + +Usage: helm-set-local-variable ([VAR VALUE]...) +Just like `setq' except that the vars are not set sequentially. +IOW Don't use VALUE of previous VAR to set the VALUE of next VAR. + +\(fn VAR VALUE ...)" + (if helm--force-updating-p + (with-helm-buffer + (cl-loop for i on args by #'cddr + do (set (make-local-variable (car i)) (cadr i)))) + (setq helm--local-variables + (append (cl-loop for i on args by #'cddr + collect (cons (car i) (cadr i))) + helm--local-variables)))) + +(defun helm--set-local-variables-internal () + (cl-loop for (var . val) in helm--local-variables + ;; If `helm-set-local-variable' is called twice or more + ;; on same variable use the last value entered which is + ;; the first on stack e.g. + ;; (helm-set-local-variable 'helm-foo 1) + ;; (helm-set-local-variable 'helm-foo 2) + ;; helm--local-variables => + ;; '((helm-foo . 2) (helm-foo. 1)) + ;; (helm-foo . 2) is retained and (helm-foo . 1) + ;; ignored. + unless (memq var computed) + do (set (make-local-variable var) val) + collect var into computed + finally (setq helm--local-variables nil))) + + +;; API helper +(cl-defun helm-empty-buffer-p (&optional (buffer helm-buffer)) + "Check if BUFFER have candidates. +Default value for BUFFER is `helm-buffer'." + (zerop (buffer-size (and buffer (get-buffer buffer))))) + +(defun helm-empty-source-p () + "Check if current source contains candidates. +This could happen when for example the last element of a source +was deleted and the candidates list not updated." + (when (helm-window) + (with-helm-window + (or (helm-empty-buffer-p) + (and (helm-end-of-source-p) + (eq (pos-bol) (pos-eol)) + (or + (save-excursion + (forward-line -1) + (helm-pos-header-line-p)) + (bobp))))))) + + +;; Tools +;; +(defun helm-apply-functions-from-source (source functions &rest args) + "From SOURCE apply FUNCTIONS on ARGS. + +This function is used to process filter functions. When filter is +a `filtered-candidate-transformer', we pass to ARGS +candidates+source whereas when the filter is +`candidate-transformer' we pass to ARGS candidates only. +This function is also used to process functions called with no +args, e.g. init functions. In this case it is called without +ARGS. +See `helm-process-filtered-candidate-transformer' + `helm-compute-attr-in-sources' + `helm-process-candidate-transformer'. + +Arg FUNCTIONS is either a symbol or a list of functions, each +function being applied on ARGS and called on the result of the +precedent function. Return the result of last function call." + (let ((helm--source-name (assoc-default 'name source)) + (helm-current-source source) + (funs (if (functionp functions) (list functions) functions))) + (cl-loop with result + for fn in funs + ;; In filter functions, ARGS is a list of one or two elements where + ;; the first element is the list of candidates and the second + ;; a list containing the source. + do (setq result (apply fn args)) + when (and args (cdr funs)) + ;; When more than one fn, set the candidates list to what returns + ;; this fn to compute the modified candidates with the next fn + ;; and so on. + do (setcar args result) + finally return result))) + +(defalias 'helm-funcall-with-source 'helm-apply-functions-from-source) +(make-obsolete 'helm-funcall-with-source 'helm-apply-functions-from-source "2.9.7") + +(defun helm-compute-attr-in-sources (attr &optional sources) + "Call the associated function(s) to ATTR for each source if any." + (let ((sources (or (helm-get-sources sources) + ;; Fix error no buffer named *helm... by checking + ;; if helm-buffer exists. + (and (buffer-live-p (get-buffer (helm-buffer-get))) + ;; `helm-sources' are local to helm-buffer. + (with-helm-buffer helm-sources))))) + (when sources + (dolist (source sources) + (helm-aif (assoc-default attr source) + (helm-apply-functions-from-source source it)))))) + +(defalias 'helm-funcall-foreach 'helm-compute-attr-in-sources) +(make-obsolete 'helm-funcall-foreach 'helm-compute-attr-in-sources "2.9.7") + +(defun helm-normalize-sources (sources) + "If SOURCES is only one source, make a list of one element." + (if (or (and sources (symbolp sources)) + (and (listp sources) (assq 'name sources))) + (list sources) + sources)) + +(defun helm-get-candidate-number (&optional in-current-source) + "Return candidates number in `helm-buffer'. +If IN-CURRENT-SOURCE is provided return the number of candidates +of current source only." + (with-helm-buffer + (if (or (helm-empty-buffer-p) + (helm-empty-source-p)) + 0 + (save-excursion + (helm-aif (and in-current-source (helm-get-previous-header-pos)) + (goto-char it) + (goto-char (point-min))) + (forward-line 1) + (if (helm-pos-multiline-p) + (cl-loop with count-multi = 1 + while (and (not (if in-current-source + (save-excursion + (forward-line 2) + (or (helm-pos-header-line-p) (eobp))) + (eobp))) + (search-forward helm-candidate-separator nil t)) + do (cl-incf count-multi) + finally return count-multi) + (cl-loop with ln = 0 + while (not (if in-current-source + (or (helm-pos-header-line-p) (eobp)) + (eobp))) + ;; Don't count empty lines maybe added by popup (bug#1370). + unless (or (eq (pos-bol) (pos-eol)) + (helm-pos-header-line-p)) + do (cl-incf ln) + do (forward-line 1) finally return ln)))))) + +;; Entry point +;; `:allow-nest' is not in this list because it is treated before. +(defconst helm-argument-keys + '(:sources :input :prompt :resume + :preselect :buffer :keymap :default :history)) + +;;;###autoload +(defun helm (&rest plist) + "Main function to execute helm sources. + +PLIST is a list like + +\(:key1 val1 :key2 val2 ...) + + or + +\(&optional sources input prompt resume preselect + buffer keymap default history allow-nest). + +** Keywords + +Keywords supported: + +- :sources +- :input +- :prompt +- :resume +- :preselect +- :buffer +- :keymap +- :default +- :history +- :allow-nest + +Extra LOCAL-VARS keywords are supported, see the \"** Other +keywords\" section below. + +Basic keywords are the following: + +*** :sources + +One of the following: + +- List of sources +- Symbol whose value is a list of sources +- Alist representing a Helm source. + - In this case the source has no name and is referenced in + `helm-sources' as a whole alist. + +*** :input + +Initial input of minibuffer (temporary value of `helm-pattern') + +*** :prompt + +Minibuffer prompt. Default value is `helm--prompt'. + +*** :resume + +If t, allow resumption of the previous session of this Helm +command, skipping initialization. + +If \\='noresume, this instance of `helm' cannot be resumed. + +*** :preselect + +Initially selected candidate (string or regexp). + +*** :buffer + +Buffer name for this Helm session. `helm-buffer' will take this value. + +*** :keymap + +\[Obsolete] + +Keymap used at the start of this Helm session. + +It is overridden by keymaps specified in sources, and is kept +only for backward compatibility. + +Keymaps should be specified in sources using the :keymap slot +instead. See `helm-source'. + +This keymap is not restored by `helm-resume'. + +*** :default + +Default value inserted into the minibuffer \ with +\\\\[next-history-element]. + +It can be a string or a list of strings, in this case +\\\\[next-history-element] cycles through +the list items, starting with the first. + +If nil, `thing-at-point' is used. + +If `helm-maybe-use-default-as-input' is non-nil, display is +updated using this value if this value matches, otherwise it is +ignored. If :input is specified, it takes precedence on :default. + +*** :history + +Minibuffer input, by default, is pushed to `minibuffer-history'. + +When an argument HISTORY is provided, input is pushed to +HISTORY. HISTORY should be a valid symbol. + +*** :allow-nest + +Allow running this Helm command in a running Helm session. + +** Other keywords + +Other keywords are interpreted as local variables of this Helm +session. The `helm-' prefix can be omitted. For example, + +\(helm :sources \\='helm-source-buffers-list + :buffer \"*helm buffers*\" + :candidate-number-limit 10) + +Starts a Helm session with the variable +`helm-candidate-number-limit' set to 10. + +** Backward compatibility + +For backward compatibility, positional parameters are +supported: + +\(helm sources input prompt resume preselect + buffer keymap default history allow-nest) + +However, the use of non-keyword args is deprecated. + +\(fn &key SOURCES INPUT PROMPT RESUME PRESELECT BUFFER KEYMAP DEFAULT HISTORY ALLOW-NEST OTHER-LOCAL-VARS)" + (let ((fn (cond ((or (and helm-alive-p (plist-get plist :allow-nest)) + (and helm-alive-p (memq 'allow-nest plist))) + #'helm--nest) + ((keywordp (car plist)) + #'helm) + (t #'helm-internal)))) + (if (and helm-alive-p (eq fn #'helm)) + (if (helm--alive-p) + ;; A helm session is normally running. + (error "Error: Trying to run helm within a running helm session") + ;; A helm session is already running and user jump somewhere else + ;; without deactivating it. + (with-helm-buffer + (prog1 + (message "Aborting an helm session running in background") + ;; `helm-alive-p' will be reset in unwind-protect forms. + (helm-keyboard-quit)))) + (if (keywordp (car plist)) + ;; Parse `plist' and move not regular `helm-argument-keys' + ;; to `helm--local-variables', then calling helm on itself + ;; with normal arguments (the non--arguments-keys removed) + ;; will end up in [1]. + (progn + (setq helm--local-variables + (append helm--local-variables + ;; Vars passed by keyword on helm call + ;; take precedence on same vars + ;; that may have been passed before helm call. + (helm-parse-keys plist))) + (apply fn (mapcar (lambda (key) (plist-get plist key)) + helm-argument-keys))) + (apply fn plist))))) ; [1] fn == helm-internal. + +(defun helm--alive-p () + "[INTERNAL] Check if `helm' is alive. +An Helm session is considered alive if `helm-alive-p' value is +non-nil, the `helm-buffer' is visible, and cursor is in the +minibuffer." + (and helm-alive-p + (get-buffer-window (helm-buffer-get) 'visible) + (minibuffer-window-active-p (minibuffer-window)) + (minibufferp (current-buffer)))) + +(defun helm-parse-keys (keys) + "Parse the KEYS arguments of `helm'. +Return only those keys not in `helm-argument-keys', prefix them +with \"helm\", and then convert them to an alist. This allows +adding arguments that are not part of `helm-argument-keys', but +are valid helm variables nevertheless. For example, +:candidate-number-limit is bound to `helm-candidate-number-limit' +in the source. + + (helm-parse-keys \\='(:sources ((name . \"test\") + (candidates . (a b c))) + :buffer \"toto\" + :candidate-number-limit 4)) + ==> ((helm-candidate-number-limit . 4))." + + (cl-loop for (key value) on keys by #'cddr + for symname = (substring (symbol-name key) 1) + for sym = (intern (if (string-match "^helm-" symname) + symname + (concat "helm-" symname))) + unless (memq key helm-argument-keys) + collect (cons sym value))) + +(defun helm--maybe-load-tramp-archive () + ;; Should fix bug#2393 and bug#2394. `while-no-input-ignore-events' + ;; is also let-bounded in `helm--maybe-use-while-no-input'. + (let ((while-no-input-ignore-events + (and (boundp 'while-no-input-ignore-events) + (cons 'dbus-event while-no-input-ignore-events)))) + (unless helm--tramp-archive-maybe-loaded + ;; This for Emacs-27 not requiring tramp-archive. + (and (boundp 'tramp-archive-enabled) + (require 'tramp-archive nil t)) + (setq helm--tramp-archive-maybe-loaded t)))) + +;;; Entry point helper +(defun helm-internal (&optional + sources input + prompt resume + preselect buffer + keymap default history) + "The internal Helm function called by `helm'. +For SOURCES INPUT PROMPT RESUME PRESELECT BUFFER KEYMAP DEFAULT and +HISTORY args see `helm'." + (cl-assert (or (stringp input) + (null input)) + nil "Error in %S buffer: Initial input should be a string or nil" + buffer) + ;; Set all windows NON dedicated to avoid headaches with PA and + ;; helm-window (bug#2443) + (cl-loop for win in (window-list nil 1) + for state = (window-dedicated-p win) + when state + do (progn (set-window-dedicated-p win nil) + (push `(,win . ,state) helm--original-dedicated-windows-alist))) + (unless helm--nested (setq helm-initial-frame (selected-frame))) + ;; Launch tramp-archive with dbus-event in `while-no-input-ignore-events'. + (helm--maybe-load-tramp-archive) + ;; Activate the advices. + ;; Advices will be available only in >=emacs-24.4, but + ;; allow compiling without errors on lower emacs. + (when (fboundp 'advice-add) + (advice-add 'tramp-read-passwd :around #'helm--suspend-read-passwd) + (advice-add 'ange-ftp-get-passwd :around #'helm--suspend-read-passwd) + (advice-add 'epa-passphrase-callback-function + :around #'helm--suspend-read-passwd) + ;; Ensure linum-mode is disabled in Helm buffers to preserve + ;; performances (Bug#1894). + (advice-add 'linum-on :override #'helm--advice-linum-on '((depth . 100)))) + (helm-log "helm-internal" (concat "[Start session] " (make-string 41 ?+))) + (helm-log "helm-internal" "prompt = %S" prompt) + (helm-log "helm-internal" "preselect = %S" preselect) + (helm-log "helm-internal" "buffer = %S" buffer) + (helm-log "helm-internal" "keymap = %S" keymap) + (helm-log "helm-internal" "default = %S" default) + (helm-log "helm-internal" "history = %S" history) + (setq helm--prompt (or prompt "pattern: ")) + (let ((non-essential t) + ;; Prevent mouse jumping to the upper-right + ;; hand corner of the frame (bug#1538). + mouse-autoselect-window + focus-follows-mouse + mode-line-in-non-selected-windows + minibuffer-completion-confirm + (ori--minibuffer-follows-selected-frame + (and (boundp 'minibuffer-follows-selected-frame) + (default-toplevel-value 'minibuffer-follows-selected-frame))) + (input-method-verbose-flag helm-input-method-verbose-flag) + (helm-maybe-use-default-as-input + (and (null input) + (or helm-maybe-use-default-as-input ; it is let-bounded so use it. + (cl-loop for s in (helm-normalize-sources sources) + thereis (memq s helm-sources-using-default-as-input)))))) + (unwind-protect + (condition-case-unless-debug _v + (let ( ;; `helm--source-name' is non-`nil' + ;; when `helm' is invoked by action, reset it. + helm--source-name + helm-current-source + helm-in-persistent-action + helm--quit + (helm-buffer (or buffer helm-buffer))) + (helm-initialize + resume input default sources) + ;; This allows giving the focus to a nested helm session which use + ;; a frame, like completion in + ;; `helm-eval-expression'. Unfortunately + ;; `minibuffer-follows-selected-frame' is available only in + ;; emacs-28+ (bug#2536). + ;; When non-nil (the default) the current active + ;; minibuffer is used in new frame, which is not what we + ;; want in helm when starting from an active minibuffer, + ;; either a helm minibuffer or something line M-:. + (and ori--minibuffer-follows-selected-frame + (setq minibuffer-follows-selected-frame + (unless (or helm--nested + ;; Allow keeping initial minibuffer visible + ;; e.g. completion-at-point from M-:. + (minibufferp helm-current-buffer)) + t))) + ;; We don't display helm-buffer here to avoid popping + ;; up a window or a frame when exiting immediately when + ;; only one candidate (this avoid having the helm frame + ;; flashing), lets first compute candidates and if more + ;; than one display helm-buffer (this is done later in + ;; helm-read-from-minibuffer). + (unless helm-execute-action-at-once-if-one + (helm-display-buffer helm-buffer resume) + (select-window (helm-window)) + (when (and resume helm-visible-mark-overlays) + (set-window-margins (selected-window) + (+ (string-width helm-visible-mark-prefix) + helm-left-margin-width)))) + ;; We are now in helm-buffer. + (unless helm-allow-mouse + (helm--remap-mouse-mode 1)) ; Disable mouse bindings. + (add-hook 'post-command-hook 'helm--maybe-update-keymap) + ;; Add also to update hook otherwise keymap is not updated + ;; until a key is hitted (Bug#1670). + (add-hook 'helm-after-update-hook 'helm--maybe-update-keymap) + (add-hook 'post-command-hook 'helm--update-header-line) + (helm-log "helm-internal" "show prompt") + (unwind-protect + (helm-read-from-minibuffer + prompt input preselect + resume keymap default history) + (helm-cleanup)) + (prog1 + (unless helm--quit (helm-execute-selection-action)) + (helm-log "helm-internal" (concat "[End session] " (make-string 41 ?-))))) + (quit + (helm-restore-position-on-quit) + (helm-log-run-hook "helm-internal" 'helm-quit-hook) + (helm-log "helm-internal" (concat "[End session (quit)] " (make-string 34 ?-))) + nil)) + (when (fboundp 'advice-remove) + (advice-remove 'tramp-read-passwd #'helm--suspend-read-passwd) + (advice-remove 'ange-ftp-get-passwd #'helm--suspend-read-passwd) + (advice-remove 'epa-passphrase-callback-function #'helm--suspend-read-passwd) + (advice-remove 'linum-on #'helm--advice-linum-on)) + (helm-log "helm-internal" "helm-alive-p = %S" (setq helm-alive-p nil)) + (helm--remap-mouse-mode -1) ; Reenable mouse bindings. + (setq helm-alive-p nil) + (and ori--minibuffer-follows-selected-frame + (set-default-toplevel-value 'minibuffer-follows-selected-frame + ori--minibuffer-follows-selected-frame)) + ;; Prevent error "No buffer named *helm*" triggered by + ;; `helm-set-local-variable'. + (setq helm--force-updating-p nil) + (setq helm--buffer-in-new-frame-p nil) + ;; Reset helm-pattern so that lambda's using it + ;; before running helm will not start with its old value. + (setq helm-pattern "") + (setq helm--ignore-errors nil + helm-debug nil)))) + +(defun helm--advice-linum-on () + (unless (or (minibufferp) + (string-match "\\`\\*helm" (buffer-name)) + (and (daemonp) (null (frame-parameter nil 'client)))) + (linum-mode 1))) + +;;; Helm resume +;; +;; +(defun helm-resume (arg) + "Resume a previous Helm session. +Call with a prefix arg to choose among existing Helm +buffers (sessions). When calling from Lisp, specify a +`buffer-name' as a string with ARG." + (interactive "P") + (let (buffer + cur-dir + narrow-pos + (helm-full-frame (default-value 'helm-full-frame)) + sources) + (if arg + (if (and (stringp arg) (bufferp (get-buffer arg))) + (setq buffer arg) + (setq buffer (helm-resume-select-buffer))) + (setq buffer helm-last-buffer)) + (cl-assert buffer nil + "helm-resume: No helm buffers found to resume") + (setq sources (buffer-local-value + 'helm-sources (get-buffer buffer))) + ;; Reset `cursor-type' to nil as it have been set to t + ;; when quitting previous session. + (with-current-buffer buffer (setq cursor-type nil)) + (setq helm-full-frame (buffer-local-value + 'helm-full-frame (get-buffer buffer))) + (setq cur-dir (buffer-local-value + 'default-directory (get-buffer buffer))) + (setq helm-saved-selection nil + helm-saved-action nil) + (unless (buffer-live-p helm-current-buffer) + ;; `helm-current-buffer' may have been killed. + (setq helm-current-buffer (current-buffer))) + (helm-aif (with-current-buffer buffer + helm--current-buffer-narrowed) + (progn + (set-buffer (car it)) + (setq narrow-pos (cdr it)))) + ;; This happen when calling C-x b within helm. + (helm-aif (get-buffer-window helm-marked-buffer-name 'visible) + (progn (delete-window it) (kill-buffer helm-marked-buffer-name))) + (save-restriction + (when narrow-pos (apply #'narrow-to-region narrow-pos)) + ;; Restart with same `default-directory' value this session + ;; was initially started with. + (with-helm-default-directory cur-dir + (unwind-protect + (helm + :sources sources + :input (buffer-local-value 'helm-input-local (get-buffer buffer)) + :prompt (buffer-local-value 'helm--prompt (get-buffer buffer)) + :resume t + :buffer buffer) + (run-hook-with-args 'helm-resume-after-hook sources)))))) + +(defun helm-resume-previous-session-after-quit () + "Resume previous Helm session within a running Helm." + (interactive) + (with-helm-alive-p + (let ((arg (if (null (member helm-buffer helm-buffers)) 0 1))) + (if (> (length helm-buffers) arg) + (helm-run-after-exit (lambda () (helm-resume (nth arg helm-buffers)))) + (message "No previous helm sessions available for resuming!"))))) +(put 'helm-resume-previous-session-after-quit 'helm-only t) + +(defun helm-resume-list-buffers-after-quit () + "List Helm buffers that can be resumed within a running Helm." + (interactive) + (with-helm-alive-p + (if (> (length helm-buffers) 0) + (helm-run-after-exit (lambda () (helm-resume t))) + (message "No previous helm sessions available for resuming!")))) +(put 'helm-resume-list-buffers-after-quit 'helm-only t) + +(defun helm-resume-p (resume) + "Whether current Helm session is resumed or not." + (eq resume t)) + +(defun helm-resume-select-buffer () + "Select an `helm-buffer' in `helm-buffers' list to resume a helm session. +Return nil if no `helm-buffer' found." + (when helm-buffers + (or (helm :sources (helm-build-sync-source "Resume helm buffer" + :candidates helm-buffers) + :resume 'noresume + :buffer "*helm resume*") + (keyboard-quit)))) + +;;;###autoload +(defun helm-cycle-resume () + "Cycle in `helm-buffers' list and resume when waiting more than 1.2s." + (interactive) + (cl-assert (and helm-buffers helm-last-buffer) + nil "No helm buffers to resume") + ;; Setup a new iterator only on first hit on + ;; `helm-run-cycle-resume', subsequents hits should reuse same + ;; iterator. + (unless (and (eq last-command 'helm-cycle-resume) + helm--cycle-resume-iterator) + (setq helm--cycle-resume-iterator + (helm-iter-sub-next-circular + helm-buffers helm-last-buffer :test 'equal))) + (helm--resume-or-iter)) + +(defun helm--resume-or-iter (&optional from-helm) + (message "Resuming helm buffer `%s'" helm-last-buffer) + (if (sit-for helm-cycle-resume-delay) + ;; Delay expire, run helm-resume. + (if from-helm + (helm-run-after-exit (lambda () (helm-resume helm-last-buffer))) + (helm-resume helm-last-buffer)) + ;; key pressed before delay, cycle. + (unless from-helm ; cycling to next item already done. + (message "Resuming helm buffer `%s'" + (setq helm-last-buffer + (helm-iter-next helm--cycle-resume-iterator)))))) + +(defun helm-run-cycle-resume () + "Same as `helm-cycle-resume' but intended to be called only from Helm." + (interactive) + (when (cdr helm-buffers) ; only one session registered. + ;; Setup a new iterator only on first hit on + ;; `helm-run-cycle-resume', subsequents hits should reuse same + ;; iterator. + (unless (and (eq last-command 'helm-run-cycle-resume) + helm--cycle-resume-iterator) + (setq helm--cycle-resume-iterator + (helm-iter-sub-next-circular + helm-buffers helm-last-buffer :test 'equal))) + ;; start at next buffer as we already are at `helm-last-buffer'. + (setq helm-last-buffer + (helm-iter-next helm--cycle-resume-iterator)) + (helm--resume-or-iter 'from-helm))) +(put 'helm-run-cycle-resume 'helm-only t) + + +;;; Nested sessions +;; +;; +(defun helm--nest (&rest same-as-helm) + "[INTERNAL] Allow calling `helm' within a running Helm session. + +Arguments SAME-AS-HELM are the same as `helm'. + +Don't use this directly, use instead `helm' with the keyword +:allow-nest. + +\(fn &key SOURCES INPUT PROMPT RESUME PRESELECT BUFFER KEYMAP DEFAULT HISTORY OTHER-LOCAL-VARS)" + (with-helm-window + (let ((orig-helm-current-buffer helm-current-buffer) + (orig-helm-buffer helm-buffer) + (orig-helm--prompt helm--prompt) + (orig-helm-sources helm-sources) + (orig-helm--in-fuzzy helm--in-fuzzy) + (orig-helm--display-frame helm--buffer-in-new-frame-p) + (orig-helm-last-frame-or-window-configuration + helm-last-frame-or-window-configuration) + (orig-one-window-p helm-onewindow-p) + (helm--nested (if helm--buffer-in-new-frame-p 'share t))) + ;; FIXME Using helm-full-frame here allow showing the new + ;; helm-buffer in the same window as old helm-buffer, why? + (helm-set-local-variable 'helm-full-frame t) + (unwind-protect + (let (helm-current-position + helm-current-buffer + helm-pattern + (helm-buffer (or (cl-getf same-as-helm :buffer) + (nth 5 same-as-helm) + "*Helm*")) + (enable-recursive-minibuffers t)) + (setq helm-sources nil) + (apply #'helm same-as-helm)) + (with-current-buffer orig-helm-buffer + (setq helm-sources orig-helm-sources) + (setq helm--nested nil) + (setq helm--buffer-in-new-frame-p orig-helm--display-frame) + (setq helm-alive-p t) ; Nested session set this to nil on exit. + (setq helm-buffer orig-helm-buffer) + (setq helm-full-frame nil) + (setq helm--prompt orig-helm--prompt) + (setq helm--in-fuzzy orig-helm--in-fuzzy) + (helm-initialize-overlays helm-buffer) + (unless (helm-empty-buffer-p) (helm-mark-current-line t)) + (setq helm-last-frame-or-window-configuration + orig-helm-last-frame-or-window-configuration) + (setq cursor-type nil) + (setq helm-current-buffer orig-helm-current-buffer) + (setq helm-onewindow-p orig-one-window-p) + ;; Be sure advices, hooks, and local modes keep running. + (advice-add 'tramp-read-passwd + :around #'helm--suspend-read-passwd) + (advice-add 'ange-ftp-get-passwd + :around #'helm--suspend-read-passwd) + (advice-add 'epa-passphrase-callback-function + :around #'helm--suspend-read-passwd) + (unless helm-allow-mouse + (helm--remap-mouse-mode 1)) + (unless (cl-loop for h in post-command-hook + thereis (memq h '(helm--maybe-update-keymap + helm--update-header-line))) + (add-hook 'post-command-hook 'helm--maybe-update-keymap) + (add-hook 'post-command-hook 'helm--update-header-line)) + (helm-display-mode-line (helm-get-current-source))))))) + + +;;; Windows and frames +;; +;; + +(defun helm-frame-or-window-configuration (save-or-restore) + "Save or restore last frame or window configuration. +Argument SAVE-OR-RESTORE is either save or restore of window or +frame configuration as per `helm-save-configuration-functions'." + (helm-log "helm-frame-or-window-configuration" "helm-save-configuration-functions = %S" + helm-save-configuration-functions) + (let ((window-persistent-parameters (append '((no-other-window . t)) + window-persistent-parameters))) + (cl-case save-or-restore + (save (setq helm-last-frame-or-window-configuration + (funcall (cdr helm-save-configuration-functions)))) + (restore (funcall (car helm-save-configuration-functions) + helm-last-frame-or-window-configuration) + ;; Restore dedicated windows (bug#2443). + (when helm--original-dedicated-windows-alist + (cl-loop for (win . state) in helm--original-dedicated-windows-alist + when (window-live-p win) + do (set-window-dedicated-p win state)) + (setq helm--original-dedicated-windows-alist nil)) + ;; Restore frame focus. + ;; This is needed for minibuffer own-frame config + ;; when recursive minibuffers are in use. + ;; e.g M-: + helm-minibuffer-history. + (cl-letf ((frame (if (minibufferp helm-current-buffer) + (selected-frame) + (last-nonminibuffer-frame))) + ;; This is a workaround, because the i3 window + ;; manager developers are refusing to fix their + ;; broken timestamp and event handling. + ;; + ;; We basically just disable the part of + ;; select-frame-set-input-focus that would call + ;; XSetInputFocus in Xlib (x-focus-frame), that + ;; resets a timestamp in the xserver which the i3 + ;; developers fail to notice. + ;; + ;; Since they don't know about the new timestamp, + ;; their keyboard handling can break after a helm + ;; user quits emacs, as reported in bug#1641. + ;; + ;; Fortunately for us, we really don't need this + ;; XSetInputFocus call, since we already have focus + ;; for Emacs, the user is just using helm! We call + ;; select-frame-set-input-focus for the other + ;; side-effects, not for x-focus-frame. + ((symbol-function 'x-focus-frame) #'ignore)) + (select-frame-set-input-focus frame)))))) + +(defun helm-split-window-default-fn (window) + "Default function to split windows before displaying `helm-buffer'. + +It is used as default value for +`helm-split-window-preferred-function' which is then the +let-bounded value of `split-window-preferred-function' in +`helm-display-buffer'. When `helm-display-function' which default +to `helm-default-display-buffer' is called from +`helm-display-buffer' the value of +`split-window-preferred-function' will be used by +`display-buffer'." + (let* ((split-width-threshold (and (integerp helm-split-width-threshold) + helm-split-width-threshold)) + (win (if (and (fboundp 'window-in-direction) + ;; Don't try to split when starting in a minibuffer + ;; e.g M-: and try to use helm-show-kill-ring. + (not (minibufferp helm-current-buffer)) + (null helm-split-width-threshold)) + (if (or (one-window-p t) + helm-split-window-inside-p) + (split-window + (selected-window) nil + (if (eq helm-split-window-default-side 'other) + helm-split-window-other-side-when-one-window + helm-split-window-default-side)) + ;; If more than one window reuse one of them. + (cl-case helm-split-window-default-side + (left (or (helm-window-in-direction 'left) + (helm-window-in-direction 'above) + (selected-window))) + (above (or (helm-window-in-direction 'above) + (helm-window-in-direction 'left) + (selected-window))) + (right (or (helm-window-in-direction 'right) + (helm-window-in-direction 'below) + (selected-window))) + (below (or (helm-window-in-direction 'below) + (helm-window-in-direction 'right) + (selected-window))) + (same (selected-window)) + (other (or (helm-other-window-for-scrolling) + (selected-window))) + (t (or (window-next-sibling) (selected-window))))) + (split-window-sensibly window)))) + (setq helm-persistent-action-window-buffer (window-buffer win)) + win)) + +(defun helm-window-in-direction (direction) + "Same as `window-in-direction' but check if window is dedicated. +Return nil when window is dedicated." + (helm-aif (window-in-direction direction) + (and (not (window-dedicated-p it)) it))) + +(defun helm-other-window-for-scrolling () + "Same as `other-window-for-scrolling' but check if window is dedicated. +Returns nil when window is dedicated." + (helm-aif (other-window-for-scrolling) + (and (not (window-dedicated-p it)) it))) + +(defun helm-resolve-display-function (com) + "Decide which display function to use according to `helm-commands-using-frame'. + +The `helm-display-function' buffer local value takes precedence +on `helm-commands-using-frame'. +If `helm-initial-frame' has no minibuffer, use +`helm-display-buffer-in-own-frame' function. +Fallback to global value of `helm-display-function' when no local +value found and current command is not in +`helm-commands-using-frame'." + (let ((win (get-buffer-window helm-current-buffer))) + (or (with-helm-buffer helm-display-function) + (and (or (memq com helm-commands-using-frame) + (and helm-use-frame-when-no-suitable-window + (or (window-dedicated-p win) + (window-parameter win 'window-side))) + (and helm-use-frame-when-more-than-two-windows + (null helm--nested) + (> (length (window-list)) 2)) + ;; Frame parameter is unreliable for minibuffer on emacs-26. + (null (member helm-initial-frame (minibuffer-frame-list)))) + #'helm-display-buffer-in-own-frame) + (default-value 'helm-display-function)))) + +(defun helm-display-buffer (buffer &optional resume) + "Display BUFFER. + +The function used to display `helm-buffer' by calling +`helm-display-function' which splits window with +`helm-split-window-preferred-function'." + (let ((split-window-preferred-function + helm-split-window-preferred-function) + (helm-split-window-default-side + (if (and (not helm-full-frame) + helm-reuse-last-window-split-state) + (cond ((eq helm-split-window-default-side 'same) 'same) + ((eq helm-split-window-default-side 'other) 'other) + (helm--window-side-state) + (t helm-split-window-default-side)) + helm-split-window-default-side)) + (disp-fn (with-current-buffer buffer + (helm-resolve-display-function + (if helm-actions-inherit-frame-settings + (helm-this-command) this-command))))) + (prog1 + (funcall disp-fn buffer (or (helm-resume-p resume) + (and helm-actions-inherit-frame-settings + helm--executing-helm-action))) + (with-helm-buffer (setq-local helm-display-function disp-fn)) + (setq helm-onewindow-p (one-window-p t)) + ;; Don't allow other-window and friends switching out of minibuffer. + (when helm-prevent-escaping-from-minibuffer + (helm-prevent-switching-other-window))))) + +(cl-defun helm-prevent-switching-other-window (&key (enabled t)) + "Allow setting `no-other-window' parameter for all windows. +Arg ENABLE is the value of `no-other-window' window property." + (walk-windows + (lambda (w) + (unless (window-dedicated-p w) + (set-window-parameter w 'no-other-window enabled))) + 0)) + +(defun helm-default-display-buffer (buffer &optional _resume) + "Default function to display `helm-buffer' BUFFER. + +It is the default value of `helm-display-function'. +It uses `switch-to-buffer' or `display-buffer' depending on the +value of `helm-full-frame' or `helm-split-window-default-side'." + (let (pop-up-frames + (curwin (get-buffer-window helm-current-buffer))) + (if (or (buffer-local-value 'helm-full-frame (get-buffer buffer)) + (and (eq helm-split-window-default-side 'same) + (one-window-p t))) + (progn (and (not (minibufferp helm-current-buffer)) + ;; side-windows can't be the only window in frame, + ;; emacs refuse to delete other windows when + ;; current is a side-window [1]. + (not (window-parameter curwin 'window-side)) + (delete-other-windows)) + (switch-to-buffer buffer)) + (when (and (or helm-always-two-windows helm-autoresize-mode) + (not (eq helm-split-window-default-side 'same)) + (not (minibufferp helm-current-buffer)) + (not helm-split-window-inside-p) + ;; Same comment as in [1]. + (not (window-parameter curwin 'window-side))) + (delete-other-windows)) + (display-buffer + buffer `(,helm-default-display-buffer-functions + . ,(append helm-default-display-buffer-alist + `((window-height . ,helm-display-buffer-default-height) + (window-width . ,helm-display-buffer-default-width))))) + (helm-log-run-hook "helm-default-display-buffer" 'helm-window-configuration-hook)))) + +;; Shut up byte-compiler in emacs-26 +(defvar tab-bar-mode) +;; No warnings in Emacs built --without-x +(defvar x-display-name) + +(defun helm-display-buffer-in-own-frame (buffer &optional resume) + "Display Helm buffer BUFFER in a separate frame. + +Function suitable for `helm-display-function', +`helm-completion-in-region-display-function' and/or +`helm-show-completion-default-display-function'. + +See `helm-display-buffer-height' and `helm-display-buffer-width' +to configure frame size. + +Note that this feature is available only with emacs-25+. +Note also it is not working properly in helm nested session with emacs +version < emacs-28." + (cl-assert (and (fboundp 'window-absolute-pixel-edges) + (fboundp 'frame-geometry)) + nil "Helm buffer in own frame is only available starting at emacs-25+") + (if (not (display-graphic-p)) + ;; Fallback to default when frames are not usable. + (helm-default-display-buffer buffer) + (setq helm--buffer-in-new-frame-p t) + (let* ((pos (window-absolute-pixel-position)) + (half-screen-size (/ (display-pixel-height x-display-name) 2)) + (frame-info (frame-geometry)) + (prmt-size (length helm--prompt)) + (line-height (frame-char-height)) + tab-bar-mode + (new-frame-alist + (if resume + (buffer-local-value 'helm--last-frame-parameters + (get-buffer buffer)) + `((width . ,helm-display-buffer-width) + (height . ,helm-display-buffer-height) + (tool-bar-lines . 0) + (left . ,(- (car pos) + (* (frame-char-width) + (if (< (- (point) (pos-bol)) prmt-size) + (- (point) (pos-bol)) + prmt-size)))) + ;; Try to put frame at the best possible place. + ;; Frame should be below point if enough + ;; place, otherwise above point and + ;; current line should not be hidden + ;; by helm frame. + (top . ,(if (> (cdr pos) half-screen-size) + ;; Above point + (- (cdr pos) + ;; add 2 lines to make sure there is always a gap + (* (+ helm-display-buffer-height 2) line-height) + ;; account for title bar height too + (cddr (assq 'title-bar-size frame-info))) + ;; Below point + (+ (cdr pos) line-height))) + (title . "Helm") + (undecorated . ,helm-use-undecorated-frame-option) + (background-color . ,(or helm-frame-background-color + (face-attribute 'default :background))) + (foreground-color . ,(or helm-frame-foreground-color + (face-attribute 'default :foreground))) + (alpha . ,(or helm-frame-alpha 100)) + (font . ,(assoc-default 'font (frame-parameters))) + (vertical-scroll-bars . nil) + (menu-bar-lines . 0) + (fullscreen . nil) + (visibility . ,(null helm-display-buffer-reuse-frame)) + (minibuffer . t)))) + display-buffer-alist) + ;; Display minibuffer above or below only in initial session, + ;; not on a session triggered by action, this way if user have + ;; toggled minibuffer and header-line manually she keeps this + ;; setting in next action. + (unless (or helm--executing-helm-action resume) + ;; Add the hook inconditionally, if + ;; helm-echo-input-in-header-line is nil helm-hide-minibuffer-maybe + ;; will have anyway no effect so no need to remove the hook. + (add-hook 'helm-minibuffer-set-up-hook 'helm-hide-minibuffer-maybe) + (with-helm-buffer + (setq-local helm-echo-input-in-header-line + (not (> (cdr pos) half-screen-size))))) + (helm-display-buffer-popup-frame buffer new-frame-alist) + ;; When frame size have been modified manually by user restore + ;; it to default value unless resuming or not using + ;; `helm-display-buffer-reuse-frame'. + ;; This have to be done AFTER raising the frame otherwise + ;; minibuffer visibility is lost until next session. + (unless (or resume (not helm-display-buffer-reuse-frame)) + (set-frame-size helm-popup-frame + helm-display-buffer-width + helm-display-buffer-height))) + (helm-log-run-hook "helm-display-buffer-in-own-frame" 'helm-window-configuration-hook))) + +(defun helm-display-buffer-popup-frame (buffer frame-alist) + (if helm-display-buffer-reuse-frame + (let* ((x (cdr (assoc 'left frame-alist))) + (y (cdr (assoc 'top frame-alist))) + (width (cdr (assoc 'width frame-alist))) + (height (cdr (assoc 'height frame-alist)))) + (unless (and helm-popup-frame + (frame-live-p helm-popup-frame)) + (setq helm-popup-frame (make-frame frame-alist))) + (select-frame helm-popup-frame) + (set-frame-position helm-popup-frame x y) + (set-frame-width helm-popup-frame width) + (set-frame-height helm-popup-frame height) + (switch-to-buffer buffer) + (select-frame-set-input-focus helm-popup-frame t)) + ;; If user have changed `helm-display-buffer-reuse-frame' to nil + ;; maybe kill the frame. + (when (and helm-popup-frame + (frame-live-p helm-popup-frame)) + (delete-frame helm-popup-frame)) + (display-buffer + buffer `(display-buffer-pop-up-frame + . ((pop-up-frame-parameters . ,frame-alist)))))) + +;; Ensure to quit helm when user delete helm frame manually. +;; If user deletes another frame keep session running. +(defun helm--delete-frame-function (frame) + (when (and helm-alive-p + ;; FRAME is handling helm-buffer + (get-buffer-window helm-buffer frame)) + (helm-keyboard-quit))) +(add-hook 'delete-frame-functions 'helm--delete-frame-function) + +;;; Initialize +;; +(defun helm-get-sources (sources) + "Transform each element of SOURCES in alist. +Return the resulting list." + (when sources + (mapcar (lambda (source) + (if (listp source) + source (symbol-value source))) + (helm-normalize-sources sources)))) + +(defun helm-initialize (resume input default sources) + "Start initialization of Helm session. +For RESUME INPUT DEFAULT and SOURCES see `helm'." + (helm-log "helm-initialize" "start initialization: resume=%S input=%S" + resume input) + (helm-frame-or-window-configuration 'save) + (let ((sources-list (helm-get-sources sources))) + (setq helm--in-fuzzy + (cl-loop for s in sources-list + for matchfns = (helm-match-functions s) + for searchfns = (helm-search-functions s) + when (or (memq 'helm-fuzzy-match matchfns) + (memq 'helm-fuzzy-search searchfns)) + return t)) + (helm-log "helm-initialize" "sources-list = %S" sources-list) + (helm-set-local-variable 'helm-sources sources-list) + ;; Once `helm-buffer' is created `helm-sources' will be a local + ;; variable which value is a list of alists. + (helm-current-position 'save) + (if (helm-resume-p resume) + (helm-initialize-overlays (helm-buffer-get)) + (helm-initial-setup input default sources-list)) + (setq helm-alive-p t) + (unless (eq resume 'noresume) + (helm--push-and-remove-dups helm-buffer 'helm-buffers) + (setq helm-last-buffer helm-buffer)) + ;; If a `resume' attribute is present `helm-compute-attr-in-sources' + ;; will run its function. + (when (helm-resume-p resume) + (helm-compute-attr-in-sources 'resume)) + (helm-log "helm-initialize" "end initialization"))) + +(defun helm-current-position (save-or-restore) + "Save or restore current position in `helm-current-buffer'. +Argument SAVE-OR-RESTORE is either save or restore." + (cl-case save-or-restore + (save + (helm-log "helm-current-position" "Save position at %S" (cons (point) (window-start))) + (setq helm-current-position (cons (point) (window-start)))) + (restore + ;; Maybe `helm-current-buffer' have been deleted + ;; during helm session so check if it is here + ;; otherwise position in underlying buffer will be lost. + (when (get-buffer-window helm-current-buffer 'visible) + (helm-log "helm-current-position" "Restore position at %S in buffer %s" + helm-current-position + (buffer-name (current-buffer))) + (goto-char (car helm-current-position)) + ;; Fix this position with the NOFORCE arg of `set-window-start' + ;; otherwise, if there is some other buffer than `helm-current-buffer' + ;; one, position will be lost. + (set-window-start (selected-window) (cdr helm-current-position) t))))) + +(defun helm-initialize-overlays (buffer) + "Initialize Helm overlays in BUFFER." + (helm-log "helm-initialize-overlays" "overlay setup") + (if helm-selection-overlay + ;; make sure the overlay belongs to the helm buffer if + ;; it's newly created + (move-overlay helm-selection-overlay (point-min) (point-min) + (get-buffer buffer)) + + (setq helm-selection-overlay + (make-overlay (point-min) (point-min) (get-buffer buffer))) + (overlay-put helm-selection-overlay 'face 'helm-selection) + (overlay-put helm-selection-overlay 'priority 1))) + +(defun helm-initial-setup (input default sources) + "Initialize Helm settings and set up the Helm buffer." + ;; Run global hook. + (helm-log-run-hook "helm-initial-setup" 'helm-before-initialize-hook) + ;; Run local source hook. + (helm--run-init-hooks 'before-init-hook sources) + ;; For initialization of helm locals vars that need + ;; a value from current buffer, it is here. + (helm-set-local-variable 'current-input-method current-input-method) + (setq helm-current-prefix-arg nil + helm-saved-action nil + helm-saved-selection nil + helm-suspend-update-flag nil + ;; Ensure this is called BEFORE selecting helm-window. + helm-current-buffer (helm--current-buffer) + helm-buffer-file-name buffer-file-name + helm-issued-errors nil + helm-saved-current-source nil + helm--suspend-update-interactive-flag nil) + (when (and (with-helm-current-buffer + (and (buffer-narrowed-p) + (use-region-p))) + (not helm--nested)) + (helm-set-local-variable 'helm--current-buffer-narrowed + (list (current-buffer) + (region-beginning) (region-end)))) + (unless (and (or helm-split-window-state + helm--window-side-state) + helm-reuse-last-window-split-state) + ;; `helm-split-window-state' should be the contrary of what we currently + ;; have to allow toggling windows with C-t. This was influencing the + ;; behavior of `helm-show-action-window-other-window' but we have now + ;; removed this limitation, the action buffer beeing displayed 'below' when + ;; helm-window is too narrow (vertical split). See bug#2635. + (setq helm-split-window-state + (if (or (null helm-split-window-default-side) ; same as below. + (memq helm-split-window-default-side '(below above)) + (null helm-split-width-threshold) + (and (integerp helm-split-width-threshold) + (>= helm-split-width-threshold (+ (frame-width) 4)))) + 'vertical 'horizontal)) + (setq helm--window-side-state + (or helm-split-window-default-side 'below))) + ;; Some sources like helm-mu are using input to init their + ;; candidates in init function, so setup initial helm-pattern here. + ;; See bug#2530 and https://github.com/emacs-helm/helm-mu/issues/54. + ;; Input should have precedence on default. + (cond (input + (setq helm-input input + helm-pattern input)) + ((and default helm-maybe-use-default-as-input) + (setq helm-pattern (if (listp default) + (car default) + default) + ;; Even if helm-pattern is set we want the + ;; prompt to be empty when using default as input, why + ;; helm-input is initialized to "". + helm-input "")) + (helm-maybe-use-default-as-input + (setq helm-pattern (or (with-helm-current-buffer + (thing-at-point 'symbol)) + "") + helm-input "")) + (t + (setq helm-pattern "" + helm-input ""))) + (helm--fuzzy-match-maybe-set-pattern) + ;; Call the init function for sources where appropriate + (helm-compute-attr-in-sources 'init sources) + (clrhash helm-candidate-cache) + (helm-create-helm-buffer) + (helm-clear-visible-mark) + ;; Run global hook. + (helm-log-run-hook "helm-initial-setup" 'helm-after-initialize-hook) + ;; Run local source hook. + (helm--run-init-hooks 'after-init-hook sources)) + +(defun helm--run-init-hooks (hook sources) + "Run after and before init hooks local to source. +See :after-init-hook and :before-init-hook in `helm-source'." + ;; We handle here incorrect values of hooks to not break packages using such + ;; values i.e. lambda's or lists not bound to a symbol. In the future we may + ;; use `helm-log-run-hook' directly which allow using add-hook, remove-hook + ;; etc... + (dolist (s sources) + (helm-acase (assoc-default hook s) + ((guard (and (functionp it) (not (symbolp it)))) + (funcall it)) + ((guard (listp it)) + (dolist (h it) (funcall h))) + (t (helm-log-run-hook "helm--run-init-hooks" it))))) + +(defun helm-restore-position-on-quit () + "Restore position in `helm-current-buffer' when quitting." + (helm-current-position 'restore)) + +(defun helm--push-and-remove-dups (elm sym) + "Move ELM of SYM value on top and set SYM to this new value." + (set sym (cons elm (delete elm (symbol-value sym))))) + +(defun helm--current-buffer () + "[INTERNAL] Return `current-buffer' BEFORE `helm-buffer' is initialized. +Note that it returns the minibuffer in use after Helm has started +and is intended for `helm-initial-setup'. To get the buffer where +Helm was started, use `helm-current-buffer' instead." + (if (minibuffer-window-active-p (minibuffer-window)) + ;; If minibuffer is active be sure to use it's buffer + ;; as `helm-current-buffer', this allow to use helm + ;; from an already active minibuffer (M-: etc...) + (window-buffer (active-minibuffer-window)) + ;; Fix Bug#456 + ;; Use this instead of `current-buffer' to ensure + ;; helm session started in helm-mode from a completing-read + ;; Use really the buffer where we started and not the one + ;; where the completing-read is wrapped. i.e + ;; (with-current-buffer SOME-OTHER-BUFFER (completing-read [...]) + (window-buffer (with-selected-window (minibuffer-window) + (minibuffer-selected-window))))) + +(define-derived-mode helm-major-mode + fundamental-mode "Hmm" + "[INTERNAL] Provide major-mode name in Helm buffers. +Unuseful when used outside Helm, don't use it.") +(put 'helm-major-mode 'mode-class 'special) +(put 'helm-major-mode 'helm-only t) + +(defun helm-create-helm-buffer () + "Create and setup `helm-buffer'." + (let ((root-dir default-directory) + (inhibit-read-only t)) + (with-current-buffer (get-buffer-create helm-buffer) + (helm-log "helm-create-helm-buffer" "Enabling major-mode %S" major-mode) + (helm-log "helm-create-helm-buffer" "kill local variables: %S" (buffer-local-variables)) + (kill-all-local-variables) + (helm-major-mode) + (set (make-local-variable 'buffer-read-only) nil) + (buffer-disable-undo) + (erase-buffer) + ;; Use this instead of setting helm-map local ensure we have all + ;; our keys when helm loose minibuffer focus. And the map is + ;; made local as well AFAIU. + (use-local-map helm-map) + (set (make-local-variable 'helm-source-filter) nil) + (make-local-variable 'helm-sources) + (set (make-local-variable 'helm-display-function) nil) + (set (make-local-variable 'helm-selection-point) nil) + (set (make-local-variable 'scroll-margin) + (if helm-display-source-at-screen-top + 0 helm-completion-window-scroll-margin)) + (set (make-local-variable 'default-directory) root-dir) + (set (make-local-variable 'helm-marked-candidates) nil) + (set (make-local-variable 'helm--prompt) helm--prompt) + (helm-initialize-persistent-action) + (helm-log "helm-create-helm-buffer" "helm-display-function = %S" helm-display-function) + (helm-log "helm-create-helm-buffer" "helm--local-variables = %S" helm--local-variables) + (helm--set-local-variables-internal) + (setq truncate-lines helm-truncate-lines) ; already local. + (setq left-margin-width helm-left-margin-width) + (setq cursor-type nil)) + (helm-initialize-overlays helm-buffer) + (get-buffer helm-buffer))) + +(define-minor-mode helm--minor-mode + "[INTERNAL] Enable keymap in Helm minibuffer. +Since this mode has no effect when run outside of Helm context, +please don't use it outside of Helm. + +\\{helm-map}" + :group 'helm + :keymap (and helm-alive-p helm-map) + (unless helm-alive-p (setq helm--minor-mode nil))) +(put 'helm--minor-mode 'helm-only t) + +(defun helm--reset-default-pattern () + (setq helm-pattern "") + (setq helm-maybe-use-default-as-input nil)) + +(defun helm-read-from-minibuffer (prompt + input preselect resume + keymap default history) + "Read pattern with prompt PROMPT and initial input INPUT. +For PRESELECT RESUME KEYMAP DEFAULT HISTORY, see `helm'." + (with-helm-buffer + (if (and (helm-resume-p resume) + ;; When no source, helm-buffer is empty + ;; or contain non--candidate lines (e.g grep exit status) + (helm-get-current-source)) + (helm-mark-current-line t) + (helm-update preselect)) + (let* ((src (helm-get-current-source)) + (src-keymap (assoc-default 'keymap src)) + (hist (or (and history (symbolp history) history) + ;; Needed for resuming. + (assoc-default 'history src))) + (timer nil) + blink-matching-paren + (first-src (car helm-sources)) + (source-process-p (or (assq 'candidates-process src) + (assq 'candidates-process first-src))) + ;; As we are using `helm-keyboard-quit' for `C-g' we have + ;; to prevent emacs command loop redefining `C-g' during + ;; helm-session. This happen only on async source with + ;; large output after a certain delay. The effect is that + ;; the minibuffer is exited but the helm async process + ;; continue running, and because minibuffer is lost `C-g' + ;; have no more effect. By binding `inhibit-quit' here we + ;; prevent this and allow `C-g' (the helm one aka + ;; `helm-keyboard-quit') to quit immediately. + (inhibit-quit source-process-p)) + (helm-log "helm-read-from-minibuffer" "helm-get-candidate-number => %S" + (helm-get-candidate-number)) + (helm-log "helm-read-from-minibuffer" "helm-execute-action-at-once-if-one = %S" + helm-execute-action-at-once-if-one) + (helm-log "helm-read-from-minibuffer" + "helm-quit-if-no-candidate = %S" helm-quit-if-no-candidate) + (when (and src (helm-resume-p resume)) + (helm-display-mode-line src) + (setq helm-pattern input)) + ;; Reset `helm-pattern' and update + ;; display if no result found with precedent value of `helm-pattern' + ;; unless `helm-quit-if-no-candidate' is non-`nil', in this case + ;; Don't force update with an empty pattern. + ;; Reset also `helm-maybe-use-default-as-input' as this checking + ;; happen only on startup. + (when helm-maybe-use-default-as-input + ;; Store value of `default' temporarily here waiting next update + ;; to allow actions like helm-moccur-action matching pattern + ;; at the place it jump to. + (setq helm-input helm-pattern) + (if source-process-p + ;; Reset pattern to next update. + (with-helm-after-update-hook + (helm--reset-default-pattern)) + ;; Reset pattern right now. + (helm--reset-default-pattern)) + ;; Ensure force-update when no candidates + ;; when we start with an empty pattern. + (and (helm-empty-buffer-p) + (null helm-quit-if-no-candidate) + (helm-force-update preselect))) + ;; Handle `helm-execute-action-at-once-if-one' and + ;; `helm-quit-if-no-candidate' now. + (cond ((and (if (functionp helm-execute-action-at-once-if-one) + (funcall helm-execute-action-at-once-if-one) + helm-execute-action-at-once-if-one) + (= (helm-get-candidate-number + (eq helm-execute-action-at-once-if-one 'current-source)) + 1)) + (ignore)) ; Don't enter the minibuffer loop. + ((and helm-quit-if-no-candidate + (= (helm-get-candidate-number) 0)) + (setq helm--quit t) + (and (functionp helm-quit-if-no-candidate) + (funcall helm-quit-if-no-candidate))) + (t ; Enter now minibuffer and wait for input. + (let ((tap (or default + (with-helm-current-buffer + (thing-at-point 'symbol))))) + (when helm-execute-action-at-once-if-one + (helm-display-buffer helm-buffer resume) + (select-window (helm-window))) + (unwind-protect + (minibuffer-with-setup-hook + (lambda () + ;; Start minor-mode with global value of helm-map. + (helm--minor-mode 1) + ;; Now override the global value of `helm-map' with + ;; the local one which is in this order: + ;; - The keymap of current source. + ;; - The value passed in KEYMAP + ;; - Or fallback to the global value of helm-map. + (helm--maybe-update-keymap + (or src-keymap keymap helm-map)) + (helm-log-run-hook "helm-read-from-minibuffer" + 'helm-minibuffer-set-up-hook) + (setq timer + (run-with-idle-timer + (max (with-helm-buffer helm-input-idle-delay) + 0.001) + 'repeat + (lambda () + ;; Stop updating in persistent action + ;; or when `helm-suspend-update-flag' + ;; is non-`nil'. + (unless (or helm-in-persistent-action + helm-suspend-update-flag) + (save-selected-window + (helm-check-minibuffer-input) + (helm-print-error-messages)))))) + ;; minibuffer has already been filled here. + (helm--update-header-line)) + (read-from-minibuffer (propertize (or prompt "pattern: ") + 'face 'helm-minibuffer-prompt) + input helm-map + nil hist tap + helm-inherit-input-method)) + (when timer (cancel-timer timer) (setq timer nil))))))))) + +(defun helm-toggle-suspend-update () + "Enable or disable display update in helm. +This can be useful for example for quietly writing a complex +regexp without Helm constantly updating." + (interactive) + (helm-suspend-update (not helm-suspend-update-flag) t) + (setq helm--suspend-update-interactive-flag + (not helm--suspend-update-interactive-flag))) +(put 'helm-toggle-suspend-update 'helm-only t) + +(defun helm-suspend-update (arg &optional verbose) + "Enable or disable display update in helm. +If ARG is 1 or non nil suspend update, if it is -1 or nil reenable +updating. When VERBOSE is specified display a message." + (with-helm-buffer + (when (setq helm-suspend-update-flag + (helm-acase arg + (1 t) + (-1 nil) + (t it))) + (helm-kill-async-processes) + (setq helm-pattern "")) + (when verbose + (message (if helm-suspend-update-flag + "Helm update suspended!" + "Helm update re-enabled!"))) + (helm-aif (helm-get-current-source) + (helm-display-mode-line it t)))) + +(defun helm-delete-backward-no-update (arg) + "Disable update and delete ARG chars backward. +Update is reenabled when idle 1s." + (interactive "p") + (with-helm-alive-p + (unless helm--suspend-update-interactive-flag + (helm-suspend-update 1)) + (delete-char (- arg)) + (run-with-idle-timer + 1 nil + (lambda () + (unless helm--suspend-update-interactive-flag + (helm-suspend-update -1) + (helm-check-minibuffer-input) + (helm-force-update)))))) +(put 'helm-delete-backward-no-update 'helm-only t) + +(defun helm-delete-char-backward (arg) + "Delete char backward and update when reaching prompt." + (interactive "p") + (condition-case _err + (delete-char (- arg)) + (buffer-read-only + (progn + (helm-update) + (helm-reset-yank-point))))) +(put 'helm-delete-char-backward 'helm-only t) + +(defun helm--suspend-read-passwd (old--fn &rest args) + "Suspend Helm while reading password. +This is used to advice `tramp-read-passwd', `ange-ftp-get-passwd' +and `epa-passphrase-callback-function'." + ;; Suspend update when prompting for a tramp password. + (setq helm-suspend-update-flag t) + (setq overriding-terminal-local-map nil) + (setq helm--reading-passwd-or-string t) + (unwind-protect + ;; No need to suspend timer in emacs-24.4 + ;; it is fixed upstream. + (apply old--fn args) + (setq helm--reading-passwd-or-string nil) + (setq helm-suspend-update-flag nil))) + +(defun helm--maybe-update-keymap (&optional map) + "Handle different keymaps in multiples sources. + +Overrides `helm-map' with the local map of current source. If no +map is found in current source, does nothing (keeps previous +map)." + (with-helm-buffer + (helm-aif (or map (assoc-default 'keymap (helm-get-current-source))) + ;; We used a timer in the past to leave + ;; enough time to helm to setup its keymap + ;; when changing source from a recursive minibuffer. + ;; e.g C-x C-f M-y C-g + ;; => *find-files have now the bindings of *kill-ring. + ;; It is no more true now we are using `minor-mode-overriding-map-alist' + ;; and `helm--minor-mode' thus it fix Bug#1076 for emacs-24.3 + ;; where concurrent timers are not supported. + ;; i.e update keymap+check input. + (with-current-buffer (window-buffer (minibuffer-window)) + (setq minor-mode-overriding-map-alist `((helm--minor-mode . ,it))))))) + +;;; Prevent loosing focus when using mouse. +;; +(defvar helm--remap-mouse-mode-map + (let ((map (make-sparse-keymap))) + (cl-loop for k in '([mouse-1] [mouse-2] [mouse-3] + [down-mouse-1] [down-mouse-2] [down-mouse-3] + [drag-mouse-1] [drag-mouse-2] [drag-mouse-3] + [double-mouse-1] [double-mouse-2] [double-mouse-3] + [triple-mouse-1] [triple-mouse-2] [triple-mouse-3]) + do (define-key map k 'ignore)) + map)) + +(define-minor-mode helm--remap-mouse-mode + "[INTERNAL] Prevent escaping helm minibuffer with mouse clicks. +Do nothing when used outside of helm context. + +WARNING: Do not use this mode yourself, it is internal to Helm." + :group 'helm + :global t + :keymap helm--remap-mouse-mode-map + (unless helm-alive-p + (setq helm--remap-mouse-mode-map nil))) +(put 'helm--remap-mouse-mode 'helm-only t) + +;; Clean up + +(defun helm-cleanup () + "Clean up the mess when Helm exit or quit." + (helm-log "helm-cleanup" "start cleanup") + (with-selected-window + ;; When exiting with `helm-execute-action-at-once-if-one', + ;; `helm-window' may not be created and we endup with an error + ;; e.g. in eshell completion when only one candidate to complete + ;; so fallback to selected-window in such cases. + (or (get-buffer-window helm-buffer) + (selected-window)) + (let ((frame (selected-frame))) + (setq cursor-type (default-value 'cursor-type)) + ;; Ensure restoring default-value of mode-line to allow user + ;; using the mouse when helm is inactive (Bug#1517,Bug#2377). + (setq mode-line-format (default-value 'mode-line-format)) + (remove-hook 'post-command-hook 'helm--maybe-update-keymap) + (remove-hook 'post-command-hook 'helm--update-header-line) + ;; Be sure we call cleanup functions from helm-buffer. + (helm-compute-attr-in-sources 'cleanup) + ;; Delete or make invisible helm frame. + (if (and helm--buffer-in-new-frame-p + ;; a helm session running in a frame that runs a nested + ;; session share the same frame for both sessions so + ;; don't delete the common frame. + ;; i.e. helm--nested == t => delete + ;; helm--nested == nil => delete + ;; helm--nested == share => don't delete + (not (eq helm--nested 'share))) + (progn + (setq-local helm--last-frame-parameters + (helm--get-frame-parameters)) + (bury-buffer) + (if helm-display-buffer-reuse-frame + (make-frame-invisible frame) (delete-frame frame))) + ;; bury-buffer from this window [1]. + ;; Do it at end to make sure buffer is still current. + (bury-buffer)))) + (helm-kill-async-processes) + ;; Remove the temporary hooks added + ;; by `with-helm-temp-hook' that + ;; may not have been consumed. + (when helm--temp-hooks + (cl-loop for (fn . hook) in helm--temp-hooks + do (remove-hook hook fn)) + (setq helm--temp-hooks nil)) + ;; When running helm from a dedicated frame + ;; with no minibuffer, helm will run in the main frame + ;; which have a minibuffer, so be sure to disable + ;; the `no-other-window' prop there. + (helm-prevent-switching-other-window :enabled nil) + (helm-log-run-hook "helm-cleanup" 'helm-cleanup-hook) + (helm-frame-or-window-configuration 'restore) + ;; [1] now bury-buffer from underlying windows otherwise, + ;; if this window is killed the underlying buffer will + ;; be a helm buffer. + (replace-buffer-in-windows helm-buffer) + (setq helm-alive-p nil) + ;; Prevent error "No buffer named *helm*" triggered by + ;; `helm-set-local-variable'. + (setq helm--force-updating-p nil) + (setq helm--buffer-in-new-frame-p nil) + ;; No need to reinitialize helm-pattern here now it is done only + ;; once in init function bug#2530. + (setq helm-last-query helm-pattern) + ;; This is needed in some cases where last input + ;; is yielded infinitely in minibuffer after helm session. + (helm-clean-up-minibuffer)) + +(defun helm-clean-up-minibuffer () + "Remove contents of minibuffer." + (let ((miniwin (minibuffer-window))) + ;; Clean only current minibuffer used by helm. + ;; i.e The precedent one is active. + (unless (minibuffer-window-active-p miniwin) + (with-current-buffer (window-buffer miniwin) + (delete-minibuffer-contents))))) + + +;;; Input handling +;; +;; +(defun helm-check-minibuffer-input () + "Check minibuffer content." + (with-selected-window (or (active-minibuffer-window) + (minibuffer-window)) + (helm-check-new-input (minibuffer-contents)))) + +(defun helm-check-new-input (input) + "Check INPUT string and update the helm buffer if necessary." + (unless (equal input helm-pattern) + (setq helm-pattern input) + (unless (helm-action-window) + (setq helm-input helm-pattern)) + (helm-log "helm-check-new-input" "helm-pattern = %S" helm-pattern) + (helm-log "helm-check-new-input" "helm-input = %S" helm-input) + (helm-log-run-hook "helm-check-new-input" 'helm-before-update-hook) + (setq helm--in-update t) + (helm-update))) + +(defun helm--reset-update-flag () + (run-with-idle-timer + helm-exit-idle-delay nil + (lambda () (setq helm--in-update nil)))) + +;; (add-hook 'helm-after-update-hook #'helm--reset-update-flag) + + +;; All candidates + +(defun helm-get-candidates (source) + "Retrieve and return the list of candidates from SOURCE." + (let* ((candidate-fn (assoc-default 'candidates source)) + (candidate-proc (assoc-default 'candidates-process source)) + ;; See comment in helm-get-cached-candidates (Bug#2113). + (inhibit-quit candidate-proc) + cfn-error + (notify-error + (lambda (&optional e) + (error + "In `%s' source: `%s' %s %s" + (assoc-default 'name source) + (or candidate-fn candidate-proc) + (if e "\n" "must be a list, a symbol bound to a list, or a function returning a list") + (if e (prin1-to-string e) "")))) + (candidates (condition-case-unless-debug err + ;; Process candidates-(process) function + ;; It may return a process or a list of candidates. + (if candidate-proc + ;; Calling `helm-interpret-value' with no + ;; SOURCE arg force the use of `funcall' + ;; and not `helm-apply-functions-from-source'. + (helm-interpret-value candidate-proc) + (helm-interpret-value candidate-fn source)) + (error (helm-log "helm-get-candidates" + "Error: %S" (setq cfn-error err)) + nil)))) + (cond ((and (processp candidates) (not candidate-proc)) + (warn "Candidates function `%s' should be called in a `candidates-process' attribute" + candidate-fn)) + ((and candidate-proc (not (processp candidates))) + (error "Candidates function `%s' should run a process" candidate-proc))) + (cond ((processp candidates) + ;; Candidates will be filtered later in process filter. + candidates) + ;; An error occured in candidates function. + (cfn-error (unless helm--ignore-errors + (funcall notify-error cfn-error))) + ;; Candidates function returns no candidates. + ((or (null candidates) + ;; Can happen when the output of a process + ;; is empty, and the candidates function call + ;; something like (split-string (buffer-string) "\n") + ;; which result in a list of one empty string (Bug#938). + ;; e.g (completing-read "test: " '("")) + (equal candidates '(""))) + nil) + ((listp candidates) + ;; Transform candidates with `candidate-transformer' functions or + ;; `real-to-display' functions if those are found, + ;; otherwise return candidates unmodified. + ;; `filtered-candidate-transformer' is NOT called here. + (helm-transform-candidates candidates source)) + (t (funcall notify-error))))) + +(defun helm-get-cached-candidates (source) + "Return the cached value of candidates for SOURCE. +Cache the candidates if there is no cached value yet." + (let* ((name (assoc-default 'name source)) + (candidate-cache (gethash name helm-candidate-cache)) + ;; Bind inhibit-quit to ensure function terminate in case of + ;; quit from `helm-while-no-input' and processes are added to + ;; helm-async-processes for further deletion (Bug#2113). + ;; FIXME: Is this still needed now `helm-while-no-input' + ;; handles quit-flag? + (inhibit-quit (assoc-default 'candidates-process source))) + (helm-aif candidate-cache + (prog1 it (helm-log "helm-get-cached-candidates" + "Use cached candidates")) + (helm-log "helm-get-cached-candidates" + "No cached candidates, calculate candidates") + (let ((candidates (helm-get-candidates source))) + (cond ((processp candidates) + (push (cons candidates + (append source + (list (cons 'item-count 0) + (cons 'incomplete-line "")))) + helm-async-processes) + (set-process-filter candidates 'helm-output-filter) + (setq candidates nil)) + ((not (assq 'volatile source)) + (puthash name candidates helm-candidate-cache))) + candidates)))) + + +;;; Candidate transformers + +(defun helm-process-candidate-transformer (candidates source) + "Execute `candidate-transformer' function(s) on CANDIDATES in SOURCE." + (helm-aif (assoc-default 'candidate-transformer source) + (helm-apply-functions-from-source source it candidates) + candidates)) + +(defun helm-process-filtered-candidate-transformer (candidates source) + "Execute `filtered-candidate-transformer' function(s) on CANDIDATES in SOURCE." + (helm-aif (assoc-default 'filtered-candidate-transformer source) + (helm-apply-functions-from-source source it candidates source) + candidates)) + +(defmacro helm--maybe-process-filter-one-by-one-candidate (candidate source) + "Execute `filter-one-by-one' function(s) on real value of CANDIDATE in SOURCE." + `(helm-aif (assoc-default 'filter-one-by-one ,source) + (let ((real (if (consp ,candidate) + (cdr ,candidate) + ,candidate))) + (if (and (listp it) + (not (functionp it))) ;; Don't treat lambda's as list. + (cl-loop for f in it + do (setq ,candidate (funcall f real)) + finally return ,candidate) + (setq ,candidate (funcall it real)))) + ,candidate)) + +(defun helm--initialize-one-by-one-candidates (candidates source) + "Process CANDIDATES with the `filter-one-by-one' function in SOURCE. +Return CANDIDATES unchanged when pattern is not empty." + (helm-aif (and (string= helm-pattern "") + (assoc-default 'filter-one-by-one source)) + (cl-loop for cand in candidates collect + (helm--maybe-process-filter-one-by-one-candidate cand source)) + candidates)) + +(defun helm-process-filtered-candidate-transformer-maybe + (candidates source process-p) + "Execute `filtered-candidate-transformer' function(s) on CANDIDATES in SOURCE. +When PROCESS-P is non-nil execute +`filtered-candidate-transformer' functions if some, otherwise +return CANDIDATES." + (if process-p + ;; When no filter return CANDIDATES unmodified. + (helm-process-filtered-candidate-transformer candidates source) + candidates)) + +(defun helm-process-real-to-display (candidates source) + "Execute real-to-display function on all CANDIDATES of SOURCE." + (helm-aif (assoc-default 'real-to-display source) + (setq candidates (helm-apply-functions-from-source + source 'mapcar + (lambda (cand) + (if (consp cand) + ;; override DISPLAY from candidate-transformer + (cons (funcall it (cdr cand)) (cdr cand)) + (cons (funcall it cand) cand))) + candidates)) + candidates)) + +(defun helm-transform-candidates (candidates source &optional process-p) + "Transform CANDIDATES from SOURCE according to candidate transformers. + +When PROCESS-P is non-nil executes the +`filtered-candidate-transformer' functions, otherwise processes +`candidate-transformer' functions only, +`filtered-candidate-transformer' functions being processed later, +after the candidates have been narrowed by +`helm-candidate-number-limit', see `helm-compute-matches'. When +`real-to-display' attribute is present, execute its functions on all +maybe filtered CANDIDATES." + (helm-process-real-to-display + (helm-process-filtered-candidate-transformer-maybe + (helm-process-candidate-transformer + candidates source) + source process-p) + source)) + + +;; Narrowing candidates +(defun helm-candidate-number-limit (source) + "Apply candidate-number-limit attribute value. +This overrides `helm-candidate-number-limit' variable. + +E.g.: +If (candidate-number-limit) is in SOURCE, show all candidates in SOURCE. +If (candidate-number-limit . 123) is in SOURCE limit candidate to 123." + (helm-aif (assq 'candidate-number-limit source) + ;; When assoc value is nil use by default 99999999 otherwise use + ;; the assoc value, when it is a symbol interpret its value (bug#1831). + (or (helm-aand (cdr it) (helm-interpret-value it)) 99999999) + (or helm-candidate-number-limit 99999999))) + +(defun helm-candidate-get-display (candidate) + "Get searched display part from CANDIDATE. +CANDIDATE is either a string, a symbol, or a (DISPLAY . REAL) +cons cell." + (cond ((car-safe candidate)) + ((symbolp candidate) + (symbol-name candidate)) + ((numberp candidate) + (number-to-string candidate)) + (t candidate))) + +(defun helm-process-pattern-transformer (pattern source) + "Execute pattern-transformer attribute function(s) on PATTERN in SOURCE." + (helm-aif (assoc-default 'pattern-transformer source) + (helm-apply-functions-from-source source it pattern) + pattern)) + +(defun helm-default-match-function (candidate) + "Check if `helm-pattern' match CANDIDATE. +Default function to match candidates according to `helm-pattern'." + (string-match helm-pattern candidate)) + + +;;; Fuzzy matching +;; +;; +(defvar helm--fuzzy-regexp-cache (make-hash-table :test 'eq)) +(defun helm--fuzzy-match-maybe-set-pattern () + ;; Computing helm-pattern with helm--mapconcat-pattern + ;; is costly, so cache it once time for all and reuse it + ;; until pattern change. + (when helm--in-fuzzy + (let ((fun (if (string-match "\\`\\^" helm-pattern) + #'identity + #'helm--mapconcat-pattern))) + (clrhash helm--fuzzy-regexp-cache) + ;; FIXME: Splitted part are not handled here, + ;; I must compute them in `helm-search-match-part' + ;; when negation and in-buffer are used. + (if (string-match "\\`!" helm-pattern) + (puthash 'helm-pattern + (if (> (length helm-pattern) 1) + (list (regexp-quote (substring helm-pattern 1 2)) + (funcall fun (substring helm-pattern 1))) + '("" "")) + helm--fuzzy-regexp-cache) + (puthash 'helm-pattern + (if (> (length helm-pattern) 0) + (list (regexp-quote (substring helm-pattern 0 1)) + (funcall fun helm-pattern)) + '("" "")) + helm--fuzzy-regexp-cache))))) + +(defun helm-fuzzy-match (candidate) + "Check if `helm-pattern' fuzzy matches CANDIDATE. +This function is used with sources built with `helm-source-sync'." + (unless (string-match " " helm-pattern) + ;; When pattern have one or more spaces, let + ;; multi-match doing the job with no fuzzy matching.[1] + (let ((regexp (cadr (gethash 'helm-pattern helm--fuzzy-regexp-cache)))) + (if (string-match "\\`!" helm-pattern) + (not (string-match regexp candidate)) + (string-match regexp candidate))))) + +(defun helm-fuzzy-search (pattern) + "Same as `helm-fuzzy-match' but for sources built with +`helm-source-in-buffer'." + (unless (string-match " " helm-pattern) + ;; Same as in `helm-fuzzy-match' ref[1]. + (let* ((regexps (gethash 'helm-pattern helm--fuzzy-regexp-cache)) + (partial-regexp (car regexps)) + (regexp (cadr regexps))) + (if (string-match "\\`!" pattern) + ;; Don't try to search here, just return + ;; the position of line and go ahead, + ;; letting `helm-search-match-part' checking if + ;; pattern match against this line. + (prog1 (list (pos-bol) (pos-eol)) + (forward-line 1)) + ;; We could use here directly `re-search-forward' + ;; on the regexp produced by `helm--mapconcat-pattern', + ;; but it is very slow because emacs have to do an incredible + ;; amount of loops to match e.g "[^f]*f[^o]*o..." in the whole buffer, + ;; more the regexp is long more the amount of loops grow. + ;; (Probably leading to a max-lisp-eval-depth error if both + ;; regexp and buffer are too big) + ;; So just search the first bit of pattern e.g "[^f]*f", and + ;; then search the corresponding line with the whole regexp, + ;; which increase dramatically the speed of the search. + (cl-loop while (re-search-forward partial-regexp nil t) + for bol = (pos-bol) + for eol = (pos-eol) + if (progn (goto-char bol) + (re-search-forward regexp eol t)) + do (goto-char eol) and return t + else do (goto-char eol) + finally return nil))))) + +(defvar helm-fuzzy-default-score-fn #'helm-fuzzy-flex-style-score) +(defun helm-score-candidate-for-pattern (candidate pattern) + "Assign score to CANDIDATE according to PATTERN." + ;; Unknown candidates always go on top. + (if (helm-candidate-prefixed-p candidate) + 200.00 + (funcall helm-fuzzy-default-score-fn candidate pattern))) + +;; The flex scoring needs a regexp whereas the fuzzy scoring works +;; directly with helm-pattern, so cache the needed regexp for flex +;; scoring to not (re)compute it at each candidate. We could reuse +;; the regexp cached in `helm--fuzzy-regexp-cache' but it is not +;; exactly the same as the one needed for flex and also it is always +;; computed against the whole helm-pattern which is not usable for +;; e.g. file completion. +(defvar helm--fuzzy-flex-regexp-cache (make-hash-table :test 'equal)) +(defun helm-fuzzy-flex-style-score (candidate pattern) + "Give a score to CANDIDATE according to PATTERN. +A regexp is generated from PATTERN to calculate score. +Score is calculated with the emacs-27 flex algorithm using +`helm-flex--style-score'." + (let ((regexp (helm-aif (gethash pattern helm--fuzzy-flex-regexp-cache) + it + (clrhash helm--fuzzy-flex-regexp-cache) + (puthash pattern (helm--fuzzy-flex-pattern-to-regexp pattern) + helm--fuzzy-flex-regexp-cache)))) + (helm-flex--style-score candidate regexp t))) + +(defun helm--fuzzy-flex-pattern-to-regexp (pattern) + "Return a regexp from PATTERN compatible with emacs-27 flex algorithm." + (completion-pcm--pattern->regex + (helm-completion--flex-transform-pattern (list pattern)) 'group)) + +(defun helm-flex-add-score-as-prop (candidates regexp) + (cl-loop with case-fold-search = (helm-set-case-fold-search) + for cand in candidates + collect (helm-flex--style-score cand regexp))) + +(defun helm-completion--flex-transform-pattern (pattern) + ;; "fob" => '(prefix "f" any "o" any "b" any point) + (cl-loop for p in pattern + if (stringp p) nconc + (cl-loop for str across p + nconc (list (string str) 'any)) + else nconc (list p))) + +(defun helm-fuzzy-helm-style-score (candidate pattern) + "Give a score to CANDIDATE according to PATTERN. +Score is calculated for contiguous matches found with PATTERN. +Score is 100 (maximum) if PATTERN is fully matched in CANDIDATE. +One point bonus is added to score when PATTERN prefix matches +CANDIDATE. Contiguous matches get a coefficient of 2." + (let* ((cand (if (stringp candidate) + candidate (helm-stringify candidate))) + (pat-lookup (helm--collect-pairs-in-string pattern)) + (str-lookup (helm--collect-pairs-in-string cand)) + (inter (cl-nintersection pat-lookup str-lookup :test 'equal)) + ;; Prefix + (bonus (cond ((or (equal (car pat-lookup) (car str-lookup)) + (equal (caar pat-lookup) (caar str-lookup))) + 2) + ((and (null pat-lookup) ; length = 1 + (string= pattern (substring cand 0 1))) + 150) + (t 0))) + ;; Exact match e.g. foo -> foo == 200 + (bonus1 (and (string= cand pattern) 200)) + ;; Partial match e.g. foo -> aafooaa == 100 + ;; or foo -> fooaaa + (bonus2 (and (or (string-match + (concat "\\`" (regexp-quote pattern)) + cand) + (string-match + (concat "\\<" (regexp-quote pattern) "\\>") + cand)) + 100))) + (+ bonus + (or bonus1 bonus2 + ;; Give a coefficient of 2 for contiguous matches. + ;; That's mean that "wiaaaki" will not take precedence + ;; on "aaawiki" when matching on "wiki" even if "wiaaaki" + ;; starts by "wi". + (* (length inter) 2))))) + +(defun helm-fuzzy-matching-default-sort-fn-1 (candidates &optional use-real basename preserve-tie-order) + "The transformer for sorting candidates in fuzzy matching. +It sorts on the display part by default. + +It sorts CANDIDATES by their scores as calculated by +`helm-score-candidate-for-pattern'. Set USE-REAL to non-nil to +sort on the real part. If BASENAME is non-nil assume we are +completing filenames and sort on basename of candidates. If +PRESERVE-TIE-ORDER is nil, ties in scores are sorted by length of +the candidates." + (if (string= helm-pattern "") + candidates + (let ((table-scr (make-hash-table :test 'equal))) + (sort candidates + (lambda (s1 s2) + ;; Score and measure the length on real or display part of candidate + ;; according to `use-real'. + (let* ((real-or-disp-fn (if use-real #'cdr #'car)) + (cand1 (cond ((and basename (consp s1)) + (helm-basename (funcall real-or-disp-fn s1))) + ((consp s1) (funcall real-or-disp-fn s1)) + (basename (helm-basename s1)) + (t s1))) + (cand2 (cond ((and basename (consp s2)) + (helm-basename (funcall real-or-disp-fn s2))) + ((consp s2) (funcall real-or-disp-fn s2)) + (basename (helm-basename s2)) + (t s2))) + (data1 (or (gethash cand1 table-scr) + (puthash cand1 + (list (helm-score-candidate-for-pattern + cand1 helm-pattern) + (length (helm-stringify cand1))) + table-scr))) + (data2 (or (gethash cand2 table-scr) + (puthash cand2 + (list (helm-score-candidate-for-pattern + cand2 helm-pattern) + (length (helm-stringify cand2))) + table-scr))) + (len1 (cadr data1)) + (len2 (cadr data2)) + (scr1 (car data1)) + (scr2 (car data2))) + (cond ((= scr1 scr2) + ;; Comparison by length should not be called here most of + ;; the time because we use now flex scoring which does + ;; such test, however we still use helm fuzzy scoring + ;; with preserve-tie-order, so keep testing length here + ;; for it. + (unless preserve-tie-order + (< len1 len2))) + ((> scr1 scr2))))))))) + +(defun helm-fuzzy-matching-default-sort-fn (candidates _source) + "Default `filtered-candidate-transformer' to sort in fuzzy matching." + (helm-fuzzy-matching-default-sort-fn-1 candidates)) + +(defun helm-fuzzy-matching-sort-fn-preserve-ties-order (candidates _source) + "Same as `helm-fuzzy-matching-default-sort-fn' but preserving order of ties. +The default function, `helm-fuzzy-matching-default-sort-fn', +sorts ties by length, shortest first. This function may be more +useful when the order of the candidates is meaningful, e.g. with +`recentf-list'." + ;; Flex scoring is already taking in account length of strings so this + ;; function have no effect when flex scoring is in use, force the usage of + ;; helm fuzzy scoring to ensure no testing against length is done. + (let ((helm-fuzzy-default-score-fn #'helm-fuzzy-helm-style-score)) + (helm-fuzzy-matching-default-sort-fn-1 candidates nil nil t))) + +(defun helm--maybe-get-migemo-pattern (pattern &optional diacritics) + (or (and helm-migemo-mode + (assoc-default pattern helm-mm--previous-migemo-info)) + (if diacritics + (char-fold-to-regexp pattern) + pattern))) + +(defun helm-fuzzy-default-highlight-match-1 (candidate &optional pattern diacritics file-comp) + (let* ((pair (and (consp candidate) candidate)) + (display (helm-stringify (if pair (car pair) candidate))) + (real (cdr pair)) + (host (and file-comp (get-text-property + (max 0 (1- (length display))) 'host display))) + (regex (helm--maybe-get-migemo-pattern pattern diacritics)) + (mpart (get-text-property 0 'match-part display)) + (mp (cond ((and mpart (string= display mpart)) nil) + (mpart) + ;; FIXME: This may be wrong when match-on-real + ;; is nil, so we should flag match-on-real on + ;; top and use it. + (file-comp (file-name-nondirectory + (or host (and (stringp real) real) display))))) + (count 0) + beg-str end-str) + ;; Happens when matching empty lines (^$), in this case there is nothing to + ;; highlight. + (if (string= mpart "") + candidate + (when host (setq pattern (cadr (split-string pattern ":")))) + ;; Extract all parts of display keeping original properties. + (when (and mp (ignore-errors + ;; Avoid error when candidate is a huge line. + (string-match (regexp-quote mp) display))) + (setq beg-str (substring display 0 (match-beginning 0)) + end-str (substring display (match-end 0) (length display)) + mp (substring display (match-beginning 0) (match-end 0)))) + (with-temp-buffer + ;; Insert the whole display part and remove non--match-part + ;; to keep their original face properties. + (insert (propertize (or mp display) 'read-only nil)) ; Fix (bug#1176) + (goto-char (point-min)) + (condition-case nil + (progn + ;; Try first matching against whole pattern. + (unless (string= pattern "") + (while (re-search-forward regex nil t) + (cl-incf count) + (helm-add-face-text-properties + (match-beginning 0) (match-end 0) 'helm-match))) + ;; If no matches start matching against multiples or fuzzy matches. + (when (zerop count) + (cl-loop with multi-match = (string-match-p " " pattern) + with patterns = (if multi-match + (cl-loop for pat in (helm-mm-split-pattern + pattern) + collect + (helm--maybe-get-migemo-pattern + pat diacritics)) + (split-string pattern "" t)) + for p in patterns + ;; Multi matches (regexps patterns). + if multi-match do + (progn + (while (re-search-forward p nil t) + (helm-add-face-text-properties + (match-beginning 0) (match-end 0) + 'helm-match)) + (goto-char (point-min))) + ;; Fuzzy matches (literal patterns). + else do + (when (search-forward p nil t) + (helm-add-face-text-properties + (match-beginning 0) (match-end 0) + 'helm-match))))) + (invalid-regexp nil)) + ;; Now replace the original match-part with the part + ;; with face properties added. + (setq display (if mp (concat beg-str (buffer-string) end-str) (buffer-string)))) + (if real (cons display real) display)))) + +(cl-defun helm-fuzzy-default-highlight-match (candidate + &optional (pattern helm-pattern) diacritics file-comp) + "The default function to highlight matches in fuzzy matching. +Highlight elements in CANDIDATE matching PATTERN according +to the matching method in use. When DIACRITICS is specified, ignore +diacritics, see `char-fold-to-regexp' for more infos." + (if (string= pattern "") + ;; Empty pattern, do nothing. This is needed when this function + ;; is used outside of helm-fuzzy-highlight-matches like in *buffers-list. + candidate + ;; Else start highlighting. + (helm-fuzzy-default-highlight-match-1 candidate pattern diacritics file-comp))) + +(defun helm-fuzzy-highlight-matches (candidates source) + "Highlight matches in CANDIDATES for SOURCE. +The filtered-candidate-transformer function to highlight fuzzy matches. +See `helm-fuzzy-default-highlight-match'." + (cl-assert helm-fuzzy-matching-highlight-fn nil "Wrong type argument functionp: nil") + (cl-loop with diac = (helm-get-attr 'diacritics source) + with file-comp-p = (and (not (helm-action-window)) + (or minibuffer-completing-file-name + (helm-get-attr 'completing-file-name source))) + ;; helm-pattern may have been modified (fuzzy) so ensure to + ;; use helm-input which is the raw pattern. + with pattern = (if file-comp-p + (file-name-nondirectory helm-input) + helm-pattern) + when (string= pattern "") return candidates + for c in candidates + collect (funcall helm-fuzzy-matching-highlight-fn c pattern diac file-comp-p))) + + +;;; helm-flex style +;; +;; Provide the emacs-27 flex style for emacs<27. +;; Reuse the flex scoring algorithm of flex style in emacs-27. +(defun helm-flex--style-score (str regexp &optional score) + "Score STR candidate according to REGEXP. + +REGEXP should be generated from a pattern which is a list like +\\='(point \"f\" any \"o\" any \"b\" any) for \"fob\" as pattern. +Such pattern may be build with +`helm-completion--flex-transform-pattern' function, and the regexp +with `completion-pcm--pattern->regex'. For commodity, +`helm--fuzzy-flex-pattern-to-regexp' is used to build such regexp. + +Function extracted from `completion-pcm--hilit-commonality' in +emacs-27 to provide such scoring in emacs<27." + ;; Don't modify the string itself. + (setq str (copy-sequence str)) + (if (string-match regexp str) + (let* ((md (match-data)) + (start (pop md)) + (len (length str)) + (score-numerator 0) + (score-denominator 0) + (last-b 0) + (update-score + (lambda (a b) + "Update score variables given match range (A B)." + (setq score-numerator (+ score-numerator (- b a))) + (unless (or (= a last-b) + (zerop last-b) + (= a (length str))) + (setq score-denominator (+ score-denominator + 1 + (expt (- a last-b 1) + (/ 1.0 3))))) + (setq last-b b))) + result) + (funcall update-score start start) + (setq md (cdr md)) + (while md + (funcall update-score start (pop md)) + (setq start (pop md))) + (funcall update-score len len) + (unless (zerop (length str)) + (setq result (/ score-numerator (* len (1+ score-denominator)) 1.0)) + (put-text-property 0 1 'completion-score result str)) + (if (and score result) result str)) + (put-text-property 0 1 'completion-score 0.0 str) + (if score 0.0 str))) + + +;;; Matching candidates +;; +;; +(defun helm-match-functions (source) + (let ((matchfns (or (assoc-default 'match source) + (assoc-default 'match-strict source) + #'helm-default-match-function))) + (if (and (listp matchfns) (not (functionp matchfns))) + matchfns (list matchfns)))) + +(defun helm-search-functions (source) + (let ((searchfns (assoc-default 'search source))) + (if (and (listp searchfns) (not (functionp searchfns))) + searchfns (list searchfns)))) + +(defun helm-match-from-candidates (cands matchfns match-part-fn limit source) + (when cands ; nil in async sources. + (condition-case-unless-debug err + (cl-loop with hash = (make-hash-table :test 'equal) + with allow-dups = (assq 'allow-dups source) + with case-fold-search = (helm-set-case-fold-search) + with count = 0 + for iter from 1 + for fn in matchfns + when (< count limit) nconc + (cl-loop for c in cands + for dup = (gethash c hash) + for disp = (helm-candidate-get-display c) + while (< count limit) + for target = (if (helm-get-attr 'match-on-real source) + ;; Let's fails on error in + ;; case next block returns nil. + (or (cdr-safe c) + (get-text-property 0 'helm-realvalue disp)) + disp) + for prop-part = (get-text-property 0 'match-part target) + for part = (and match-part-fn + (or prop-part + (funcall match-part-fn target))) + ;; When allowing dups check if DUP + ;; have been already found in previous loop + ;; by comparing its value with ITER. + when (and (or (and allow-dups dup (= dup iter)) + (null dup)) + (condition-case nil + (funcall fn (or part target)) + (invalid-regexp nil))) + do + (progn + ;; Give as value the iteration number of + ;; inner loop to be able to check if + ;; the duplicate have not been found in previous loop. + (puthash c iter hash) + (helm--maybe-process-filter-one-by-one-candidate c source) + (cl-incf count)) + ;; Filter out nil candidates maybe returned by + ;; `helm--maybe-process-filter-one-by-one-candidate'. + and when c collect + (if (and part (not prop-part)) + (if (consp c) + (cons (propertize target 'match-part part) (cdr c)) + (propertize c 'match-part part)) + c))) + (error (unless (eq (car err) 'invalid-regexp) ; Always ignore regexps errors. + (helm-log-error "helm-match-from-candidates" + "helm-match-from-candidates in source `%s': %s %s" + (assoc-default 'name source) (car err) (cdr err))) + nil)))) + +(defun helm-compute-matches (source) + "Start computing candidates in SOURCE." + (save-current-buffer + (let ((matchfns (helm-match-functions source)) + (matchpartfn (assoc-default 'match-part source)) + (helm--source-name (assoc-default 'name source)) + (helm-current-source source) + (limit (helm-candidate-number-limit source)) + (helm-pattern (helm-process-pattern-transformer + helm-pattern source))) + (helm--fuzzy-match-maybe-set-pattern) + ;; If source have a `filtered-candidate-transformer' attr + ;; Filter candidates with this func, otherwise just compute + ;; candidates. + ;; NOTE that this next block of code is returning nil on async sources, + ;; the candidates being processed directly in `helm-output-filter' + ;; process-filter. + (helm-process-filtered-candidate-transformer + ;; When using in-buffer method or helm-pattern is empty or + ;; using dynamic completion always compute all candidates. + (if (or (equal helm-pattern "") + (assq 'match-dynamic source) + (helm--candidates-in-buffer-p source)) + ;; Compute all candidates up to LIMIT. + ;; one-by-one are computed here only for sources that + ;; display a list of candidates even with an empty + ;; pattern. + (helm--initialize-one-by-one-candidates + (helm-take (helm-get-cached-candidates source) limit) + source) + ;; Compute candidates according to pattern with their match + ;; fns. + ;; one-by-one filtered candidates are computed during the + ;; execution of next loop in `helm-match-from-candidates'. + (helm-match-from-candidates + (helm-get-cached-candidates source) matchfns matchpartfn limit source)) + source)))) + +(defun helm--candidates-in-buffer-p (source) + (assq 'search source)) + +(defun helm-render-source (source matches) + "Display MATCHES from SOURCE according to its settings." + (helm-log "helm-render-source" "Source = %S" (remove (assq 'keymap source) source)) + (when matches + (helm-insert-header-from-source source) + (cl-loop with separate = nil + with start = (point) + with singleline = (null (assq 'multiline source)) + for m in matches + for count from 1 + if singleline + do (helm-insert-match m 'insert count source) + else + do (progn + (if separate + (helm-insert-candidate-separator) + (setq separate t)) + (helm-insert-match m 'insert count source)) + finally (and (null singleline) + (put-text-property start (point) + 'helm-multiline t))))) + +(defmacro helm-while-no-input (&rest body) + "Same as `while-no-input' but returns either BODY or nil. +Unlike `while-no-input' this macro ensure to not returns `t'." + (declare (debug t) (indent 0)) + (let ((catch-sym (make-symbol "input"))) + `(with-local-quit + (catch ',catch-sym + (let ((throw-on-input ',catch-sym) + val) + (setq val (progn ,@body)) + ;; See comments in `while-no-input' about resetting + ;; quit-flag. + (cond ((eq quit-flag throw-on-input) + (setq quit-flag nil)) + (quit-flag nil) + (t val))))))) + +(defmacro helm--maybe-use-while-no-input (&rest body) + "Wrap BODY in `helm-while-no-input' unless initializing a remote connection." + `(progn + (if (and (file-remote-p helm-pattern) + (not (file-remote-p helm-pattern nil t))) + ;; Tramp will ask for passwd, don't use `helm-while-no-input'. + ,@body + (helm-log "helm--maybe-use-while-no-input" + "Using here `helm-while-no-input'") + ;; Emacs bug , unexpected + ;; dbus-event is triggered on dbus init. + ;; Ignoring the dbus-event work on emacs28+; for emacs27 or older + ;; version, require tramp-archive can workaround the issue. + (let ((while-no-input-ignore-events + (and (boundp 'while-no-input-ignore-events) + (cons 'dbus-event while-no-input-ignore-events)))) + (helm-while-no-input ,@body))))) + +(defun helm--collect-matches (src-list) + "Return a list of matches for each source in SRC-LIST. + +The resulting value is a list of lists, e.g. ((a b c) (c d) (e +f)) or (nil nil nil) for three sources when no matches found, +however this function can be interrupted by new input and in this +case returns a plain nil i.e. not (nil), in this case +`helm-update' is not rendering the source, keeping previous +candidates in display." + (let ((matches (helm--maybe-use-while-no-input + (cl-loop for src in src-list + collect (helm-compute-matches src))))) + (unless (eq matches t) matches))) + + +;;; Case fold search +;; +;; +(cl-defun helm-set-case-fold-search (&optional (pattern helm-pattern)) + "Used to set the value of `case-fold-search' in Helm. +Return t or nil depending on the value of `helm-case-fold-search' +and `helm-pattern'." + (if helm-alive-p + (let ((helm-case-fold-search + (helm-aif (assq 'case-fold-search (helm-get-current-source)) + (cdr it) + helm-case-fold-search)) + ;; Only parse basename for filenames + ;; to avoid setting case sensitivity + ;; when expanded directories contains upcase + ;; characters. + (bn-or-pattern (if (string-match "[~/]*" pattern) + (helm-basename pattern) + pattern))) + (helm-set-case-fold-search-1 bn-or-pattern)) + case-fold-search)) + +(defun helm-set-case-fold-search-1 (pattern) + (cl-case helm-case-fold-search + (smart (let ((case-fold-search nil)) + (if (string-match "[[:upper:]]" pattern) nil t))) + (t helm-case-fold-search))) + + +;;; Helm update +;; +(defun helm-update (&optional preselect source candidates) + "Update candidates list in `helm-buffer' based on `helm-pattern'. +Argument PRESELECT is a string or regexp used to move selection +to a particular place after finishing update. +When SOURCE is provided update mode-line for this source, otherwise +the current source will be used. +Argument CANDIDATES when provided is used to redisplay these candidates +without recomputing them, it should be a list of lists." + (helm-log "helm-update" "Start updating") + (helm-kill-async-processes) + ;; When persistent action have been called + ;; we have two windows even with `helm-full-frame'. + ;; So go back to one window when updating if `helm-full-frame' + ;; is non-`nil'. + (when (with-helm-buffer + (and helm-onewindow-p + ;; We are not displaying helm-buffer in a frame and + ;; helm-window is already displayed. + (not helm--buffer-in-new-frame-p) + (helm-window) + (not (helm-action-window)))) + (with-helm-window (delete-other-windows))) + (with-current-buffer (helm-buffer-get) + (set (make-local-variable 'helm-input-local) helm-pattern) + (unwind-protect + (let (sources matches) + ;; Collect sources ready to be updated. + (setq sources + (cl-loop for src in helm-sources + when (helm-update-source-p src) + collect src)) + ;; When no sources to update erase buffer + ;; to avoid duplication of header and candidates + ;; when next chunk of update will arrive, + ;; otherwise the buffer is erased AFTER [1] the results + ;; are computed. + (unless sources (erase-buffer)) + ;; Compute matches without rendering the sources. + ;; This prevent the helm-buffer flickering when constantly + ;; updating. + (helm-log "helm-update" "Matches: %S" + (setq matches (or candidates (helm--collect-matches sources)))) + ;; If computing matches finished and is not interrupted + ;; erase the helm-buffer and render results (Fix #1157). + (when matches ;; nil only when interrupted by while-no-input. + (erase-buffer) ; [1] + (cl-loop for src in sources + for mtc in matches + do (helm-render-source src mtc)) + ;; Move to first line only when there is matches + ;; to avoid cursor moving upside down (Bug#1703). + (helm--update-move-first-line))) + ;; When there is only one async source, update mode-line and run + ;; `helm-after-update-hook' in `helm-output-filter--post-process', + ;; when there is more than one source, update mode-line and run + ;; `helm-after-update-hook' now even if an async source is + ;; present and running in BG. + (let ((src (or source (helm-get-current-source)))) + (unless (assq 'candidates-process src) + (helm-display-mode-line src 'force) + (helm-log-run-hook "helm-update" 'helm-after-update-hook))) + (when preselect + (helm-log "helm-update" "Update preselect candidate %s" preselect) + (if (helm-window) + (with-helm-window (helm-preselect preselect source)) + (helm-preselect preselect source))) + (setq helm--force-updating-p nil) + (helm--reset-update-flag)) + (helm-log "helm-update" "end update"))) + +(defun helm-update-source-p (source) + "Whether SOURCE needs updating or not." + (let ((len (string-width + (if (assq 'multimatch source) + ;; Don't count spaces entered when using + ;; multi-match. + (replace-regexp-in-string " " "" helm-pattern) + helm-pattern)))) + (and (or (not helm-source-filter) + (member (assoc-default 'name source) helm-source-filter)) + (>= len + (helm-aif (assq 'requires-pattern source) (or (cdr it) 1) 0)) + ;; Entering repeatedly these strings (*, ?) takes 100% CPU + ;; and hang emacs on MacOs preventing deleting backward those + ;; characters (Bug#1802). Update: it seems it is no more true, + ;; thus this affect bug#2423, so let's remove this for now. + ;; (not (string-match-p "\\`[*]+\\'" helm-pattern)) + ;; These incomplete regexps hang helm forever + ;; so defer update. Maybe replace spaces quoted when using + ;; multi-match. + (not (member (replace-regexp-in-string "\\s\\ " " " helm-pattern) + helm-update-blacklist-regexps))))) + +(defun helm--update-move-first-line () + "Goto first line of `helm-buffer'." + (goto-char (point-min)) + (if (helm-window) + (helm-move-selection-common :where 'line + :direction 'next + :follow t) + (forward-line 1) + (helm-mark-current-line) + (helm-follow-execute-persistent-action-maybe))) + +(cl-defun helm-force-update (&optional preselect (recenter t)) + "Force recalculation and update of candidates. + +Unlike `helm-update', this function re-evaluates `init' and +`update' attributes when present; also `helm-candidate-cache' is +not reinitialized, meaning candidates are not recomputed unless +pattern has changed. + +Selection is preserved to current candidate if it still exists after +update or moved to PRESELECT, if specified. +The helm-window is re-centered at the end when RECENTER is t which +is the default. RECENTER can be also a number in this case it is +passed as argument to `recenter'." + (with-helm-buffer + (let* ((source (helm-get-current-source)) + (selection (helm-aif (helm-get-selection nil t source) + (regexp-quote it)))) + (setq helm--force-updating-p t) + (mapc 'helm-force-update--reinit helm-sources) + (helm-update (or preselect selection) source) + (when (and (helm-window) recenter) + (with-helm-window + (recenter (and (numberp recenter) recenter))))))) + +(defun helm-refresh () + "Force recalculation and update of candidates." + (interactive) + (with-helm-alive-p + (helm-force-update))) +(put 'helm-refresh 'helm-only t) + +(defun helm-force-update--reinit (source) + "Reinit SOURCE by calling its update and init functions." + ;; When using a specific buffer as cache, don't kill it. + (helm-aif (and (null (bufferp (assoc-default + (helm-get-attr 'name source) + helm--candidate-buffer-alist))) + (helm-apply-functions-from-source + source 'helm-candidate-buffer)) + (kill-buffer it)) + (dolist (attr '(update init)) + (helm-aif (assoc-default attr source) + (helm-apply-functions-from-source source it))) + (helm-remove-candidate-cache source)) + +(defun helm-redisplay-buffer () + "Redisplay candidates in `helm-buffer'. + +Candidates are not recomputed, only redisplayed after modifying +the whole list of candidates in each source with functions found +in `redisplay' attribute of current source. Note that candidates +are redisplayed with their display part with all properties +included only. This function is used in async sources to +transform the whole list of candidates from the sentinel +functions (i.e. when all candidates have been computed) because +other filters like `candidate-transformer' are modifying only +each chunk of candidates from `process-filter' as they come in +and not the whole list. Use this for e.g. sorting the whole list +of async candidates once computed. + +Note: To ensure redisplay is done in async sources after Helm +reached `candidate-number-limit' you will have also to redisplay +your candidates from `helm-async-outer-limit-hook'." + (with-helm-buffer + (let ((get-cands (lambda (source) + (let ((fns (assoc-default 'redisplay source)) + candidates + helm-move-to-line-cycle-in-source + helm-allow-mouse) + (helm-goto-source source) + (helm-next-line) + (helm-awhile (condition-case-unless-debug nil + (and (not (helm-pos-header-line-p)) + (helm-get-selection + nil 'withprop source)) + (error nil)) + (push it candidates) + (when (save-excursion + (forward-line 1) (helm-end-of-source-p t)) + (cl-return nil)) + (helm-next-line)) + (helm-apply-functions-from-source + source fns (nreverse candidates))))) + (get-sources (lambda () + (let (sources helm-move-to-line-cycle-in-source) + (helm-awhile (helm-get-current-source) + (push it sources) + (when (save-excursion + (helm-move--end-of-source) + (forward-line 1) (eobp)) + (cl-return nil)) + (helm-next-source)) + (nreverse sources))))) + (goto-char (point-min)) + (helm-update nil (helm-get-current-source) + (cl-loop with sources = (funcall get-sources) + for s in helm-sources + for name = (assoc-default 'name s) collect + (when (cl-loop for src in sources thereis + (string= name + (assoc-default 'name src))) + (funcall get-cands s))))))) + +(defun helm-remove-candidate-cache (source) + "Remove SOURCE from `helm-candidate-cache'." + (remhash (assoc-default 'name source) helm-candidate-cache)) + +(defvar helm-drag-mouse-1-fn 'ignore) +(defun helm-insert-match (match insert-function &optional num source) + "Insert MATCH into `helm-buffer' with INSERT-FUNCTION. +If MATCH is a cons cell then insert the car as display with the +cdr stored as real value in a `helm-realvalue' text property. +Args NUM and SOURCE are also stored as text property when +specified as respectively `helm-cand-num' and `helm-cur-source'." + (let ((start (pos-bol (point))) + (dispvalue (helm-candidate-get-display match)) + (realvalue (cdr-safe match)) + (map (when helm-allow-mouse (make-sparse-keymap))) + (inhibit-read-only t) + end) + (when (and (stringp dispvalue) + (not (zerop (length dispvalue)))) + (funcall insert-function dispvalue) + (setq end (pos-eol)) + ;; Some strings may handle another keymap prop. + (remove-text-properties start end '(keymap nil)) + (put-text-property start end 'read-only nil) + ;; Some sources with candidates-in-buffer have already added + ;; 'helm-realvalue property when creating candidate buffer. + (unless (get-text-property start 'helm-realvalue) + (and realvalue + (put-text-property start end + 'helm-realvalue realvalue))) + (when map + (define-key map [drag-mouse-1] 'ignore) + (define-key map [mouse-1] 'helm-mouse-select-candidate) + (define-key map [mouse-2] 'ignore) + (define-key map [mouse-3] 'helm-menu-select-action) + (add-text-properties + start end + `(mouse-face highlight + keymap ,map + help-echo ,(helm-acase (get-text-property start 'help-echo) + ((guard (stringp it)) + (concat it "\nmouse-1: select candidate\nmouse-3: menu actions")) + (t "mouse-1: select candidate\nmouse-3: menu actions"))))) + (when num + (put-text-property start end 'helm-cand-num num)) + (when source + (put-text-property start end 'helm-cur-source source)) + (funcall insert-function "\n")))) + +(defun helm--mouse-reset-selection-help-echo () + (let* ((inhibit-read-only t) + (start (overlay-start helm-selection-overlay)) + (end (overlay-end helm-selection-overlay)) + (help-echo (get-text-property start 'help-echo))) + (when (and (stringp help-echo) + (string-match "mouse-2: execute action" help-echo)) + (put-text-property + start end + 'help-echo (replace-match "mouse-1: select candidate" + t t help-echo))))) + +(defun helm--bind-mouse-for-selection (pos) + (let ((inhibit-read-only t) + (map (get-text-property pos 'keymap))) + (when map + (define-key map [drag-mouse-1] helm-drag-mouse-1-fn) + (define-key map [mouse-2] 'helm-maybe-exit-minibuffer) + (put-text-property + helm-selection-point + (overlay-end helm-selection-overlay) + 'help-echo (helm-aif (get-text-property pos 'help-echo) + (if (and (stringp it) + (string-match "mouse-1: select candidate" it)) + (replace-match "mouse-2: execute action" t t it) + "mouse-2: execute action\nmouse-3: menu actions") + "mouse-2: execute action\nmouse-3: menu actions"))))) + +(defun helm-mouse-select-candidate (event) + (interactive "e") + (let* ((window (posn-window (event-end event))) + (pos (posn-point (event-end event)))) + (unwind-protect + (with-current-buffer (window-buffer window) + (if (and (helm-action-window) + (eql window (get-buffer-window helm-buffer))) + (user-error "selection in helm-window not available while selecting action") + (helm--mouse-reset-selection-help-echo) + (goto-char pos) + (when (helm-pos-multiline-p) + (goto-char (or (helm-get-previous-candidate-separator-pos) + (helm-get-previous-header-pos))) + (forward-line 1))) + (helm-mark-current-line) + (helm-follow-execute-persistent-action-maybe)) + (select-window (minibuffer-window)) + (set-buffer (window-buffer window))))) +(put 'helm-mouse-select-candidate 'helm-only t) + +(defun helm-insert-header-from-source (source) + "Insert SOURCE name in `helm-buffer' header. +Maybe insert, by overlay, additional info after the source name +if SOURCE has header-name attribute." + (let ((name (assoc-default 'name source))) + (helm-insert-header + name + (helm-aif (assoc-default 'header-name source) + (helm-apply-functions-from-source source it name))))) + +(defun helm-insert-header (name &optional display-string) + "Insert header of source NAME into the helm buffer. +If DISPLAY-STRING is non-nil and a string value then display this +additional info after the source name by overlay." + (unless (bobp) + (let ((start (point))) + (insert (propertize "\n" 'face 'helm-eob-line)) + (put-text-property start (point) 'helm-header-separator t))) + (let ((start (point))) + (insert name) + (put-text-property (pos-bol) + (pos-eol) 'helm-header t) + (when display-string + (overlay-put (make-overlay (pos-bol) (pos-eol)) + 'display display-string)) + (insert "\n") + (add-text-properties start (point) '(face helm-source-header + ;; Disable line numbers on + ;; source headers. + display-line-numbers-disable t)))) + +(defun helm-insert-candidate-separator () + "Insert separator of candidates into the Helm buffer." + (insert (propertize helm-candidate-separator 'face 'helm-separator)) + (put-text-property (pos-bol) + (pos-eol) 'helm-candidate-separator t) + (insert "\n")) + +(defun helm-init-relative-display-line-numbers () + "Enable `display-line-numbers' for Helm buffers. +This is intended to be added to `helm-after-initialize-hook'. +This will work only in Emacs-26+, i.e. Emacs versions that have +`display-line-numbers-mode'." + (when (boundp 'display-line-numbers) + (with-helm-buffer + (setq display-line-numbers 'relative)))) + +(define-minor-mode helm-display-line-numbers-mode + "Toggle display of line numbers in current Helm buffer." + :group 'helm + (with-helm-alive-p + (cl-assert (boundp 'display-line-numbers) nil + "`display-line-numbers' not available") + (if helm-display-line-numbers-mode + (with-helm-buffer + (setq display-line-numbers 'relative)) + (with-helm-buffer + (setq display-line-numbers nil))))) +(put 'helm-display-line-numbers-mode 'helm-only t) + + + +;;; Async process +;; +(defun helm-output-filter (process output-string) + "The `process-filter' function for Helm async sources." + (with-local-quit + (helm-output-filter-1 (assoc process helm-async-processes) output-string))) + +(defun helm-output-filter-1 (process-assoc output-string) + (helm-log "helm-output-filter-1" "output-string = %S" output-string) + (with-current-buffer helm-buffer + (let ((source (cdr process-assoc))) + (save-excursion + (helm-aif (assoc-default 'insertion-marker source) + (goto-char it) + (goto-char (point-max)) + (helm-insert-header-from-source source) + (setcdr process-assoc + (append source `((insertion-marker . ,(point-marker)))))) + (helm-output-filter--process-source + (car process-assoc) output-string source + (helm-candidate-number-limit source)))) + (helm-output-filter--post-process))) + +(defun helm-output-filter--process-source (process output-string source limit) + (cl-dolist (candidate (helm-transform-candidates + (helm-output-filter--collect-candidates + (split-string output-string + helm-process-output-split-string-separator) + (assq 'incomplete-line source)) + source t)) + (setq candidate + (helm--maybe-process-filter-one-by-one-candidate candidate source)) + (if (assq 'multiline source) + (let ((start (point))) + (helm-insert-candidate-separator) + (helm-insert-match candidate 'insert-before-markers + (1+ (cdr (assq 'item-count source))) + source) + (put-text-property start (point) 'helm-multiline t)) + (helm-insert-match candidate 'insert-before-markers + (1+ (cdr (assq 'item-count source))) + source)) + (cl-incf (cdr (assq 'item-count source))) + (when (>= (assoc-default 'item-count source) limit) + (helm-kill-async-process process) + (helm-log-run-hook "helm-output-filter--process-source" + 'helm-async-outer-limit-hook) + (cl-return)))) + +(defun helm-output-filter--collect-candidates (lines incomplete-line-info) + "Collect LINES maybe completing the truncated first and last lines." + ;; The output of process may come in chunks of any size, so the last + ;; line of LINES could be truncated, this truncated line is stored + ;; in INCOMPLETE-LINE-INFO to be concatenated with the first + ;; incomplete line of the next arriving chunk. INCOMPLETE-LINE-INFO + ;; is an attribute of source; it is created with an empty string + ;; when the source is computed => (incomplete-line . "") + (helm-log "helm-output-filter--collect-candidates" + "incomplete-line-info = %S" (cdr incomplete-line-info)) + (butlast + (cl-loop for line in lines + ;; On start `incomplete-line-info' value is empty string. + for newline = (helm-aif (cdr incomplete-line-info) + (prog1 + (concat it line) + (setcdr incomplete-line-info nil)) + line) + collect newline + ;; Store last incomplete line (last chunk truncated) until + ;; new output arrives. Previously storing 'line' in + ;; incomplete-line-info assumed output was truncated in + ;; only two chunks. But output could be large and + ;; truncated in more than two chunks. Therefore store + ;; 'newline' to contain the previous chunks (Bug#1187). + finally do (setcdr incomplete-line-info newline)))) + +(defun helm-output-filter--post-process () + (helm-aif (get-buffer-window helm-buffer 'visible) + (with-selected-window it + (helm-skip-noncandidate-line 'next) + (helm-mark-current-line nil 'nomouse) + ;; FIXME Don't hardcode follow delay. + (helm-follow-execute-persistent-action-maybe 0.5) + (helm-display-mode-line (helm-get-current-source)) + (helm-log-run-hook "helm-output-filter--post-process" + 'helm-after-update-hook) + (helm--reset-update-flag)))) + +(defun helm-process-deferred-sentinel-hook (process event file) + "Defer remote processes in sentinels. +Meant to be called at the beginning of a sentinel process +function." + (when (and (not (zerop helm-tramp-connection-min-time-diff)) + (string= event "finished\n") + (or (file-remote-p file) + ;; `helm-suspend-update-flag' + ;; is non-`nil' here only during a + ;; running process, this will never be called + ;; when user set it explicitly with `C-!'. + helm-suspend-update-flag)) + (setq helm-suspend-update-flag t) + ;; Kill the process but don't delete entry in + ;; `helm-async-processes'. + (helm-kill-async-process process) + ;; When tramp opens the same connection twice in less than 5 + ;; seconds, it throws 'suppress, which calls the real-handler on + ;; the main "Emacs". To avoid this [1] helm waits for 5 seconds + ;; before updates yet allows user input during this delay. [1] In + ;; recent Emacs versions, this has been fixed so tramp returns nil + ;; in such conditions. Note: `tramp-connection-min-time-diff' cannot + ;; have values less than 5 seconds otherwise the process dies. + (run-at-time helm-tramp-connection-min-time-diff + nil (lambda () + (when helm-alive-p ; Don't run timer fn after quit. + (setq helm-suspend-update-flag nil) + (helm-check-minibuffer-input)))))) + +(defun helm-kill-async-processes () + "Kill all asynchronous processes registered in `helm-async-processes'." + (while helm-async-processes + (helm-kill-async-process (caar helm-async-processes)) + (setq helm-async-processes (cdr helm-async-processes)))) + +(defun helm-kill-async-process (process) + "Stop output from `helm-output-filter' and kill associated PROCESS." + (set-process-filter process nil) + (delete-process process)) + + +;;; Actions +;; +(defun helm-execute-selection-action () + "Execute current action." + (helm-log-run-hook "helm-execute-selection-action" + 'helm-before-action-hook) + ;; Position can be change when `helm-current-buffer' + ;; is split, so jump to this position before executing action. + (helm-current-position 'restore) + (unwind-protect + (prog1 (helm-execute-selection-action-1) + (helm-log-run-hook "helm-execute-selection-action" + 'helm-after-action-hook)) + (setq helm--executing-helm-action nil))) + +(defun helm-execute-selection-action-1 (&optional + selection action + preserve-saved-action) + "Execute ACTION on current SELECTION. +If PRESERVE-SAVED-ACTION is non-nil, then save the action." + (helm-log "helm-execute-selection-action-1" "executing action") + (setq action (helm-get-default-action + (or action + helm-saved-action + (if (get-buffer helm-action-buffer) + (helm-get-selection helm-action-buffer) + (helm-get-actions-from-current-source))))) + (helm-aif (and (not helm-in-persistent-action) + (get-buffer helm-action-buffer)) + (kill-buffer it)) + (let ((source (or helm-saved-current-source + (helm-get-current-source))) + non-essential) + (setq selection (helm-coerce-selection + (or selection + helm-saved-selection + (helm-get-selection nil nil source) + (and (assq 'accept-empty source) "")) + source)) + (unless preserve-saved-action (setq helm-saved-action nil)) + (when (and selection action) (funcall action selection)))) + +(defun helm-coerce-selection (selection source) + "Apply coerce attribute function to SELECTION in SOURCE. +Coerce source with coerce function." + (helm-aif (assoc-default 'coerce source) + (helm-apply-functions-from-source source it selection) + selection)) + +(defun helm-get-default-action (action) + "Get the first ACTION value of action list in source." + (if (and (listp action) (not (functionp action))) + (cdar action) + action)) + +(defun helm--show-action-window-other-window-p () + "Decide if window layout is suitable for showing action buffer. +Note that the return value is meaningful only at some point in the code, +i.e. before displaying action menu." + (when helm-show-action-window-other-window + ;; We were previously checking helm-split-window-state (eq vertical) to + ;; decide to show action window, we now show it inconditionally in such case + ;; but 'below'. + (if (< (window-width (helm-window)) + (or split-width-threshold 160)) + 'below + helm-show-action-window-other-window))) + +(defun helm-select-action () + "Select an action for the currently selected candidate. +If action buffer is selected, back to the Helm buffer." + (interactive) + (with-helm-alive-p + (let ((src (helm-get-current-source))) + (helm-log-run-hook "helm-select-action" 'helm-select-action-hook) + (setq helm-saved-selection (helm-get-selection nil nil src)) + (with-selected-frame (with-helm-window (selected-frame)) + (prog1 + (helm-acond ((get-buffer-window helm-action-buffer 'visible) + (let ((delta (window-total-height it))) + (set-window-buffer it helm-buffer) + (helm--set-action-prompt 'restore) + ;; If `helm-show-action-window-other-window' is non nil + ;; we should have now two windows displaying + ;; helm-buffer, delete the one that was handling + ;; previously action buffer. + (when (helm--show-action-window-other-window-p) + (delete-window it)) + ;; Resize window on horizontal split, though for some + ;; reasons only 'above' needs to be resized. + (when (memq helm-show-action-window-other-window '(below above)) + (window-resize (get-buffer-window helm-buffer) delta)) + (kill-buffer helm-action-buffer) + (setq helm-saved-selection nil) + (helm-set-pattern helm-input 'noupdate) + ;; Maybe hide minibuffer if helm was showing + ;; minibuffer in header-line and we are just toggling + ;; menu [1]. + (helm-hide-minibuffer-maybe))) + (helm-saved-selection + (setq helm-saved-current-source src) + (let ((actions (helm-get-actions-from-current-source src)) + helm-onewindow-p) + (if (functionp actions) + (message "Sole action: %s" + (if (or (consp actions) + (byte-code-function-p actions) + (helm-subr-native-elisp-p actions)) + "Anonymous" actions)) + (helm-show-action-buffer actions) + ;; Be sure the minibuffer is entirely deleted (bug#907). + (helm--delete-minibuffer-contents-from "") + ;; Unhide minibuffer to make visible action prompt [1]. + (with-selected-window (minibuffer-window) + (remove-overlays) (setq cursor-type t)) + (helm--set-action-prompt) + (helm-check-minibuffer-input)))) + (t (message "No Actions available"))) + (helm-display-mode-line (helm-get-current-source)) + (run-hooks 'helm-window-configuration-hook)))))) +(put 'helm-select-action 'helm-only t) + +(defun helm-menu-select-action (_event) + "Popup action menu from mouse-3." + (interactive "e") + (if (get-buffer-window helm-action-buffer 'visible) + (helm-select-action) + (let ((src (helm-get-current-source))) + (helm-aif (helm-get-actions-from-current-source src) + (progn + (setq helm-saved-current-source src) + (if (functionp it) + (message "Sole action: %s" + (if (or (consp it) + (byte-code-function-p it) + (helm-subr-native-elisp-p it)) + "Anonymous" it)) + (setq helm-saved-action + (x-popup-menu + t (list "Available Actions" + (cons "" it)))) + (helm-maybe-exit-minibuffer)) + (message "No Actions available")))))) +(put 'helm-menu-select-action 'helm-only t) + +(defun helm--set-action-prompt (&optional restore) + (with-selected-window (minibuffer-window) + (let ((inhibit-read-only t) + (props '(face minibuffer-prompt + field t + read-only t + rear-nonsticky t + front-sticky t)) + (prt (if restore helm--prompt helm--action-prompt))) + (erase-buffer) + (insert (apply #'propertize prt props)) + ;; Restore minibuffer depth indicator if the mode is enabled. + (when minibuffer-depth-indicate-mode + (minibuffer-depth-setup))))) + +(defun helm-show-action-buffer (actions) + (with-current-buffer (get-buffer-create helm-action-buffer) + (erase-buffer) + (buffer-disable-undo) + (setq cursor-type nil) + ;; Maybe display action buffer 'below' if window isn't large enough + ;; (bug#2635). + (set-window-buffer (helm-aif (helm--show-action-window-other-window-p) + (split-window (get-buffer-window helm-buffer) nil it) + (get-buffer-window helm-buffer)) + helm-action-buffer) + (set (make-local-variable 'helm-sources) + (list + (helm-build-sync-source "Actions" + :volatile t + :nomark t + :persistent-action #'ignore + :persistent-help "DoNothing" + :keymap 'helm-map + :candidates actions + :mode-line '("Action(s)" "\\\\[helm-select-action]:BackToCands RET/f1/f2/fn:NthAct") + :candidate-transformer + (lambda (candidates) + (cl-loop for (i . j) in candidates + for count from 1 + collect + (cons (concat (cond ((> count 12) + " ") + ((< count 10) + (format "[f%s] " count)) + (t (format "[f%s] " count))) + (propertize i 'face 'helm-action)) + j))) + :candidate-number-limit nil))) + (set (make-local-variable 'helm-source-filter) nil) + (set (make-local-variable 'helm-selection-overlay) nil) + (helm-initialize-overlays helm-action-buffer))) + + +;; Selection of candidates + +(defun helm-display-source-at-screen-top-maybe (unit) + "Display source at the top of screen when UNIT value is \\='source. +Return nil for any other value of UNIT." + (when (and helm-display-source-at-screen-top (eq unit 'source)) + (set-window-start (selected-window) + (save-excursion (forward-line -1) (point))))) + +(defun helm-skip-noncandidate-line (direction) + "Skip source header or candidates separator when going in DIRECTION. +DIRECTION is either \\='next or \\='previous. +Same as `helm-skip-header-and-separator-line' but ensure point is +moved to the right place when at bob or eob." + (helm-skip-header-and-separator-line direction) + (and (bobp) (forward-line 1)) ; Skip first header. + (and (eobp) (forward-line -1))) ; Avoid last empty line. + +(defun helm-skip-header-and-separator-line (direction) + "Skip source header or candidate separator when going to next/previous line. +DIRECTION is either \\='next or \\='previous." + (let ((fn (cl-ecase direction + (next 'eobp) + (previous 'bobp)))) + (while (and (not (funcall fn)) + (or (helm-pos-header-line-p) + (helm-pos-candidate-separator-p))) + (forward-line (if (and (eq direction 'previous) + (not (eq (pos-bol) (point-min)))) + -1 1))))) + +(defun helm-display-mode-line (source &optional force) + "Set up mode-line and header-line for `helm-buffer'. + +SOURCE is a Helm source object. + +Optional argument FORCE forces redisplay of the Helm buffer's +mode and header lines." + (set (make-local-variable 'helm-mode-line-string) + (helm-interpret-value (or (and (listp source) ; Check if source is empty. + (assoc-default 'mode-line source)) + (default-value 'helm-mode-line-string)) + source)) + (let ((follow (and (or (helm-follow-mode-p source) + (and helm-follow-mode-persistent + (member (assoc-default 'name source) + helm-source-names-using-follow))) + " (HF)")) + (marked (and helm-marked-candidates + (cl-loop with cur-name = (assoc-default 'name source) + for c in helm-marked-candidates + for name = (assoc-default 'name (car c)) + when (string= name cur-name) + collect c)))) + ;; Setup mode-line. + (if helm-mode-line-string + (setq mode-line-format + `(:propertize + (" " mode-line-buffer-identification " " + (:eval (format "L%-3d" (helm-candidate-number-at-point))) + ,follow + " " + (:eval ,(and marked + (propertize + (format "M%d" (length marked)) + 'face 'helm-visible-mark))) + (:eval (when ,helm--mode-line-display-prefarg + (let ((arg (prefix-numeric-value + (or prefix-arg current-prefix-arg)))) + (unless (= arg 1) + (propertize (format " [prefarg:%s]" arg) + 'face 'helm-prefarg))))) + " " + (:eval (with-helm-buffer + (helm-show-candidate-number + (car-safe helm-mode-line-string)))) + " " helm--mode-line-string-real " " + (:eval (make-string (window-width) ? ))) + keymap (keymap (mode-line keymap + (mouse-1 . ignore) + (down-mouse-1 . ignore) + (drag-mouse-1 . ignore) + (mouse-2 . ignore) + (down-mouse-2 . ignore) + (drag-mouse-2 . ignore) + (mouse-3 . ignore) + (down-mouse-3 . ignore) + (drag-mouse-3 . ignore)))) + helm--mode-line-string-real + (substitute-command-keys (if (listp helm-mode-line-string) + (cadr helm-mode-line-string) + helm-mode-line-string))) + (setq mode-line-format (default-value 'mode-line-format))) + ;; Setup header-line. + (cond (helm-echo-input-in-header-line + (setq force t) + (helm--set-header-line)) + (helm-display-header-line + (let ((hlstr (helm-interpret-value + (and (listp source) + (assoc-default 'header-line source)) + source)) + (endstr (make-string (window-width) ? ))) + (setq header-line-format + (propertize (concat " " hlstr endstr) + 'face 'helm-header)))))) + (when force (force-mode-line-update))) + +(defun helm--set-header-line (&optional update) + (with-selected-window (minibuffer-window) + (when helm-display-header-line + ;; Prevent cursor movement over the overlay displaying + ;; persistent-help in minibuffer (Bug#2108). + (setq-local disable-point-adjustment t)) + (let* ((beg (save-excursion (vertical-motion 0 (helm-window)) (point))) + (end (save-excursion (end-of-visual-line) (point))) + ;; The visual line where the cursor is. + (cont (buffer-substring beg end)) + (pref (propertize + " " + 'display (if (string-match-p (regexp-opt `(,helm--prompt + ,helm--action-prompt)) + cont) + `(space :width ,helm-header-line-space-before-prompt) + (propertize + "->" + 'face 'helm-header-line-left-margin)))) + (pos (- (point) beg))) + ;; Increment pos each time we find a "%" up to current-pos (bug#1648). + (cl-loop for c across (buffer-substring-no-properties beg (point)) + when (eql c ?%) do (cl-incf pos)) + ;; Increment pos when cursor is on a "%" to make it visible in header-line + ;; i.e "%%|" and not "%|%" (bug#1649). + (when (eql (char-after) ?%) (setq pos (1+ pos))) + (setq cont (replace-regexp-in-string "%" "%%" cont)) + (with-helm-buffer + (setq header-line-format (concat pref cont " ")) + (funcall helm-default-prompt-display-function pos) + (when update (force-mode-line-update)))))) + +(defun helm-set-default-prompt-display (pos) + (put-text-property + ;; Increment pos to handle the space before prompt (i.e `pref'). + (+ 1 pos) (+ 2 pos) + 'face + ;; Don't just use cursor face, this can hide the current character. + (list :inverse-video t + :foreground (face-background 'cursor) + :background (face-background 'default)) + header-line-format)) + +(defun helm-exchange-minibuffer-and-header-line () + "Display minibuffer in header-line and vice versa for current Helm session. + +This is a toggle command." + (interactive) + (cl-assert (not (eq (helm-get-attr 'echo-input-in-header-line) 'never)) + nil "echo-input-in-header-line not allowed in this source") + (with-helm-window + (add-hook 'helm-minibuffer-set-up-hook 'helm-hide-minibuffer-maybe) + (setq-local helm-echo-input-in-header-line + (not helm-echo-input-in-header-line)) + (with-selected-window (minibuffer-window) + (if (with-helm-buffer helm-echo-input-in-header-line) + (helm-hide-minibuffer-maybe) + (remove-overlays) + (setq cursor-type t))) + (helm-display-mode-line (helm-get-current-source) t))) +(put 'helm-exchange-minibuffer-and-header-line 'helm-only t) + +(defun helm--update-header-line () + ;; This should be used in `post-command-hook', + ;; nowhere else. + (when (with-helm-buffer helm-echo-input-in-header-line) + (helm--set-header-line t))) + +;; We were previously let-binding `resize-mini-windows' in +;; `helm-read-from-minibuffer', this to prevent minibuffer resizing when +;; inserting multiline string in fake minibuffer (header-line). +;; I seems it had no effect see bug#2638. +(defun helm-hide-minibuffer-maybe () + "Hide minibuffer contents in a Helm session. +This function should normally go to `helm-minibuffer-set-up-hook'. +It has no effect if `helm-echo-input-in-header-line' is nil." + (when (with-helm-buffer helm-echo-input-in-header-line) + (let ((ov (make-overlay (point-min) (point-max) nil nil t))) + (overlay-put ov 'window (selected-window)) + (helm-aif (and helm-display-header-line + (helm-get-attr 'persistent-help)) + (progn + (overlay-put ov 'display + (truncate-string-to-width + (substitute-command-keys + (concat "\\\\[helm-execute-persistent-action]: " + (format "%s (keeping session)" it))) + (- (window-width) 1))) + (overlay-put ov 'face 'helm-header)) + (overlay-put ov 'face (let ((bg-color (face-background 'default nil))) + `(:background ,bg-color :foreground ,bg-color)))) + + (setq cursor-type nil)))) + +(defun helm-show-candidate-number (&optional name) + "Used to display candidate number in mode-line. +You can specify NAME of candidates e.g. \"Buffers\" otherwise it +is \"Candidate(s)\" by default." + (when helm-alive-p + (unless (helm-empty-source-p) + ;; Build a fixed width string when candidate-number < 1000 + (let* ((cand-name (or name "Candidate(s)")) + (width (length (format "[999 %s]" cand-name)))) + (propertize + (format (concat "%-" (number-to-string width) "s") + (format "[%s %s]" + (helm-get-candidate-number 'in-current-source) + cand-name)) + 'face (if helm-suspend-update-flag + 'helm-candidate-number-suspended + 'helm-candidate-number)))))) + +(cl-defun helm-move-selection-common (&key where direction (follow t)) + "Move the selection marker to a new position. +Position is determined by WHERE and DIRECTION. +Key arg WHERE can be one of: + - line + - page + - edge + - source +Key arg DIRECTION can be one of: + - previous + - next + - A source or a source name when used with :WHERE \\='source." + (let ((move-func (cl-case where + (line (cl-ecase direction + (previous 'helm-move--previous-line-fn) + (next 'helm-move--next-line-fn))) + (page (cl-ecase direction + (previous 'helm-move--previous-page-fn) + (next 'helm-move--next-page-fn))) + (edge (cl-ecase direction + (previous 'helm-move--beginning-of-buffer-fn) + (next 'helm-move--end-of-buffer-fn))) + (source (cl-case direction + (previous 'helm-move--previous-source-fn) + (next 'helm-move--next-source-fn) + (t (lambda () ; A source is passed as DIRECTION arg. + (helm-move--goto-source-fn direction))))))) + source) + (unless (or (helm-empty-buffer-p (helm-buffer-get)) + (not (helm-window))) + (with-helm-window + (when helm-allow-mouse + (helm--mouse-reset-selection-help-echo)) + (helm-log-run-hook "helm-move-selection-common" + 'helm-move-selection-before-hook) + (funcall move-func) + (and (memq direction '(next previous)) + (helm-skip-noncandidate-line direction)) + (when (helm-pos-multiline-p) + (helm-move--beginning-of-multiline-candidate)) + (helm-display-source-at-screen-top-maybe where) + (helm-mark-current-line) + (when follow + (helm-follow-execute-persistent-action-maybe)) + (helm-display-mode-line (setq source (helm-get-current-source))) + (helm-log-run-hook "helm-move-selection-common" + 'helm-move-selection-after-hook) + (helm--set-minibuffer-completion-confirm source))))) + +(defun helm-move--beginning-of-multiline-candidate () + (let ((header-pos (helm-get-previous-header-pos)) + (separator-pos (helm-get-previous-candidate-separator-pos))) + (when header-pos + (goto-char (if (or (null separator-pos) + (< separator-pos header-pos)) + header-pos + separator-pos)) + (forward-line 1)))) + +(defun helm-move--previous-multi-line-fn () + (forward-line -1) + (unless (helm-pos-header-line-p) + (helm-skip-header-and-separator-line 'previous) + (helm-move--beginning-of-multiline-candidate))) + +(defun helm-move--previous-line-fn () + (if (not (helm-pos-multiline-p)) + (forward-line -1) + (helm-move--previous-multi-line-fn)) + (when (and helm-move-to-line-cycle-in-source + (helm-pos-header-line-p)) + (forward-line 1) + (helm-move--end-of-source) + ;; We are at end of helm-buffer + ;; check if last candidate is a multiline candidate + ;; and jump to it + (when (and (eobp) + (save-excursion (forward-line -1) (helm-pos-multiline-p))) + (helm-move--previous-multi-line-fn)))) + +(defun helm-move--next-multi-line-fn () + (let ((header-pos (helm-get-next-header-pos)) + (separator-pos (helm-get-next-candidate-separator-pos))) + (cond ((and separator-pos + (or (null header-pos) (< separator-pos header-pos))) + (goto-char separator-pos)) + (header-pos + (goto-char header-pos))))) + +(defun helm-move--next-line-fn () + (if (not (helm-pos-multiline-p)) + (forward-line 1) + (helm-move--next-multi-line-fn)) + (when (and helm-move-to-line-cycle-in-source + (or (save-excursion (and (helm-pos-multiline-p) + (goto-char (overlay-end + helm-selection-overlay)) + (helm-end-of-source-p t))) + (helm-end-of-source-p t))) + (helm-move--beginning-of-source) + (helm-display-source-at-screen-top-maybe 'source))) + +(defun helm-move--previous-page-fn () + (condition-case nil + (scroll-down helm-scroll-amount) + (beginning-of-buffer (goto-char (point-min))))) + +(defun helm-move--next-page-fn () + (condition-case nil + (scroll-up helm-scroll-amount) + (end-of-buffer (goto-char (point-max))))) + +(defun helm-move--beginning-of-buffer-fn () + (goto-char (point-min))) + +(defun helm-move--end-of-buffer-fn () + (goto-char (point-max))) + +(defun helm-move--end-of-source () + (helm-aif (helm-get-next-header-pos) + (progn (goto-char it) (forward-line -2)) + (goto-char (point-max)))) + +(defun helm-move--beginning-of-source () + (helm-aif (helm-get-previous-header-pos) + (progn (goto-char it) + (forward-line 1)) + (goto-char (point-min)))) + +(defun helm-move--previous-source-fn () + (forward-line -1) + (if (bobp) + (goto-char (point-max)) + (helm-skip-header-and-separator-line 'previous)) + (goto-char (helm-get-previous-header-pos)) + (forward-line 1)) + +(defun helm-move--next-source-fn () + (goto-char (or (and (not (save-excursion + (forward-line 1) (eobp))) + ;; Empty source at eob are just + ;; not displayed unless they are dummy. + ;; Bug#1117. + (helm-get-next-header-pos)) + (point-min)))) + +(defun helm-move--goto-source-fn (source-or-name) + (goto-char (point-min)) + (let ((name (if (stringp source-or-name) + source-or-name + (assoc-default 'name source-or-name)))) + (if (or (null name) (string= name "")) + (forward-line 1) + (condition-case err + (while (not (string= name (helm-current-line-contents))) + (goto-char (helm-get-next-header-pos))) + (error (helm-log "helm-move--goto-source-fn" "%S" err)))))) + +(defun helm-candidate-number-at-point () + (if helm-alive-p + (with-helm-buffer + (or (get-text-property (point) 'helm-cand-num) 1)) + (or (get-text-property (point) 'helm-cand-num) 1))) + +(defun helm--next-or-previous-line (direction &optional arg) + ;; Be sure to not use this in non--interactives calls. + (let ((helm-move-to-line-cycle-in-source + (and helm-move-to-line-cycle-in-source arg))) + (if (and arg (> arg 1)) + (cl-loop with pos = (helm-candidate-number-at-point) + with cand-num = (helm-get-candidate-number t) + with iter = (min arg (if (eq direction 'next) + (- cand-num pos) + (min arg (1- pos)))) + for count from 1 + while (<= count iter) + do + (helm-move-selection-common :where 'line :direction direction)) + (helm-move-selection-common :where 'line :direction direction)))) + +(defun helm-previous-line (&optional arg) + "Move selection to the ARG previous line(s). +Same behavior as `helm-next-line' when called with a numeric +prefix arg." + (interactive "p") + (with-helm-alive-p + (helm--next-or-previous-line 'previous arg))) +(put 'helm-previous-line 'helm-only t) + +(defun helm-next-line (&optional arg) + "Move selection to the next ARG line(s). +When numeric prefix arg is > than the number of candidates, then +move to the last candidate of current source (i.e. don't move to +next source)." + (interactive "p") + (with-helm-alive-p + (helm--next-or-previous-line 'next arg))) +(put 'helm-next-line 'helm-only t) + +(defun helm-scroll-up () + "Scroll up helm-buffer by `helm-scroll-amount' lines." + (interactive) + (with-helm-alive-p + (helm-move-selection-common :where 'page :direction 'previous))) +(put 'helm-scroll-up 'helm-only t) + +(defun helm-previous-page () + "Move selection back with a pageful." + (interactive) + (with-helm-alive-p + (let (helm-scroll-amount) + (helm-move-selection-common :where 'page :direction 'previous)))) +(put 'helm-previous-page 'helm-only t) + +(defun helm-scroll-down () + "Scroll down helm-buffer by `helm-scroll-amount' lines." + (interactive) + (with-helm-alive-p + (helm-move-selection-common :where 'page :direction 'next))) +(put 'helm-scroll-down 'helm-only t) + +(defun helm-next-page () + "Move selection forward with a pageful." + (interactive) + (with-helm-alive-p + (let (helm-scroll-amount) + (helm-move-selection-common :where 'page :direction 'next)))) +(put 'helm-next-page 'helm-only t) + +(defun helm-beginning-of-buffer () + "Move selection at the top." + (interactive) + (with-helm-alive-p + (helm-move-selection-common :where 'edge :direction 'previous))) +(put 'helm-beginning-of-buffer 'helm-only t) + +(defun helm-end-of-buffer () + "Move selection at the bottom." + (interactive) + (with-helm-alive-p + (helm-move-selection-common :where 'edge :direction 'next))) +(put 'helm-end-of-buffer 'helm-only t) + +(defun helm-previous-source () + "Move selection to the previous source." + (interactive) + (with-helm-alive-p + (helm-move-selection-common :where 'source :direction 'previous))) +(put 'helm-previous-source 'helm-only t) + +(defun helm-next-source () + "Move selection to the next source." + (interactive) + (with-helm-alive-p + (helm-move-selection-common :where 'source :direction 'next))) +(put 'helm-next-source 'helm-only t) + +(defun helm-goto-source (&optional source-or-name) + "Move the selection to the source named SOURCE-OR-NAME. + +If SOURCE-OR-NAME is empty string or nil go to the first +candidate of first source." + (helm-move-selection-common :where 'source :direction source-or-name)) + +(defvar helm-follow-action-white-list-commands + '(helm-ff-decrease-image-size-persistent + helm-ff-increase-image-size-persistent + helm-ff-rotate-left-persistent + helm-ff-rotate-right-persistent) + "Allow `helm-follow-action-forward/backward' switching to next file +when one of these commands is the `last-command'. + +For example when browsing files with `C-` and rotate the current file, +hitting `C-` again will not switch to next file but kill its buffer.") + +(defun helm--follow-action (arg) + (let ((helm--temp-follow-flag t) ; Needed in HFF. + (in-follow-mode (helm-follow-mode-p))) + ;; When follow-mode is already enabled, just go to next or + ;; previous line. + (when (or (eq last-command 'helm-follow-action-forward) + (eq last-command 'helm-follow-action-backward) + (eq last-command 'helm-execute-persistent-action) + (memq last-command helm-follow-action-white-list-commands) + in-follow-mode) + (if (> arg 0) + (helm-move-selection-common :where 'line + :direction 'next + :follow nil) + (helm-move-selection-common :where 'line + :direction 'previous + :follow nil))) + (unless in-follow-mode + (helm-execute-persistent-action)))) + +(defun helm-follow-action-forward () + "Go to next line and execute persistent action." + (interactive) + (with-helm-alive-p (helm--follow-action 1))) +(put 'helm-follow-action-forward 'helm-only t) + +(defun helm-follow-action-backward () + "Go to previous line and execute persistent action." + (interactive) + (with-helm-alive-p (helm--follow-action -1))) +(put 'helm-follow-action-backward 'helm-only t) + +(defun helm-mark-current-line (&optional resumep nomouse) + "Move `helm-selection-overlay' to current line. +When RESUMEP is non nil move overlay to `helm-selection-point'. +When NOMOUSE is specified do not set mouse bindings. + +Note that selection is unrelated to visible marks used for +marking candidates." + (with-helm-buffer + (when resumep + (goto-char helm-selection-point)) + (move-overlay + helm-selection-overlay (pos-bol) + (if (helm-pos-multiline-p) + (let ((header-pos (helm-get-next-header-pos)) + (separator-pos (helm-get-next-candidate-separator-pos))) + (or (and (null header-pos) separator-pos) + (and header-pos separator-pos + (< separator-pos header-pos) + separator-pos) + header-pos + (point-max))) + (1+ (pos-eol)))) + (setq helm-selection-point (overlay-start helm-selection-overlay)) + (when (and helm-allow-mouse (null nomouse)) + (helm--bind-mouse-for-selection helm-selection-point)))) + +(defun helm-confirm-and-exit-minibuffer () + "Maybe ask for confirmation when exiting helm. +It is similar to `minibuffer-complete-and-exit' adapted to Helm. +If `minibuffer-completion-confirm' value is \\='confirm, send +minibuffer confirm message and exit on next hit. If +`minibuffer-completion-confirm' value is t, don't exit and send +message \\='no match'." + (interactive) + (with-helm-alive-p + (if (and (helm--updating-p) + (null helm--reading-passwd-or-string)) + (progn (message "[Display not ready]") + (sit-for 0.5) (message nil) + (helm-update)) + (let* ((src (helm-get-current-source)) + (empty-buffer-p (with-current-buffer helm-buffer + (eq (point-min) (point-max)))) + (unknown (and (not empty-buffer-p) + ;; Now such candidates have a helm-new-file or an + ;; unknown text property (we were testing if string + ;; match [?] previously). + (helm-candidate-prefixed-p + (helm-get-selection nil 'withprop src))))) + (cond ((and (or empty-buffer-p unknown) + (memq minibuffer-completion-confirm + '(confirm confirm-after-completion))) + (setq helm-minibuffer-confirm-state + 'confirm) + (setq minibuffer-completion-confirm nil) + (minibuffer-message " [confirm]")) + ;; When require-match is strict (i.e. `t'), buffer + ;; should be either empty or in read-file-name have an + ;; unknown candidate ([+] prefix), if it's not the case + ;; fix it in helm-mode but not here. + ;; When `minibuffer-completion-confirm' is set to 'noexit or + ;; 'exit, that's mean MUST-MATCH is a function and we use its + ;; return value to set `minibuffer-completion-confirm', this is + ;; done in `helm--set-minibuffer-completion-confirm'. + ((or (eq minibuffer-completion-confirm 'noexit) + (and (or empty-buffer-p unknown) + (eq minibuffer-completion-confirm t))) + (minibuffer-message " [No match]")) + (empty-buffer-p + ;; This is used when helm-buffer is totally empty, + ;; i.e. the [+] have not been added because must-match + ;; is used from outside helm-comp-read i.e. from a helm + ;; source built with :must-match. + (setq helm-saved-selection helm-pattern + helm-saved-action (helm-get-default-action + (assoc-default + 'action + (car (with-helm-buffer helm-sources)))) + helm-minibuffer-confirm-state nil) + (helm-exit-minibuffer)) + (t + (setq helm-minibuffer-confirm-state nil) + (helm-exit-minibuffer))))))) +(put 'helm-confirm-and-exit-minibuffer 'helm-only t) + +(defun helm-confirm-and-exit-hook () + "Restore `minibuffer-completion-confirm' when helm update." + (unless (or (eq minibuffer-completion-confirm t) + (not helm-minibuffer-confirm-state)) + (setq minibuffer-completion-confirm + helm-minibuffer-confirm-state))) +(add-hook 'helm-after-update-hook 'helm-confirm-and-exit-hook) + +(defun helm--set-minibuffer-completion-confirm (src) + "Return the value of a REQUIRE-MATCH arg in a `completing-read'." + ;; Set `minibuffer-completion-confirm' to 'noexit or + ;; 'exit, according to MUST-MATCH value (possibly a function). + (with-helm-buffer + (setq minibuffer-completion-confirm + (helm-acase (helm-get-attr 'must-match src) + ((guard (and (functionp it) + (helm-get-selection nil nil src))) + (if (funcall it guard) 'exit 'noexit)) + (t it))))) + +(defun helm-read-string (prompt &optional initial-input history + default-value inherit-input-method) + "Same as `read-string' but for reading string from a helm session." + (let ((helm--reading-passwd-or-string t)) + (read-string + prompt initial-input history default-value inherit-input-method))) + +(defun helm--updating-p () + ;; helm timer is between two cycles. + ;; IOW `helm-check-minibuffer-input' haven't yet compared input + ;; and `helm-pattern'. + (or (not (equal (minibuffer-contents) helm-pattern)) + ;; `helm-check-minibuffer-input' have launched `helm-update'. + helm--in-update)) + +(defun helm-maybe-exit-minibuffer () + (interactive) + (with-helm-alive-p + (if (and (helm--updating-p) + (null helm--reading-passwd-or-string)) + (progn + (message "[Display not ready]") + (sit-for 0.5) (message nil) + (helm-update)) + (helm-exit-minibuffer)))) +(put 'helm-maybe-exit-minibuffer 'helm-only t) + +(defun helm-exit-minibuffer () + "Select the current candidate by exiting the minibuffer." + (unless helm-current-prefix-arg + (setq helm-current-prefix-arg current-prefix-arg)) + (setq helm-exit-status 0) + (helm-log-run-hook "helm-exit-minibuffer" + 'helm-exit-minibuffer-hook) + (exit-minibuffer)) + +(defun helm-keyboard-quit () + "Quit minibuffer in helm. +If action buffer is displayed, kill it." + (interactive) + (with-helm-alive-p + (when (get-buffer-window helm-action-buffer 'visible) + (kill-buffer helm-action-buffer)) + (setq helm-exit-status 1) + (abort-recursive-edit))) +(put 'helm-keyboard-quit 'helm-only t) + +(defun helm-get-next-header-pos () + "Return the position of the next header from point." + (next-single-property-change (point) 'helm-header)) + +(defun helm-get-previous-header-pos () + "Return the position of the previous header from point." + (previous-single-property-change (point) 'helm-header)) + +(defun helm-pos-multiline-p () + "Return non-`nil' if the current position is in the multiline source region." + (get-text-property (point) 'helm-multiline)) + +(defun helm-get-next-candidate-separator-pos () + "Return the position of the next candidate separator from point." + (let ((hp (helm-get-next-header-pos))) + (helm-aif (next-single-property-change (point) 'helm-candidate-separator) + (or + ;; Be sure we don't catch + ;; the separator of next source. + (and hp (< it hp) it) + ;; The separator found is in next source + ;; we are at last cand, so use the header pos. + (and hp (< hp it) hp) + ;; A single source, just try next separator. + it)))) + +(defun helm-get-previous-candidate-separator-pos () + "Return the position of the previous candidate separator from point." + (previous-single-property-change (point) 'helm-candidate-separator)) + +(defun helm-pos-header-line-p () + "Return t if the current line is a header line." + (or (get-text-property (pos-bol) 'helm-header) + (get-text-property (pos-bol) 'helm-header-separator))) + +(defun helm-pos-candidate-separator-p () + "Return t if the current line is a candidate separator." + (get-text-property (pos-bol) 'helm-candidate-separator)) + + +;;; Debugging +;; +;; +(defun helm-debug-output () + "Show all Helm locals variables and output of `helm-debug-function'." + (interactive) + (with-helm-alive-p + (helm-help-internal helm-debug-output-buffer 'helm-debug-output-function))) +(put 'helm-debug-output 'helm-only t) + +(defun helm-default-debug-function () + "Collect sources of helm current session without their keymap. +This is the default function for `helm-debug-function'." + (cl-loop for source in (with-helm-buffer helm-sources) + collect (remove (assq 'keymap source) source))) + +(defun helm-debug-output-function () + (let ((local-vars (buffer-local-variables (get-buffer helm-buffer))) + (count 1)) + (insert (format "* Helm debug from `%s' buffer\n\n" helm-buffer)) + (insert "** Local variables\n\n#+begin_src elisp\n" + (pp-to-string (remove (assq 'helm-sources local-vars) local-vars)) + "\n#+end_src\n") + (dolist-with-progress-reporter (v (helm-interpret-value helm-debug-function)) + "Calculating all helm-related values..." + (insert (format "** Value%s\n" count) + "#+begin_src elisp\n" (pp-to-string v) "\n#+end_src\n") + (cl-incf count)))) + +(defun helm-enable-or-switch-to-debug () + "First hit enable helm debugging, second hit switch to debug buffer." + (interactive) + (with-helm-alive-p + (if helm-debug + (helm-run-after-exit + #'helm-debug-open-last-log) + (setq helm-debug t) + (with-helm-buffer (setq truncate-lines nil)) + (message "Debugging enabled")))) +(put 'helm-enable-or-switch-to-debug 'helm-only t) + + +;; Misc + +(defun helm-preselect (candidate-or-regexp &optional source) + "Move selection to CANDIDATE-OR-REGEXP on Helm start. + +CANDIDATE-OR-REGEXP can be a: + +- String +- Cons cell of two strings +- Nullary function, which moves to a candidate + +When CANDIDATE-OR-REGEXP is a cons cell, tries moving to first +element of the cons cell, then the second, and so on. This allows +selection of duplicate candidates after the first. + +Optional argument SOURCE is a Helm source object." + (with-helm-buffer + (when candidate-or-regexp + (if source + (helm-goto-source source) + (goto-char (point-min)) + (forward-line 1)) + (if (functionp candidate-or-regexp) + (funcall candidate-or-regexp) + (let ((start (point)) mp) + (helm-awhile (if (consp candidate-or-regexp) + (and (re-search-forward (car candidate-or-regexp) nil t) + (re-search-forward (cdr candidate-or-regexp) nil t)) + (re-search-forward candidate-or-regexp nil t)) + ;; If search fall on an header line continue loop + ;; until it match or fail (Bug#1509). + (unless (helm-pos-header-line-p) (cl-return (setq mp it)))) + (goto-char (or mp start))))) + (forward-line 0) ; Avoid scrolling right on long lines. + (when (helm-pos-multiline-p) + (helm-move--beginning-of-multiline-candidate)) + (when (helm-pos-header-line-p) (forward-line 1)) + (when helm-allow-mouse + (helm--mouse-reset-selection-help-echo)) + (helm-mark-current-line) + (helm-display-mode-line (or source (helm-get-current-source))) + (helm-log-run-hook "helm-preselect" 'helm-after-preselection-hook))) + +(defun helm-delete-current-selection () + "Delete the currently selected item." + (with-helm-window + (cond ((helm-pos-multiline-p) + (helm-aif (helm-get-next-candidate-separator-pos) + (delete-region (pos-bol) + (1+ (progn (goto-char it) (pos-eol)))) + ;; last candidate + (goto-char (helm-get-previous-candidate-separator-pos)) + (delete-region (pos-bol) (point-max))) + (when (helm-end-of-source-p) + (goto-char (or (helm-get-previous-candidate-separator-pos) + (point-min))) + (forward-line 1))) + (t + (delete-region (pos-bol) (1+ (pos-eol))) + (when (helm-end-of-source-p t) + (let ((headp (save-excursion + (forward-line -1) + (not (helm-pos-header-line-p))))) + (and headp (forward-line -1)))))) + (unless (helm-end-of-source-p t) + (helm-mark-current-line)))) + +(defun helm-end-of-source-1 (n at-point) + (save-excursion + (if (and (helm-pos-multiline-p) (null at-point)) + (null (helm-get-next-candidate-separator-pos)) + (forward-line (if at-point 0 n)) + (or (eq (pos-bol) (pos-eol)) + (helm-pos-header-line-p) + (if (< n 0) (bobp) (eobp)))))) + +(defun helm-end-of-source-p (&optional at-point) + "Return non-nil if we are at EOB or end of source." + (helm-end-of-source-1 1 at-point)) + +(defun helm-beginning-of-source-p (&optional at-point) + "Return non-nil if we are at BOB or beginning of source." + (helm-end-of-source-1 -1 at-point)) + +(defun helm--edit-current-selection-internal (func) + (with-helm-window + (forward-line 0) + (let ((realvalue (get-text-property (point) 'helm-realvalue)) + (multiline (get-text-property (point) 'helm-multiline))) + (funcall func) + (forward-line 0) + (and realvalue + (put-text-property (point) (pos-eol) + 'helm-realvalue realvalue)) + (and multiline + (put-text-property (point) + (or (helm-get-next-candidate-separator-pos) + (point-max)) + 'helm-multiline multiline)) + (helm-mark-current-line)))) + +(defmacro helm-edit-current-selection (&rest forms) + "Evaluate FORMS at current selection in the helm buffer. +Used generally to modify current selection." + (declare (indent 0) (debug t)) + `(helm--edit-current-selection-internal + (lambda () ,@forms))) + +(defun helm--delete-minibuffer-contents-from (from-str) + ;; Giving an empty string value to FROM-STR delete all. + (let ((input (minibuffer-contents))) + (helm-reset-yank-point) + (if (> (length input) 0) + ;; minibuffer is not empty, delete contents from end + ;; of FROM-STR and update. + (helm-set-pattern from-str) + ;; minibuffer is already empty, force update. + (helm-force-update)))) + +(defun helm-delete-minibuffer-contents (&optional arg) + "Delete minibuffer contents. +When `helm-delete-minibuffer-contents-from-point' is non-nil, +delete minibuffer contents from point instead of deleting all. +With a prefix arg reverse this behaviour. When at the end of +minibuffer, delete all." + (interactive "P") + (with-helm-alive-p + (let ((str (if helm-delete-minibuffer-contents-from-point + (if (or arg (eobp)) + "" (helm-minibuffer-completion-contents)) + (if (and arg (not (eobp))) + (helm-minibuffer-completion-contents) "")))) + (helm--delete-minibuffer-contents-from str)))) +(put 'helm-delete-minibuffer-contents 'no-helm-mx t) + + +;;; helm-source-in-buffer. +;; +(defun helm-candidates-in-buffer (&optional source) + "The top level function used to store candidates with `helm-source-in-buffer'. + +Candidates are stored in a buffer generated internally by +`helm-candidate-buffer' function. Each candidate must be placed +in one line. + +The buffer is created and fed in the init attribute function of +Helm. + +E.g.: + + (helm-build-in-buffer-source \"test\" + :init (lambda () + (helm-init-candidates-in-buffer + \\='global \\='(foo foa fob bar baz)))) + +A shortcut can be used to simplify: + + (helm-build-in-buffer-source \"test\" + :data \\='(foo foa fob bar baz)) + +By default, Helm makes candidates by evaluating the candidates +function, then narrows them by `string-match' for each candidate. + +But this is slow for large number of candidates. The new way is +to store all candidates in a buffer and then narrow with +`re-search-forward'. Search function is customizable by search +attribute. The important point is that buffer processing is MUCH +FASTER than string list processing and is the Emacs way. + +The init function writes all candidates to a newly-created +candidate buffer. The candidates buffer is created or specified +by `helm-candidate-buffer'. Candidates are stored in a line. + +The candidates function narrows all candidates, IOW creates a +subset of candidates dynamically. + +Class `helm-source-in-buffer' is implemented with three attributes: + + (candidates . helm-candidates-in-buffer) + (volatile) + (match identity) + +The volatile attribute is needed because +`helm-candidates-in-buffer' creates candidates dynamically and +need to be called every time `helm-pattern' changes. + +Because `helm-candidates-in-buffer' plays the role of `match' +attribute function, specifying `(match identity)' makes the +source slightly faster. + +However if source contains `match-part' attribute, match is +computed only on part of candidate returned by the call of +function provided by this attribute. The function should have one +arg, candidate, and return only a specific part of candidate. + +To customize `helm-candidates-in-buffer' behaviour, use `search', +`get-line' and `match-part' attributes." + (let ((src (or source (helm-get-current-source)))) + (helm-candidates-in-buffer-1 + (helm-candidate-buffer) + helm-pattern + (or (assoc-default 'get-line src) + #'buffer-substring-no-properties) + (or (assoc-default 'search src) + '(helm-candidates-in-buffer-search-default-fn)) + ;; When candidate-transformer is specified in source ALL candidates should + ;; be computed with the candidate-transformer function (in contrast with + ;; filtered-candidate-transformer). This to be consistent with what sync + ;; sources do. The car of the cons is used for initial fetching of + ;; candidates whereas the cdr is used after when searching (in this case + ;; the candidate number limit is used). + (if (helm-get-attr 'candidate-transformer src) + (cons 99999999 (helm-candidate-number-limit src)) + (helm-candidate-number-limit src)) + (helm-get-attr 'match-part) + src))) + +(defun helm-candidates-in-buffer-search-default-fn (pattern) + "Search PATTERN with `re-search-forward' with bound and noerror args." + (condition-case _err + (re-search-forward pattern nil t) + (invalid-regexp nil))) + +(defun helm-candidates-in-buffer-1 (buffer pattern get-line-fn + search-fns limit + match-part-fn source) + "Return the list of candidates inserted in BUFFER matching PATTERN." + ;; buffer == nil when candidates buffer does not exist. + (when buffer + (with-current-buffer buffer + (let ((inhibit-point-motion-hooks t) + (start-point (1- (point-min)))) + (goto-char start-point) + (if (string= pattern "") + (helm-initial-candidates-from-candidate-buffer + get-line-fn (if (consp limit) (car limit) limit)) + (helm-search-from-candidate-buffer + pattern get-line-fn search-fns + (if (consp limit) (cdr limit) limit) + start-point match-part-fn source)))))) + + +(defun helm-search-from-candidate-buffer (pattern get-line-fn search-fns + limit start-point match-part-fn source) + (let ((inhibit-read-only t) + (diacritics (assoc-default 'diacritics source))) + (helm--search-from-candidate-buffer-1 + (lambda () + (cl-loop with hash = (make-hash-table :test 'equal) + with allow-dups = (assq 'allow-dups source) + with case-fold-search = (helm-set-case-fold-search) + with count = 0 + for iter from 1 + for searcher in search-fns + do (progn + (goto-char start-point) + ;; The character at start-point is a newline, + ;; if pattern match it that's mean we are + ;; searching for newline in buffer, in this + ;; case skip this false line. + ;; See comment >>>[1] in + ;; `helm--search-from-candidate-buffer-1'. + (and (condition-case nil + (looking-at pattern) + (invalid-regexp nil)) + (forward-line 1))) + nconc + (cl-loop with pos-lst + ;; POS-LST is used as a flag to decide if we + ;; run `helm-search-match-part' even if + ;; MATCH-PART isn't specified on source. This + ;; happen when fuzzy matching or using a + ;; negation (!) in one of the patterns, in + ;; these case the searcher returns a list + ;; '(BEG END) instead of an integer like + ;; `re-search-forward'. + while (and (setq pos-lst (funcall searcher pattern)) + (not (eobp)) + (< count limit)) + for cand = (apply get-line-fn + (if (and pos-lst (listp pos-lst)) + pos-lst + (list (pos-bol) (pos-eol)))) + when (and match-part-fn + (not (get-text-property 0 'match-part cand))) + do (setq cand + (propertize cand 'match-part (funcall match-part-fn cand))) + for dup = (gethash cand hash) + when (and (or (and allow-dups dup (= dup iter)) + (null dup)) + (or + ;; Always collect when cand is matched + ;; by searcher funcs and match-part attr + ;; is not present. + (and (not match-part-fn) + (not (consp pos-lst))) + ;; If match-part attr is present, or if SEARCHER fn + ;; returns a cons cell, collect PATTERN only if it + ;; match the part of CAND specified by + ;; the match-part func. + (helm-search-match-part cand pattern diacritics))) + do (progn + (puthash cand iter hash) + (helm--maybe-process-filter-one-by-one-candidate cand source) + (cl-incf count)) + and collect cand)))))) + +(defun helm-search-match-part (candidate pattern diacritics) + "Match PATTERN only on match-part property value of CANDIDATE. + +Because `helm-search-match-part' may be called even if +unspecified in source (negation or fuzzy), the part to match +falls back to the whole candidate even if match-part hasn't been +computed by match-part-fn and stored in the match-part property." + (let ((part (or (get-text-property 0 'match-part candidate) + candidate)) + (fuzzy-regexp (cadr (gethash 'helm-pattern helm--fuzzy-regexp-cache))) + (matchfn (cond (helm-migemo-mode 'helm-mm-migemo-string-match) + (diacritics 'helm-mm-diacritics-string-match) + (t 'string-match)))) + (condition-case _err + (if (string-match " " pattern) + (cl-loop for i in (helm-mm-split-pattern pattern) always + (if (string-match "\\`!" i) + (not (funcall matchfn (substring i 1) part)) + (funcall matchfn i part))) + (if (string-match "\\`!" pattern) + (if helm--in-fuzzy + ;; Fuzzy regexp have already been + ;; computed with substring 1. + (not (string-match fuzzy-regexp part)) + (not (funcall matchfn (substring pattern 1) part))) + (funcall matchfn (if helm--in-fuzzy fuzzy-regexp pattern) part))) + (invalid-regexp nil)))) + +(defun helm-initial-candidates-from-candidate-buffer (get-line-fn limit) + (cl-loop repeat limit + until (eobp) + for line = (funcall get-line-fn (pos-bol) (pos-eol)) + when line collect line + do (forward-line 1))) + +(defun helm--search-from-candidate-buffer-1 (search-fn) + ;; We are adding a newline at bob and at eol + ;; and removing these newlines afterward. + ;; This is a bad hack that should be removed. + ;; To avoid matching the empty line at first line + ;; when searching with e.g occur and "^$" just + ;; forward-line before searching (See >>>[1] above). + (goto-char (point-min)) + (insert "\n") + (goto-char (point-max)) + (insert "\n") + (unwind-protect + (funcall search-fn) + (goto-char (point-min)) + (delete-char 1) + (goto-char (1- (point-max))) + (delete-char 1) + (set-buffer-modified-p nil))) + +(defun helm-candidate-buffer (&optional buffer-spec) + "Register and return a buffer storing candidates of current source. + +This is used to initialize a buffer for storing candidates for a +candidates-in-buffer source, candidates will be searched in this +buffer and displayed in `helm-buffer'. This should be used only +in init functions, don't relay on this in other places unless you +know what you are doing. + +This function is still in public API only for backward +compatibility, you should use instead +`helm-init-candidates-in-buffer' for initializing your sources. + +Internally, this function is called without argument and returns +the buffer corresponding to current source i.e. +`helm--source-name' which is available in only some places. + +Acceptable values of BUFFER-SPEC: + +- global (a symbol) + Create a new global candidates buffer, + named \" *helm candidates:SOURCE*\". + This is used by `helm-init-candidates-in-buffer' and it is + the most common usage of BUFFER-SPEC. + The buffer will be killed and recreated at each new + helm-session. + +- local (a symbol) + Create a new local candidates buffer, + named \" *helm candidates:SOURCE*HELM-CURRENT-BUFFER\". + You may want to use this when you want to have a different + buffer each time source is used from a different + `helm-current-buffer'. + The buffer is erased and refilled at each new session but not + killed. You probably don't want to use this value for + BUFFER-SPEC. + +- nil (omit) + Only return the candidates buffer of current source if found. + +- A buffer + Register a buffer as a candidates buffer. + The buffer needs to exists, it is not created. + This allow you to use the buffer as a cache, it is faster + because the buffer is already drawn, but be careful when using + this as you may mangle your buffer depending on what you write + in your init(s) function, IOW don't modify the contents of the + buffer in init(s) function but in a transformer. + The buffer is not erased nor deleted. + Generally it is safer to use a copy of buffer inserted + in a global or local buffer. + +If for some reasons a global buffer and a local buffer exist and +are belonging to the same source, the local buffer takes +precedence on the global one and is used instead. + +When forcing update only the global and local buffers are killed +before running again the init function." + (let ((global-bname (format " *helm candidates:%s*" + helm--source-name)) + (local-bname (format " *helm candidates:%s*%s" + helm--source-name + (buffer-name helm-current-buffer)))) + (when buffer-spec + ;; Register buffer in `helm--candidate-buffer-alist'. + ;; This is used only to retrieve buffer associated to current source + ;; when using named buffer as value of BUFFER-SPEC. + (setq helm--candidate-buffer-alist + (cons (cons helm--source-name buffer-spec) + (delete (assoc helm--source-name + helm--candidate-buffer-alist) + helm--candidate-buffer-alist))) + ;; When using global or local as value of BUFFER-SPEC + ;; create the buffer global-bname or local-bname, otherwise + ;; reuse the buffer named BUFFER-SPEC. + (unless (bufferp buffer-spec) + ;; Global buffers are killed and recreated. + (and (eq buffer-spec 'global) + (buffer-live-p (get-buffer global-bname)) + (kill-buffer global-bname)) + ;; Create global or local buffer. + ;; Local buffer, once created are reused and a new one + ;; is created when `helm-current-buffer' change across sessions. + (with-current-buffer (get-buffer-create + (helm-acase buffer-spec + (global global-bname) + (local local-bname) + (t (and (stringp buffer-spec) + buffer-spec)))) + ;; We need a buffer not read-only to perhaps insert later + ;; text coming from read-only buffers (Bug#1176). + (set (make-local-variable 'buffer-read-only) nil) + ;; Undo is automatically disabled in buffer names starting + ;; with a space, so no need to disable it. + (erase-buffer) + (font-lock-mode -1)))) + ;; Finally return the candidates buffer. + (helm-acond ((get-buffer local-bname)) + ((get-buffer global-bname)) + ((assoc-default helm--source-name helm--candidate-buffer-alist) + (and (or (stringp it) (bufferp it)) + (buffer-live-p (get-buffer it)) + it))))) + +(defvar helm-candidate-buffer-longest-len 0 + "May store the longest length of candidates in a in-buffer source. +It is a local variable set from `helm-init-candidates-in-buffer' in +`helm-candidate-buffer'. +Allow getting the longest length of initial candidates in transformers +without looping again through the whole list. +It is useful to align extra informations after candidates in `helm-buffer'.") + +(defsubst helm-in-buffer-get-longest-candidate () + "Return the longest candidate recorded in `helm-candidate-buffer'." + (helm-aif (helm-candidate-buffer) + (buffer-local-value + 'helm-candidate-buffer-longest-len + (get-buffer it)) + 0)) + +(defun helm-make-separator (cand &optional longest) + "Create a separator to align candidates. +Longest candidate should have been calculated at initialization +of `helm-source-in-buffer' by `helm-init-candidates-in-buffer' , otherwise +LONGEST can be used to specify longest candidate." + (let ((lgst (or longest (helm-in-buffer-get-longest-candidate))) + (len (length cand))) + (make-string (1+ (if (>= lgst len) + (- lgst len) + 0)) + ? ))) + +(defun helm-init-candidates-in-buffer (buffer-spec data &optional force-longest) + "Register BUFFER-SPEC with DATA for a helm candidates-in-buffer session. + +Arg BUFFER-SPEC can be a `buffer-name' (stringp), a buffer-spec +object (bufferp), or a symbol, either \\='local or \\='global which is +passed to `helm-candidate-buffer'. +The most common usage of BUFFER-SPEC is \\='global. + +Arg DATA can be either a list or a plain string. +Returns the resulting buffer. + +Use this in your init function to register a buffer for a +`helm-source-in-buffer' session and feed it with DATA. You +probably don't want to bother with this and use the :data slot +when initializing a source with `helm-source-in-buffer' class. + +When inserting DATA in `helm-candidate-buffer', if DATA is a list the longest +candidate will be recorded in `helm-candidate-buffer-longest-len' local +variable. If DATA is a string, it is inserted directly in +`helm-candidate-buffer' and `helm-candidate-buffer-longest-len' is not computed +unless FORCE-LONGEST is non nil." + (declare (indent 1)) + (let ((caching (and (or (stringp buffer-spec) + (bufferp buffer-spec)) + (buffer-live-p (get-buffer buffer-spec)))) + (buf (helm-candidate-buffer buffer-spec))) + (unless caching + (with-current-buffer buf + (erase-buffer) + (cond ((listp data) + (insert (mapconcat (lambda (i) + (let ((cand (cond ((symbolp i) (symbol-name i)) + ((numberp i) (number-to-string i)) + ((consp i) (propertize + (car i) + 'helm-realvalue (cdr i))) + (t i)))) + (setq-local helm-candidate-buffer-longest-len + (max helm-candidate-buffer-longest-len + (length cand))) + cand)) + data "\n"))) + ((stringp data) + (insert data) + (when force-longest + (setq-local helm-candidate-buffer-longest-len + (helm--get-longest-len-in-buffer)))))) + buf))) + +(defun helm--get-longest-len-in-buffer () + "Return length of the longest line in buffer." + (save-excursion + (goto-char (point-min)) + (let ((max 0) + len) + (while (not (eobp)) + (setq len (- (pos-eol) (pos-bol))) + (when (> len max) + (setq max len)) + (forward-line 1)) + max))) + + +;;; Resplit helm window +;; +;; +(defun helm-toggle-resplit-window () + "Toggle resplit helm window, vertically or horizontally." + (interactive) + (with-helm-alive-p + (if (and (= (length (window-list nil 1)) 2) + (not (window-dedicated-p + (get-buffer-window helm-current-buffer)))) + (progn + (when helm-prevent-escaping-from-minibuffer + (helm-prevent-switching-other-window :enabled nil)) + (unwind-protect + (with-helm-window + (cond ((or helm-full-frame (one-window-p t)) + (user-error "Attempt to resplit a single window")) + ((helm-action-window) + (user-error "Can't resplit while selecting actions")) + (t + (let ((before-height (window-height))) + (delete-window) + (set-window-buffer + (select-window + (if (= (window-height) before-height) ; initial split was horizontal. + ;; Split window vertically with `helm-buffer' placed + ;; on the good side according to actual value of + ;; `helm-split-window-default-side'. + (prog1 + (cond ((or (eq helm-split-window-default-side 'above) + (eq helm-split-window-default-side 'left)) + (split-window + (selected-window) nil 'above)) + (t (split-window-vertically))) + (setq helm-split-window-state 'vertical)) + ;; Split window vertically, same comment as above. + (setq helm-split-window-state 'horizontal) + (cond ((or (eq helm-split-window-default-side 'left) + (eq helm-split-window-default-side 'above)) + (split-window (selected-window) nil 'left)) + (t (split-window-horizontally))))) + helm-buffer)))) + (setq helm--window-side-state (helm--get-window-side-state))) + (when helm-prevent-escaping-from-minibuffer + (helm-prevent-switching-other-window :enabled t)))) + (error "current window configuration not suitable for splitting")))) +(put 'helm-toggle-resplit-window 'helm-only t) + +;; Utility: Resize helm window. +(defun helm-enlarge-window-1 (n) + "Enlarge or narrow helm window. +If N is positive enlarge, if negative narrow." + (unless helm-full-frame + (let ((horizontal-p (eq helm-split-window-state 'horizontal))) + (with-helm-window + (enlarge-window n horizontal-p))))) + +(defun helm-narrow-window () + "Narrow helm window." + (interactive) + (with-helm-alive-p + (helm-enlarge-window-1 -1))) +(put 'helm-narrow-window 'helm-only t) + +(defun helm-enlarge-window () + "Enlarge helm window." + (interactive) + (with-helm-alive-p + (helm-enlarge-window-1 1))) +(put 'helm-enlarge-window 'helm-only t) + +(defun helm-toggle-full-frame (&optional arg) + "Toggle `helm-buffer' full-frame view." + (interactive "p") + (cl-assert (null (helm-action-window)) + nil "Unable to toggle full frame from action window") + (when arg ; Called interactively + (cl-assert (null helm--buffer-in-new-frame-p) + nil "Can't toggle full frame when using helm own frame")) + (if (or helm-onewindow-p + (buffer-local-value 'helm-full-frame (get-buffer helm-buffer))) + (with-helm-window + (setq-local helm-full-frame nil) + (setq helm-onewindow-p nil) + (let ((split-window-preferred-function + helm-split-window-preferred-function)) + (switch-to-buffer helm-current-buffer) + (helm-display-buffer helm-buffer) + (select-window (minibuffer-window)))) + (with-helm-window + (delete-other-windows) + (setq-local helm-full-frame t) + (setq helm-onewindow-p t)))) +(put 'helm-toggle-full-frame 'helm-only t) + +(defun helm-swap-windows () + "Swap window holding `helm-buffer' with other window." + (interactive) + (with-helm-alive-p + (if (= (length (window-list nil 1)) 2) + (cond ((and helm-full-frame (one-window-p t)) + (user-error "Can't swap windows in a single window")) + ((helm-action-window) + (user-error "Can't resplit while selecting actions")) + (t + (let* ((w1 (helm-window)) + (split-state (eq helm-split-window-state 'horizontal)) + (w1size (window-total-size w1 split-state)) + (b1 (window-buffer w1)) ; helm-buffer + (s1 (window-start w1)) + (cur-frame (window-frame w1)) + (w2 (with-selected-window (helm-window) + ;; Don't try to display helm-buffer + ;; in a dedicated window. + (get-window-with-predicate + (lambda (w) (not (window-dedicated-p w))) + 1 cur-frame))) + (w2size (window-total-size w2 split-state)) + (b2 (window-buffer w2)) ; probably helm-current-buffer + (s2 (window-start w2)) + resize) + (with-selected-frame (window-frame w1) + (helm-replace-buffer-in-window w1 b1 b2) + (helm-replace-buffer-in-window w2 b2 b1) + (setq resize + (cond ( ;; helm-window is smaller than other window. + (< w1size w2size) + (- (- (max w2size w1size) + (min w2size w1size)))) + ( ;; helm-window is larger than other window. + (> w1size w2size) + (- (max w2size w1size) + (min w2size w1size))) + ( ;; windows have probably same size. + t nil))) + ;; Maybe resize the window holding helm-buffer. + (and resize (window-resize w2 resize split-state)) + (set-window-start w1 s2 t) + (set-window-start w2 s1 t)) + (setq helm--window-side-state (helm--get-window-side-state))))) + (error "current window configuration not suitable for splitting")))) +(put 'helm-swap-windows 'helm-only t) + +(defun helm--get-window-side-state () + "Return the position of `helm-window' from `helm-current-buffer'. +Possible values are \\='left \\='right \\='below or \\='above." + (let ((side-list '(left right below above))) + (cl-loop for side in side-list + thereis (and (equal (helm-window) + (window-in-direction + side (get-buffer-window helm-current-buffer t) + t)) + side)))) + +(defun helm-replace-buffer-in-window (window buffer1 buffer2) + "Replace BUFFER1 by BUFFER2 in WINDOW registering BUFFER1." + (when (get-buffer-window buffer1) + (unrecord-window-buffer window buffer1) + (set-window-buffer window buffer2))) + +;; Utility: select another action by key +(defun helm-select-nth-action (n) + "Select the N nth action for the currently selected candidate." + (let ((src (helm-get-current-source))) + (setq helm-saved-selection (helm-get-selection nil nil src)) + (unless helm-saved-selection + (error "Nothing is selected")) + (setq helm-saved-action + (helm-get-nth-action + n + (if (get-buffer-window helm-action-buffer 'visible) + (assoc-default 'candidates src) + (helm-get-actions-from-current-source src)))) + (helm-maybe-exit-minibuffer))) + +(defun helm-get-nth-action (n action) + (cond ((and (zerop n) (functionp action)) + action) + ((listp action) + (or (cdr (elt action n)) + (error "No such action"))) + ((and (functionp action) (< 0 n)) + (error "Sole action")) + (t + (error "Error in `helm-select-nth-action'")))) + +(defun helm-execute-selection-action-at-nth (linum) + "Execute default action on candidate at LINUM lines from selection." + (let ((prefarg current-prefix-arg)) + (if (>= linum 0) + (helm-next-line linum) + (helm-previous-line (lognot (1- linum)))) + (setq current-prefix-arg prefarg) + (helm-exit-minibuffer))) + +;;; Persistent Action +;; +(defun helm-initialize-persistent-action () + (set (make-local-variable 'helm-persistent-action-display-window) nil)) + +(cl-defun helm-execute-persistent-action (&optional attr split) + "Perform the associated action ATTR without quitting helm. + +Arg ATTR default will be `persistent-action' or +`persistent-action-if' if unspecified depending on what's found +in source, but it can be anything else. +In this case you have to add this new attribute to your source. +See `persistent-action' and `persistent-action-if' slot +documentation in `helm-source'. + +When `helm-full-frame' is non-nil, and `helm-buffer' is displayed +in only one window, the helm window is split to display +`helm-select-persistent-action-window' in other window to +maintain visibility. The argument SPLIT can be used to force +splitting inconditionally, it is unused actually." + (interactive) + (with-helm-alive-p + (let ((source (helm-get-current-source))) + (unless attr + (setq attr (or (car (assq 'persistent-action source)) + (car (assq 'persistent-action-if source))))) + (helm-log "helm-execute-persistent-action" "executing persistent-action") + (let* ((selection (and source (helm-get-selection nil nil source))) + (attr-val (if (eq attr 'persistent-action-if) + (funcall (assoc-default attr source) selection) + (assoc-default attr source))) + ;; If attr value is a cons, use its car as persistent function. + (fn (if (and (consp attr-val) + ;; maybe a lambda. + (not (functionp attr-val))) + (car attr-val) attr-val)) + ;; And its cdr to decide if helm window should be splitted. + (no-split (and (consp attr-val) + (not (functionp attr-val)) + (cdr attr-val))) + ;; Is next-window (from helm-window) a suitable window for PA? + (no-suitable-win + (helm-aand (not helm--buffer-in-new-frame-p) + (get-buffer-window helm-current-buffer) + (or (window-dedicated-p it) + (window-parameter it 'window-side)))) + (cursor-in-echo-area t) + mode-line-in-non-selected-windows) + (progn + (when (and helm-onewindow-p (null no-split) + (null helm--buffer-in-new-frame-p)) + (helm-toggle-full-frame)) + (when (eq fn 'ignore) + (cl-return-from helm-execute-persistent-action nil)) + (when source + (with-helm-window + (save-selected-window + ;; FIXME: Simplify SPLIT behavior, it is a mess actually. + (if no-split + (helm-select-persistent-action-window :split 'never) + (helm-select-persistent-action-window + :split (or split helm-onewindow-p no-suitable-win))) + (helm-log "helm-execute-persistent-action" + "current-buffer = %S" (current-buffer)) + (let ((helm-in-persistent-action t) + (display-buffer-alist '((".*" (display-buffer-same-window)))) + display-buffer-function pop-up-windows pop-up-frames + special-display-regexps special-display-buffer-names) + (helm-execute-selection-action-1 + selection (or fn (helm-get-actions-from-current-source source)) t) + (unless (helm-action-window) + (helm-log-run-hook "helm-execute-persistent-action" + 'helm-after-persistent-action-hook))) + ;; A typical case is when a persistent action delete + ;; the buffer already displayed in + ;; `helm-persistent-action-display-window' and `helm-full-frame' + ;; is enabled, we end up with the `helm-buffer' + ;; displayed in two windows. + (when (and helm-onewindow-p + (> (length (window-list)) 1) + (equal (buffer-name + (window-buffer + helm-persistent-action-display-window)) + (helm-buffer-get))) + (delete-other-windows)))))))))) +(put 'helm-execute-persistent-action 'helm-only t) + +(cl-defun helm-persistent-action-display-window (&key split) + "Return the window that will be used for persistent action. +If SPLIT is t window is split in persistent action, if it has the +special symbol `never' don't split, if it is nil don't split either. +The symbol `never' is kept for backward compatibility." + (with-helm-window + (setq helm-persistent-action-display-window + (cond ((and (window-live-p helm-persistent-action-display-window) + (not (member helm-persistent-action-display-window + (get-buffer-window-list helm-buffer)))) + helm-persistent-action-display-window) + ((and helm--buffer-in-new-frame-p helm-initial-frame) + (with-selected-frame helm-initial-frame + (let ((win (selected-window))) + (if (or (window-dedicated-p win) + (window-parameter win 'window-side)) + (next-window win 1) + win)))) + ((and split (not (eq split 'never))) + (split-window)) + ((get-buffer-window helm-current-buffer)) + (t (previous-window (selected-window) 1)))))) + +(cl-defun helm-select-persistent-action-window (&key split) + "Select the window that will be used for persistent action. +See `helm-persistent-action-display-window' for how to use SPLIT." + (select-window (get-buffer-window (helm-buffer-get))) + (prog1 + (select-window + (setq minibuffer-scroll-window + (helm-persistent-action-display-window :split split)) + 'norecord) + (helm-log "helm-select-persistent-action-window" + "Selected window is %S" minibuffer-scroll-window))) + +;;; Scrolling - recentering +;; +;; +(defun helm-other-window-base (command &optional arg) + (let ((minibuffer-scroll-window + (helm-persistent-action-display-window))) + (funcall command (or arg helm-scroll-amount)))) + +(defun helm-scroll-other-window (&optional arg) + "Scroll other window upward ARG many lines. +When arg is not provided scroll `helm-scroll-amount' lines. +See `scroll-other-window'." + (interactive "P") + (with-helm-alive-p (helm-other-window-base 'scroll-other-window arg))) +(put 'helm-scroll-other-window 'helm-only t) + +(defun helm-scroll-other-window-down (&optional arg) + "Scroll other window downward ARG many lines. +When arg is not provided scroll `helm-scroll-amount' lines. +See `scroll-other-window-down'." + (interactive "P") + (with-helm-alive-p (helm-other-window-base 'scroll-other-window-down arg))) +(put 'helm-scroll-other-window-down 'helm-only t) + +(defun helm-recenter-top-bottom-other-window (&optional arg) + "Run `recenter-top-bottom' in other window. +Meaning of prefix ARG is the same as in `recenter-top-bottom'." + (interactive "P") + (with-helm-alive-p + (with-helm-window + (with-selected-window (helm-persistent-action-display-window) + (recenter-top-bottom arg))))) +(put 'helm-recenter-top-bottom-other-window 'helm-only t) + +(defun helm-reposition-window-other-window (&optional arg) + "Run `reposition-window' in other window. +Meaning of prefix ARG is the same as in `reposition-window'." + (interactive "P") + (with-helm-alive-p + (with-helm-window + (with-selected-window (helm-persistent-action-display-window) + (reposition-window arg))))) +(put 'helm-reposition-window-other-window 'helm-only t) + + +;; Utility: Visible Mark + +(defun helm-clear-visible-mark () + (with-current-buffer (helm-buffer-get) + (mapc 'delete-overlay helm-visible-mark-overlays) + (set (make-local-variable 'helm-visible-mark-overlays) nil))) + +(defun helm-this-visible-mark () + (cl-loop for o in (overlays-at (point)) + when (overlay-get o 'visible-mark) + return o)) + +(defun helm-delete-visible-mark (overlay) + (let ((src (helm-get-current-source))) + (setq helm-marked-candidates + (remove + (cons src (helm-get-selection nil nil src)) + helm-marked-candidates)) + (delete-overlay overlay) + (setq helm-visible-mark-overlays + (delq overlay helm-visible-mark-overlays)))) + +(defun helm-make-visible-mark (&optional src selection) + (let* ((source (or src (helm-get-current-source))) + (sel (or selection (helm-get-selection + nil (helm-get-attr 'marked-with-props source) + source))) + (selection-end (if (helm-pos-multiline-p) + ;; Stays within source + (or (helm-get-next-candidate-separator-pos) + (helm-get-next-header-pos) + (point-max)) + ;; Not multiline + (1+ (pos-eol)))) + (o (make-overlay (pos-bol) selection-end))) + (overlay-put o 'priority 0) + (overlay-put o 'face 'helm-visible-mark) + (overlay-put o 'source source) + (overlay-put o 'string (buffer-substring (overlay-start o) (overlay-end o))) + (overlay-put o 'real sel) + (overlay-put o 'before-string (propertize " " 'display + `((margin left-margin) + ,(propertize + helm-visible-mark-prefix + 'face 'helm-mark-prefix)))) + (overlay-put o 'visible-mark t) + (overlay-put o 'evaporate t) + (cl-pushnew o helm-visible-mark-overlays) + (push (cons source sel) helm-marked-candidates))) + +(defun helm-toggle-visible-mark (arg) + "Toggle Helm visible mark at point ARG times. +If ARG is negative toggle backward." + (interactive "p") + (with-helm-alive-p + (with-helm-window + (let ((nomark (assq 'nomark (helm-get-current-source))) + (next-fns (if (< arg 0) + '(helm-beginning-of-source-p . helm-previous-line) + '(helm-end-of-source-p . helm-next-line)))) + (if nomark + (message "Marking not allowed in this source") + (cl-loop with n = (if (< arg 0) (* arg -1) arg) + repeat n do + (progn + (helm-aif (helm-this-visible-mark) + (helm-delete-visible-mark it) + (helm-make-visible-mark)) + (if (funcall (car next-fns)) + (progn + (helm-display-mode-line (helm-get-current-source)) + (cl-return nil)) + (funcall (cdr next-fns))))) + (set-window-margins (selected-window) + (if helm-visible-mark-overlays + (+ (string-width helm-visible-mark-prefix) + helm-left-margin-width) + helm-left-margin-width))))))) +(put 'helm-toggle-visible-mark 'helm-only t) + +(defun helm-toggle-visible-mark-forward () + (interactive) + (helm-toggle-visible-mark 1)) + +(defun helm-toggle-visible-mark-backward () + (interactive) + (helm-toggle-visible-mark -1)) + +(defun helm-file-completion-source-p (&optional source) + "Return non-nil if current source is a file completion source." + (or helm--completing-file-name ; helm-read-file-name + (let ((cur-source (cdr (assq 'name + (or source (helm-get-current-source)))))) + (cl-loop for i in helm--file-completion-sources + thereis (string= cur-source i))))) + +(defun helm-mark-all (&optional all) + "Mark all visible unmarked candidates in current source. + +With a prefix arg mark all visible unmarked candidates in all +sources." + (interactive "P") + (with-helm-alive-p + (with-helm-window ; Using `with-helm-buffer' for some unknow + ; reasons infloop. + (set-window-margins (selected-window) + (+ (string-width helm-visible-mark-prefix) + helm-left-margin-width)) + (if (null all) + (helm-mark-all-1 t) + (let ((pos (point))) + (goto-char (point-min)) + (helm-awhile (helm-get-next-header-pos) + (goto-char it) + (forward-line 1) + (helm-mark-current-line) + (helm-mark-all-1)) + ;; `save-excursion' seems confused if used in addition of + ;; the one used in `helm-mark-all-1', so save POS and back + ;; to it when loop is finished. + (goto-char pos) + (helm-mark-current-line) + (helm-display-mode-line (helm-get-current-source) t)))))) +(put 'helm-mark-all 'helm-only t) + +(defun helm-mark-all-1 (&optional ensure-beg-of-source) + "Mark all visible unmarked candidates in current source. +Need to be wrapped in `with-helm-window'. +Arg ENSURE-BEG-OF-SOURCE ensure we are at beginning of source +when starting to mark candidates, if handled elsewhere before +starting it is not needed." + (let* ((src (helm-get-current-source)) + (follow (if (helm-follow-mode-p src) 1 -1)) + (nomark (assq 'nomark src)) + (src-name (assoc-default 'name src)) + (filecomp-p (or (helm-file-completion-source-p src) + (string= src-name "Files from Current Directory")))) + ;; Note that `cl-letf' prevents edebug working properly. + (cl-letf (((symbol-function 'message) #'ignore)) + (helm-follow-mode -1) + (unwind-protect + (if nomark + (user-error "Marking not allowed in this source") + (save-excursion + (when ensure-beg-of-source + (goto-char (helm-get-previous-header-pos)) + (forward-line 1)) + (let* ((next-head (helm-get-next-header-pos)) + (end (and next-head + (save-excursion + (goto-char next-head) + (forward-line -1) + (point)))) + (maxpoint (or end (point-max)))) + (while (< (point) maxpoint) + (helm-mark-current-line) + (let* ((prefix (or (get-text-property (pos-bol) 'helm-new-file) + (get-text-property (pos-bol) 'unknown))) + (cand (helm-get-selection + nil (helm-get-attr 'marked-with-props src) + src)) + (bn (and filecomp-p (helm-basename cand)))) + ;; Don't mark possibles directories ending with . or .. + ;; autosave files/links and non--existent files. + (unless + (or (helm-this-visible-mark) + ;; Non existing files in HFF and + ;; RFN. Display may be an image. See + ;; https://github.com/yyoncho/helm-treemacs-icons/issues/5 + ;; and also Bug#2296. + prefix + (and filecomp-p + (or + ;; autosave files + (string-match-p "\\`[.]?#.*#?\\'" bn) + ;; dot files + (member bn '("." ".."))))) + (helm-make-visible-mark src cand))) + (when (helm-pos-multiline-p) + (goto-char + (or (helm-get-next-candidate-separator-pos) + (point-max)))) + (forward-line 1)))) + (helm-mark-current-line)) + (helm-follow-mode follow))))) + +(defun helm-unmark-all () + "Unmark all candidates in all sources of current helm session." + (interactive) + (with-helm-alive-p + (with-helm-window + (save-excursion + (helm-clear-visible-mark)) + (setq helm-marked-candidates nil) + (helm-mark-current-line) + (helm-display-mode-line (helm-get-current-source)) + (set-window-margins (selected-window) helm-left-margin-width)))) +(put 'helm-unmark-all 'helm-only t) + +(defun helm-toggle-all-marks (&optional all) + "Toggle all marks. + +Mark all visible candidates of current source or unmark all +candidates visible or invisible in all sources of current Helm +session. + +With a prefix argument mark all candidates in all sources." + (interactive "P") + (with-helm-alive-p + (let ((marked (helm-marked-candidates))) + (if (and (>= (length marked) 1) + (with-helm-window helm-visible-mark-overlays)) + (helm-unmark-all) + (helm-mark-all all))))) +(put 'helm-toggle-all-marks 'helm-only t) + +(defun helm--compute-marked (real source &optional wildcard) + (let* ((coerced (helm-coerce-selection real source)) + (wilds (and wildcard + (condition-case nil + (helm-file-expand-wildcards + coerced t) + (error nil))))) + ;; Avoid returning a not expanded wildcard fname. + ;; e.g assuming "/tmp" doesn't contain "*.el" + ;; return nil when coerced is "/tmp/*.el". + (unless (or wilds (null wildcard) + (string-match-p helm--url-regexp coerced) + (file-exists-p coerced) + (and (stringp coerced) + (null (string-match-p "[[*?]" coerced)))) + (setq coerced nil)) + (or wilds (and coerced (list coerced))))) + +(cl-defun helm-marked-candidates (&key with-wildcard all-sources) + "Return marked candidates of current source, if any. + +Otherwise return one element list consisting of the current +selection. When key WITH-WILDCARD is specified, expand it. When +ALL-SOURCES key value is non-nil returns marked candidates of all +sources." + (with-current-buffer helm-buffer + (let* ((current-src (helm-get-current-source)) + (candidates + (cl-loop for (source . real) in (reverse helm-marked-candidates) + for use-wc = (and with-wildcard + (string-match-p "\\*" real) + (null (file-exists-p real))) + when (or all-sources + (equal (assq 'name source) + (assq 'name current-src))) + append (helm--compute-marked real source use-wc))) + sel) + (unless candidates + (setq sel (helm-get-selection + nil (helm-get-attr 'marked-with-props + current-src) + current-src)) + (setq candidates + (helm--compute-marked + sel current-src + (and with-wildcard (null (file-exists-p sel)))))) + (helm-log "helm-marked-candidates" + "Marked candidates = %S" candidates) + candidates))) + +(defun helm--remove-marked-and-update-mode-line (elm) + (with-helm-buffer + (setq helm-marked-candidates + (delete (rassoc elm helm-marked-candidates) + helm-marked-candidates)) + (helm-display-mode-line (helm-get-current-source)))) + +(defun helm-current-source-name= (name) + (save-excursion + (goto-char (helm-get-previous-header-pos)) + (equal name (helm-current-line-contents)))) + +(defun helm-revive-visible-mark () + "Restore marked candidates when helm updates display." + (with-current-buffer helm-buffer + (save-excursion + (dolist (o helm-visible-mark-overlays) + (let* ((source (overlay-get o 'source)) + (ov-src-name (assoc-default 'name source)) + (ov-str (overlay-get o 'string)) + (ov-real (overlay-get o 'real)) + (ov-ml-str (helm-aif (helm-get-attr 'multiline source) + (if (numberp it) + ;; Assume display have been computed + ;; against real e.g. kill-ring. + (helm--multiline-get-truncated-candidate + ov-real it) + ov-str) + ov-str)) + beg end) + ;; Move point to end of source header line. + (goto-char (point-min)) + (search-forward ov-src-name nil t) + (while (and (search-forward ov-ml-str nil t) + (cl-loop for ov in (overlays-at (pos-bol 0)) + never (overlay-get ov 'visible-mark)) + (helm-current-source-name= ov-src-name)) + (setq beg (match-beginning 0) + end (if (string= ov-ml-str ov-str) + (match-end 0) (1+ (match-end 0)))) + ;; Calculate real value of candidate. + ;; It can be nil if candidate have only a display value. + (let ((real (get-text-property (pos-bol 0) 'helm-realvalue))) + (if real + ;; Check if real value of current candidate is the same + ;; than the one stored in overlay. + ;; This is needed when some cands have same display names. + ;; Using equal allow testing any type of value for real cand. + ;; bug#706. + (and (equal ov-real real) + (move-overlay o beg end)) + (and (equal ov-str (buffer-substring beg end)) + (move-overlay o beg end)))))))))) +(add-hook 'helm-after-update-hook 'helm-revive-visible-mark) + +(defun helm-next-point-in-list (curpos points &optional prev) + (cond + ;; rule out special cases. + ((null points) curpos) + ((and prev (<= curpos (car points))) + (nth (1- (length points)) points)) + ((< (car (last points)) curpos) + (if prev (car (last points)) (nth 0 points))) + ((and (not prev) (>= curpos (car (last points)))) + (nth 0 points)) + (t + (nth (if prev + (cl-loop for pt in points + for i from 0 + if (<= curpos pt) return (1- i)) + (cl-loop for pt in points + for i from 0 + if (< curpos pt) return i)) + points)))) + +(defun helm-next-visible-mark (&optional prev) + "Move next Helm visible mark. +If PREV is non-nil move to precedent." + (interactive) + (with-helm-alive-p + (with-helm-window + (ignore-errors + (goto-char (helm-next-point-in-list + (point) + (sort (mapcar 'overlay-start helm-visible-mark-overlays) '<) + prev))) + (helm-mark-current-line)))) +(put 'helm-next-visible-mark 'helm-only t) + +(defun helm-prev-visible-mark () + "Move previous helm visible mark." + (interactive) + (with-helm-alive-p + (helm-next-visible-mark t))) +(put 'helm-prev-visible-mark 'helm-only t) + +;;; Utility: Selection Paste +;; +(defun helm-yank-selection (arg) + "Set minibuffer contents to current display selection. +With a prefix arg set to real value of current selection." + (interactive "P") + (with-helm-alive-p + (let ((str (format "%s" (helm-get-selection nil (not arg))))) + (kill-new str) + (helm-set-pattern str)))) +(put 'helm-yank-selection 'helm-only t) + +(defun helm-kill-selection-and-quit (arg) + "Store display value of current selection to kill ring. +With a prefix arg use real value of current selection. +Display value is shown in `helm-buffer' and real value is used to +perform actions." + (interactive "P") + (with-helm-alive-p + (helm-run-after-exit + (lambda (sel) + (kill-new sel) + ;; Return nil to force `helm-mode--keyboard-quit' + ;; in `helm-comp-read' otherwise the value "Saved to kill-ring: foo" + ;; is used as exit value for `helm-comp-read'. + (prog1 nil (message "Saved to kill-ring: %s" sel) (sit-for 1))) + (format "%s" (helm-get-selection nil (not arg)))))) +(put 'helm-kill-selection-and-quit 'helm-only t) + +(defun helm-insert-or-copy (&optional arg) + "Insert selection or marked candidates in current buffer. + +With a prefix arg copy marked candidates to kill-ring. +The real value of each candidate is used." + (interactive "P") + (with-helm-alive-p + (helm-run-after-exit + (lambda (cands) + (with-helm-current-buffer + (let ((sels (mapconcat (lambda (c) + (format "%s" c)) + cands "\n"))) + (if arg (kill-new sels) (insert sels))))) + (helm-marked-candidates)))) +(put 'helm-insert-or-copy 'helm-only t) + + +;;; Follow-mode: Automatic execution of persistent-action +;; +;; +(defvar helm-follow-input-idle-delay nil + "`helm-follow-mode' will execute its persistent action after this delay. +Note that if the `follow-delay' attr is present in source, it +will take precedence over this.") + +(defun helm-follow-mode (&optional arg) + "Execute persistent action every time the cursor is moved. + +This mode is source local, i.e. It applies on current source only. +\\ +This mode can be enabled or disabled interactively at anytime during +a helm session with \\[helm-follow-mode]. + +When enabling interactively `helm-follow-mode' in a source, you +can keep it enabled for next Emacs sessions by setting +`helm-follow-mode-persistent' to a non-nil value. + +When `helm-follow-mode' is called with a prefix arg and +`helm-follow-mode-persistent' is non-nil `helm-follow-mode' will +be persistent only for this Emacs session, but not for the next +Emacs sessions, i.e. the current source will not be saved to +`helm-source-names-using-follow'. + +A prefix arg with `helm-follow-mode' already enabled will have no +effect. + +Note that you can use instead of this mode the commands +`helm-follow-action-forward' and `helm-follow-action-backward' at +anytime in all Helm sessions. + +They are bound by default to \\[helm-follow-action-forward] and +\\[helm-follow-action-backward]." + (interactive (list (helm-aif (and current-prefix-arg + (prefix-numeric-value current-prefix-arg)) + (unless (helm-follow-mode-p) it)))) + (with-helm-alive-p + (with-current-buffer helm-buffer + (let* ((src (helm-get-current-source)) + (name (assoc-default 'name src)) + (fol-attr (assq 'follow src)) + (enabled (or (helm-follow-mode-p src) + (and helm-follow-mode-persistent + (member (assoc-default 'name src) + helm-source-names-using-follow))))) + (if src + (progn + (if (eq (cdr fol-attr) 'never) + (message "helm-follow-mode not allowed in this source") + ;; Make follow attr persistent for this emacs session. + (helm-follow-mode-set-source + (if (or enabled (and (numberp arg) (< arg 0))) -1 1) + src) + ;; When arg is nil assume the call is interactive. + ;; However if user call helm-follow-mode with a prefix arg, + ;; the call will be considered non--interactive and + ;; src-name will NOT be saved to helm-source-names-using-follow. + ;; When called from lisp (non--interactive) src-name + ;; will never be saved. + (when (and helm-follow-mode-persistent (null arg)) + (if (null enabled) + (unless (member name helm-source-names-using-follow) + (push name helm-source-names-using-follow) + (customize-save-variable 'helm-source-names-using-follow + helm-source-names-using-follow)) + (when (member name helm-source-names-using-follow) + (setq helm-source-names-using-follow + (delete name helm-source-names-using-follow)) + (customize-save-variable 'helm-source-names-using-follow + helm-source-names-using-follow)))) + (message "helm-follow-mode is %s" + (if (helm-follow-mode-p src) + "enabled" "disabled")) + (helm-display-mode-line src t))) + (message "Not enough candidates for helm-follow-mode")))))) +(put 'helm-follow-mode 'helm-only t) + +(defun helm-follow-execute-persistent-action-maybe (&optional delay) + "Execute persistent action in mode `helm-follow-mode'. + +This happen after: DELAY or the \\='follow-attr value of current +source or `helm-follow-input-idle-delay' or +`helm-input-idle-delay' secs." + (let* ((src (helm-get-current-source)) + (at (or delay + (assoc-default 'follow-delay src) + helm-follow-input-idle-delay + (or (and helm-input-idle-delay + (max helm-input-idle-delay 0.01)) + 0.01))) + (suspend (and helm--in-update + ;; Specific to helm-find-files. + (assoc-default 'suspend-follow-in-update src)))) + (when (and (not suspend) + (not (get-buffer-window helm-action-buffer 'visible)) + (not (helm-pos-header-line-p)) + (or (helm-follow-mode-p src) + (and helm-follow-mode-persistent + (member (assoc-default 'name src) + helm-source-names-using-follow))) + (null (eq (assoc-default 'follow src) 'never)) + (helm-get-selection nil nil src)) + (helm-follow-mode-set-source 1 src) + (run-with-idle-timer at nil (lambda () + (when helm-alive-p + (helm-execute-persistent-action))))))) + +(defun helm-follow-mode-p (&optional source) + (with-helm-buffer + (eq (helm-get-attr 'follow (or source (helm-get-current-source))) 1))) + +(defun helm-follow-mode-set-source (value &optional source) + (with-helm-buffer + (helm-set-attr 'follow value (or source (helm-get-current-source))))) + +;;; Auto-resize mode +;; +(defun helm--autoresize-hook (&optional max-height min-height) + (when (helm-window) + (with-helm-window + (fit-window-to-buffer nil + (/ (* (frame-height) + (or max-height helm-autoresize-max-height)) + 100) + (/ (* (frame-height) + (or min-height helm-autoresize-min-height)) + 100))))) + +(define-minor-mode helm-autoresize-mode + "Auto resize helm window when enabled. +Helm window is re-sized according to `helm-autoresize-max-height' +and `helm-autoresize-min-height'. Note that when this mode is +enabled, Helm behaves as if `helm-always-two-windows' is enabled. + +See `fit-window-to-buffer' for more infos." + :group 'helm + :global t + (if helm-autoresize-mode + (progn (add-hook 'helm-after-update-hook 'helm--autoresize-hook) + (add-hook 'helm-window-configuration-hook 'helm--autoresize-hook)) + (remove-hook 'helm-after-update-hook 'helm--autoresize-hook) + (remove-hook 'helm-window-configuration-hook 'helm--autoresize-hook))) + +(defun helm-help () + "Generate Helm's help according to `help-message' attribute. + +If `helm-buffer' is empty, provide completions on `helm-sources' +to choose its local documentation. +If source doesn't have any `help-message' attribute, a generic +message explaining this is added instead. +The global `helm-help-message' is always added after this local +help." + (interactive) + (require 'helm-mode) ; for helm-comp-read. + (with-helm-alive-p + (let ((source (or (helm-get-current-source) + (helm-comp-read + "Help for: " + (cl-loop for src in (with-helm-buffer helm-sources) + collect `(,(assoc-default 'name src) . + ,src)) + :allow-nest t + :exec-when-only-one t)))) + (save-selected-window + (helm-help-internal + helm-help-buffer-name + (lambda () + (helm-aif (assoc-default 'help-message source) + (insert (substitute-command-keys + (helm-interpret-value it))) + (insert "* No specific help for this source available.")) + (insert "\n\n" + (substitute-command-keys + (helm-interpret-value helm-help-message))))))))) +(put 'helm-help 'helm-only t) + +(defun helm-toggle-truncate-line () + "Toggle `truncate-lines' value in `helm-buffer'" + (interactive) + (with-helm-alive-p + (with-helm-buffer + (setq truncate-lines (not truncate-lines)) + (when (helm-get-previous-header-pos) + (helm-update (regexp-quote (helm-get-selection nil t)))) + (message "%sisplaying continuation lines" + (if truncate-lines "Not D" "D"))))) +(put 'helm-toggle-truncate-line 'helm-only t) + +;;;###autoload +(defun helm-other-buffer (sources buffer) + "Simplified Helm interface with other `helm-buffer'. +Call `helm' only with SOURCES and BUFFER as args." + (helm :sources sources :buffer buffer)) + + +(provide 'helm-core) +;;; helm-core.el ends here diff --git a/code/elpa/helm-core-20240316.1157/helm-lib.el b/code/elpa/helm-core-20240316.1157/helm-lib.el new file mode 100644 index 0000000..7215918 --- /dev/null +++ b/code/elpa/helm-core-20240316.1157/helm-lib.el @@ -0,0 +1,2145 @@ +;;; helm-lib.el --- Helm routines. -*- lexical-binding: t -*- + +;; Copyright (C) 2015 ~ 2020 Thierry Volpiatto + +;; Author: Thierry Volpiatto +;; URL: http://github.com/emacs-helm/helm + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: +;; All helm functions that don't require specific helm code should go here. + +;;; Code: + +(require 'cl-lib) + +(declare-function ansi-color--find-face "ansi-color.el") +(declare-function ansi-color-apply-sequence "ansi-color.el") +(declare-function dired-current-directory "dired.el") +(declare-function ffap-file-remote-p "ffap.el") +(declare-function ffap-url-p "ffap.el") +(declare-function helm-get-attr "helm-core.el") +(declare-function helm-set-attr "helm-core.el") +(declare-function helm-follow-mode-p "helm-core.el") +(declare-function helm-get-current-source "helm-core.el") +(declare-function helm-get-selection "helm-core.el") +(declare-function helm-get-sources "helm-core.el") +(declare-function helm-interpret-value "helm-core.el") +(declare-function helm-log-run-hook "helm-core.el") +(declare-function helm-next-line "helm-core.el") +(declare-function helm-get-next-header-pos "helm-core.el") +(declare-function helm-mark-current-line "helm-core.el") +(declare-function helm-marked-candidates "helm-core.el") +(declare-function helm-set-case-fold-search "helm-core.el") +(declare-function helm-get-previous-header-pos "helm-core.el") +(declare-function helm-source--cl--print-table "helm-source.el") +(declare-function helm-update "helm-core.el") +(declare-function org-content "org.el") +(declare-function org-mark-ring-goto "org.el") +(declare-function org-mark-ring-push "org.el") +(declare-function org-table-p "org-compat.el") +(declare-function org-table-align "org-table.el") +(declare-function org-table-end "org-table.el") +(declare-function org-open-at-point "org.el") +(declare-function helm-read-file-name "helm-mode.el") +(declare-function find-function-library "find-func.el") +(declare-function find-library-name "find-func.el") + +(defvar helm-sources) +(defvar helm-initial-frame) +(defvar helm-current-position) +(defvar helm-persistent-action-display-window) +(defvar helm--buffer-in-new-frame-p) +(defvar helm-completion-style) +(defvar helm-completion-styles-alist) +(defvar helm-persistent-action-window-buffer) +(defvar helm-help-buffer-name) +(defvar completion-flex-nospace) +(defvar find-function-source-path) +(defvar ffap-machine-p-unknown) +(defvar ffap-machine-p-local) +(defvar ffap-machine-p-known) +(defvar helm-debug-output-buffer) + +;;; User vars. +;; +(defcustom helm-file-globstar t + "Same as globstar bash shopt option. +When non-nil a pattern beginning with two stars will expand +recursively. +Directories expansion is not supported yet." + :group 'helm + :type 'boolean) + +(defcustom helm-yank-text-at-point-function nil + "The function used to forward point with `helm-yank-text-at-point'. +With a nil value, fallback to default `forward-word'. +The function should take one arg, an integer like `forward-word'. +NOTE: Using `forward-symbol' here is not very useful as it is +already provided by \\\\[next-history-element]." + :type 'function + :group 'helm) + +(defcustom helm-scroll-amount nil + "Scroll amount when scrolling helm window or other window in a helm session. +It is used by `helm-scroll-other-window', `helm-scroll-up', `helm-scroll-down' +and `helm-scroll-other-window-down'. + +If you prefer scrolling line by line, set this value to 1." + :group 'helm + :type 'integer) + +(defcustom helm-help-full-frame t + "Display help window in full frame when non nil. + +Even when nil probably the same result (full frame) can be +reached by tweaking `display-buffer-alist', but it is much more +convenient to use a simple boolean value here." + :type 'boolean + :group 'helm-help) + +(defvar helm-ff--boring-regexp nil) +(defun helm-ff--setup-boring-regex (var val) + (set var val) + (setq helm-ff--boring-regexp + (cl-loop with last = (car (last val)) + for r in (butlast val) + if (string-match "\\$\\'" r) + concat (concat r "\\|") into result + else concat (concat r "$\\|") into result + finally return + (concat result last + (if (string-match "\\$\\'" last) "" "$"))))) + +(defcustom helm-boring-file-regexp-list + (mapcar (lambda (f) + (let ((rgx (regexp-quote f))) + (if (string-match-p "[^/]$" f) + ;; files: e.g .o => \\.o$ + (concat rgx "$") + ;; directories: e.g .git/ => \.git\\(/\\|$\\) + (concat (substring rgx 0 -1) "\\(/\\|$\\)")))) + completion-ignored-extensions) + "A list of regexps matching boring files. + +This list is build by default on `completion-ignored-extensions'. +The directory names should end with \"/?\" e.g. \"\\.git/?\" and +the file names should end with \"$\" e.g. \"\\.o$\". + +These regexps may be used to match the entire path, not just the +file name, so for example to ignore files with a prefix +\".bak.\", use \"\\.bak\\..*$\" as the regexp. + +NOTE: When modifying this, be sure to use customize interface or +the customize functions e.g. `customize-set-variable' and NOT +`setq'." + :group 'helm-files + :type '(repeat (choice regexp)) + :set 'helm-ff--setup-boring-regex) + +(defcustom helm-describe-function-function 'describe-function + "Function used to describe functions in Helm." + :group 'helm-elisp + :type 'function) + +(defcustom helm-describe-variable-function 'describe-variable + "Function used to describe variables in Helm." + :group 'helm-elisp + :type 'function) + + +;;; Internal vars +;; +(defvar helm-yank-point nil) +(defvar helm-pattern "" + "The input pattern used to update the helm buffer.") +(defvar helm-buffer "*helm*" + "Buffer showing completions.") +(defvar helm-current-buffer nil + "Current buffer when `helm' is invoked.") +(defvar helm-suspend-update-flag nil) +(defvar helm-action-buffer "*helm action*" + "Buffer showing actions.") +(defvar helm-current-prefix-arg nil + "Record `current-prefix-arg' when exiting minibuffer.") +(defvar helm-current-error nil + "Same as `compilation-current-error' but for helm-occur and helm-grep.") + +;;; Compatibility +;; +(defun helm-add-face-text-properties (beg end face &optional append object) + "Add the face property to the text from START to END. +It is a compatibility function which behaves exactly like +`add-face-text-property' if available, otherwise like +`add-text-properties'. When only `add-text-properties' is +available APPEND is ignored." + (if (fboundp 'add-face-text-property) + (add-face-text-property beg end face append object) + (add-text-properties beg end `(face ,face) object))) + +;;; Override `push-mark' +;; +;; Fix duplicates in `mark-ring' and `global-mark-ring' and update +;; buffers in `global-mark-ring' to recentest mark. +(defun helm--advice-push-mark (&optional location nomsg activate) + (unless (null (mark t)) + (let ((marker (copy-marker (mark-marker)))) + (setq mark-ring (cons marker (delete marker mark-ring)))) + (when (> (length mark-ring) mark-ring-max) + ;; Move marker to nowhere. + (set-marker (car (nthcdr mark-ring-max mark-ring)) nil) + (setcdr (nthcdr (1- mark-ring-max) mark-ring) nil))) + (set-marker (mark-marker) (or location (point)) (current-buffer)) + ;; Now push the mark on the global mark ring. + (setq global-mark-ring (cons (copy-marker (mark-marker)) + ;; Avoid having multiple entries + ;; for same buffer in `global-mark-ring'. + (cl-loop with mb = (current-buffer) + for m in global-mark-ring + for nmb = (marker-buffer m) + unless (eq mb nmb) + collect m))) + (when (> (length global-mark-ring) global-mark-ring-max) + (set-marker (car (nthcdr global-mark-ring-max global-mark-ring)) nil) + (setcdr (nthcdr (1- global-mark-ring-max) global-mark-ring) nil)) + (or nomsg executing-kbd-macro (> (minibuffer-depth) 0) + (message "Mark set")) + (when (or activate (not transient-mark-mode)) + (set-mark (mark t))) + nil) + +(defcustom helm-advice-push-mark t + "Override `push-mark' with a version avoiding duplicates when non-nil." + :group 'helm + :type 'boolean + :set (lambda (var val) + (set var val) + (if val + (advice-add 'push-mark :override #'helm--advice-push-mark '((depth . 100))) + (advice-remove 'push-mark #'helm--advice-push-mark)))) + +;; This the version of Emacs-27 written by Stefan +(defun helm-advice--ffap-read-file-or-url (prompt guess) + (or guess (setq guess default-directory)) + (if (ffap-url-p guess) + (read-string prompt guess nil nil t) + (unless (ffap-file-remote-p guess) + (setq guess (abbreviate-file-name (expand-file-name guess)))) + (read-file-name prompt (file-name-directory guess) nil nil + (file-name-nondirectory guess)))) + +;; The native-comp branch of emacs "is a modified Emacs capable of compiling +;; and running Emacs Lisp as native code in form of re-loadable elf files." +;; (https://akrl.sdf.org/gccemacs.html). The function subr-native-elisp-p is a +;; native function available only in this branch and evaluates to true if the +;; argument supplied is a natively compiled lisp function. Use this function +;; if it's available, otherwise return nil. Helm needs to distinguish compiled +;; functions from other symbols in a various places. +(defun helm-subr-native-elisp-p (object) + (when (fboundp 'subr-native-elisp-p) + (subr-native-elisp-p object))) + +;; Available only in Emacs-28+ +(unless (fboundp 'file-modes-number-to-symbolic) + (defun file-modes-number-to-symbolic (mode &optional filetype) + "Return a string describing a file's MODE. +For instance, if MODE is #o700, then it produces `-rwx------'. +FILETYPE if provided should be a character denoting the type of file, +such as `?d' for a directory, or `?l' for a symbolic link and will override +the leading `-' char." + (string + (or filetype + (pcase (ash mode -12) + ;; POSIX specifies that the file type is included in st_mode + ;; and provides names for the file types but values only for + ;; the permissions (e.g., S_IWOTH=2). + + ;; (#o017 ??) ;; #define S_IFMT 00170000 + (#o014 ?s) ;; #define S_IFSOCK 0140000 + (#o012 ?l) ;; #define S_IFLNK 0120000 + ;; (8 ??) ;; #define S_IFREG 0100000 + (#o006 ?b) ;; #define S_IFBLK 0060000 + (#o004 ?d) ;; #define S_IFDIR 0040000 + (#o002 ?c) ;; #define S_IFCHR 0020000 + (#o001 ?p) ;; #define S_IFIFO 0010000 + (_ ?-))) + (if (zerop (logand 256 mode)) ?- ?r) + (if (zerop (logand 128 mode)) ?- ?w) + (if (zerop (logand 64 mode)) + (if (zerop (logand 2048 mode)) ?- ?S) + (if (zerop (logand 2048 mode)) ?x ?s)) + (if (zerop (logand 32 mode)) ?- ?r) + (if (zerop (logand 16 mode)) ?- ?w) + (if (zerop (logand 8 mode)) + (if (zerop (logand 1024 mode)) ?- ?S) + (if (zerop (logand 1024 mode)) ?x ?s)) + (if (zerop (logand 4 mode)) ?- ?r) + (if (zerop (logand 2 mode)) ?- ?w) + (if (zerop (logand 512 mode)) + (if (zerop (logand 1 mode)) ?- ?x) + (if (zerop (logand 1 mode)) ?T ?t))))) + +(unless (and (fboundp 'pos-bol) (fboundp 'pos-eol)) + (defalias 'pos-bol 'line-beginning-position) + (defalias 'pos-eol 'line-end-position)) + +;;; Compatibility with < Emacs-29 +;; Needed by helm-packages.el and affixations functions for helm-mode (27) +;; waiting package.el moves on Elpa. Slightly modified to fit with +;; Emacs-27/28. +(when (eval-when-compile (< emacs-major-version 29)) ; Avoid warnings. + (progn + (require 'package) + (eval-and-compile + (defun package--archives-initialize () + "Make sure the list of installed and remote packages are initialized." + (unless package--initialized + (package-initialize t)) + (unless package-archive-contents + (package-refresh-contents))) + + (defun package-get-descriptor (pkg-name) + "Return the `package-desc' of PKG-NAME." + (unless package--initialized (package-initialize 'no-activate)) + (or (cadr (assq pkg-name package-alist)) + (cadr (assq pkg-name package-archive-contents)))) + + (defun package--upgradeable-packages () + ;; Initialize the package system to get the list of package + ;; symbols for completion. + (package--archives-initialize) + (mapcar + #'car + (seq-filter + (lambda (elt) + (or (let ((available + (assq (car elt) package-archive-contents))) + (and available + (version-list-< + (package-desc-version (cadr elt)) + (package-desc-version (cadr available))))))) + package-alist))) + + (defun package-upgrade (name) + "Upgrade package NAME if a newer version exists." + (let* ((package (if (symbolp name) + name + (intern name))) + (pkg-desc (cadr (assq package package-alist)))) + ;; `pkg-desc' will be nil when the package is an "active built-in". + (when pkg-desc + (package-delete pkg-desc 'force 'dont-unselect)) + (package-install package + ;; An active built-in has never been "selected" + ;; before. Mark it as installed explicitly. + (and pkg-desc 'dont-select)))) + + (defun package-recompile (pkg) + "Byte-compile package PKG again. +PKG should be either a symbol, the package name, or a `package-desc' +object." + (let ((pkg-desc (if (package-desc-p pkg) + pkg + (cadr (assq pkg package-alist))))) + ;; Delete the old .elc files to ensure that we don't inadvertently + ;; load them (in case they contain byte code/macros that are now + ;; invalid). + (dolist (elc (directory-files-recursively + (package-desc-dir pkg-desc) "\\.elc\\'")) + (delete-file elc)) + (package--compile pkg-desc))) + + (defun package--dependencies (pkg) + "Return a list of all dependencies PKG has. +This is done recursively." + ;; Can we have circular dependencies? Assume "nope". + (when-let* ((desc (cadr (assq pkg package-archive-contents))) + (deps (mapcar #'car (package-desc-reqs desc)))) + (delete-dups (apply #'nconc deps (mapcar #'package--dependencies deps)))))))) + +;;; Provide `help--symbol-class' not available in emacs-27 +;; +(unless (fboundp 'help--symbol-class) + (defun help--symbol-class (s) + "Return symbol class characters for symbol S." + (when (stringp s) + (setq s (intern-soft s))) + (concat + (when (fboundp s) + (concat + (cond + ((commandp s) "c") + ((eq (car-safe (symbol-function s)) 'macro) "m") + (t "f")) + (and (let ((flist (indirect-function s))) + (advice--p (if (eq 'macro (car-safe flist)) (cdr flist) flist))) + "!") + (and (get s 'byte-obsolete-info) "-"))) + (when (boundp s) + (concat + (if (custom-variable-p s) "u" "v") + (and (local-variable-if-set-p s) "'") + (and (ignore-errors (not (equal (symbol-value s) (default-value s)))) "*") + (and (get s 'byte-obsolete-variable) "-"))) + (and (facep s) "a") + (and (fboundp 'cl-find-class) (cl-find-class s) "t")))) + +;; Inline `kmacro--to-vector' from E29 to fix compatibility of +;; `helm-kbd-macro-concat-macros' with E29 and E28. +(unless (fboundp #'kmacro--to-vector) + (defun kmacro--to-vector (object) + "Normalize an old-style key sequence to the vector form." + (if (not (stringp object)) + object + (let ((vec (string-to-vector object))) + (unless (multibyte-string-p object) + (dotimes (i (length vec)) + (let ((k (aref vec i))) + (when (> k 127) + (setf (aref vec i) (+ k ?\M-\C-@ -128)))))) + vec)))) + +;;; Macros helper. +;; +(defmacro helm-with-gensyms (symbols &rest body) + "Bind the SYMBOLS to fresh uninterned symbols and eval BODY." + (declare (indent 1)) + `(let ,(mapcar (lambda (s) + ;; Use cl-gensym here instead of make-symbol + ;; to ensure a symbol that have a live that go + ;; beyond the live of its macro have different name. + ;; i.e symbols created with `with-helm-temp-hook' + ;; should have random names. + `(,s (cl-gensym (symbol-name ',s)))) + symbols) + ,@body)) + +;;; Command loop helper +;; +(defconst helm-this-command-black-list + '(helm-maybe-exit-minibuffer + helm-confirm-and-exit-minibuffer + helm-exit-minibuffer + exit-minibuffer + helm-M-x)) + +(defconst helm-this-command-functions '(read-multiple-choice--long-answers) + "The functions that should be returned by `helm-this-command' when found.") + +(defun helm-this-command () + "Return the actual command in action. +Like `this-command' but return the real command, and not +`exit-minibuffer' or other unwanted functions." + (cl-loop for count from 1 to 50 + for btf = (backtrace-frame count) + for fn = (cl-second btf) + ;; Some commands like `kill-buffer' may call another function + ;; involving a completing-read, in this case we want to stop at this + ;; function and not go up to the initial interactive call (in this + ;; case kill-buffer) See Issue#2634. + if (or (memq fn helm-this-command-functions) + (and + ;; In some cases we may have in the way an + ;; advice compiled resulting in byte-code, + ;; ignore it (Bug#691). + (symbolp fn) + (commandp fn) + (not (memq fn helm-this-command-black-list)))) + return fn + else + if (and (eq fn 'call-interactively) + (> (length btf) 2)) + return (cadr (cdr btf)))) + + +;;; Iterators +;; +(cl-defmacro helm-position (item seq &key test all) + "A simple and faster replacement of CL `position'. + +Returns ITEM first occurence position found in SEQ. +When SEQ is a string, ITEM have to be specified as a char. +Argument TEST when unspecified default to `eq'. +When argument ALL is non-nil return a list of all ITEM positions +found in SEQ." + (let ((key (if (stringp seq) 'across 'in))) + `(cl-loop with deftest = 'eq + for c ,key ,seq + for index from 0 + when (funcall (or ,test deftest) c ,item) + if ,all collect index into ls + else return index + finally return ls))) + +(defun helm-iter-list (seq &optional cycle) + "Return an iterator object from SEQ. +The iterator die and return nil when it reach end of SEQ. +When CYCLE is specified the iterator never ends." + (let ((lis seq)) + (lambda () + (let ((elm (car lis))) + (setq lis (if cycle + (or (cdr lis) seq) + (cdr lis))) + elm)))) + +(defun helm-iter-circular (seq) + "Infinite iteration on SEQ." + (helm-iter-list seq 'cycle)) + +(cl-defun helm-iter-sub-next-circular (seq elm &key (test 'eq)) + "Infinite iteration of SEQ starting at ELM." + (let* ((pos (1+ (helm-position elm seq :test test))) + (sub (append (nthcdr pos seq) (helm-take seq pos))) + (iterator (helm-iter-circular sub))) + (lambda () + (helm-iter-next iterator)))) + +(defun helm-iter-next (iterator) + "Return next elm of ITERATOR." + (and iterator (funcall iterator))) + + +;;; Anaphoric macros. +;; +(defmacro helm-aif (test-form then-form &rest else-forms) + "Anaphoric version of `if'. +Like `if' but set the result of TEST-FORM in a temporary variable +called `it'. THEN-FORM and ELSE-FORMS are then executed just like +in `if'." + (declare (indent 2) (debug t)) + `(let ((it ,test-form)) + (if it ,then-form ,@else-forms))) + +(defmacro helm-awhile (sexp &rest body) + "Anaphoric version of `while'. +Same usage as `while' except that SEXP is bound to a temporary +variable called `it' at each turn. +An implicit nil block is bound to the loop so usage of +`cl-return' is possible to exit the loop." + (declare (indent 1) (debug t)) + (helm-with-gensyms (flag) + `(let ((,flag t)) + (cl-block nil + (while ,flag + (helm-aif ,sexp + (progn ,@body) + (setq ,flag nil))))))) + +(defmacro helm-acond (&rest clauses) + "Anaphoric version of `cond'. +In each clause of CLAUSES, the result of the car of clause is +stored in a temporary variable called `it' and usable in the cdr +of this same clause. Each `it' variable is independent of its +clause. The usage is the same as `cond'." + (declare (debug cond)) + (unless (null clauses) + (helm-with-gensyms (sym) + (let ((clause1 (car clauses))) + `(let ((,sym ,(car clause1))) + (helm-aif ,sym + (if (cdr ',clause1) + (progn ,@(cdr clause1)) + it) + (helm-acond ,@(cdr clauses)))))))) + +(defmacro helm-aand (&rest conditions) + "Anaphoric version of `and'. +Each condition is bound to a temporary variable called `it' which +is usable in next condition." + (declare (debug (&rest form))) + (cond ((null conditions) t) + ((null (cdr conditions)) (car conditions)) + (t `(helm-aif ,(car conditions) + (helm-aand ,@(cdr conditions)))))) + +(defmacro helm-acase (expr &rest clauses) + "A simple anaphoric case implementation. + +The car of each clause can be any object that will be compared +with `equal' or an expression starting with `guard' which is +evaluated. Once evaluated `guard' is bound to the returned value +that can be used in the cdr of clause. + +NOTE: `guard' as a temp var is reserved for helm-acase, so if you +let-bind a local var outside the helm-acase body, it will be +overriden deliberately by helm-acase. + +EXPR is bound to a temporary variable called `it' which is +usable in CLAUSES to refer to EXPR. + +\(fn EXPR (KEYLIST BODY...)...)" + (declare (indent 1) (debug (form &rest ([&or (symbolp form) sexp] body)))) + (unless (null clauses) + (let* ((clause1 (car clauses)) + (key (car clause1)) + (sexp (and (eq 'guard (car-safe key)) + (cadr key)))) + `(let* ((it ,expr) + (guard ,sexp)) + (if (or guard + (equal it ',key) + (and (listp ',key) (member it ',key)) + (and (symbolp ',key) (eq ',key t))) + (progn ,@(cdr clause1)) + (helm-acase it ,@(cdr clauses))))))) + +;;; Fuzzy matching routines +;; +(defsubst helm--mapconcat-pattern (pattern) + "Transform string PATTERN in regexp for further fuzzy matching. +E.g.: helm.el$ + => \"[^h]*h[^e]*e[^l]*l[^m]*m[^.]*\\\\.[^e]*e[^l]*l$\" + ^helm.el$ + => \"helm\\\\.el$\"." + (let ((ls (split-string-and-unquote pattern ""))) + (if (string= "^" (car ls)) + ;; Exact match. + (mapconcat (lambda (c) + (if (and (string= c "$") + (string-match "$\\'" pattern)) + c (regexp-quote c))) + (cdr ls) "") + ;; Fuzzy match. + (mapconcat (lambda (c) + (if (and (string= c "$") + (string-match "$\\'" pattern)) + c (format "[^%s]*%s" c (regexp-quote c)))) + ls "")))) + +(defsubst helm--collect-pairs-in-string (string) + ;; We want to collect e.g. + ;; in "abcd" -> (("a" "b") ("b" "c") ("c" "d")) + ;; and not (("a" "b") ("c" "d")) so we use by #'cdr which is the default. + ;; If the last pair have no cdr i.e. (s1 nil) ignore it. + (cl-loop for (s1 s2) on (split-string string "" t) + when s2 collect (list s1 s2))) + +;;; Help routines. +;; +(defvar helm-help--iter-org-state nil) + +(defvar helm-help-mode-before-hook nil + "A hook that runs before helm-help starts.") + +(defvar helm-help-mode-after-hook nil + "A hook that runs when helm-help exits.") + +(defcustom helm-help-default-prompt + "[SPC,C-v,next:ScrollUp b,M-v,prior:ScrollDown TAB:Cycle M-TAB:All C-s/r:Isearch q:Quit]" + "The prompt used in `helm-help'." + :type 'string + :group 'helm) + +(defcustom helm-help-hkmap + '(("C-v" . helm-help-scroll-up) + ("SPC" . helm-help-scroll-up) + ("" . helm-help-scroll-up) + ("M-v" . helm-help-scroll-down) + ("b" . helm-help-scroll-down) + ("" . helm-help-scroll-down) + ("C-s" . isearch-forward) + ("C-r" . isearch-backward) + ("C-a" . move-beginning-of-line) + ("C-e" . move-end-of-line) + ("C-f" . forward-char) + ("" . forward-char) + ("C-b" . backward-char) + ("" . backward-char) + ("C-n" . helm-help-next-line) + ("C-p" . helm-help-previous-line) + ("" . helm-help-next-line) + ("" . helm-help-previous-line) + ("M-a" . backward-sentence) + ("M-e" . forward-sentence) + ("M-f" . forward-word) + ("M-b" . backward-word) + ("M->" . end-of-buffer) + ("M-<" . beginning-of-buffer) + ("C-SPC" . helm-help-toggle-mark) + ("C-M-SPC" . mark-sexp) + ("TAB" . org-cycle) + ("C-m" . helm-help-org-open-at-point) + ("C-&" . helm-help-org-mark-ring-goto) + ("C-%" . org-mark-ring-push) + ("M-TAB" . helm-help-org-cycle) + ("M-w" . helm-help-copy-region-as-kill) + ("q" . helm-help-quit)) + "Alist of (KEY . FUNCTION) for `helm-help'. + +This is not a standard keymap, just an alist where it is possible to +define a simple KEY (a string with no spaces) associated with a +FUNCTION. More complex key like \"C-x C-x\" are not supported. +Interactive functions will be called interactively whereas other +functions will be called with funcall except commands that are in +`helm-help-not-interactive-command'. +For convenience you can add bindings here with `helm-help-define-key'." + :type '(alist :key-type string :key-value symbol) + :group 'helm) + +(defvar helm-help-not-interactive-command '(isearch-forward isearch-backward) + "Commands that we don't want to call interactively in `helm-help'.") + +(defun helm-help-internal (bufname insert-content-fn) + "Show long message during Helm session in BUFNAME. +INSERT-CONTENT-FN is the function that inserts text to be +displayed in BUFNAME." + (let ((winconf (current-frame-configuration)) + (hframe (selected-frame))) + (helm-log-run-hook "helm-help-internal" 'helm-help-mode-before-hook) + (with-selected-frame helm-initial-frame + (select-frame-set-input-focus helm-initial-frame) + (unwind-protect + (progn + (setq helm-suspend-update-flag t) + (set-buffer (get-buffer-create bufname)) + (switch-to-buffer bufname) + (when helm-help-full-frame (delete-other-windows)) + (delete-region (point-min) (point-max)) + (org-mode) + (save-excursion + (funcall insert-content-fn) + (goto-char (point-min)) + (while (re-search-forward "^[|]" nil t) + (when (org-table-p t) + (org-table-align) + (goto-char (org-table-end))))) + (org-mark-ring-push) ; Put mark at bob + (buffer-disable-undo) + (helm-help-event-loop)) + (raise-frame hframe) + (helm-log-run-hook "helm-help-internal" 'helm-help-mode-after-hook) + (setq helm-suspend-update-flag nil) + (set-frame-configuration winconf))))) + +(cl-defun helm-help-scroll-up (&optional (amount helm-scroll-amount)) + "Scroll up in `helm-help'." + (condition-case _err + (scroll-up-command amount) + (beginning-of-buffer nil) + (end-of-buffer nil))) + +(cl-defun helm-help-scroll-down (&optional (amount helm-scroll-amount)) + "Scroll down in `helm-help'." + (condition-case _err + (scroll-down-command amount) + (beginning-of-buffer nil) + (end-of-buffer nil))) + +(defun helm-help-next-line () + "Next line function for `helm-help'." + (condition-case _err + (call-interactively #'next-line) + (beginning-of-buffer nil) + (end-of-buffer nil))) + +(defun helm-help-previous-line () + "Previous line function for `helm-help'." + (condition-case _err + (call-interactively #'previous-line) + (beginning-of-buffer nil) + (end-of-buffer nil))) + +(defun helm-help-toggle-mark () + "Toggle mark in `helm-help'." + (if (region-active-p) + (deactivate-mark) + (push-mark nil nil t))) + +(defun helm-help-org-cycle () + "Runs `org-cycle' in `helm-help'." + (helm-acase (helm-iter-next helm-help--iter-org-state) + ((guard (numberp it)) (org-content)) + ;; See `helm--help-org-prefargs' about `org-cycle' ARG. + (t (org-cycle it)))) + +(defun helm-help-copy-region-as-kill () + "Copy region function for `helm-help'" + (copy-region-as-kill + (region-beginning) (region-end)) + (deactivate-mark)) + +(defun helm-help-quit () + "Quit `helm-help'." + (if (or (get-buffer-window helm-help-buffer-name 'visible) + (get-buffer-window helm-debug-output-buffer 'visible)) + (throw 'helm-help-quit nil) + (quit-window))) + +(defun helm-help-org-open-at-point () + "Calls `org-open-at-point' ignoring errors." + (ignore-errors + (org-open-at-point))) + +(defun helm-help-org-mark-ring-goto () + "Calls `org-mark-ring-goto' ignoring errors." + (ignore-errors + (org-mark-ring-goto))) + +(defvar helm--help-org-prefargs + (if (> emacs-major-version 28) + '(1 (4) (16)) '(1 (16) (64))) + "`org-cycle' ARG have not the same meaning across Emacs versions.") + +(defun helm-help-event-loop () + "The loop in charge of scanning keybindings in `helm-help'." + (let ((prompt (propertize + helm-help-default-prompt + 'face 'helm-helper)) + scroll-error-top-bottom + (helm-help--iter-org-state (helm-iter-circular helm--help-org-prefargs))) + (catch 'helm-help-quit + (helm-awhile (read-key prompt) + (let ((fun (cl-loop for (k . v) in helm-help-hkmap + when (eql (aref (kbd k) 0) it) + return v))) + (when fun + (if (and (commandp fun) + (not (memq fun helm-help-not-interactive-command))) + ;; For movement of cursor in help buffer we need to + ;; call interactively commands for impaired people + ;; using a synthetizer (Bug#1347). + (call-interactively fun) + (funcall fun)))))))) + +(defun helm-help-define-key (key function &optional override) + "Add KEY bound to fUNCTION in `helm-help-hkmap'. + +If OVERRIDE is non nil, all bindings associated with FUNCTION are +removed and only (KEY . FUNCTION) is kept. +If FUNCTION is nil (KEY . FUNCTION) is not added and removed from +alist if already present. +See `helm-help-hkmap' for supported keys and functions." + (cl-assert (not (cdr (split-string key))) nil + (format "Error: Unsuported key `%s'" key)) + (when override + (helm-awhile (rassoc function helm-help-hkmap) + (setq helm-help-hkmap (delete it helm-help-hkmap)))) + (helm-aif (and (null function) (assoc key helm-help-hkmap)) + (setq helm-help-hkmap (delete it helm-help-hkmap)) + (and function (add-to-list 'helm-help-hkmap `(,key . ,function))))) + +;;; Multiline transformer +;; +(defun helm-multiline-transformer (candidates _source) + (cl-loop with offset = (helm-interpret-value + (assoc-default 'multiline (helm-get-current-source))) + for cand in candidates + for disp = (or (car-safe cand) cand) + for real = (or (cdr-safe cand) cand) + if (numberp offset) + collect (cons (helm--multiline-get-truncated-candidate disp offset) + real) + else collect (cons disp real))) + +(defun helm--multiline-get-truncated-candidate (candidate offset) + "Truncate CANDIDATE when its length is > than OFFSET." + (with-temp-buffer + (insert candidate) + (goto-char (point-min)) + (if (and offset + (> (buffer-size) offset)) + (let ((end-str "[...]")) + (concat + (buffer-substring + (point) + (save-excursion + (forward-char offset) + (setq end-str (if (looking-at "\n") + end-str (concat "\n" end-str))) + (point))) + end-str)) + (buffer-string)))) + +;;; List processing +;; +(defun helm-flatten-list (seq) + "Return a list of all single elements of sublists in SEQ. + + Example: + (helm-flatten-list \\='(1 (2 . 3) nil (4 5 (6) 7) 8 (9 . 10))) + => (1 2 3 4 5 6 7 8 9 10)" + (let (result) + (cl-labels ((flatten + (seq) + (cl-loop for elm in seq + if (consp elm) + do (flatten + (if (atom (cdr elm)) + (list (car elm) (cdr elm)) + elm)) + else do (and elm (push elm result))))) + (flatten seq)) + (nreverse result))) + +(defun helm-mklist (obj) + "Return OBJ as a list. +Otherwise make a list with one element OBJ." + (if (and (listp obj) (not (functionp obj))) + obj + (list obj))) + +(cl-defun helm-fast-remove-dups (seq &key (test 'eq)) + "Remove duplicates elements in list SEQ. + +This is same as `remove-duplicates' but with memoisation. +It is much faster, especially in large lists. +A test function can be provided with TEST argument key. +Default is `eq'. +NOTE: Comparison of special Elisp objects (e.g., markers etc.) +fails because their printed representations which are stored in +hash-table can't be compared with with the real object in SEQ. +This is a bug in `puthash' which store the printable +representation of object instead of storing the object itself, +this to provide at the end a printable representation of +hashtable itself." + (let ((table (make-hash-table :test test))) + (mapcan (lambda (x) + (unless (gethash x table) + (list (puthash x x table)))) + seq))) + +(defsubst helm--string-join (strings &optional separator) + "Join all STRINGS using SEPARATOR." + (mapconcat 'identity strings separator)) + +(defun helm--concat-regexps (regexp-list) + "Return a regexp which matches any of the regexps in REGEXP-LIST." + (if regexp-list + (concat "\\(?:" (helm--string-join regexp-list "\\)\\|\\(?:") "\\)") + "\\`\\'")) ; Match nothing + +(defun helm-skip-entries (seq black-regexp-list &optional white-regexp-list) + "Remove entries which match one of REGEXP-LIST from SEQ." + (let ((black-regexp (helm--concat-regexps black-regexp-list)) + (white-regexp (helm--concat-regexps white-regexp-list))) + (cl-loop for i in seq + unless (and (stringp i) + (string-match-p black-regexp i) + (null + (string-match-p white-regexp i))) + collect i))) + +(defun helm-boring-directory-p (directory black-list) + "Check if one regexp in BLACK-LIST matches DIRECTORY." + (helm-awhile (helm-basedir (directory-file-name + (expand-file-name directory))) + ;; Break at root to avoid infloop, root is / or on Windows + ;; C:/ i.e. :/ (Bug#2308). + (when (string-match-p "\\`[A-Za-z]?:?/\\'" it) + (cl-return nil)) + (when (cl-loop for r in black-list + thereis (string-match-p + r (directory-file-name directory))) + (cl-return t)) + (setq directory it))) + +(defun helm-shadow-entries (seq regexp-list) + "Put shadow property on entries in SEQ matching a regexp in REGEXP-LIST." + (let ((face 'italic)) + (cl-loop for i in seq + if (cl-loop for regexp in regexp-list + thereis (and (stringp i) + (string-match regexp i))) + collect (propertize i 'face face) + else collect i))) + +(defun helm-remove-if-not-match (regexp seq) + "Remove all elements of SEQ that don't match REGEXP." + (cl-loop for s in seq + for str = (cond ((symbolp s) + (symbol-name s)) + ((consp s) + (car s)) + (t s)) + when (string-match-p regexp str) + collect s)) + +(defun helm-remove-if-match (regexp seq) + "Remove all elements of SEQ that match REGEXP." + (cl-loop for s in seq + for str = (cond ((symbolp s) + (symbol-name s)) + ((consp s) + (car s)) + (t s)) + unless (string-match-p regexp str) + collect s)) + +(defun helm-transform-mapcar (fn seq) + "Apply function FN on all elements of list SEQ. +When SEQ is a list of cons cells apply FN on the cdr of each element, +keeping their car unmodified. + +Examples: + + (helm-transform-mapcar \\='upcase \\='(\"foo\" \"bar\")) + => (\"FOO\" \"BAR\") + (helm-transform-mapcar \\='upcase \\='((\"1st\" . \"foo\") (\"2nd\" . \"bar\"))) + => ((\"1st\" . \"FOO\") (\"2nd\" . \"BAR\")) +" + (cl-loop for elm in seq + if (consp elm) + collect (cons (car elm) (funcall fn (cdr elm))) + else + collect (funcall fn elm))) + +(defun helm-append-at-nth (seq elm index) + "Append ELM at INDEX in SEQ. +When INDEX is > to the SEQ length ELM is added at end of SEQ. +When INDEX is 0 or negative, ELM is added at beginning of SEQ. + +Examples: + + (helm-append-at-nth \\='(a b c d) \\='(z) 2) + =>(a b z c d) + + (helm-append-at-nth \\='(a b c d) \\='((x . 1) (y . 2)) 2) + =>(a b (x . 1) (y . 2) c d) + + But this is not working: + (helm-append-at-nth \\='(a b c d) \\='(x . 1) 2) + =>Wrong type argument: listp, 1 + +NOTE: This function uses `append' internally, so ELM is expected +to be a list to be appended to SEQ, even if for convenience an +atom is supported as ELM value." + (setq index (min (max index 0) (length seq)) + elm (helm-mklist elm)) + (if (zerop index) + (append elm seq) + (let* ((end-part (nthcdr index seq)) + (len (length end-part)) + (beg-part (butlast seq len))) + (append beg-part elm end-part)))) + +(cl-defgeneric helm-take (seq n) + "Return the first N elements of SEQ if SEQ is longer than N. +It is used for narrowing list of candidates to the +`helm-candidate-number-limit'." + (if (> (length seq) n) (cl-subseq seq 0 n) seq)) + +(cl-defmethod helm-take ((seq list) n) + "`helm-take' optimized for lists." + (let ((store '())) + (if (> n (length seq)) + seq + (while (> (1+ (cl-decf n)) 0) + (push (pop seq) store)) + (nreverse store)))) + +(defalias 'helm-take-first-elements 'helm-take) +(make-obsolete 'helm-take-first-elements 'helm-take "3.9.1") + +(defun helm-source-by-name (name &optional sources) + "Get a Helm source in SOURCES by NAME. + +Optional argument SOURCES is a list of Helm sources which default +to `helm-sources'." + (cl-loop with src-list = (if sources + (cl-loop for src in sources + collect (if (listp src) + src + (symbol-value src))) + helm-sources) + for source in src-list + thereis (and (string= name (assoc-default 'name source)) source))) + +(defun helm-make-actions (&rest args) + "Build an alist with (NAME . ACTION) elements with each pairs in ARGS. +Where NAME is a string or a function returning a string or nil +and ACTION a function. +If NAME returns nil the pair is skipped. + +\(fn NAME ACTION ...)" + (cl-loop for (name fn) on args by #'cddr + when (functionp name) + do (setq name (funcall name)) + when name + collect (cons name fn))) + +(defun helm-closest-number-in-list (num list) + "Return closest number to NUM found in LIST. +LIST is a list of numbers and NUM a number." + (cl-loop for i in list + for diff = (if (> num i) (- num i) (- i num)) + collect (cons diff i) into res + minimize diff into min + finally return (cdr (assq min res)))) + +(defun helm-group-candidates-by (candidates function &optional selection separate) + "Group similar items in CANDIDATES according to FUNCTION. +Items not matching FUNCTION are grouped as well in a separate group. + +Example: + + (setq B \\='(1 2 3 4 5 6 7 8 9)) + + (helm-group-candidates-by B #\\='cl-oddp 2 \\='separate) + => ((2 4 6 8) (1 3 5 7 9)) + +SELECTION specify where to start in CANDIDATES. +Similar candidates to SELECTION will be listed on top. + +If SEPARATE is non-nil returns a list of groups i.e. a list of lists, +otherwise a plain list is returned." + (cl-loop with sel = (or selection (helm-get-selection) "") + with lst = (copy-sequence candidates) + while lst + for group = (cl-loop for c in lst + when (equal (funcall function c) + (funcall function sel)) + collect c into grp + and do (setq lst (delete c lst)) + finally return (prog1 grp + (setq sel (car lst)))) + if separate collect group + else append group)) + +(defun helm-reorganize-sequence-from-elm (sequence elm &optional reverse) + "Reorganize SEQUENCE from ELM. + +Examples: + + (helm-reorganize-sequence-from-elm \\='(a b c d e f g h i j k l) \\='e) + => (f g h i j k l a b c d e) + (helm-reorganize-sequence-from-elm \\='(a b c d e f g h i j k l) \\='e t) + => (d c b a l k j i h g f e) +" + (let* ((new-seq (if reverse + (reverse sequence) + sequence)) + (pos (1+ (cl-position elm new-seq :test 'equal)))) + (append (nthcdr pos new-seq) (helm-take new-seq pos)))) + +;;; Strings processing. +;; +(defun helm-stringify (elm) + "Return the representation of ELM as a string. +ELM can be a string, a number or a symbol." + (helm-acase elm + ((guard (stringp it)) it) + ((guard (numberp it)) (number-to-string it)) + ((guard (symbolp it)) (symbol-name it)))) + +(defun helm-substring (str width) + "Return the substring of string STR from 0 to WIDTH. +Handle multibyte characters by moving by columns." + (with-temp-buffer + (save-excursion + (insert str)) + (move-to-column width) + (buffer-substring (pos-bol) (point)))) + +(defun helm-substring-by-width (str width &optional endstr) + "Truncate string STR to end at column WIDTH. +Similar to `truncate-string-to-width'. +Add ENDSTR at end of truncated STR. +Add spaces at end if needed to reach WIDTH when STR is shorter +than WIDTH." + (cl-loop for ini-str = str + then (substring ini-str 0 (1- (length ini-str))) + for sw = (string-width ini-str) + when (<= sw width) return + (concat ini-str endstr (make-string (- width sw) ? )))) + +(defun helm-string-multibyte-p (str) + "Check if string STR contains multibyte characters." + (cl-loop for c across str + thereis (> (char-width c) 1))) + +(defun helm-get-pid-from-process-name (process-name) + "Get pid from running process PROCESS-NAME." + ;; Protect system processes calls (Issue #2497) + ;; Ensure `list-system-processes' and `process-attributes' don't run + ;; on remote (only Emacs-28/29+). + (cl-loop with default-directory = temporary-file-directory + with process-list = (list-system-processes) + for pid in process-list + for process = (assoc-default 'comm (process-attributes pid)) + when (and process (string-match process-name process)) + return pid)) + +(defun helm-ff-find-printers () + "Return a list of available printers on Unix systems." + (when (executable-find "lpstat") + (let ((printer-list (with-temp-buffer + (call-process "lpstat" nil t nil "-a") + (split-string (buffer-string) "\n")))) + (cl-loop for p in printer-list + for printer = (car (split-string p)) + when printer + collect printer)))) + +(defun helm-region-active-p () + (and transient-mark-mode mark-active (/= (mark) (point)))) + +(defun helm-quote-whitespace (candidate) + "Quote whitespace, if some, in string CANDIDATE." + (replace-regexp-in-string " " "\\\\ " candidate)) + +(defun helm-current-line-contents () + "Current line string without properties." + (buffer-substring-no-properties (pos-bol) (pos-eol))) + +(defun helm--replace-regexp-in-buffer-string (regexp rep str &optional fixedcase literal subexp start) + "Replace REGEXP by REP in string STR. + +Same as `replace-regexp-in-string' but handle properly REP as +function with SUBEXP specified. + +E.g.: + + (helm--replace-regexp-in-buffer-string + \"e\\\\(m\\\\)acs\" \\='upcase \"emacs\" t nil 1) + => \"eMacs\" + + (replace-regexp-in-string + \"e\\\\(m\\\\)acs\" \\='upcase \"emacs\" t nil 1) + => \"eEMACSacs\" + +Also START argument behaves as expected unlike +`replace-regexp-in-string'. + +E.g.: + + (helm--replace-regexp-in-buffer-string \"f\" \"r\" \"foofoo\" t nil nil 3) + => \"fooroo\" + + (replace-regexp-in-string \"f\" \"r\" \"foofoo\" t nil nil 3) + => \"roo\" + +Unlike `replace-regexp-in-string' this function is buffer-based +implemented i.e. replacement is computed inside a temp buffer, so +REGEXP should be used differently than with +`replace-regexp-in-string'. + +NOTE: This function is used internally for +`helm-ff-query-replace-on-filenames' and builded for this. +You should use `replace-regexp-in-string' instead unless the +behaviour of this function is really needed." + (with-temp-buffer + (insert str) + (goto-char (or start (point-min))) + (while (re-search-forward regexp nil t) + (replace-match (cond ((and (functionp rep) subexp) + (funcall rep (match-string subexp))) + ((functionp rep) + (funcall rep str)) + (t rep)) + fixedcase literal nil subexp)) + (buffer-string))) + +(defun helm-url-unhex-string (str) + "Same as `url-unhex-string' but ensure STR is completely decoded." + (setq str (or str "")) + (with-temp-buffer + (save-excursion (insert str)) + (while (re-search-forward "%[A-Za-z0-9]\\{2\\}" nil t) + (replace-match (byte-to-string (string-to-number + (substring (match-string 0) 1) + 16)) + t t) + ;; Restart from beginning until string is completely decoded. + (goto-char (point-min))) + (decode-coding-string (buffer-string) 'utf-8))) + +(defun helm-read-answer (prompt answer-list) + "Prompt user for an answer. +Arg PROMPT is the prompt to present user the different possible +answers, ANSWER-LIST is a list of strings. +If user enters an answer which is one of ANSWER-LIST return this +answer, otherwise keep prompting for a valid answer. +Note that answer should be a single char, only short answer are +accepted. + +Example: + + (helm-acase (helm-read-answer + \"answer [y,n,!,q]: \" + \\='(\"y\" \"n\" \"!\" \"q\")) + (\"y\" \"yes\") + (\"n\" \"no\") + (\"!\" \"all\") + (\"q\" \"quit\")) + +" + (helm-awhile (read-key (propertize prompt 'face 'minibuffer-prompt)) + (let ((str (and (characterp it) (string it)))) + (if (and str (member str answer-list)) + (cl-return str) + (message "Please answer by %s" (mapconcat 'identity answer-list ", ")) + (sit-for 1))))) + +(defun helm-read-answer-dolist-with-action (prompt list action &optional prompt-formater) + "Read answer with PROMPT and execute ACTION on each element of LIST. + +Argument PROMPT is a format spec string e.g. \"Do this on %s?\" +which take each elements of LIST as argument, no need to provide +the help part i.e. [y,n,!,q] it will be already added. + +While looping through LIST, ACTION is executed on each elements +differently depending of answer: + +- y Execute ACTION on element. +- n Skip element. +- ! Don't ask anymore and execute ACTION on remaining elements. +- q Skip all remaining elements. + +PROMPT-FORMATER is a function called with one argument which is +used to modify each element of LIST to be displayed in PROMPT." + (let (dont-ask) + (catch 'break + (dolist (elm list) + (if dont-ask + (funcall action elm) + (helm-acase (helm-read-answer + (format (concat prompt "[y,n,!,q]") + (if prompt-formater + (funcall prompt-formater elm) + elm)) + '("y" "n" "!" "q")) + ("y" (funcall action elm)) + ("n" (ignore)) + ("!" (prog1 + (funcall action elm) + (setq dont-ask t))) + ("q" (throw 'break nil)))))))) + +(defsubst helm-string-numberp (str) + "Return non nil if string STR represent a number." + (cl-assert (stringp str) t) + (or (cl-loop for c across str always (char-equal c ?0)) + (not (zerop (string-to-number str))))) + +;;; Symbols routines +;; +(defun helm-symbolify (str-or-sym) + "Get symbol of STR-OR-SYM." + (helm-acase str-or-sym + ((guard (symbolp it)) it) + ("" nil) + (t (intern it)))) + +(defun helm-symbol-name (obj) + (if (or (and (consp obj) (functionp obj)) + (byte-code-function-p obj) + (helm-subr-native-elisp-p obj)) + "Anonymous" + (symbol-name obj))) + +(defun helm-describe-class (class) + "Display documentation of Eieio CLASS, a symbol or a string." + (let ((advicep (advice-member-p #'helm-source--cl--print-table 'cl--print-table))) + (unless advicep + (advice-add 'cl--print-table :override #'helm-source--cl--print-table '((depth . 100)))) + (unwind-protect + (if (fboundp 'cl-describe-type) + (cl-describe-type (helm-symbolify class)) + (let ((helm-describe-function-function 'describe-function)) + (helm-describe-function (helm-symbolify class)))) + (unless advicep + (advice-remove 'cl--print-table #'helm-source--cl--print-table))))) + +(defun helm-describe-function (func) + "Display documentation of FUNC, a symbol or string." + (cl-letf (((symbol-function 'message) #'ignore)) + (funcall helm-describe-function-function (helm-symbolify func)))) + +(defun helm-describe-variable (var) + "Display documentation of VAR, a symbol or a string." + (cl-letf (((symbol-function 'message) #'ignore)) + (funcall helm-describe-variable-function (helm-symbolify var)))) + +(defun helm-describe-face (face) + "Display documentation of FACE, a symbol or a string." + (let ((faces (helm-marked-candidates))) + (cl-letf (((symbol-function 'message) #'ignore)) + (describe-face (if (cdr faces) + (mapcar 'helm-symbolify faces) + (helm-symbolify face)))))) + +(defun helm-elisp--persistent-help (candidate fun &optional name) + "Used to build persistent actions describing CANDIDATE with FUN. +Argument NAME is used internally to know which command to use +when symbol CANDIDATE refers at the same time to a variable and a +function. +See `helm-elisp-show-help'." + (let ((hbuf (get-buffer (help-buffer)))) + (cond ((helm-follow-mode-p) + (if name + (funcall fun candidate name) + (funcall fun candidate))) + ((or (and (helm-get-attr 'help-running-p) + (string= candidate (helm-get-attr 'help-current-symbol)))) + (progn + ;; When started from a help buffer, + ;; Don't kill this buffer as it is helm-current-buffer. + (unless (equal hbuf helm-current-buffer) + (kill-buffer hbuf) + (set-window-buffer (get-buffer-window hbuf) + ;; It is generally + ;; helm-current-buffer but it may + ;; be another buffer when helm have + ;; been started from a dedicated window. + (if helm--buffer-in-new-frame-p + helm-current-buffer + helm-persistent-action-window-buffer))) + (helm-set-attr 'help-running-p nil)) + ;; Force running update hook to may be delete + ;; helm-persistent-action-display-window, this is done in + ;; helm-persistent-action-display-window (the function). + (unless helm--buffer-in-new-frame-p + (helm-update (regexp-quote (helm-get-selection))))) + (t + (if name + (funcall fun candidate name) + (funcall fun candidate)) + (helm-set-attr 'help-running-p t))) + (helm-set-attr 'help-current-symbol candidate))) + +(defcustom helm-find-function-default-project nil + "Default directories to search symbols definitions from `helm-apropos'. +A list of directories or a single directory name. +Helm will allow you selecting one of those directories with `M-n' when +using a prefix arg with the `find-function' action in `helm-apropos'. +This is a good idea to add the directory names of the projects you are +working on to quickly jump to the definitions in the project source +files instead of jumping to the loaded files located in `load-path'." + :type '(choice (repeat string) + string) + :group 'helm-elisp) + +(defun helm-find-function-noselect (func &optional root-dir type) + "Find FUNC definition without selecting buffer. +FUNC can be a symbol or a string. +Instead of looking in LOAD-PATH to find library, this function +search in all subdirs of ROOT-DIR, if ROOT-DIR is unspecified ask for +it with completion. +TYPE when nil specify function, for other values see +`find-function-regexp-alist'." + (require 'find-func) + (let* ((sym (helm-symbolify func)) + (dir (or root-dir (helm-read-file-name + "Project directory: " + :test 'file-directory-p + :default (helm-mklist helm-find-function-default-project) + :must-match t))) + (find-function-source-path + (cons dir (helm-walk-directory dir + :directories 'only + :path 'full))) + (symbol-lib (helm-acase type + ((defvar defface) + (or (symbol-file sym it) + (help-C-file-name sym 'var))) + ;; Sometimes e.g. with prefix key symbols + ;; `find-function-library' returns a list of only one + ;; element, the symbol itself i.e. no library. + (t (cdr (find-function-library sym))))) + (library (and symbol-lib + (find-library-name + (helm-basename symbol-lib t))))) + (if library + (find-function-search-for-symbol sym type library) + (error "Don't know where `%s' is defined" sym)))) + +(defun helm-find-function (func) + "Try to jump to FUNC definition. +With a prefix arg ask for the project directory to search in instead of +using LOAD-PATH." + (if (not helm-current-prefix-arg) + (find-function (helm-symbolify func)) + (let ((place (helm-find-function-noselect func))) + (if (cdr place) + (progn + (switch-to-buffer (car place)) (goto-char (cdr place))) + (helm-aif (car place) + (message "Couldn't find Function `%s' in `%s'" + func (buffer-name it)) + (message "Couldn't find Function `%s'" func)))))) + +(defun helm-find-variable (var) + "Try to jump to VAR definition. +With a prefix arg ask for the project directory to search in instead of +using LOAD-PATH." + (if (not helm-current-prefix-arg) + (find-variable (helm-symbolify var)) + (let ((place (helm-find-function-noselect var nil 'defvar))) + (when place + (switch-to-buffer (car place)) (goto-char (cdr place)))))) + +(defun helm-find-face-definition (face) + "Try to jump to FACE definition. +With a prefix arg ask for the project directory to search in instead of +using LOAD-PATH." + (if (not helm-current-prefix-arg) + (find-face-definition (helm-symbolify face)) + (let ((place (helm-find-function-noselect face nil 'defface))) + (when place + (switch-to-buffer (car place)) (goto-char (cdr place)))))) + +(defun helm-kill-new (candidate &optional replace) + "CANDIDATE is symbol or string. +See `kill-new' for argument REPLACE." + (kill-new (helm-stringify candidate) replace)) + +(defun helm-group-p (symbol) + "Return non nil when SYMBOL is a group." + (or (and (get symbol 'custom-loads) + (not (get symbol 'custom-autoload))) + (get symbol 'custom-group))) + + +;;; Modes +;; +(defun helm-same-major-mode-p (start-buffer alist) + "Decide if current-buffer is related to START-BUFFER. +Argument ALIST is an alist of associated major modes." + ;; START-BUFFER is the current-buffer where we start searching. + ;; Determine the major-mode of START-BUFFER as `cur-maj-mode'. + ;; Each time the loop go in another buffer we try from this buffer + ;; to determine if its `major-mode' is: + ;; - same as the `cur-maj-mode' + ;; - derived from `cur-maj-mode' and from + ;; START-BUFFER if its mode is derived from the one in START-BUFFER. + ;; - have an assoc entry (major-mode . cur-maj-mode) + ;; - have an rassoc entry (cur-maj-mode . major-mode) + ;; - check if one of these entries inherit from another one in + ;; `alist'. + (let* ((cur-maj-mode (with-current-buffer start-buffer major-mode)) + (maj-mode major-mode) + (c-assoc-mode (assq cur-maj-mode alist)) + (c-rassoc-mode (rassq cur-maj-mode alist)) + (o-assoc-mode (assq major-mode alist)) + (o-rassoc-mode (rassq major-mode alist)) + (cdr-c-assoc-mode (cdr c-assoc-mode)) + (cdr-o-assoc-mode (cdr o-assoc-mode))) + (or (eq major-mode cur-maj-mode) + (derived-mode-p cur-maj-mode) + (with-current-buffer start-buffer + (derived-mode-p maj-mode)) + (or (eq cdr-c-assoc-mode major-mode) + (eq (car c-rassoc-mode) major-mode) + (eq (cdr (assq cdr-c-assoc-mode alist)) + major-mode) + (eq (car (rassq cdr-c-assoc-mode alist)) + major-mode)) + (or (eq cdr-o-assoc-mode cur-maj-mode) + (eq (car o-rassoc-mode) cur-maj-mode) + (eq (cdr (assq cdr-o-assoc-mode alist)) + cur-maj-mode) + (eq (car (rassq cdr-o-assoc-mode alist)) + cur-maj-mode))))) + +;;; Source processing +;; +(defun helm-map-candidates-in-source (src fn pred) + "Map over all candidates in SRC and execute FN if PRED returns non nil. +Arg FN and PRED are functions called with current display part of +candidate as arg." + (declare (indent 1)) + (save-excursion + (goto-char (helm-get-previous-header-pos)) + (helm-next-line) + (let* ((next-head (helm-get-next-header-pos)) + (end (and next-head + (save-excursion + (goto-char next-head) + (forward-line -1) + (point)))) + (maxpoint (or end (point-max)))) + (while (< (point) maxpoint) + (helm-mark-current-line) + (let ((cand (helm-get-selection nil 'withprop src))) + (when (funcall pred cand) + (funcall fn cand))) + (forward-line 1) (end-of-line))))) + +;;; Files routines +;; +(defun helm-file-name-sans-extension (filename) + "Same as `file-name-sans-extension' but remove all extensions." + (helm-aif (file-name-sans-extension filename) + ;; Start searching at index 1 for files beginning with a dot + ;; (bug#1335). + (if (string-match "\\." (helm-basename it) 1) + (helm-file-name-sans-extension it) + it))) + +(defsubst helm-file-name-extension (file) + "Returns FILE extension if it is not a number." + (helm-aif (file-name-extension file) + (and (not (helm-string-numberp it)) it))) + +(defun helm-basename (fname &optional ext) + "Print FNAME with any leading directory components removed. +If specified, also remove filename extension EXT. +If FNAME is a directory EXT arg is ignored. + +Arg EXT can be specified as a string, a number or `t' . +When specified as a string, this string is stripped from end of FNAME. +e.g. (helm-basename \"tutorial.el.gz\" \".el.gz\") => tutorial. +When `t' no checking of `file-name-extension' is done and the first +extension is removed unconditionally with `file-name-sans-extension'. +e.g. (helm-basename \"tutorial.el.gz\" t) => tutorial.el. +When a number, remove that many times extensions from FNAME until FNAME ends +with its real extension which is by default \".el\". +e.g. (helm-basename \"tutorial.el.gz\" 2) => tutorial +To specify the extension where to stop use a cons cell where the cdr is a regexp +matching extension e.g. (2 . \\\\.py$). +e.g. (helm-basename \"~/ucs-utils-6.0-delta.py.gz\" \\='(2 . \"\\\\.py\\\\\\='\")) +=>ucs-utils-6.0-delta." + (let ((non-essential t) + (ext-regexp (cond ((consp ext) (cdr ext)) + ((numberp ext) "\\.el\\'") + (t ext))) + result) + (cond ((or (null ext) (file-directory-p fname)) + (file-name-nondirectory (directory-file-name fname))) + ((or (numberp ext) (consp ext)) + (cl-dotimes (_ (if (consp ext) (car ext) ext)) + (let ((bn (file-name-nondirectory (or result fname)))) + (helm-aif (file-name-sans-extension bn) + (if (string-match-p ext-regexp bn) + (cl-return (setq result (file-name-sans-extension bn))) + (setq result (file-name-sans-extension bn)))))) + result) + ((eq t ext) + (file-name-sans-extension (file-name-nondirectory fname))) + ((stringp ext) + (replace-regexp-in-string (concat (regexp-quote ext) "\\'") "" + (file-name-nondirectory fname)))))) + +(defun helm-basedir (fname &optional parent) + "Return the base directory of FNAME ending by a slash. +If PARENT is specified and FNAME is a directory return the parent +directory of FNAME. +If PARENT is not specified but FNAME doesn't end by a slash, the returned value +is same as with PARENT." + (helm-aif (and fname + (or (and (string= fname "~") "~") + (file-name-directory + (if parent + (directory-file-name fname) + fname)))) + (file-name-as-directory it))) + +(defun helm-current-directory () + "Return current-directory name at point. +Useful in dired buffers when there is inserted subdirs." + (expand-file-name + (if (eq major-mode 'dired-mode) + (dired-current-directory) + default-directory))) + +(defun helm-shadow-boring-files (files) + "Files matching `helm-boring-file-regexp' will be +displayed with the `file-name-shadow' face if available." + (helm-shadow-entries files helm-boring-file-regexp-list)) + +(defun helm-skip-boring-files (files) + "Files matching `helm-boring-file-regexp' will be skipped." + (helm-skip-entries files helm-boring-file-regexp-list)) + +(defun helm-skip-current-file (files) + "Current file will be skipped." + (remove (buffer-file-name helm-current-buffer) files)) + +(defun helm-w32-pathname-transformer (args) + "Change undesirable features of windows pathnames to ones more acceptable to +other candidate transformers." + (if (eq system-type 'windows-nt) + (helm-transform-mapcar + (lambda (x) + (replace-regexp-in-string + "/cygdrive/\\(.\\)" "\\1:" + (replace-regexp-in-string "\\\\" "/" x))) + args) + args)) + +(defun helm-w32-prepare-filename (file) + "Convert filename FILE to something usable by external w32 executables." + (replace-regexp-in-string ; For UNC paths + "/" "\\" + (replace-regexp-in-string ; Strip cygdrive paths + "/cygdrive/\\(.\\)" "\\1:" + file nil nil) nil t)) + +(defun helm-w32-shell-execute-open-file (file) + (with-no-warnings + (w32-shell-execute "open" (helm-w32-prepare-filename file)))) + +;; Same as `vc-directory-exclusion-list'. +(defvar helm-walk-ignore-directories + '("SCCS/" "RCS/" "CVS/" "MCVS/" ".svn/" ".git/" ".hg/" ".bzr/" + "_MTN/" "_darcs/" "{arch}/" ".gvfs/")) + +(defsubst helm--dir-file-name (file dir) + (expand-file-name + (substring file 0 (1- (length file))) dir)) + +(defsubst helm--dir-name-p (str) + (char-equal (aref str (1- (length str))) ?/)) + +(cl-defun helm-walk-directory (directory &key (path 'basename) + directories + match skip-subdirs + noerror) + "Walk through DIRECTORY tree. + +Argument PATH can be one of basename, relative, full, or a +function called on file name, default to basename. + +Argument DIRECTORIES when t return also directories names, +otherwise skip directories names, with a value of `only' returns +only subdirectories, i.e. files are skipped. + +Argument MATCH is a regexp matching files or directories. + +Argument SKIP-SUBDIRS when t will skip +`helm-walk-ignore-directories', otherwise if it is given as a +list of directories, this list will be used instead of +`helm-walk-ignore-directories'. + +Argument NOERROR when t will skip directories which are not +accessible." + (let ((fn (cl-case path + (basename 'file-name-nondirectory) + (relative 'file-relative-name) + (full 'identity) + (t path)))) ; A function. + (setq skip-subdirs (if (listp skip-subdirs) + skip-subdirs + helm-walk-ignore-directories)) + (cl-labels ((ls-rec (dir) + (unless (file-symlink-p dir) + (cl-loop for f in (sort (file-name-all-completions "" dir) + 'string-lessp) + unless (member f '("./" "../")) + ;; A directory. + ;; Use `helm--dir-file-name' to remove the final slash. + ;; Needed to avoid infloop on directory symlinks. + if (and (helm--dir-name-p f) + (helm--dir-file-name f dir)) + nconc + (unless (or (member f skip-subdirs) + (and noerror + (not (file-accessible-directory-p it)))) + (if (and directories + (or (null match) + (string-match match f))) + (nconc (list (concat (funcall fn it) "/")) + (ls-rec it)) + (ls-rec it))) + ;; A regular file. + else nconc + (when (and (null (eq directories 'only)) + (or (null match) (string-match match f))) + (list (funcall fn (expand-file-name f dir)))))))) + (ls-rec directory)))) + +(defun helm-file-expand-wildcards (pattern &optional full) + "Same as `file-expand-wildcards' but allow recursion. +Recursion happens when PATTERN starts with two stars. +Directories expansion is not supported." + (let ((bn (helm-basename pattern)) + (case-fold-search nil)) + (if (and helm-file-globstar + (string-match "\\`\\*\\{2\\}\\(.*\\)" bn)) + (helm-walk-directory (helm-basedir pattern) + :path (cl-case full + (full 'full) + (relative 'relative) + ((basename nil) 'basename) + (t 'full)) + :directories nil + :match (or (helm-wildcard-to-regexp bn) + (wildcard-to-regexp bn)) + :skip-subdirs t) + (helm-aif (helm-wildcard-to-regexp bn) + (directory-files (helm-basedir pattern) full it) + ;; `file-expand-wildcards' fails to expand weird directories + ;; like "[ foo.zz ] bar.*.avi", fallback to `directory-files' + ;; in such cases. + (or (file-expand-wildcards pattern full) + (directory-files (helm-basedir pattern) + full (wildcard-to-regexp bn))))))) + +(defun helm-wildcard-to-regexp (wc) + "Transform wilcard WC like \"**.{jpg,jpeg}\" in REGEXP." + (when (string-match ".*\\(\\*\\{1,2\\}\\)\\.[{]\\(.*\\)[}]\\'" wc) + (format ".*\\.\\(%s\\)$" + (replace-regexp-in-string + "," "\\\\|" (match-string 2 wc))))) + +(defun helm-locate-lib-get-summary (file) + "Extract library description from FILE." + (let* ((shell-file-name "sh") + (shell-command-switch "-c") + (cmd "%s %s | head -n1 | awk 'match($0,\"%s\",a) {print a[2]}'\ + | awk -F ' -*-' '{print $1}'") + (regexp "^;;;(.*) ---? (.*)$") + (desc (shell-command-to-string + (format cmd + (if (string-match-p "\\.gz\\'" file) + "gzip -c -q -d" "cat") + (shell-quote-argument file) + regexp)))) + (if (string= desc "") + "Not documented" + (replace-regexp-in-string "\n" "" desc)))) + +;;; helm internals +;; +(defun helm-set-pattern (pattern &optional noupdate) + "Set minibuffer contents to PATTERN. +If optional NOUPDATE is non-nil, the Helm buffer is not changed." + (with-selected-window (or (active-minibuffer-window) (minibuffer-window)) + (delete-minibuffer-contents) + (insert pattern)) + (when noupdate + (setq helm-pattern pattern))) + +(defun helm-minibuffer-completion-contents () + "Return the user input in a minibuffer before point as a string. +That is what completion commands operate on." + (buffer-substring (field-beginning) (point))) + +(defmacro with-helm-buffer (&rest body) + "Eval BODY inside `helm-buffer'." + (declare (indent 0) (debug t)) + `(with-current-buffer (helm-buffer-get) + ,@body)) + +(defmacro with-helm-current-buffer (&rest body) + "Eval BODY inside `helm-current-buffer'." + (declare (indent 0) (debug t)) + `(with-current-buffer (or (and (buffer-live-p helm-current-buffer) + helm-current-buffer) + (setq helm-current-buffer + (current-buffer))) + ,@body)) + +(defun helm-buffer-get () + "Return `helm-action-buffer' if shown otherwise `helm-buffer'." + (if (helm-action-window) + helm-action-buffer + helm-buffer)) + +(defun helm-window () + "Window of `helm-buffer'." + (get-buffer-window (helm-buffer-get) 0)) + +(defun helm-action-window () + "Window of `helm-action-buffer'." + (get-buffer-window helm-action-buffer 'visible)) + +(defmacro with-helm-window (&rest body) + "Be sure BODY is excuted in the helm window." + (declare (indent 0) (debug t)) + `(with-selected-window (helm-window) + ,@body)) + +(defmacro helm-without-follow (&rest body) + "Ensure BODY runs without following. +I.e. when using `helm-next-line' and friends in BODY." + (declare (indent 0) (debug t)) + `(cl-letf (((symbol-function 'helm-follow-mode-p) + (lambda (&optional _) nil))) + (let (helm-follow-mode-persistent) + (progn ,@body)))) + +(defun helm-candidate-prefixed-p (candidate) + "Return non nil when CANDIDATE is prefixed. + +Candidates files are prefixed with [+] or a specific icon when candidate is a +non existing file, in other places candidates may be prefixed with an unknown +symbol [?], these candidate have the text property or +property." + (or (get-text-property 0 'helm-new-file candidate) + (get-text-property 0 'unknown candidate))) + +;; Completion styles related functions +;; +(defun helm--setup-completion-styles-alist () + (cl-pushnew '(helm helm-completion-try-completion + helm-completion-all-completions + "helm multi completion style.") + completion-styles-alist + :test 'equal) + (unless (assq 'flex completion-styles-alist) + ;; Add helm-fuzzy style only if flex is not available. + (cl-pushnew '(helm-flex helm-flex-completion-try-completion + helm-flex-completion-all-completions + "helm flex completion style.\nProvide flex matching for emacs-26.") + completion-styles-alist + :test 'equal))) + +(defvar helm-blacklist-completion-styles '(emacs21 emacs22)) +(defun helm--prepare-completion-styles (&optional com-or-mode styles) + "Return a suitable list of styles for `completion-styles'. + +When `helm-completion-style' is not `emacs' the Emacs vanilla +default `completion-styles' is used except for +`helm-dynamic-completion' which uses inconditionally `emacs' as +value for `helm-completion-style'. + +If styles are specified in `helm-completion-styles-alist' for a +particular mode, use these styles for the corresponding mode. +If COM-OR-MODE (a mode or a command) is specified it is used to find the +corresponding styles in `helm-completion-styles-alist'. + +If STYLES is specified as a list of styles suitable for +`completion-styles' these styles are used in the given order. +Otherwise helm style is added to `completion-styles' always after +flex or helm-flex completion style if present." + ;; For `helm-completion-style' and `helm-completion-styles-alist'. + (require 'helm-mode) + (let ((from (if com-or-mode com-or-mode major-mode))) + (if (memq helm-completion-style '(helm helm-fuzzy)) + ;; Keep default settings, but probably nil is fine as well. + '(basic partial-completion emacs22) + (or + styles + (helm-acase (cdr (assq from helm-completion-styles-alist)) + ((guard (and (consp it) (cdr it))) guard)) + ;; We need to have flex always behind helm, otherwise + ;; when matching against e.g. '(foo foobar foao frogo bar + ;; baz) with pattern "foo" helm style if before flex will + ;; return foo and foobar only defeating flex that would + ;; return foo foobar foao and frogo. + (let* ((wflex (car (or (assq 'flex completion-styles-alist) + (assq 'helm-flex completion-styles-alist)))) + (styles (append (and (memq wflex completion-styles) + (list wflex)) + (cl-loop for s in completion-styles + unless (or (memq s helm-blacklist-completion-styles) + (memq wflex completion-styles)) + collect s)))) + (helm-append-at-nth + styles '(helm) + (if (memq wflex completion-styles) + 1 0))))))) + +(defun helm-dynamic-completion (collection predicate &optional point metadata nomode styles) + "Build a completion function for `helm-pattern' in COLLECTION. + +Only the elements of COLLECTION that satisfy PREDICATE are considered. + +Argument POINT is the same as in `completion-all-completions' and +is meaningful only when using some kind of `completion-at-point'. + +The return value is a list of completions that may be sorted by +the sort function provided by the completion-style in +use (emacs-27 only), otherwise (emacs-26) the sort function has +to be provided if needed either with an FCT function in source or +by passing the sort function with METADATA +E.g.: (metadata (display-sort-function . foo)). + +If you don't want the sort fn provided by style to kick +in (emacs-27) you can use as metadata value the symbol `nosort'. + +Example: + + (helm :sources (helm-build-sync-source \"test\" + :candidates (helm-dynamic-completion + \\='(foo bar baz foab) + \\='symbolp) + :match-dynamic t) + :buffer \"*helm test*\") + +When argument NOMODE is non nil don't use `completion-styles' as +specified in `helm-completion-styles-alist' for specific modes. + +When STYLES is specified use these `completion-styles', see +`helm--prepare-completion-styles'. + +Also `helm-completion-style' settings have no effect here, +`emacs' being used inconditionally as value." + (lambda () + (let* (;; Force usage of emacs style otherwise + ;; helm--prepare-completion-styles will reset + ;; completion-styles to default value i.e. (basic partial + ;; emacs22). + (helm-completion-style 'emacs) + (completion-styles + (with-helm-current-buffer + (helm--prepare-completion-styles nomode styles))) + (completion-flex-nospace t) + (nosort (eq metadata 'nosort)) + (compsfn (lambda (str pred _action) + (let* ((completion-ignore-case (helm-set-case-fold-search)) + (comps (completion-all-completions + str + (if (functionp collection) + (funcall collection str pred t) + collection) + pred + (or point 0) + (or (and (listp metadata) metadata) + (setq metadata '(metadata))))) + (last-data (last comps)) + (sort-fn (unless nosort + (completion-metadata-get + metadata 'display-sort-function))) + all) + (when (cdr last-data) + (setcdr last-data nil)) + (setq all (copy-sequence comps)) + (if (and sort-fn (> (length str) 0)) + (funcall sort-fn all) + all))))) + ;; Ensure circular objects are removed. + (complete-with-action t compsfn helm-pattern predicate)))) + +(defun helm-guess-filename-at-point () + (with-helm-current-buffer + ;; Ensure to disable the evil `ffap-machine-at-point' which may run here as + ;; `file-name-at-point-functions' contains by default + ;; `ffap-guess-file-name-at-point' See bug#2574. + ;; Use same value as in Emacs-29 for next 3 vars to ensure `ffap-machine-p' + ;; never ping. + (let ((ffap-machine-p-known 'accept) + (ffap-machine-p-local 'reject) + (ffap-machine-p-unknown 'reject)) + (run-hook-with-args-until-success 'file-name-at-point-functions)))) + +;; Yank text at point. +;; +;; +(defun helm-yank-text-at-point (arg) + "Yank text at point in `helm-current-buffer' into minibuffer." + (interactive "p") + (with-helm-current-buffer + (let ((fwd-fn (or helm-yank-text-at-point-function #'forward-word)) + diff) + ;; Start to initial point if C-w have never been hit. + (unless helm-yank-point + (setq helm-yank-point (car helm-current-position))) + (save-excursion + (goto-char helm-yank-point) + (helm-set-pattern + (if (< arg 0) + (with-temp-buffer + (insert helm-pattern) + (let ((end (point-max))) + (goto-char end) + (funcall fwd-fn -1) + (setq diff (- end (point))) + (delete-region (point) end) + (buffer-string))) + (funcall fwd-fn arg) + (concat + ;; Allow yankink beyond eol allow inserting e.g long + ;; urls in mail buffers. + helm-pattern (replace-regexp-in-string + "\\`\n" "" + (buffer-substring-no-properties + helm-yank-point (point)))))) + (setq helm-yank-point (if diff (- (point) diff) (point))))))) +(put 'helm-yank-text-at-point 'helm-only t) + +(defun helm-undo-yank-text-at-point () + "Undo last entry added by `helm-yank-text-at-point'." + (interactive) + (helm-yank-text-at-point -1)) +(put 'helm-undo-yank-text-at-point 'helm-only t) + +(defun helm-reset-yank-point () + (setq helm-yank-point nil)) + +(add-hook 'helm-cleanup-hook 'helm-reset-yank-point) +(add-hook 'helm-after-initialize-hook 'helm-reset-yank-point) + +;;; Ansi +;; +;; +(defvar helm--ansi-color-regexp + "\033\\[\\(K\\|[0-9;]*m\\)") +(defvar helm--ansi-color-drop-regexp + "\033\\[\\([ABCDsuK]\\|[12][JK]\\|=[0-9]+[hI]\\|[0-9;]*[Hf]\\)") +(defun helm--ansi-color-apply (string) + "A version of `ansi-color-apply' immune to upstream changes. + +Similar to the emacs-24.5 version without support to +`ansi-color-context' which is buggy in Emacs. + +Modify also `ansi-color-regexp' by using own variable +`helm--ansi-color-regexp' that matches whole STRING. + +This is needed to provide compatibility for both emacs-25 and +emacs-24.5 as emacs-25 version of `ansi-color-apply' is partially +broken." + (require 'ansi-color) + (let ((start 0) + codes end escape-sequence + result colorized-substring) + ;; Find the next escape sequence. + (while (setq end (string-match helm--ansi-color-regexp string start)) + (setq escape-sequence (match-string 1 string)) + ;; Colorize the old block from start to end using old face. + (when codes + (put-text-property + start end 'font-lock-face (ansi-color--find-face codes) string)) + (setq colorized-substring (substring string start end) + start (match-end 0)) + ;; Eliminate unrecognized ANSI sequences. + (while (string-match helm--ansi-color-drop-regexp colorized-substring) + (setq colorized-substring + (replace-match "" nil nil colorized-substring))) + (push colorized-substring result) + ;; Create new face, by applying escape sequence parameters. + (setq codes (ansi-color-apply-sequence escape-sequence codes))) + ;; If the rest of the string should have a face, put it there. + (when codes + (put-text-property + start (length string) + 'font-lock-face (ansi-color--find-face codes) string)) + ;; Save the remainder of the string to the result. + (if (string-match "\033" string start) + (push (substring string start (match-beginning 0)) result) + (push (substring string start) result)) + (apply 'concat (nreverse result)))) + +(when (< emacs-major-version 26) + (advice-add 'ansi-color-apply :override #'helm--ansi-color-apply)) + + +;;; Fontlock +(dolist (mode '(emacs-lisp-mode lisp-interaction-mode)) + (font-lock-add-keywords + mode + '(("(\\<\\(with-helm-after-update-hook\\)\\>" 1 font-lock-keyword-face) + ("(\\<\\(with-helm-temp-hook\\)\\>" 1 font-lock-keyword-face) + ("(\\<\\(with-helm-window\\)\\>" 1 font-lock-keyword-face) + ("(\\<\\(with-helm-current-buffer\\)\\>" 1 font-lock-keyword-face) + ("(\\<\\(with-helm-buffer\\)\\>" 1 font-lock-keyword-face) + ("(\\<\\(with-helm-show-completion\\)\\>" 1 font-lock-keyword-face) + ("(\\<\\(with-helm-default-directory\\)\\>" 1 font-lock-keyword-face) + ("(\\<\\(with-helm-restore-variables\\)\\>" 1 font-lock-keyword-face) + ("(\\<\\(helm-multi-key-defun\\)\\>" 1 font-lock-keyword-face) + ("(\\<\\(helm-while-no-input\\)\\>" 1 font-lock-keyword-face) + ("(\\<\\(helm-aif\\)\\>" 1 font-lock-keyword-face) + ("(\\<\\(helm-awhile\\)\\>" 1 font-lock-keyword-face) + ("(\\<\\(helm-acond\\)\\>" 1 font-lock-keyword-face) + ("(\\<\\(helm-aand\\)\\>" 1 font-lock-keyword-face) + ("(\\<\\(helm-with-gensyms\\)\\>" 1 font-lock-keyword-face) + ("(\\<\\(helm-read-answer-dolist-with-action\\)\\>" 1 font-lock-keyword-face) + ("(\\<\\(helm-read-answer\\)\\>" 1 font-lock-keyword-face)))) + +(provide 'helm-lib) + +;;; helm-lib ends here diff --git a/code/elpa/helm-core-20240316.1157/helm-multi-match.el b/code/elpa/helm-core-20240316.1157/helm-multi-match.el new file mode 100644 index 0000000..c183f0b --- /dev/null +++ b/code/elpa/helm-core-20240316.1157/helm-multi-match.el @@ -0,0 +1,410 @@ +;;; helm-multi-match.el --- Multiple regexp matching methods for helm -*- lexical-binding: t -*- + +;; Original Author: rubikitch + +;; Copyright (C) 2008 ~ 2011 rubikitch +;; Copyright (C) 2011 ~ 2020 Thierry Volpiatto + +;; Author: Thierry Volpiatto +;; URL: http://github.com/emacs-helm/helm + +;; 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 'helm-lib) + + +(defgroup helm-multi-match nil + "Helm multi match." + :group 'helm) + +(defcustom helm-mm-matching-method 'multi3 + "Matching method for helm match plugin. +You can set here different methods to match candidates in helm. +Here are the possible value of this symbol and their meaning: +- multi1: Respect order, prefix of pattern must match. +- multi2: Same but with partial match. +- multi3: The best, multiple regexp match, allow negation. +- multi3p: Same but prefix must match. + +Default is multi3, you should keep this for a better experience. + +Note that multi1 and multi3p are incompatible with fuzzy matching +in file completion and by the way fuzzy matching will be disabled there +when these options are used." + :type '(radio :tag "Matching methods for helm" + (const :tag "Multiple regexp 1 ordered with prefix match" multi1) + (const :tag "Multiple regexp 2 ordered with partial match" multi2) + (const :tag "Multiple regexp 3 matching no order, partial, best." multi3) + (const :tag "Multiple regexp 3p matching with prefix match" multi3p)) + :group 'helm-multi-match) + + +;; Internal +(defvar helm-mm-default-match-functions + '(helm-mm-exact-match helm-mm-match)) +(defvar helm-mm-default-search-functions + '(helm-mm-exact-search helm-mm-search)) + + +;;; Build regexps +;; +;; +(defconst helm-mm-space-regexp "\\s\\\\s-" + "Regexp to represent space itself in multiple regexp match.") + +(defun helm-mm-split-pattern (pattern &optional grep-space) + "Split PATTERN if it contains spaces and return resulting list. +If spaces in PATTERN are escaped, don't split at this place. +i.e \"foo bar baz\"=> (\"foo\" \"bar\" \"baz\") +but \"foo\\ bar baz\"=> (\"foo\\s-bar\" \"baz\"). +If GREP-SPACE is used translate escaped space to \"\\s\" instead of \"\\s-\"." + (split-string + ;; Match spaces litteraly because candidate buffer syntax-table + ;; doesn't understand "\s-" properly. + (replace-regexp-in-string + helm-mm-space-regexp + (if grep-space "\\s" "\\s-") pattern nil t))) + +(defun helm-mm-1-make-regexp (pattern) + "Replace spaces in PATTERN with \".*\"." + (mapconcat 'identity (helm-mm-split-pattern pattern) ".*")) + + +;;; Exact match. +;; +;; +;; Internal. +(defvar helm-mm--exact-pattern-str nil) +(defvar helm-mm--exact-pattern-real nil) + +(defun helm-mm-exact-get-pattern (pattern) + (unless (equal pattern helm-mm--exact-pattern-str) + (setq helm-mm--exact-pattern-str pattern + helm-mm--exact-pattern-real (concat "^" (regexp-quote pattern) "$"))) + helm-mm--exact-pattern-real) + + +(cl-defun helm-mm-exact-match (candidate &optional (pattern helm-pattern)) + (if case-fold-search + (string= (downcase candidate) (downcase pattern)) + (string= candidate pattern))) + +(defun helm-mm-exact-search (pattern &rest _ignore) + (re-search-forward (helm-mm-exact-get-pattern pattern) nil t)) + + +;;; Prefix match +;; +;; +;; Internal +(defvar helm-mm--prefix-pattern-str nil) +(defvar helm-mm--prefix-pattern-real nil) + +(defun helm-mm-prefix-get-pattern (pattern) + (unless (equal pattern helm-mm--prefix-pattern-str) + (setq helm-mm--prefix-pattern-str pattern + helm-mm--prefix-pattern-real (concat "\n" pattern))) + helm-mm--prefix-pattern-real) + +(defun helm-mm-prefix-match (candidate &optional pattern) + ;; In filename completion basename and basedir may be + ;; quoted, unquote them for string comparison (Bug#1283). + (setq pattern (replace-regexp-in-string + "\\\\" "" (or pattern helm-pattern))) + (let ((len (length pattern))) + (and (<= len (length candidate)) + (string= (substring candidate 0 len) pattern )))) + +(defun helm-mm-prefix-search (pattern &rest _ignore) + (search-forward (helm-mm-prefix-get-pattern pattern) nil t)) + + +;;; Multiple regexp patterns 1 (order is preserved / prefix). +;; +;; +;; Internal +(defvar helm-mm--1-pattern-str nil) +(defvar helm-mm--1-pattern-real nil) + +(defun helm-mm-1-get-pattern (pattern) + (unless (equal pattern helm-mm--1-pattern-str) + (setq helm-mm--1-pattern-str pattern + helm-mm--1-pattern-real + (concat "^" (helm-mm-1-make-regexp pattern)))) + helm-mm--1-pattern-real) + +(cl-defun helm-mm-1-match (candidate &optional (pattern helm-pattern)) + (string-match (helm-mm-1-get-pattern pattern) candidate)) + +(defun helm-mm-1-search (pattern &rest _ignore) + (re-search-forward (helm-mm-1-get-pattern pattern) nil t)) + + +;;; Multiple regexp patterns 2 (order is preserved / partial). +;; +;; +;; Internal +(defvar helm-mm--2-pattern-str nil) +(defvar helm-mm--2-pattern-real nil) + +(defun helm-mm-2-get-pattern (pattern) + (unless (equal pattern helm-mm--2-pattern-str) + (setq helm-mm--2-pattern-str pattern + helm-mm--2-pattern-real + (concat "^.*" (helm-mm-1-make-regexp pattern)))) + helm-mm--2-pattern-real) + +(cl-defun helm-mm-2-match (candidate &optional (pattern helm-pattern)) + (string-match (helm-mm-2-get-pattern pattern) candidate)) + +(defun helm-mm-2-search (pattern &rest _ignore) + (re-search-forward (helm-mm-2-get-pattern pattern) nil t)) + + +;;; Multiple regexp patterns 3 (permutation). +;; +;; +;; Internal +(defvar helm-mm--3-pattern-str nil) +(defvar helm-mm--3-pattern-list nil) + +(defun helm-mm-3-get-patterns (pattern) + "Return a list of predicate/regexp cons cells. +E.g., ((identity . \"foo\") (not . \"bar\")). +If PATTERN is unchanged, don't recompute PATTERN and return the +previous value stored in `helm-mm--3-pattern-list'." + (unless (equal pattern helm-mm--3-pattern-str) + (setq helm-mm--3-pattern-str pattern + helm-mm--3-pattern-list + (helm-mm-3-get-patterns-internal pattern))) + helm-mm--3-pattern-list) + +(defun helm-mm-3-get-patterns-internal (pattern) + "Return a list of predicate/regexp cons cells. +E.g., ((identity . \"foo\") (not . \"bar\"))." + (unless (string= pattern "") + (cl-loop for pat in (helm-mm-split-pattern pattern) + collect (if (char-equal ?! (aref pat 0)) + (cons 'not (substring pat 1)) + (cons 'identity pat))))) + +(defun helm-mm-regexp-p (string) + (string-match-p "[][*+^$.?]" string)) + +(defvar helm-mm--match-on-diacritics nil) + +(cl-defun helm-mm-3-match (candidate &optional (pattern helm-pattern)) + "Check if PATTERN match CANDIDATE. +When PATTERN contains a space, it is splitted and matching is +done with the several resulting regexps against CANDIDATE. +E.g., \"bar foo\" will match \"foobar\" and \"barfoo\". +Argument PATTERN, a string, is transformed in a list of cons cell +with `helm-mm-3-get-patterns' if it contains a space. +E.g., \"foo bar\"=>((identity . \"foo\") (identity . \"bar\")). +Then each predicate of cons cell(s) is called with the regexp of +the same cons cell against CANDIDATE. +I.e. (identity (string-match \"foo\" \"foo bar\")) => t." + (let ((pat (helm-mm-3-get-patterns pattern))) + (cl-loop for (predicate . regexp) in pat + for re = (if (and helm-mm--match-on-diacritics + (not (helm-mm-regexp-p regexp))) + (char-fold-to-regexp regexp) + regexp) + always (funcall predicate + (condition-case _err + ;; FIXME: Probably do nothing when + ;; using fuzzy leaving the job + ;; to the fuzzy fn. + (string-match re candidate) + (invalid-regexp nil)))))) + +(defun helm-mm-3-search-base (pattern searchfn1 searchfn2) + "Try to find PATTERN in `helm-buffer' with SEARCHFN1 and SEARCHFN2. +This is the search function for `candidates-in-buffer' enabled sources. +Use the same method as `helm-mm-3-match' except it search in buffer +instead of matching on a string. +i.e (identity (re-search-forward \"foo\" (pos-eol) t)) => t." + (cl-loop with pat = (if (stringp pattern) + (helm-mm-3-get-patterns pattern) + pattern) + with regex = (cdar pat) + with regex1 = (if (and regex + helm-mm--match-on-diacritics + (not (helm-mm-regexp-p regex))) + (char-fold-to-regexp regex) + regex) + when (eq (caar pat) 'not) return + ;; Pass the job to `helm-search-match-part'. + (prog1 (list (pos-bol) (pos-eol)) + (forward-line 1)) + while (condition-case _err + (funcall searchfn1 (or regex1 "") nil t) + (invalid-regexp nil)) + for bol = (pos-bol) + for eol = (pos-eol) + if (cl-loop for (pred . str) in (cdr pat) + for regexp = (if (and helm-mm--match-on-diacritics + (not (helm-mm-regexp-p str))) + (char-fold-to-regexp str) + str) + always + (progn (goto-char bol) + (funcall pred (condition-case _err + (funcall searchfn2 regexp eol t) + (invalid-regexp nil))))) + do (helm-mm-3--search-move-forward bol eol) and return t + else do (helm-mm-3--search-move-forward bol eol) + finally return nil)) + +(defun helm-mm-3--search-move-forward (bol eol) + "Move point forward for next search. +Forward line on empty lines, otherwise goto eol." + (if (eql bol eol) (forward-line 1) (goto-char eol))) + +(defun helm-mm-3-search (pattern &rest _ignore) + (helm-mm-3-search-base + pattern 're-search-forward 're-search-forward)) + +(defun helm-mm-3-search-on-diacritics (pattern &rest _ignore) + (let ((helm-mm--match-on-diacritics t)) + (helm-mm-3-search pattern))) + +;;; mp-3 with migemo +;; Needs https://github.com/emacs-jp/migemo +;; +(defvar helm-mm--previous-migemo-info nil + "[Internal] Cache previous migemo query.") +(make-local-variable 'helm-mm--previous-migemo-info) + +(declare-function migemo-get-pattern "ext:migemo.el") +(declare-function migemo-search-pattern-get "ext:migemo.el") + +(define-minor-mode helm-migemo-mode + "Enable migemo in helm. +It will be available in the sources handling it, +i.e. the sources which have the slot :migemo with non--nil value." + :lighter " Hmio" + :group 'helm + :global t + (cl-assert (featurep 'migemo) + nil "No feature called migemo found, install migemo.el.")) + +(defun helm-mm-migemo-get-pattern (pattern) + (let ((regex (migemo-get-pattern pattern))) + (if (ignore-errors (string-match regex "") t) + (concat regex "\\|" pattern) pattern))) + +(defun helm-mm-migemo-search-pattern-get (pattern) + (let ((regex (migemo-search-pattern-get pattern))) + (if (ignore-errors (string-match regex "") t) + (concat regex "\\|" pattern) pattern))) + +(defun helm-mm-migemo-string-match (pattern str) + "Migemo version of `string-match'." + (unless (assoc pattern helm-mm--previous-migemo-info) + (with-helm-buffer + (setq helm-mm--previous-migemo-info + (push (cons pattern (helm-mm-migemo-get-pattern pattern)) + helm-mm--previous-migemo-info)))) + (string-match (assoc-default pattern helm-mm--previous-migemo-info) str)) + +(defun helm-mm-diacritics-string-match (pattern str) + "Check if PATTERN match STR ignoring diacritics. + +If PATTERN is a regexp (i.e. `helm-mm-regexp-p') use PATTERN +unmodified, otherwise transform PATTERN with `char-fold-to-regexp'. + +This function is used to search match-part of candidate in in-buffer +sources." + (string-match (if (helm-mm-regexp-p pattern) + pattern + (char-fold-to-regexp pattern)) + str)) + +(cl-defun helm-mm-3-migemo-match (candidate &optional (pattern helm-pattern)) + (and helm-migemo-mode + (cl-loop for (pred . re) in (helm-mm-3-get-patterns pattern) + always (funcall pred (helm-mm-migemo-string-match re candidate))))) + +(defun helm-mm-migemo-forward (word &optional bound noerror count) + (with-helm-buffer + (unless (assoc word helm-mm--previous-migemo-info) + (setq helm-mm--previous-migemo-info + (push (cons word (if (delq 'ascii (find-charset-string word)) + word + (helm-mm-migemo-search-pattern-get word))) + helm-mm--previous-migemo-info)))) + (re-search-forward + (assoc-default word helm-mm--previous-migemo-info) bound noerror count)) + +(defun helm-mm-3-migemo-search (pattern &rest _ignore) + (and helm-migemo-mode + (helm-mm-3-search-base + pattern 'helm-mm-migemo-forward 'helm-mm-migemo-forward))) + + +;;; mp-3p- (multiple regexp pattern 3 with prefix search) +;; +;; +(defun helm-mm-3p-match (candidate &optional pattern) + "Check if PATTERN match CANDIDATE. +Same as `helm-mm-3-match' but only for the cdr of patterns, the car of +patterns must always match CANDIDATE prefix. +E.g. \"bar foo baz\" will match \"barfoobaz\" or \"barbazfoo\" but not +\"foobarbaz\" whereas `helm-mm-3-match' would match all." + (let* ((pat (helm-mm-3-get-patterns (or pattern helm-pattern))) + (first (car pat))) + (and (funcall (car first) (helm-mm-prefix-match candidate (cdr first))) + (cl-loop for (predicate . regexp) in (cdr pat) + always (funcall predicate (string-match regexp candidate)))))) + +(defun helm-mm-3p-search (pattern &rest _ignore) + (helm-mm-3-search-base + pattern 'helm-mm-prefix-search 're-search-forward)) + + +;;; Generic multi-match/search functions +;; +;; +(cl-defun helm-mm-match (candidate &optional (pattern helm-pattern)) + "Call `helm-mm-matching-method' function against CANDIDATE." + (let ((fun (cl-ecase helm-mm-matching-method + (multi1 #'helm-mm-1-match) + (multi2 #'helm-mm-2-match) + (multi3 #'helm-mm-3-match) + (multi3p #'helm-mm-3p-match)))) + (funcall fun candidate pattern))) + +(cl-defun helm-mm-3-match-on-diacritics (candidate &optional (pattern helm-pattern)) + "Same as `helm-mm-3-match' but match on diacritics if possible." + (let ((helm-mm--match-on-diacritics t)) + (helm-mm-match candidate pattern))) + +(defun helm-mm-search (pattern &rest _ignore) + "Search for PATTERN with `helm-mm-matching-method' function." + (let ((fun (cl-ecase helm-mm-matching-method + (multi1 #'helm-mm-1-search) + (multi2 #'helm-mm-2-search) + (multi3 #'helm-mm-3-search) + (multi3p #'helm-mm-3p-search)))) + (funcall fun pattern))) + + +(provide 'helm-multi-match) + + +;;; helm-multi-match.el ends here diff --git a/code/elpa/helm-core-20240316.1157/helm-source.el b/code/elpa/helm-core-20240316.1157/helm-source.el new file mode 100644 index 0000000..5c60522 --- /dev/null +++ b/code/elpa/helm-core-20240316.1157/helm-source.el @@ -0,0 +1,1312 @@ +;;; helm-source.el --- Helm source creation. -*- lexical-binding: t -*- + +;; Copyright (C) 2015 ~ 2020 Thierry Volpiatto + +;; Author: Thierry Volpiatto +;; URL: http://github.com/emacs-helm/helm + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; Interface to create helm sources easily. +;; Actually the eieo objects are transformed in alist for compatibility. +;; In the future this package should allow creating source as eieo objects +;; without conversion to alist, teaching helm to read such a structure. +;; The compatibility with alists would be kept. + +;;; Code: + +(require 'cl-lib) +(require 'eieio) +(require 'helm-lib) + +(defvar helm-fuzzy-sort-fn) +(defvar helm-fuzzy-match-fn) +(defvar helm-fuzzy-search-fn) + +(declare-function helm-init-candidates-in-buffer "helm-core.el") +(declare-function helm-interpret-value "helm-core.el") +(declare-function helm-fuzzy-highlight-matches "helm-core.el") +(declare-function helm-marked-candidates "helm-core.el") + +;;; Advice Emacs fn +;; Make Classes's docstrings more readable by removing the attempts to align +;; unuseful stuff and add newline for separating slot documentation, as well +;; slots are in bold characters. + +(defun helm-source--cl--print-table (&rest args) + "Advice for `cl--print-table' to make readable class slots docstrings." + (let ((format "%s\n\n Initform=%s\n\n%s")) + (dolist (row (cadr args)) + (setcar row (propertize (car row) 'face 'bold)) + (setcdr row (nthcdr 1 (cdr row))) + (insert "\n* " (apply #'format format row) "\n")))) + +(cl-defgeneric helm--setup-source (source) + "Prepare slots and handle slot errors before creating a helm source.") + +(cl-defgeneric helm-setup-user-source (source) + "Allow users modifying slots in SOURCE just before creation.") + + +;;; Classes for sources +;; +;; +(defclass helm-source () + ((name + :initarg :name + :initform nil + :custom string + :documentation + " The name of the source. + A string which is also the heading which appears + above the list of matches from the source. Must be unique.") + + (header-name + :initarg :header-name + :initform nil + :custom function + :documentation + " A function returning the display string of the header. + Its argument is the name of the source. This attribute is useful to + add an additional information with the source name. + It doesn't modify the name of the source.") + + (init + :initarg :init + :initform nil + :custom function + :documentation + " Function called with no parameters when helm is started. + It is useful for collecting current state information which can be + used to create the list of candidates later. + Initialization of `candidates-in-buffer' is done here + with `helm-init-candidates-in-buffer'.") + + (candidates + :initarg :candidates + :initform nil + :custom (choice function list) + :documentation + " Specifies how to retrieve candidates from the source. + It can either be a variable name, a function called with no parameters + or the actual list of candidates. + + Do NOT use this for asynchronous sources, use `candidates-process' + instead. + + The list must be a list whose members are strings, symbols + or (DISPLAY . REAL) pairs. + + In case of (DISPLAY . REAL) pairs, the DISPLAY string is shown + in the Helm buffer, but the REAL one is used as action + argument when the candidate is selected. This allows a more + readable presentation for candidates which would otherwise be, + for example, too long or have a common part shared with other + candidates which can be safely replaced with an abbreviated + string for display purposes. + + Note that if the (DISPLAY . REAL) form is used then pattern + matching is done on the displayed string, not on the real + value. + + This function, generally should not compute candidates according to + `helm-pattern' which defeat all the Helm's matching mechanism + i.e. multiple pattern matching and/or fuzzy matching. + If you want to do so, use :match-dynamic slot to be sure matching + occur only in :candidates function and there is no conflict with + other match functions.") + + (update + :initarg :update + :initform nil + :custom function + :documentation + " Function called with no parameters before :init function + when `helm-force-update' is called.") + + (cleanup + :initarg :cleanup + :initform nil + :custom function + :documentation + " Function called with no parameters when *helm* buffer is + closed. It is useful for killing unneeded candidates buffer. + + Note that the function is executed BEFORE performing action.") + + (keymap + :initarg :keymap + :initform 'helm-map + :custom sexp + :documentation + " Specific keymap for this source. + default value is `helm-map'.") + + (action + :initarg :action + :initform 'identity + :custom (alist :key-type string + :value-type function) + :documentation + " An alist of (DISPLAY . FUNCTION) pairs, a variable name or a function. + FUNCTION is called with one parameter: the selected candidate. + + An action other than the default can be chosen from this list + of actions for the currently selected candidate (by default + with TAB). The DISPLAY string is shown in the completions + buffer and the FUNCTION is invoked when an action is + selected. The first action of the list is the default. + + You should use `helm-make-actions' to build this alist easily.") + + (persistent-action + :initarg :persistent-action + :initform nil + :custom function + :documentation + " Can be a either a Function called with one parameter (the + selected candidate) or a cons cell where first element is this + same function and second element a symbol (e.g never-split) + that inform `helm-execute-persistent-action' to not split his + window to execute this persistent action. + Example: + + (defun foo-persistent-action (candidate) + (do-something candidate)) + + :persistent-action \\='(foo-persistent-action . never-split) ; Don't split + or + :persistent-action \\='foo-persistent-action ; Split + + When specifying :persistent-action by slot directly, foo-persistent-action + will be executed without quitting helm when hitting `C-j'. + + Note that other persistent actions can be defined using other + bindings than `C-j' by simply defining an interactive function bound + to a key in the keymap source. + The function should create a new attribute in source before calling + `helm-execute-persistent-action' on this attribute. + Example: + + (defun helm-ff-persistent-delete () + \"Delete current candidate without quitting.\" + (interactive) + (with-helm-alive-p + (helm-set-attr \\='quick-delete \\='(helm-ff-quick-delete . never-split)) + (helm-execute-persistent-action \\='quick-delete))) + + This function is then bound in `helm-find-files-map'.") + + (persistent-action-if + :initarg :persistent-action-if + :initform nil + :custom function + :documentation + " Similar from persistent action but it is a function that should + return an object suitable for persistent action when called , i.e. a + function or a cons cell. + Example: + + (defun foo-persistent-action (candidate) + (cond (something + ;; Don't split helm-window. + (cons (lambda (_ignore) + (do-something candidate)) + \\='no-split)) + ;; Split helm-window. + (something-else + (lambda (_ignore) + (do-something-else candidate))))) + + :persistent-action-if \\='foo-persistent-action + + Here when hitting `C-j' one of the lambda's will be executed + depending on something or something-else condition, splitting or not + splitting as needed. + See `helm-find-files-persistent-action-if' definition as another example.") + + (persistent-help + :initarg :persistent-help + :initform nil + :custom string + :documentation + " A string to explain persistent-action of this source. + It is a facility to display what persistent action does in + header-line, once your source is loaded don't use it directly, it will + have no effect, use instead `header-line' attribute. + It also accepts a function or a variable name. + It will be displayed in `header-line' or in `minibuffer' depending + of value of `helm-echo-input-in-header-line' and `helm-display-header-line'.") + + (help-message + :initarg :help-message + :initform nil + :custom (choice string function) + :documentation + " Help message for this source. + If not present, `helm-help-message' value will be used.") + + (multiline + :initarg :multiline + :initform nil + :custom (choice boolean integer) + :documentation + " Allow multiline candidates. + When non-nil candidates will be separated by `helm-candidate-separator'. + You can customize the color of this separator with `helm-separator' face. + Value of multiline can be an integer which specify the maximum size of the + multiline string to display, if multiline string is longer than this value + it will be truncated.") + + (requires-pattern + :initarg :requires-pattern + :initform 0 + :custom integer + :documentation + " If present matches from the source are shown only if the + pattern is not empty. Optionally, it can have an integer + parameter specifying the required length of input which is + useful in case of sources with lots of candidates.") + + (candidate-transformer + :initarg :candidate-transformer + :initform nil + :custom (choice function list) + :documentation + " It's a function or a list of functions called with one argument + when the completion list from the source is built. The argument + is the list of candidates retrieved from the source. The + function should return a transformed list of candidates which + will be used for the actual completion. If it is a list of + functions, it calls each function sequentially. + + This can be used to transform or remove items from the list of + candidates. + + Note that `candidates' is run already, so the given transformer + function should also be able to handle candidates with (DISPLAY + . REAL) format.") + + (filtered-candidate-transformer + :initarg :filtered-candidate-transformer + :initform nil + :custom (choice function list) + :documentation + " It has the same format as `candidate-transformer', except the + function is called with two parameters: the candidate list and + the source. + + This transformer is run on the candidate list which is already + filtered by the current pattern. While `candidate-transformer' + is run only once, it is run every time the input pattern is + changed. + + It can be used to transform the candidate list dynamically, for + example, based on the current pattern. + + In some cases it may also be more efficent to perform candidate + transformation here, instead of with `candidate-transformer' + even if this transformation is done every time the pattern is + changed. For example, if a candidate set is very large then + `candidate-transformer' transforms every candidate while only + some of them will actually be displayed due to the limit + imposed by `helm-candidate-number-limit'. + + Note that `candidates' and `candidate-transformer' is run + already, so the given transformer function should also be able + to handle candidates with (DISPLAY . REAL) format.") + + (filter-one-by-one + :initarg :filter-one-by-one + :initform nil + :custom (choice function list) + :documentation + " A transformer function that treat candidates one by one. + It is called with one arg the candidate. + It is faster than `filtered-candidate-transformer' or + `candidate-transformer', but should be used only in sources + that recompute constantly their candidates, e.g `helm-source-find-files'. + Filtering happen early and candidates are treated + one by one instead of re-looping on the whole list. + If used with `filtered-candidate-transformer' or `candidate-transformer' + these functions should treat the candidates transformed by the + `filter-one-by-one' function in consequence.") + + (display-to-real + :initarg :display-to-real + :initform nil + :custom function + :documentation + " Transform the selected candidate when passing it to action. + + Function called with one parameter, the selected candidate. + + Avoid recomputing all candidates with candidate-transformer + or filtered-candidate-transformer to give a new value to REAL, + instead the selected candidate is transformed only when passing it + to action. This works (and make sense) only with plain string + candidates, it will NOT work when candidate is a cons cell, in this + case the real value of candidate will be used. + Example: + + (helm :sources (helm-build-sync-source \"test\" + :candidates \\='(a b c d e) + :display-to-real (lambda (c) (concat c \":modified by d-t-r\"))) + :buffer \"*helm test*\") + + Note that this is NOT a transformer, + so the display will not be modified by this function.") + + (real-to-display + :initarg :real-to-display + :initform nil + :custom function + :documentation + " Recompute all candidates computed previously with other transformers. + + Function called with one parameter, the selected candidate. + + The real value of candidates will be shown in display and of course + be used by action. + Example: + + (helm :sources (helm-build-sync-source \"test\" + :candidates \\='((\"foo\" . 1) (\"bar\" . 2) (\"baz\". 3)) + :real-to-display (lambda (c) (format \"%s\" (1+ c)))) + :buffer \"*helm test*\") + + Mostly deprecated, kept only for backward compatibility.") + + (marked-with-props + :initarg :marked-with-props + :initform nil + :custom (choice boolean symbol) + :documentation + " Get candidates with their properties in `helm-marked-candidates'. + Allow using the FORCE-DISPLAY-PART of `helm-get-selection' in marked + candidates, use t or \\='withprop to pass it to `helm-get-selection'.") + + (action-transformer + :initarg :action-transformer + :initform nil + :custom (choice function list) + :documentation + " It's a function or a list of functions called with two + arguments when the action list from the source is + assembled. The first argument is the list of actions, the + second is the current selection. If it is a list of functions, + it calls each function sequentially. + + The function should return a transformed action list. + + This can be used to customize the list of actions based on the + currently selected candidate.") + + (pattern-transformer + :initarg :pattern-transformer + :initform nil + :custom (choice function list) + :documentation + " It's a function or a list of functions called with one argument + before computing matches. Its argument is `helm-pattern'. + Functions should return transformed `helm-pattern'. + + It is useful to change interpretation of `helm-pattern'.") + + (candidate-number-limit + :initarg :candidate-number-limit + :initform nil + :custom integer + :documentation + " Override `helm-candidate-number-limit' only for this source.") + + (volatile + :initarg :volatile + :initform nil + :custom boolean + :documentation + " Indicates the source assembles the candidate list dynamically, + so it shouldn't be cached within a single Helm + invocation. It is only applicable to synchronous sources, + because asynchronous sources are not cached.") + + (match + :initarg :match + :initform nil + :custom (choice function list) + :documentation + " List of functions called with one parameter: a candidate. The + function should return non-nil if the candidate matches the + current pattern (see variable `helm-pattern'). + + When using `candidates-in-buffer' its default value is `identity' and + don't have to be changed, use the `search' slot instead. + + This attribute allows the source to override the default + pattern matching based on `string-match'. It can be used, for + example, to implement a source for file names and do the + pattern matching on the basename of files, since it's more + likely one is typing part of the basename when searching for a + file, instead of some string anywhere else in its path. + + If the list contains more than one function then the list of + matching candidates from the source is constructed by appending + the results after invoking the first function on all the + potential candidates, then the next function, and so on. The + matching candidates supplied by the first function appear first + in the list of results and then results from the other + functions, respectively. + + This attribute has no effect for asynchronous sources (see + attribute `candidates'), and sources using `match-dynamic' + since they perform pattern matching themselves. + + Note that FUZZY-MATCH slot will overhide value of this slot.") + + (diacritics + :initarg :diacritics + :initform nil + :custom boolean + :documentation + " Ignore diacritics when searching.") + + (match-on-real + :initarg :match-on-real + :initform nil + :custom boolean + :documentation + " Match the real value of candidates when non nil.") + + (fuzzy-match + :initarg :fuzzy-match + :initform nil + :custom boolean + :documentation + " Enable fuzzy matching in this source. + This will overwrite settings in MATCH slot, and for + sources built with child class `helm-source-in-buffer' the SEARCH slot. + This also add a `filtered-candidate-transformer' function to sort candidates + (see `helm-fuzzy-sort-fn') according to the score of each candidate which is + computed with `helm-fuzzy-default-score-fn'. + This is an easy way of enabling fuzzy matching, but you can use the MATCH + or SEARCH slots yourself if you want something more elaborated, mixing + different type of match (See `helm-source-buffers' class for example), you + will have in this case to provide as well a sort fn + in `filtered-candidate-transformer' yourself. + + This attribute is not supported for asynchronous sources + since they perform pattern matching themselves.") + + (redisplay + :initarg :redisplay + :initform 'identity + :custom (choice list function) + :documentation + " A function or a list of functions to apply to current list + of candidates when redisplaying buffer with `helm-redisplay-buffer'. + This is only interesting for modifying and redisplaying the whole list + of candidates in async sources. + It uses `identity' by default for when async sources are mixed with + normal sources, in this case these normal sources are not modified and + redisplayed as they are.") + + (nomark + :initarg :nomark + :initform nil + :custom boolean + :documentation + " Don't allow marking candidates when this attribute is present.") + + (nohighlight + :initarg :nohighlight + :initform nil + :custom boolean + :documentation + " Disable highlighting matches in this source. + This will disable generic highlighting of matches, + but some specialized highlighting can be done from elsewhere, + i.e from `filtered-candidate-transformer' or `filter-one-by-one' slots. + So use this to either disable completely highlighting in your source, + or to disable highlighting and use a specialized highlighting matches + function for this source. + Remember that this function should run AFTER all filter functions if those + filter functions are modifying face properties, though it is possible to + avoid this by using new `add-face-text-property' in your filter functions.") + + (allow-dups + :initarg :allow-dups + :initform nil + :custom boolean + :documentation + " Allow helm collecting duplicates candidates.") + + (history + :initarg :history + :initform nil + :custom symbol + :documentation + " Allow passing history variable to helm from source. + It should be a quoted symbol. + Passing the history variable here have no effect + so add it also in the `helm' call with the :history keyword. + The main point of adding the variable here + is to make it available when resuming.") + + (coerce + :initarg :coerce + :initform nil + :custom function + :documentation + " It's a function called with one argument: the selected candidate. + This function is intended for type convertion. In normal case, + the selected candidate (string) is passed to action + function. If coerce function is specified, it is called just + before action function. + + Example: converting string to symbol + (coerce . intern)") + + (mode-line + :initarg :mode-line + :initform nil + :custom (choice string sexp) + :documentation + " Source local `helm-mode-line-string' (included in + `mode-line-format'). It accepts also variable/function name.") + + (header-line + :initarg :header-line + :initform nil + :custom (choice string function) + :documentation + " Source local `header-line-format'. + It will be displayed in `header-line' or in `minibuffer' depending + of value of `helm-echo-input-in-header-line' and `helm-display-header-line'. + It accepts also variable/function name.") + + (resume + :initarg :resume + :initform nil + :custom function + :documentation + " Function called with no parameters at end of initialization + when `helm-resume' is started. + If this function try to do something against `helm-buffer', (e.g updating, + searching etc...) probably you should run it in a timer to ensure + `helm-buffer' is ready.") + + (follow + :initarg :follow + :initform nil + :custom integer + :documentation + " Enable `helm-follow-mode' for this source only. + With a value of 1 enable, a value of -1 or nil disable the mode. + See `helm-follow-mode' for more infos.") + + (follow-delay + :initarg :follow-delay + :initform nil + :custom integer + :documentation + " `helm-follow-mode' will execute persistent-action after this delay. + Otherwise value of `helm-follow-input-idle-delay' is used if non--nil, + If none of these are found fallback to `helm-input-idle-delay'.") + + (multimatch + :initarg :multimatch + :initform t + :custom boolean + :documentation + " Use the multi-match algorithm when non-nil. + I.e Allow specifying multiple patterns separated by spaces. + When a pattern is prefixed by \"!\" the negation of this pattern is used, + i.e match anything but this pattern. + It is the standard way of matching in helm and is enabled by default. + It can be used with fuzzy-matching enabled, but as soon helm detect a space, + each pattern will match by regexp and will not be fuzzy.") + + (match-part + :initarg :match-part + :initform nil + :custom function + :documentation + " Allow matching only one part of candidate. + If source contain match-part attribute, match is computed only + on part of candidate returned by the call of function provided + by this attribute. The function should have one arg, candidate, + and return only a specific part of candidate. + On async sources, as matching is done by the backend, this have + no effect apart for highlighting matches.") + + (before-init-hook + :initarg :before-init-hook + :initform nil + :custom symbol + :documentation + " A local hook that run at beginning of initilization of this source. + i.e Before the creation of `helm-buffer'. + + Should be a variable (a symbol) bound to a list of + functions or a single function (see `run-hooks' documentation). + Even better is to use `add-hook' to feed this variable. + Usage of an anonymous function, or a list of functions is still + supported but not recommended.") + + (after-init-hook + :initarg :after-init-hook + :initform nil + :custom symbol + :documentation + " A local hook that run at end of initilization of this source. + i.e After the creation of `helm-buffer'. + + Should be a variable (a symbol) bound to a list of + functions or a single function (see `run-hooks' documentation). + Even better is to use `add-hook' to feed this variable. + Usage of an anonymous function, or a list of functions is still + supported but not recommended.") + + (delayed + :initarg :delayed + :initform nil + :custom (choice null integer) + :documentation + " This slot have no more effect and is just kept for backward compatibility. + Please don't use it.") + + (must-match + :initarg :must-match + :initform nil + :custom symbol + :documentation + " Same as `completing-read' require-match arg. + Possible values are: + - `t' which prevent exiting with an empty helm-buffer i.e. no matches. + - `confirm' which ask for confirmation i.e. need to press a second + time RET. + - `nil' is the default and is doing nothing i.e. returns nil when + pressing RET with an empty helm-buffer. + - Any other non nil values e.g. `ignore' allow exiting with + minibuffer contents as candidate value (in this case helm-buffer + is empty).") + + (find-file-target + :initarg :find-file-target + :initform nil + :custom function + :documentation + " Determine the target file when running `helm-quit-and-find-file'. + It is a function called with one arg SOURCE.") + + (group + :initarg :group + :initform 'helm + :custom symbol + :documentation + " The current source group, default to `helm' when not specified.")) + + "Main interface to define helm sources." + :abstract t) + +(defclass helm-source-sync (helm-source) + ((candidates + :initform '("ERROR: You must specify the `candidates' slot, either with a list or a function")) + + (migemo + :initarg :migemo + :initform nil + :custom boolean + :documentation + " Enable migemo. + When multimatch is disabled, you can give the symbol \\='nomultimatch as value + to force not using generic migemo matching function. + In this case you have to provide your own migemo matching funtion + that kick in when `helm-migemo-mode' is enabled. + Otherwise it will be available for this source once `helm-migemo-mode' + is enabled when non-nil.") + + (match-strict + :initarg :match-strict + :initform nil + :custom function + :documentation + " When specifying a match function within a source and + helm-multi-match is enabled, the result of all matching + functions will be concatened, which in some cases is not what + is wanted. When using `match-strict' only this or these + functions will be used. You can specify those functions as a + list of functions or a single symbol function. + + NOTE: This have the same effect as using :MULTIMATCH nil.") + + (match-dynamic + :initarg :match-dynamic + :initform nil + :custom boolean + :documentation + " Disable all helm matching functions when non nil. + The :candidates function in this case is in charge of fetching + candidates dynamically according to `helm-pattern'. + If you want to make your :candidates function working with `completion-styles' + use the function `helm-dynamic-completion'. + Note that :volatile is automatically enabled when using this, so no + need to specify it.")) + + "Use this class to make helm sources using a list of candidates. +This list should be given as a normal list, a variable handling a list +or a function returning a list. +Matching is done basically with `string-match' against each candidate.") + +(defclass helm-source-async (helm-source) + ((candidates-process + :initarg :candidates-process + :initform nil + :custom function + :documentation + " This attribute is used to define a process as candidate. + The function called with no arguments must return a process + i.e. `processp', it use typically `start-process' or `make-process', + see (info \"(elisp) Asynchronous Processes\"). + + + NOTE: + When building the source at runtime you can give directly a process + as value, otherwise wrap the process call into a function. + The process buffer should be nil, otherwise, if you use + `helm-buffer' give to the process a sentinel.") + + (multimatch :initform nil)) + + "Use this class to define a helm source calling an external process. +The external process is called typically in a `start-process' call to be +asynchronous. + +Note that using multiples asynchronous sources is not fully working, +expect weird behavior if you try this. + +The :candidates slot is not allowed even if described because this class +inherit from `helm-source'.") + +(defclass helm-source-in-buffer (helm-source) + ((init + :initform 'helm-default-init-source-in-buffer-function) + + (data + :initarg :data + :initform nil + :custom (choice list string) + :documentation + " A string, a list or a buffer that will be used to feed the `helm-candidates-buffer'. + This data will be passed in a function added to the init slot and + the buffer will be build with `helm-init-candidates-in-buffer' or directly + with `helm-candidates-buffer' if data is a buffer. + This is an easy and fast method to build a `candidates-in-buffer' source.") + + (migemo + :initarg :migemo + :initform nil + :custom boolean + :documentation + " Enable migemo. + When multimatch is disabled, you can give the symbol \\='nomultimatch as value + to force not using generic migemo matching function. + In this case you have to provide your own migemo matching funtion + that kick in when `helm-migemo-mode' is enabled. + Otherwise it will be available for this source once `helm-migemo-mode' + is enabled when non-nil.") + + (candidates + :initform 'helm-candidates-in-buffer) + + (volatile + :initform t) + + (match + :initform '(identity)) + + (get-line + :initarg :get-line + :initform 'buffer-substring-no-properties + :custom function + :documentation + " A function like `buffer-substring-no-properties' or `buffer-substring'. + This function converts region from point at line-beginning and point + at line-end in the `helm-candidate-buffer' to a string which will be displayed + in the `helm-buffer', it takes two args BEG and END. + By default, `helm-candidates-in-buffer' uses + `buffer-substring-no-properties' which does no conversion and doesn't carry + text properties.") + + (search + :initarg :search + :initform '(helm-candidates-in-buffer-search-default-fn) + :custom (choice function list) + :documentation + " List of functions like `re-search-forward' or `search-forward'. + Buffer search function used by `helm-candidates-in-buffer'. + By default, `helm-candidates-in-buffer' uses `re-search-forward'. + The function should take one arg PATTERN. + If your search function needs to handle negation like multimatch, + this function should returns in such case a cons cell of two integers defining + the beg and end positions to match in the line previously matched by + `re-search-forward' or similar, and move point to next line + (See how the `helm-mm-3-search-base' and `helm-fuzzy-search' functions are working). + + NOTE: FUZZY-MATCH slot will overhide value of this slot.") + + (search-strict + :initarg :search-strict + :initform nil + :custom function + :documentation + " When specifying a search function within a source and + helm-multi-match is enabled, the result of all searching + functions will be concatened, which in some cases is not what + is wanted. When using `search-strict' only this or these + functions will be used. You can specify those functions as a + list of functions or a single symbol function. + + NOTE: This have the same effect as using a nil value for + :MULTIMATCH slot.")) + + "Use this source to make helm sources storing candidates inside a buffer. + +The buffer storing candidates is generated by `helm-candidate-buffer' function +and all search are done in this buffer, results are transfered to the `helm-buffer' +when done. +Contrarily to `helm-source-sync' candidates are matched using a function +like `re-search-forward' (see below documentation of `:search' slot) which makes +the search much faster than matching candidates one by one. +If you want to add search functions to your sources, don't use `:match' which +will raise an error, but `:search'. +See `helm-candidates-in-buffer' for more infos.") + +(defclass helm-source-dummy (helm-source) + ((candidates + :initform '("dummy")) + + (filtered-candidate-transformer + :initform (lambda (_candidates _source) (list helm-pattern))) + + (multimatch + :initform nil) + + (accept-empty + :initarg :accept-empty + :initform t + :custom boolean + :documentation + " Allow exiting with an empty string. + You should keep the default value.") + + (match + :initform 'identity) + + (volatile + :initform t))) + +(defclass helm-source-in-file (helm-source-in-buffer) + ((init :initform (lambda () + (let ((file (helm-get-attr 'candidates-file)) + (count 1)) + (with-current-buffer (helm-candidate-buffer 'global) + (insert-file-contents file) + (goto-char (point-min)) + (when (helm-get-attr 'linum) + (while (not (eobp)) + (add-text-properties + (pos-bol) (pos-eol) + `(helm-linum ,count)) + (cl-incf count) + (forward-line 1))))))) + (get-line :initform #'buffer-substring) + (candidates-file + :initarg :candidates-file + :initform nil + :custom string + :documentation + " The file used to fetch candidates.") + (linum + :initarg :linum + :initform nil + :documentation + " Store line number in each candidate when non nil. + Line number is stored in `helm-linum' text property.")) + + "The contents of the FILE will be used as candidates in buffer.") + + +;;; Error functions +;; +;; +(defun helm-default-init-source-in-buffer-function () + (helm-init-candidates-in-buffer 'global + '("ERROR: No buffer handling your data, use either the `init' slot or the `data' slot."))) + + +;;; Internal Builder functions. +;; +;; +(defun helm--create-source (object) + "[INTERNAL] Build a helm source from OBJECT. +Where OBJECT is an instance of an eieio class." + (cl-loop for sd in (eieio-class-slots (eieio-object-class object)) + for s = (eieio-slot-descriptor-name sd) + for slot-val = (slot-value object s) + when slot-val + collect (cons s slot-val))) + +(defun helm-make-source (name class &rest args) + "Build a `helm' source named NAME with ARGS for CLASS. +Argument NAME is a string which define the source name, so no need to use +the keyword :name in your source, NAME will be used instead. +Argument CLASS is a symbol defining an eieio class object. +Arguments ARGS are keyword value pairs as defined in CLASS." + (declare (indent 2)) + (let ((source (apply #'make-instance class name args))) + (setf (slot-value source 'name) name) + (helm--setup-source source) + (helm-setup-user-source source) + (helm--create-source source))) + +(defun helm-make-type (class &rest args) + (let ((source (apply #'make-instance class args))) + (setf (slot-value source 'name) nil) + (helm--setup-source source) + (helm--create-source source))) + +(defvar helm-mm-default-search-functions) +(defvar helm-mm-default-match-functions) + +(defun helm-source-mm-get-search-or-match-fns (source method) + "Prepare match or search functions for class SOURCE. +Argument METHOD is the matching method used by SOURCE either `match' +or `search'." + (let* ((diacritics (slot-value source 'diacritics)) + (defmatch (helm-aif (slot-value source 'match) + (helm-mklist it))) + (defmatch-strict (helm-aif (and (eq method 'match) + (slot-value source 'match-strict)) + (helm-mklist it))) + (defsearch (helm-aif (and (eq method 'search) + (slot-value source 'search)) + (helm-mklist it))) + (defsearch-strict (helm-aif (and (eq method 'search-strict) + (slot-value source 'search-strict)) + (helm-mklist it))) + (migemo (slot-value source 'migemo))) + (cl-case method + (match (cond (defmatch-strict) + ((and migemo diacritics) + (append (list 'helm-mm-exact-match + 'helm-mm-3-match-on-diacritics) + defmatch '(helm-mm-3-migemo-match))) + (migemo + (append helm-mm-default-match-functions + defmatch '(helm-mm-3-migemo-match))) + (diacritics + (delq nil + `(helm-mm-exact-match + ,@defmatch helm-mm-3-match-on-diacritics))) + (defmatch + (append helm-mm-default-match-functions defmatch)) + (t helm-mm-default-match-functions))) + (search (cond (defsearch-strict) + ((and migemo diacritics) + (append '(helm-mm-exact-search) + defsearch + '(helm-mm-3-migemo-search + helm-mm-3-search-on-diacritics))) + (migemo + (append helm-mm-default-search-functions + defsearch '(helm-mm-3-migemo-search))) + (diacritics + (delq nil + `(helm-mm-exact-search + ,@defsearch helm-mm-3-search-on-diacritics))) + (defsearch + (append helm-mm-default-search-functions defsearch)) + (t helm-mm-default-search-functions)))))) + + +;;; Modifiers +;; +(cl-defun helm-source-add-action-to-source-if (name fn source predicate + &optional (index 4)) + "Same as `helm-add-action-to-source-if' but for SOURCE defined as eieio object. +You can use this inside a `helm--setup-source' method for a SOURCE defined as +an eieio class." + (let* ((actions (slot-value source 'action)) + (action-transformers (slot-value source 'action-transformer)) + (new-action (list (cons name fn))) + (transformer (lambda (actions _candidate) + (let ((candidate (car (helm-marked-candidates)))) + (cond ((funcall predicate candidate) + (helm-append-at-nth + actions new-action index)) + (t actions)))))) + (cond ((functionp actions) + (setf (slot-value source 'action) (list (cons "Default action" actions)))) + ((listp actions) + (setf (slot-value source 'action) (helm-interpret-value actions source)))) + (when (or (symbolp action-transformers) (functionp action-transformers)) + (setq action-transformers (list action-transformers))) + (setf (slot-value source 'action-transformer) + (delq nil (append (list transformer) action-transformers))))) + + +;;; Methods to build sources. +;; +;; +(defun helm-source--persistent-help-string (value source) + "Format `persistent-help' VALUE in SOURCE. +Argument VALUE can be a string, a variable or a function." + (substitute-command-keys + (format "\\\\[helm-execute-persistent-action]: %s (keeping session)" + (helm-aif value + (helm-interpret-value value source) + (slot-value source 'header-line))))) + +(defun helm-source--header-line (source) + "Compute a default header line for SOURCE. + +The header line is based on one of `persistent-action-if', +`persistent-action', or `action' (in this order of precedence)." + (substitute-command-keys + (concat "\\\\[helm-execute-persistent-action]: " + (helm-acond + ((slot-value source 'persistent-action-if) + (helm-symbol-name it)) + ((or (slot-value source 'persistent-action) + (slot-value source 'action)) + (cond ((and (symbolp it) + (functionp it) + (eq it 'identity)) + "Do Nothing") + ((and (symbolp it) + (boundp it) + (listp (symbol-value it)) + (stringp (caar (symbol-value it)))) + (caar (symbol-value it))) + ((or (symbolp it) (functionp it)) + (helm-symbol-name it)) + ((listp it) + (let ((action (car it))) + ;; It comes from :action ("foo" . function). + (if (stringp (car action)) + (car action) + ;; It comes from :persistent-action + ;; (function . 'nosplit) Fix Bug#788. + (if (or (symbolp action) + (functionp action)) + (helm-symbol-name action))))) + (t ""))) + (t "")) + " (keeping session)"))) + +(cl-defmethod helm--setup-source ((_source helm-source))) + +(cl-defmethod helm--setup-source :before ((source helm-source)) + (unless (slot-value source 'group) + (setf (slot-value source 'group) 'helm)) + (when (slot-value source 'delayed) + (warn "Deprecated usage of helm `delayed' slot in `%s'" + (slot-value source 'name))) + (helm-aif (slot-value source 'keymap) + (let* ((map (if (symbolp it) + (symbol-value it) + it)) + (must-match-map (when (slot-value source 'must-match) + (let ((map (make-sparse-keymap))) + (define-key map (kbd "RET") + 'helm-confirm-and-exit-minibuffer) + map))) + (loc-map (if must-match-map + (make-composed-keymap + must-match-map map) + map))) + (setf (slot-value source 'keymap) loc-map))) + (helm-aif (slot-value source 'persistent-help) + (setf (slot-value source 'header-line) + (helm-source--persistent-help-string it source)) + (setf (slot-value source 'header-line) (helm-source--header-line source))) + (when (slot-value source 'fuzzy-match) + (cl-assert helm-fuzzy-sort-fn nil "Wrong type argument functionp: nil") + (setf (slot-value source 'filtered-candidate-transformer) + (helm-aif (slot-value source 'filtered-candidate-transformer) + (append (helm-mklist it) + (list helm-fuzzy-sort-fn)) + (list helm-fuzzy-sort-fn)))) + (unless (slot-value source 'nohighlight) + (setf (slot-value source 'filtered-candidate-transformer) + (helm-aif (slot-value source 'filtered-candidate-transformer) + (append (helm-mklist it) + (list #'helm-fuzzy-highlight-matches)) + (list #'helm-fuzzy-highlight-matches)))) + (when (numberp (helm-interpret-value (slot-value source 'multiline))) + (setf (slot-value source 'filtered-candidate-transformer) + (helm-aif (slot-value source 'filtered-candidate-transformer) + (append (helm-mklist it) + (list #'helm-multiline-transformer)) + (list #'helm-multiline-transformer)))) + (helm-aif (slot-value source 'requires-pattern) + (let ((val (if (symbolp it) + (symbol-value it) + it))) + (setf (slot-value source 'requires-pattern) val))) + ;; Warn when hooks are defined as something else as a symbol i.e. a lambda or + ;; a list, if a function an error will raise later anyway when this function + ;; is called with `run-hooks'. + (let ((sname (slot-value source 'name))) + (helm-aif (slot-value source 'before-init-hook) + (when (or (and (functionp it) (not (symbolp it))) + (consp it)) + (warn "Helm source `%s': before-init-hook Should be defined as a symbol" sname))) + (helm-aif (slot-value source 'after-init-hook) + (when (or (and (functionp it) (not (symbolp it))) + (consp it)) + (warn "Helm source `%s': after-init-hook Should be defined as a symbol" sname))))) + +(cl-defmethod helm-setup-user-source ((_source helm-source))) + +(cl-defmethod helm--setup-source ((source helm-source-sync)) + (when (slot-value source 'fuzzy-match) + (helm-aif (slot-value source 'match) + (setf (slot-value source 'match) + (append (helm-mklist it) + (list helm-fuzzy-match-fn))) + (setf (slot-value source 'match) helm-fuzzy-match-fn))) + (when (slot-value source 'multimatch) + (setf (slot-value source 'match) + (helm-source-mm-get-search-or-match-fns source 'match))) + (helm-aif (and (null (slot-value source 'multimatch)) + (slot-value source 'migemo)) + (unless (eq it 'nomultimatch) ; Use own migemo fn. + (setf (slot-value source 'match) + (append (helm-mklist (slot-value source 'match)) + '(helm-mm-3-migemo-match))))) + (when (slot-value source 'match-dynamic) + (setf (slot-value source 'match) 'identity) + (setf (slot-value source 'match-part) nil) + (setf (slot-value source 'multimatch) nil) + (setf (slot-value source 'fuzzy-match) nil) + (setf (slot-value source 'volatile) t))) + +(cl-defmethod helm--setup-source ((source helm-source-in-buffer)) + (cl-assert (eq (slot-value source 'candidates) 'helm-candidates-in-buffer) + nil + (format "Wrong usage of `candidates' attr in `%s' use `data' or `init' instead" + (slot-value source 'name))) + (let ((cur-init (slot-value source 'init))) + (helm-aif (slot-value source 'data) + (setf (slot-value source 'init) + (delq + nil + (list + (and (null (eq 'helm-default-init-source-in-buffer-function + cur-init)) + cur-init) + (lambda () + (helm-init-candidates-in-buffer + 'global + (cond ((functionp it) (funcall it)) + ((and (bufferp it) (buffer-live-p it)) + (with-current-buffer it (buffer-string))) + (t it))))))))) + (when (slot-value source 'fuzzy-match) + (helm-aif (slot-value source 'search) + (setf (slot-value source 'search) + (append (helm-mklist it) + (list helm-fuzzy-search-fn))) + (setf (slot-value source 'search) (list helm-fuzzy-search-fn)))) + (when (slot-value source 'multimatch) + (setf (slot-value source 'search) + (helm-source-mm-get-search-or-match-fns source 'search))) + (helm-aif (and (null (slot-value source 'multimatch)) + (slot-value source 'migemo)) + (unless (eq it 'nomultimatch) + (setf (slot-value source 'search) + (append (helm-mklist (slot-value source 'search)) + '(helm-mm-3-migemo-search))))) + (let ((mtc (slot-value source 'match))) + (cl-assert (or (equal '(identity) mtc) + (eq 'identity mtc)) + nil "Invalid slot value for `match'") + (cl-assert (eq (slot-value source 'volatile) t) + nil "Invalid slot value for `volatile'"))) + +(cl-defmethod helm--setup-source ((source helm-source-async)) + (cl-assert (null (slot-value source 'candidates)) + nil "Incorrect use of `candidates' use `candidates-process' instead") + (cl-assert (null (slot-value source 'multimatch)) + nil "`multimatch' not allowed in async sources.") + (cl-assert (null (slot-value source 'fuzzy-match)) + nil "`fuzzy-match' not supported in async sources.")) + +(cl-defmethod helm--setup-source ((source helm-source-dummy)) + (let ((mtc (slot-value source 'match))) + (cl-assert (or (equal '(identity) mtc) + (eq 'identity mtc)) + nil "Invalid slot value for `match'") + (cl-assert (eq (slot-value source 'volatile) t) + nil "Invalid slot value for `volatile'") + (cl-assert (equal (slot-value source 'candidates) '("dummy")) + nil "Invalid slot value for `candidates'") + (cl-assert (eq (slot-value source 'accept-empty) t) + nil "Invalid slot value for `accept-empty'"))) + + +;;; User functions +;; +;; Sources +(defmacro helm-build-sync-source (name &rest args) + "Build a synchronous helm source with name NAME. +Args ARGS are keywords provided by `helm-source-sync'." + (declare (indent 1)) + `(helm-make-source ,name 'helm-source-sync ,@args)) + +(defmacro helm-build-async-source (name &rest args) + "Build a asynchronous helm source with name NAME. +Args ARGS are keywords provided by `helm-source-async'." + (declare (indent 1)) + `(helm-make-source ,name 'helm-source-async ,@args)) + +(defmacro helm-build-in-buffer-source (name &rest args) + "Build a helm source with name NAME using `candidates-in-buffer' method. +Args ARGS are keywords provided by `helm-source-in-buffer'." + (declare (indent 1)) + `(helm-make-source ,name 'helm-source-in-buffer ,@args)) + +(defmacro helm-build-dummy-source (name &rest args) + "Build a helm source with name NAME using `dummy' method. +Args ARGS are keywords provided by `helm-source-dummy'." + (declare (indent 1)) + `(helm-make-source ,name 'helm-source-dummy ,@args)) + +(defmacro helm-build-in-file-source (name file &rest args) + "Build a helm source with NAME name using `candidates-in-files' method. +Arg FILE is a filename, the contents of this file will be +used as candidates in buffer. +Args ARGS are keywords provided by `helm-source-in-file'." + (declare (indent 2)) + `(helm-make-source ,name 'helm-source-in-file + :candidates-file ,file ,@args)) + + +(provide 'helm-source) + +;;; helm-source ends here diff --git a/code/elpa/helm-ls-git-20240315.1721/helm-ls-git-autoloads.el b/code/elpa/helm-ls-git-20240315.1721/helm-ls-git-autoloads.el new file mode 100644 index 0000000..d74ceb3 --- /dev/null +++ b/code/elpa/helm-ls-git-20240315.1721/helm-ls-git-autoloads.el @@ -0,0 +1,48 @@ +;;; helm-ls-git-autoloads.el --- automatically extracted autoloads (do not edit) -*- lexical-binding: t -*- +;; Generated by the `loaddefs-generate' function. + +;; This file is part of GNU Emacs. + +;;; Code: + +(add-to-list 'load-path (or (and load-file-name (directory-file-name (file-name-directory load-file-name))) (car load-path))) + + + +;;; 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) +(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) +(autoload 'helm-ls-git "helm-ls-git" "\ + + +(fn &optional ARG)" t) +(register-definition-prefixes "helm-ls-git" '("helm-")) + +;;; End of scraped data + +(provide 'helm-ls-git-autoloads) + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; no-native-compile: t +;; coding: utf-8-emacs-unix +;; End: + +;;; helm-ls-git-autoloads.el ends here diff --git a/code/elpa/helm-ls-git-20240315.1721/helm-ls-git-pkg.el b/code/elpa/helm-ls-git-20240315.1721/helm-ls-git-pkg.el new file mode 100644 index 0000000..d580804 --- /dev/null +++ b/code/elpa/helm-ls-git-20240315.1721/helm-ls-git-pkg.el @@ -0,0 +1,7 @@ +(define-package "helm-ls-git" "20240315.1721" "list git files." + '((helm "3.9.5") + (emacs "25.3")) + :commit "8b0b9484d43153e0c1a1fb664a14b1a53874e60b" :url "https://github.com/emacs-helm/helm-ls-git") +;; Local Variables: +;; no-byte-compile: t +;; End: diff --git a/code/elpa/helm-ls-git-20240315.1721/helm-ls-git.el b/code/elpa/helm-ls-git-20240315.1721/helm-ls-git.el new file mode 100644 index 0000000..211ed66 --- /dev/null +++ b/code/elpa/helm-ls-git-20240315.1721/helm-ls-git.el @@ -0,0 +1,2111 @@ +;;; helm-ls-git.el --- list git files. -*- lexical-binding: t -*- + +;; Copyright (C) 2012 ~ 2023 Thierry Volpiatto + +;; Package-Requires: ((helm "3.9.5") (emacs "25.3")) +;; URL: https://github.com/emacs-helm/helm-ls-git +;; Version: 1.9.4 + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; Features: +;; +;; Display list of branches in project and provide related actions. +;; +;; Provide git log view from branches source with related actions (diff, patches, reset, find file etc...) +;; +;; Display the open buffers in project. +;; +;; Display a status source showing state of project (modified files etc...). +;; +;; Provide its own commit facilities with a mode to edit commit (commit, amend etc...) +;; +;; Allow rebasing and provide a mode to edit rebase-todo files +;; +;; Display stashes list and provide related actions. +;; +;; Display a list of all files in project under git control. +;; +;; Allow looking quickly at diff on modified files. +;; +;; Allow switching to git status with your preferred frontend (vc-dir, magit,etc...) +;; +;; Full integration of git-grep, allow also usage of helm-grep (you can use ack-grep instead of grep). +;; +;; Integrate usage of gid from id-utils. +;; +;; Full integration with helm-find-files, allow you to browse project unrelated to current-buffer. +;; +;; In addition, all actions of type files and buffers are provided. + +;;; 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 nil + "Favorite git-status command for emacs. + +When set, you will have an additional action allowing to +switch to a git status buffer e.g. `vc-dir' or `magit-status'. + +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 "LightSkyBlue")) + "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) + (define-key map (kbd "M-L") 'undefined) + (define-key map (kbd "M-L") 'helm-ls-git-run-file-log) + 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) + (define-key map (kbd "C-c i") 'helm-ls-git-status-toggle-ignored) + 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 "C-c R") 'helm-ls-git-run-status-revert-files) + (define-key map (kbd "M-e") 'helm-ls-git-run-switch-to-shell) + (define-key map (kbd "C-c i") 'helm-ls-git-status-toggle-ignored) + 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). + +Using the browse project action from `helm-find-files' allow +you to switch to another project easily (\\\\[helm-ff-run-browse-project]) . + +See also the command `helm-projects-history' bound to +\\[helm-projects-history] to switch to one project to the other. + +Also using bookmarks to switch projects is a good alternative. + +*** Git status command + +By default `helm-ls-git-status-command' is nil, +but you can set it if needed to `magit-status', `vc-dir' or whatever. + +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 branches + +From this source you can see all locals branches and switch to them as needed. +The current branch is prefixed with a star. +You can toggle branches view (locales and remotes) with \\\\[helm-ls-git-branches-toggle-show-all]. +See the action menu to see other available actions. + +*** 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 +*** List files source + +\\ +|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. + +*** Buffers source + +\\ +|Keys|Description +|-----------+----------| +|\\[helm-ls-git-ls-files-show-others]|Toggle view of tracked/not tracked files. + +*** Status source + +\\ +|Keys|Description +|-----------+----------| +|\\[helm-ls-git-run-stage-marked-and-commit]|Commit marked files. +|\\[helm-ls-git-run-stage-marked-and-amend-commit]|Stage marked files and amend. +|\\[helm-ls-git-run-stage-files]|Stage files. +|\\[helm-ls-git-run-stage-marked-and-extend-commit]|Stage marked files and extend commit. +|\\[helm-ls-git-run-stash]|Stash. +|\\[helm-ls-git-run-stash-snapshot]|Stash snapshot (no revert). +|\\[helm-ls-git-run-status-revert-files]|Revert marked files. +|\\[helm-ls-git-run-switch-to-shell]|Switch to shell. + +*** Branches source + +\\ +|Keys|Description +|-----------+----------| +|\\[helm-ls-git-branches-toggle-show-all]|Show all branches locales and remotes. +|\\[helm-ls-git-run-show-log]|Show log. +|\\[helm-ls-git-run-push]|Push. +|\\[helm-ls-git-run-pull]|Pull. +|\\[helm-ls-git-run-fetch]|Fetch. +|\\[helm-ls-git-run-switch-to-shell]|Switch to shell. + +") + + +;; 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 (lambda () + (and helm-ls-git-status-command "Git status")) + (lambda (_candidate) + (funcall helm-ls-git-status-command + (helm-default-directory))) + "Git Log" 'helm-ls-git-show-log-for-file + "Switch to shell" 'helm-ls-git-switch-to-shell + "Git grep files (`C-u' only current directory)" + 'helm-ls-git-grep + "Gid" 'helm-ff-gid) + 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" (lambda (_candidate) + (let ((helm--reading-passwd-or-string t)) + (mapc 'find-file (helm-marked-candidates)))) + (lambda () + (and helm-ls-git-status-command "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)) + for fname = (buffer-file-name (get-buffer buf)) + when (and fname (file-exists-p fname)) + 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 file) + "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) + (when file (setq switches (append switches `("--follow" ,file)))) + (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-for-file (file) + (helm-ls-git-show-log (helm-ls-git--branch) file)) + +(helm-make-command-from-action helm-ls-git-run-file-log + "Git log for candidate FILE." + 'helm-ls-git-show-log-for-file) + +(defun helm-ls-git-show-log (branch &optional file) + (let ((name (if (helm-ls-git-detached-state-p) + (helm-ls-git--branch) + (helm-ls-git-normalize-branch-name 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 (substring-no-properties 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)) + file)) + (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) + ("Ediff file at revs" . helm-ls-git-ediff-file-at-revs) + ("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) + ("Checkout" . helm-ls-git-log-checkout)) + :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) + (helm-ls-git-revert-buffers-in-project)) + +(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-checkout (_candidate) + (let ((rev (car (split-string (helm-get-selection nil 'withprop))))) + (helm-ls-git-checkout rev))) + +(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-1 (candidate &optional file buffer-only) + (with-helm-default-directory (helm-default-directory) + (let* ((rev (substring-no-properties (car (split-string candidate)))) + (file (or file + (helm :sources (helm-build-in-buffer-source "Git cat-file" + :data (helm-ls-git-list-files)) + :buffer "*helm-ls-git cat-file*"))) + ;; Git command line needs 1234:lisp/foo. + (fname (concat rev ":" file)) + ;; Whereas the file created will be lisp/1234:foo. + (path (expand-file-name + (concat (helm-basedir file) rev ":" (helm-basename file)) + (helm-ls-git-root-dir))) + str status buf) + (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 (setq buf (find-file-noselect path)) + (insert str) + ;; Prevent kill-buffer asking after ediff ends. + (set-buffer-modified-p (not buffer-only)) + (goto-char (point-min)) + (unless buffer-only + (save-buffer))) + (if buffer-only buf (find-file path))) + (error "No such file %s at %s" file rev))))) + +(defun helm-ls-git-log-find-file (candidate) + (helm-ls-git-log-find-file-1 candidate)) + +(defun helm-ls-git-ediff-file-at-revs (_candidate) + (let* ((marked (helm-marked-candidates)) + (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)) + (ediff-buffers buf1 buf2))) + +(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" "-v" "--color=always"))) + (t + (apply #'process-file "git" nil t nil + '("branch" "-a" "-v" "--color=always"))))))) + "")) + +(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-delete-remote-branch (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)))))) + +(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 `("-D" ,branch))) + (cl-assert (not (string-match "\\`[*]" candidate)) + nil "Can't delete current branch") + ;; Delete remote branch async. + (if (and remote + (or helm-ls-git-delete-branch-on-remote + (y-or-n-p (format "Really delete `%s' branch on remote ?" branch)))) + (helm-ls-git-delete-remote-branch branch) + ;; Delete local branch synchronously. + (if (= (apply #'process-file "git" nil nil nil "branch" switches) 0) + (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-detached-state-p () + (with-temp-buffer + (let* ((default-directory (helm-default-directory)) + (proc (process-file + "git" nil t nil + "symbolic-ref" "HEAD" "--short"))) + (null (= proc 0))))) + +(defun helm-ls-git-branches-transformer (candidates) + (cl-loop for c in candidates + for disp = (ansi-color-apply c) + for split = (split-string disp) + for real = (if (string= (car split) "*") + (concat "* " (cadr split)) + (car split)) + collect (cons disp real))) + +(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 (helm-make-actions + (lambda () + (and helm-ls-git-status-command "Git status")) + (lambda (_candidate) + (funcall helm-ls-git-status-command + (helm-default-directory))) + "Switch to shell" #'helm-ls-git-switch-to-shell + "Git log (M-L)" #'helm-ls-git-show-log) + :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 +(defvar helm-ls-git--status-ignored-behavior "no") + +(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" + (format "--ignored=%s" helm-ls-git--status-ignored-behavior) + "--porcelain"))))))))) + +(defun helm-ls-git-status-toggle-ignored () + (interactive) + (setq helm-ls-git--status-ignored-behavior + (helm-acase helm-ls-git--status-ignored-behavior + ("traditional" "no") + ("no" "traditional"))) + (with-helm-window (helm-force-update))) + +(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 "^\\(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) + (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)" 'helm-ls-git-status-revert-files + "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 "^AM? " 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 "^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 + ((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) + +(defun helm-ls-git-status-revert-files (_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))))) + (when helm-in-persistent-action (helm-force-update)))) + +(defun helm-ls-git-run-status-revert-files () + (interactive) + (with-helm-alive-p + (helm-set-attr 'revert 'helm-ls-git-status-revert-files) + (helm-execute-persistent-action 'revert))) +(put 'helm-ls-git-run-status-revert-files '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-1 (arg) + "Move commit line one line down or up according to ARG. +ARG can be 1 for down or -1 for up." + (beginning-of-line) + (let* ((next (+ 1 (line-end-position))) + (line (buffer-substring (point) next))) + (delete-region (point) next) + (forward-line arg) + (insert line) + (forward-line -1))) + +(defun helm-ls-git-rebase-todo-move-down () + "Move commit line one line down." + (interactive) + (helm-ls-git-rebase-todo-move-1 1)) + +(defun helm-ls-git-rebase-todo-move-up () + "Move commit line on line up." + (interactive) + (helm-ls-git-rebase-todo-move-1 -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 (pos-bol)) + (save-excursion + (when (re-search-forward regexp (pos-eol) t) + (delete-region (pos-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 +;; +;; Override 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 (lambda () + (and helm-ls-git-status-command "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/code/elpa/helm-org-20231022.620/helm-org-autoloads.el b/code/elpa/helm-org-20231022.620/helm-org-autoloads.el new file mode 100644 index 0000000..8bca261 --- /dev/null +++ b/code/elpa/helm-org-20231022.620/helm-org-autoloads.el @@ -0,0 +1,55 @@ +;;; helm-org-autoloads.el --- automatically extracted autoloads (do not edit) -*- lexical-binding: t -*- +;; Generated by the `loaddefs-generate' function. + +;; This file is part of GNU Emacs. + +;;; Code: + +(add-to-list 'load-path (or (and load-file-name (directory-file-name (file-name-directory load-file-name))) (car load-path))) + + + +;;; Generated autoloads from helm-org.el + +(require 'helm-easymenu) +(easy-menu-add-item nil '("Tools" "Helm") '("Org" ["Org headlines in org agenda files" helm-org-agenda-files-headings t] ["Org headlines in buffer" helm-org-in-buffer-headings t]) "Elpa") +(autoload 'helm-org-agenda-files-headings "helm-org" "\ +Preconfigured helm for org files headings. + +(fn &optional ARG)" t) +(autoload 'helm-org-in-buffer-headings "helm-org" "\ +Preconfigured helm for org buffer headings. + +(fn &optional ARG)" t) +(autoload 'helm-org-parent-headings "helm-org" "\ +Preconfigured helm for org headings that are parents of the current heading. + +(fn &optional ARG)" t) +(autoload 'helm-org-capture-templates "helm-org" "\ +Preconfigured helm for org templates." t) +(autoload 'helm-org-completing-read-tags "helm-org" "\ +Completing read function for Org tags. + +This function is used as a `completing-read' function in +`helm-completing-read-handlers-alist' by `org-set-tags' and +`org-capture'. + +NOTE: Org tag completion will work only if you disable org fast tag +selection, see (info \"(org) setting tags\"). + +(fn PROMPT COLLECTION PRED REQ INITIAL HIST DEF INHERIT-INPUT-METHOD NAME BUFFER)") +(register-definition-prefixes "helm-org" '("helm-")) + +;;; End of scraped data + +(provide 'helm-org-autoloads) + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; no-native-compile: t +;; coding: utf-8-emacs-unix +;; End: + +;;; helm-org-autoloads.el ends here diff --git a/code/elpa/helm-org-20231022.620/helm-org-pkg.el b/code/elpa/helm-org-20231022.620/helm-org-pkg.el new file mode 100644 index 0000000..22c1dae --- /dev/null +++ b/code/elpa/helm-org-20231022.620/helm-org-pkg.el @@ -0,0 +1,13 @@ +(define-package "helm-org" "20231022.620" "Helm for org headlines and keywords completion" + '((helm "3.3") + (emacs "24.4")) + :commit "c80e53315ce6b096e2d0e630702df924bf00bf6a" :authors + '(("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) + :maintainers + '(("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) + :maintainer + '("Thierry Volpiatto" . "thierry.volpiatto@gmail.com") + :url "https://github.com/emacs-helm/helm-org") +;; Local Variables: +;; no-byte-compile: t +;; End: diff --git a/code/elpa/helm-org-20231022.620/helm-org.el b/code/elpa/helm-org-20231022.620/helm-org.el new file mode 100644 index 0000000..03b1968 --- /dev/null +++ b/code/elpa/helm-org-20231022.620/helm-org.el @@ -0,0 +1,538 @@ +;;; helm-org.el --- Helm for org headlines and keywords completion -*- lexical-binding: t -*- + +;; Copyright (C) 2012 ~ 2019 Thierry Volpiatto +;; Author: Thierry Volpiatto + +;; URL: https://github.com/emacs-helm/helm-org +;; Package-Requires: ((helm "3.3") (emacs "24.4")) +;; Version: 1.0 + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + + +;;; Commentary: +;; +;; Helm for org headlines and keywords completion + +;;; Code: +(require 'cl-lib) +(require 'helm) +(require 'helm-utils) +(require 'org) + +(defvar helm-completing-read-handlers-alist) + +;; Internals +(defvar helm-org--headers-cache nil) +(defvar helm-org--buffer-tick nil) +(defvar helm-org--force-refresh nil + "[INTERNAL] Force refreshing caches when non nil.") + +;; Menu +;;;###autoload +(progn + (require 'helm-easymenu) + (easy-menu-add-item + nil '("Tools" "Helm") + '("Org" + ["Org headlines in org agenda files" helm-org-agenda-files-headings t] + ["Org headlines in buffer" helm-org-in-buffer-headings t]) + "Elpa")) + + +;; Load org-with-point-at macro when compiling +(eval-when-compile + (require 'org-macs)) + +(declare-function org-agenda-switch-to "org-agenda.el") + +(defgroup helm-org nil + "Org related functions for helm." + :group 'helm) + +(defcustom helm-org-headings-fontify nil + "Fontify org buffers before parsing them. +This reflect fontification in `helm-buffer' when non--nil. +NOTE: This will be slow on large org buffers." + :group 'helm-org + :type 'boolean + :set (lambda (var value) + (set var value) + (setq helm-org--force-refresh t))) + +(defcustom helm-org-format-outline-path nil + "Show all org level as path." + :group 'helm-org + :type 'boolean + :set (lambda (var value) + (set var value) + (setq helm-org--force-refresh t))) + +(defcustom helm-org-headings-min-depth 1 + "Minimum depth of org headings to start with." + :group 'helm-org + :type 'integer + :set (lambda (var value) + (set var value) + (setq helm-org--force-refresh t))) + +(defcustom helm-org-headings-max-depth 8 + "Go down to this maximum depth of org headings." + :group 'helm-org + :type 'integer + :set (lambda (var value) + (set var value) + (setq helm-org--force-refresh t))) + +(defcustom helm-org-headings-actions + '(("Go to heading" . helm-org-goto-marker) + ("Open in indirect buffer `C-c i'" . helm-org--open-heading-in-indirect-buffer) + ("Refile heading(s) (marked-to-selected|current-to-selected) `C-c w`" . helm-org--refile-heading-to) + ("Insert link to this heading `C-c l`" . helm-org-insert-link-to-heading-at-marker)) + "Default actions alist for `helm-source-org-headings-for-files'." + :group 'helm-org + :type '(alist :key-type string :value-type function)) + +(defcustom helm-org-truncate-lines t + "Truncate org-header-lines when non-nil." + :type 'boolean + :group 'helm-org) + +(defcustom helm-org-ignore-autosaves nil + "Ignore autosave files when starting `helm-org-agenda-files-headings'." + :type 'boolean + :group 'helm-org) + +(defcustom helm-org-completion-styles '(helm) + "A list of styles suitable for `completion-styles'." + :group 'helm-org + :type '(repeat symbol)) + + +;;; Help +;; +(defvar helm-org-headings-help-message + "* Helm Org headings + +** Tips + +*** Matching and completion-styles + +In addition of multi matching like in all other helm commands, helm-org obey `completion-styles' +which allow having flex aka fuzzy matching, see [[Completion-styles][Completion-styles]]. + +*** Refiling + +You can refile one or more headings at a time. + +To refile one heading, move the point to the entry you want to refile and run +\\[helm-org-in-buffer-headings]. Then select the heading you want to refile to +and press \\\\[helm-org-run-refile-heading-to] or select the refile action from the actions menu. + +To refile multiple headings, run \\[helm-org-in-buffer-headings] and mark the +headings you want to refile. Then select the heading you want to refile to +\(without marking it) and press \\\\[helm-org-run-refile-heading-to] or select the refile action from the +actions menu. + +*** Tags completion + +Tags completion use `completing-read-multiple', perhaps have a +look at its docstring. + +**** Single tag + +From an org heading hit C-c C-c which provide a +\"Tags\" prompt, then hit TAB and RET if you want to enter an +existing tag or write a new tag in prompt. At this point you end +up with an entry in your prompt, if you enter RET, the entry is +added as tag in your org header. + +**** Multiple tags + +If you want to add more tag to your org header, add a separator[1] after +your tag and write a new tag or hit TAB to find another existing +tag, and so on until you have all the tags you want +e.g \"foo,bar,baz\" then press RET to finally add the tags to your +org header. +Note: [1] A separator can be a comma, a colon i.e. [,:] or a space. + +** Commands +\\ +|Keys|Description +|-----------+----------| +|\\[helm-org-run-open-heading-in-indirect-buffer]|Open heading in indirect buffer. +|\\[helm-org-run-refile-heading-to]|Refile current or marked headings to selection. +|\\[helm-org-run-insert-link-to-heading-at-marker]|Insert link at point to selection." + ) + +;;; Org capture templates +;; +;; +(defvar org-capture-templates) +(defun helm-source-org-capture-templates () + "Build source for org capture templates." + (helm-build-sync-source "Org Capture Templates:" + :candidates (cl-loop for template in org-capture-templates + collect (cons (nth 1 template) (nth 0 template))) + :action '(("Do capture" . (lambda (template-shortcut) + (org-capture nil template-shortcut)))))) + +;;; Org headings +;; +;; +(defun helm-org-goto-marker (marker) + "Go to MARKER in org buffer." + (switch-to-buffer (marker-buffer marker)) + (goto-char (marker-position marker)) + (org-show-context) + (re-search-backward "^\\*+ " nil t) + (org-show-entry) + (org-show-children)) + +(defun helm-org--open-heading-in-indirect-buffer (marker) + "Open org heading at MARKER in indirect buffer." + (helm-org-goto-marker marker) + (org-tree-to-indirect-buffer) + + ;; Put the non-indirect buffer at the bottom of the prev-buffers + ;; list so it won't be selected when the indirect buffer is killed + (set-window-prev-buffers nil (append (cdr (window-prev-buffers)) + (car (window-prev-buffers))))) + +(defun helm-org-run-open-heading-in-indirect-buffer () + "Open selected Org heading in an indirect buffer." + (interactive) + (with-helm-alive-p + (helm-exit-and-execute-action #'helm-org--open-heading-in-indirect-buffer))) +(put 'helm-org-run-open-heading-in-indirect-buffer 'helm-only t) + +(defvar helm-org-headings-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map helm-map) + (define-key map (kbd "C-c i") 'helm-org-run-open-heading-in-indirect-buffer) + (define-key map (kbd "C-c w") 'helm-org-run-refile-heading-to) + (define-key map (kbd "C-c l") 'helm-org-run-insert-link-to-heading-at-marker) + map) + "Keymap for `helm-source-org-headings-for-files'.") + +(defun helm-org-build-sources (filenames &optional parents force-refresh) + (unwind-protect + (cl-loop for file in filenames + for name = (if (bufferp file) + (buffer-name file) + (helm-basename file)) + collect + (helm-build-sync-source (format "Org headings (%s)" name) + :candidates (helm-dynamic-completion + (helm-org--get-candidates-in-file + file + helm-org-headings-fontify + t + parents (or force-refresh + helm-org--force-refresh)) + 'stringp + nil '(metadata (display-sort-function + . + (lambda (candidates) + (sort candidates + #'helm-generic-sort-fn)))) + nil helm-org-completion-styles) + :match-dynamic t + :find-file-target (lambda (source) + (let ((marker (helm-get-selection nil nil source))) + (buffer-file-name (marker-buffer marker)))) + :filtered-candidate-transformer + #'helm-org-indent-headings + :action 'helm-org-headings-actions + :help-message 'helm-org-headings-help-message + :keymap helm-org-headings-map + :group 'helm-org)) + (setq helm-org--force-refresh nil))) + +(defun helm-org--get-candidates-in-file (filename &optional fontify nofname parents force-refresh) + "Get candidates for org FILENAME. +Fontify each heading when FONTIFY is specified. +Don't show filename when NOFNAME. +Get PARENTS as well when specified." + (with-current-buffer (pcase filename + ((pred bufferp) filename) + ((pred stringp) (find-file-noselect filename t))) + (let ((tick (buffer-chars-modified-tick))) + (if (and helm-org--buffer-tick + (= tick helm-org--buffer-tick) + (null force-refresh)) + helm-org--headers-cache + (message "Refreshing cache in `%s'..." (buffer-name)) + (set (make-local-variable 'helm-org--buffer-tick) tick) + (prog1 + (set (make-local-variable 'helm-org--headers-cache) + (let ((match-fn (if fontify + #'match-string + #'match-string-no-properties)) + (search-fn (lambda () + (re-search-forward + org-complex-heading-regexp nil t))) + (file (unless (or (bufferp filename) nofname) + (concat (helm-basename filename) ":")))) + (when parents + (add-function :around (var search-fn) + (lambda (old-fn &rest args) + (when (org-up-heading-safe) + (apply old-fn args))))) + (save-excursion + (save-restriction + (unless (and (bufferp filename) + (buffer-base-buffer filename)) + ;; Only widen direct buffers, not indirect ones. + (widen)) + (unless parents (goto-char (point-min))) + ;; clear cache for new version of org-get-outline-path + (and (boundp 'org-outline-path-cache) + (setq org-outline-path-cache nil)) + (cl-loop with width = (window-width (helm-window)) + while (funcall search-fn) + for beg = (point-at-bol) + for end = (point-at-eol) + when (and fontify + (null (text-property-any + beg end 'fontified t))) + do (jit-lock-fontify-now beg end) + for level = (length (match-string-no-properties 1)) + for heading = (funcall match-fn 4) + if (and (>= level helm-org-headings-min-depth) + (<= level helm-org-headings-max-depth)) + collect (propertize + (if helm-org-format-outline-path + (org-format-outline-path + ;; org-get-outline-path changed in signature and behaviour since org's + ;; commit 105a4466971. Let's fall-back to the new version in case + ;; of wrong-number-of-arguments error. + (condition-case nil + (append (apply #'org-get-outline-path + (unless parents + (list t level heading))) + (list heading)) + (wrong-number-of-arguments + (org-get-outline-path t t))) + width file) + (if file + (concat file (funcall match-fn 0)) + (funcall match-fn 0))) + 'helm-real-display heading + 'helm-realvalue (point-marker))))))) + (message "Refreshing cache in `%s' done" (buffer-name))))))) + +(defun helm-org-indent-headings (candidates _source) + "Indent headings and hide leading stars displayed in the helm buffer. +If `org-startup-indented' and `org-hide-leading-stars' are nil, do +nothing to CANDIDATES." + (cl-loop for disp in candidates collect + (helm-org-indent-headings-1 disp))) + +(defun helm-org-indent-headings-1 (candidate) + (if helm-org-headings-fontify + (if (string-match "^\\(\\**\\)\\(\\* \\)\\(.*\n?\\)" candidate) + (replace-match "\\1\\2\\3" t nil candidate) + candidate) + (if (string-match "^\\(\\**\\)\\(\\* \\)\\(.*\n?\\)" candidate) + (let ((foreground (org-find-invisible-foreground))) + (with-helm-current-buffer + (cond + ;; org-startup-indented is t, and org-hide-leading-stars is t + ;; Or: #+STARTUP: indent hidestars + ((and org-startup-indented org-hide-leading-stars) + (with-helm-buffer + (require 'org-indent) + (org-indent-mode 1) + (replace-match + (format "%s\\2\\3" + (propertize (replace-match "\\1" t nil candidate) + 'face `(:foreground ,foreground))) + t nil candidate))) + ;; org-startup-indented is nil, org-hide-leading-stars is t + ;; Or: #+STARTUP: noindent hidestars + ((and (not org-startup-indented) org-hide-leading-stars) + (with-helm-buffer + (replace-match + (format "%s\\2\\3" + (propertize (replace-match "\\1" t nil candidate) + 'face `(:foreground ,foreground))) + t nil candidate))) + ;; org-startup-indented is nil, and org-hide-leading-stars is nil + ;; Or: #+STARTUP: noindent showstars + (t + (with-helm-buffer + (replace-match "\\1\\2\\3" t nil candidate)))))) + candidate))) + +(defun helm-org-insert-link-to-heading-at-marker (marker) + "Insert link to heading at MARKER position." + (with-current-buffer (marker-buffer marker) + (let ((heading-name (save-excursion (goto-char (marker-position marker)) + (nth 4 (org-heading-components)))) + (file-name (buffer-file-name))) + (with-helm-current-buffer + (org-insert-link + file-name (concat "file:" file-name "::*" heading-name)))))) + +(defun helm-org-run-insert-link-to-heading-at-marker () + "Run interactively `helm-org-insert-link-to-heading-at-marker'." + (interactive) + (with-helm-alive-p + (helm-exit-and-execute-action + 'helm-org-insert-link-to-heading-at-marker))) + +(defun helm-org--refile-heading-to (marker) + "Refile headings to heading at MARKER. +If multiple candidates are marked in the Helm session, they will +all be refiled. If no headings are marked, the selected heading +will be refiled." + (let* ((victims (with-helm-buffer (helm-marked-candidates))) + (buffer (marker-buffer marker)) + (filename (buffer-file-name buffer)) + ;; get the heading we refile to so org doesn't + ;; output 'Refile to "nil" in file ...' + (heading (with-current-buffer buffer + (org-with-point-at marker + (org-get-heading :no-tags :no-todo :no-priority :no-comment)))) + (rfloc (list heading filename nil marker))) + (when (and (= 1 (length victims)) + (equal (helm-get-selection) (car victims))) + ;; No candidates are marked; we are refiling the entry at point + ;; to the selected heading + (setq victims (list (point)))) + ;; Probably best to check that everything returned a value + (when (and victims buffer filename rfloc) + (cl-loop for victim in victims + do (org-with-point-at victim + (org-refile nil nil rfloc)))))) + +(defun helm-org-in-buffer-preselect () + "Return the current or closest visible heading as a regexp string." + (save-excursion + (cond ((org-at-heading-p) (forward-line 0)) + ((org-before-first-heading-p) + (outline-next-visible-heading 1)) + (t (outline-previous-visible-heading 1))) + (regexp-quote (buffer-substring-no-properties (point) + (point-at-eol))))) + +(defun helm-org-run-refile-heading-to () + "Helm org refile heading action." + (interactive) + (with-helm-alive-p + (helm-exit-and-execute-action 'helm-org--refile-heading-to))) +(put 'helm-org-run-refile-heading-to 'helm-only t) + +;;;###autoload +(defun helm-org-agenda-files-headings (&optional arg) + "Preconfigured helm for org files headings." + (interactive "P") + (let ((autosaves (cl-loop for f in (org-agenda-files) + when (file-exists-p + (expand-file-name + (concat "#" (helm-basename f) "#") + (helm-basedir f))) + collect (helm-basename f))) + (files (org-agenda-files))) + (when (or (null autosaves) + helm-org-ignore-autosaves + (y-or-n-p (format "%s have auto save data, continue? " + (mapconcat #'identity autosaves ", ")))) + (helm :sources (helm-org-build-sources files nil arg) + :truncate-lines helm-org-truncate-lines + :buffer "*helm org headings*")))) + +;;;###autoload +(defun helm-org-in-buffer-headings (&optional arg) + "Preconfigured helm for org buffer headings." + (interactive "P") + (let ((files (list (current-buffer)))) + (helm :sources (helm-org-build-sources files nil arg) + :preselect (helm-org-in-buffer-preselect) + :truncate-lines helm-org-truncate-lines + :buffer "*helm org inbuffer*"))) + +;;;###autoload +(defun helm-org-parent-headings (&optional arg) + "Preconfigured helm for org headings that are parents of the current heading." + (interactive "P") + ;; Use a large max-depth to ensure all parents are displayed. + (let ((helm-org-headings-min-depth 1) + (helm-org-headings-max-depth 50) + (files (list (current-buffer)))) + (helm :sources (helm-org-build-sources files t arg) + :truncate-lines helm-org-truncate-lines + :buffer "*helm org parent headings*"))) + +;;;###autoload +(defun helm-org-capture-templates () + "Preconfigured helm for org templates." + (interactive) + (helm :sources (helm-source-org-capture-templates) + :truncate-lines helm-org-truncate-lines + :buffer "*helm org capture templates*")) + +;;; Org tag completion + +;; Based on code from Anders Johansson posted on 3 Mar 2016 at +;; + +(defvar crm-separator) + +;;;###autoload +(defun helm-org-completing-read-tags (prompt collection pred req initial + hist def inherit-input-method _name _buffer) + "Completing read function for Org tags. + +This function is used as a `completing-read' function in +`helm-completing-read-handlers-alist' by `org-set-tags' and +`org-capture'. + +NOTE: Org tag completion will work only if you disable org fast tag +selection, see (info \"(org) setting tags\")." + (if (not (string= "Tags: " prompt)) + ;; Not a tags prompt. Use normal completion by calling + ;; `org-icompleting-read' again without this function in + ;; `helm-completing-read-handlers-alist' + (let ((helm-completing-read-handlers-alist + (rassq-delete-all + 'helm-org-completing-read-tags + (copy-alist helm-completing-read-handlers-alist)))) + (org-icompleting-read + prompt collection pred req initial hist def inherit-input-method)) + ;; Tags prompt + (let* ((curr (and (stringp initial) + (not (string= initial "")) + (org-split-string initial ":"))) + (table (delete curr + (org-uniquify + (mapcar #'car org-last-tags-completion-table)))) + (crm-separator ":\\|,\\|\\s-")) + (cl-letf (((symbol-function 'crm-complete-word) + 'self-insert-command)) + (mapconcat #'identity + (completing-read-multiple + prompt table pred nil initial hist def) + ":"))))) + +(provide 'helm-org) + +;; Local Variables: +;; byte-compile-warnings: (not obsolete) +;; coding: utf-8 +;; indent-tabs-mode: nil +;; End: + +;;; helm-org.el ends here diff --git a/org/elpa/helpful-20230323.414/helpful-autoloads.el b/code/elpa/helpful-20231028.516/helpful-autoloads.el similarity index 62% rename from org/elpa/helpful-20230323.414/helpful-autoloads.el rename to code/elpa/helpful-20231028.516/helpful-autoloads.el index 6af04f1..87372e3 100644 --- a/org/elpa/helpful-20230323.414/helpful-autoloads.el +++ b/code/elpa/helpful-20231028.516/helpful-autoloads.el @@ -1,12 +1,14 @@ -;;; helpful-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- -;; +;;; helpful-autoloads.el --- automatically extracted autoloads (do not edit) -*- lexical-binding: t -*- +;; Generated by the `loaddefs-generate' function. + +;; This file is part of GNU Emacs. + ;;; Code: -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) +(add-to-list 'load-path (or (and load-file-name (directory-file-name (file-name-directory load-file-name))) (car load-path))) + -;;;### (autoloads nil "helpful" "helpful.el" (0 0 0 0)) ;;; Generated autoloads from helpful.el (autoload 'helpful-function "helpful" "\ @@ -14,55 +16,51 @@ Show help for function named SYMBOL. See also `helpful-macro', `helpful-command' and `helpful-callable'. -\(fn SYMBOL)" t nil) - +(fn SYMBOL)" t) (autoload 'helpful-command "helpful" "\ Show help for interactive function named SYMBOL. See also `helpful-function'. -\(fn SYMBOL)" t nil) - +(fn SYMBOL)" t) (autoload 'helpful-key "helpful" "\ Show help for interactive command bound to KEY-SEQUENCE. -\(fn KEY-SEQUENCE)" t nil) - +(fn KEY-SEQUENCE)" t) (autoload 'helpful-macro "helpful" "\ Show help for macro named SYMBOL. -\(fn SYMBOL)" t nil) - +(fn SYMBOL)" t) (autoload 'helpful-callable "helpful" "\ Show help for function, macro or special form named SYMBOL. See also `helpful-macro', `helpful-function' and `helpful-command'. -\(fn SYMBOL)" t nil) - +(fn SYMBOL)" t) (autoload 'helpful-symbol "helpful" "\ -Show help for SYMBOL, a variable, function or macro. +Show help for SYMBOL, a variable, function, macro, or face. See also `helpful-callable' and `helpful-variable'. -\(fn SYMBOL)" t nil) - +(fn SYMBOL)" t) (autoload 'helpful-variable "helpful" "\ Show help for variable named SYMBOL. -\(fn SYMBOL)" t nil) - +(fn SYMBOL)" t) (autoload 'helpful-at-point "helpful" "\ -Show help for the symbol at point." t nil) - +Show help for the symbol at point." t) (register-definition-prefixes "helpful" '("helpful-")) - -;;;*** +;;; End of scraped data + +(provide 'helpful-autoloads) + ;; Local Variables: ;; version-control: never ;; no-byte-compile: t ;; no-update-autoloads: t -;; coding: utf-8 +;; no-native-compile: t +;; coding: utf-8-emacs-unix ;; End: + ;;; helpful-autoloads.el ends here diff --git a/code/elpa/helpful-20231028.516/helpful-pkg.el b/code/elpa/helpful-20231028.516/helpful-pkg.el new file mode 100644 index 0000000..7dc4696 --- /dev/null +++ b/code/elpa/helpful-20231028.516/helpful-pkg.el @@ -0,0 +1,18 @@ +(define-package "helpful" "20231028.516" "A better *help* buffer" + '((emacs "25") + (dash "2.18.0") + (s "1.11.0") + (f "0.20.0") + (elisp-refs "1.2")) + :commit "a32a5b3d959a7fccf09a71d97b3d7c888ac31c69" :authors + '(("Wilfred Hughes" . "me@wilfred.me.uk")) + :maintainers + '(("Wilfred Hughes" . "me@wilfred.me.uk")) + :maintainer + '("Wilfred Hughes" . "me@wilfred.me.uk") + :keywords + '("help" "lisp") + :url "https://github.com/Wilfred/helpful") +;; Local Variables: +;; no-byte-compile: t +;; End: diff --git a/org/elpa/helpful-20230323.414/helpful.el b/code/elpa/helpful-20231028.516/helpful.el similarity index 95% rename from org/elpa/helpful-20230323.414/helpful.el rename to code/elpa/helpful-20231028.516/helpful.el index edc7a62..dd07076 100644 --- a/org/elpa/helpful-20230323.414/helpful.el +++ b/code/elpa/helpful-20231028.516/helpful.el @@ -4,10 +4,8 @@ ;; Author: Wilfred Hughes ;; URL: https://github.com/Wilfred/helpful -;; Package-Version: 20230323.414 -;; Package-Commit: e9ec6fc2ae10db2b9b59ed656021845d11881a0a ;; Keywords: help, lisp -;; Version: 0.20 +;; Version: 0.22 ;; Package-Requires: ((emacs "25") (dash "2.18.0") (s "1.11.0") (f "0.20.0") (elisp-refs "1.2")) ;; This program is free software; you can redistribute it and/or modify @@ -58,6 +56,10 @@ (require 'imenu) (require 'cc-langs) +(declare-function org-link-types "ol" ()) +(declare-function org-link-store-props "ol" (&rest plist)) +(declare-function org-link-get-parameter "ol" (type key)) + (defvar-local helpful--sym nil) (defvar-local helpful--callable-p nil) (defvar-local helpful--associated-buffer nil @@ -96,6 +98,12 @@ To disable cleanup entirely, set this variable to nil. See also :type 'function :group 'helpful) +(defcustom helpful-set-variable-function + (if (< 29 emacs-major-version) #'setopt #'setq) + "Function used by `helpful--set' to interactively set variables." + :type 'function + :group 'helpful) + ;; TODO: explore whether more basic highlighting is fast enough to ;; handle larger functions. See `c-font-lock-init' and its use of ;; font-lock-keywords-1. @@ -165,7 +173,7 @@ can make Helpful very slow.") (defun helpful--heading (text) "Propertize TEXT as a heading." - (format "%s\n" (propertize text 'face 'helpful-heading))) + (propertize (concat text "\n") 'face 'helpful-heading)) (defun helpful--format-closure (sym form) "Given a closure, return an equivalent defun form." @@ -598,6 +606,7 @@ overrides that to include previously opened buffers." (let* ((sym (button-get button 'symbol)) (buf (button-get button 'buffer)) (sym-value (helpful--sym-value sym buf)) + (set-func (symbol-name helpful-set-variable-function)) ;; Inspired by `counsel-read-setq-expression'. (expr (minibuffer-with-setup-hook @@ -606,7 +615,7 @@ overrides that to include previously opened buffers." #'elisp-eldoc-documentation-function) (run-hooks 'eval-expression-minibuffer-setup-hook) (goto-char (minibuffer-prompt-end)) - (forward-char (length (format "(setq %S " sym)))) + (forward-char (length (format "(%s %S " set-func sym)))) (read-from-minibuffer "Eval: " (format @@ -614,9 +623,9 @@ overrides that to include previously opened buffers." (and (symbolp sym-value) (not (null sym-value)) (not (keywordp sym-value)))) - "(setq %s '%S)" - "(setq %s %S)") - sym sym-value) + "(%s %s '%S)" + "(%s %s %S)") + set-func sym sym-value) read-expression-map t 'read-expression-history)))) (save-current-buffer @@ -791,16 +800,17 @@ bound) or else highlight." sym-name) (propertize sym-name 'face 'font-lock-builtin-face)) - ((and (boundp sym) (s-ends-with-p "variable " before-txt)) + ((and (boundp sym) (s-ends-with-p "variable " (downcase before-txt))) (helpful--button sym-name 'helpful-describe-exactly-button 'symbol sym 'callable-p nil)) - ((and (fboundp sym) (or - (s-starts-with-p " command" after-txt) - (s-ends-with-p "command " before-txt) - (s-ends-with-p "function " before-txt))) + ((and (fboundp sym) + (or + (s-starts-with-p " command" (downcase after-txt)) + (s-ends-with-p "command " (downcase before-txt)) + (s-ends-with-p "function " (downcase before-txt)))) (helpful--button sym-name 'helpful-describe-exactly-button @@ -1496,7 +1506,7 @@ buffer." ;; that. (save-excursion (condition-case _err - (setq pos (cdr (find-variable-noselect sym 'defvar))) + (setq pos (cdr (find-variable-noselect sym library-name))) (search-failed nil) ;; If your current Emacs instance doesn't match the source ;; code configured in find-function-C-source-directory, we can @@ -1582,7 +1592,7 @@ same bindings as `global-map'." (when (and key-sequences (not (eq keymap-sym 'widget-global-map))) (push (cons (symbol-name keymap-sym) key-sequences) matching-keymaps)))) - (-zip keymap-syms keymap-sym-vals)) + (-zip-pair keymap-syms keymap-sym-vals)) ;; Look for this command in keymaps used by minor modes that ;; aren't bound to variables. @@ -1959,6 +1969,11 @@ OBJ may be a symbol or a compiled function object." "special form" 'helpful-info-button 'info-node "(elisp)Special Forms")) + (user-option-button + (helpful--button + "customizable" + 'helpful-info-button + 'info-node "(elisp)Variable Definitions")) (keyboard-macro-button (helpful--button "keyboard macro" @@ -2002,6 +2017,8 @@ OBJ may be a symbol or a compiled function object." (if (and callable-p (commandp sym)) interactive-button) (if compiled-p compiled-button) (if native-compiled-p native-compiled-button) + (if (and (not callable-p) (custom-variable-p sym)) + user-option-button) (if (and (not callable-p) (local-variable-if-set-p sym)) buffer-local-button))) (description @@ -2733,12 +2750,13 @@ See also `helpful-macro', `helpful-function' and `helpful-command'." (not (eq symbol t))))) (defun helpful--bound-p (symbol) - "Return non-nil if SYMBOL is a variable or callable. + "Return non-nil if SYMBOL is a variable, callable, or face. This differs from `boundp' because we do not consider nil, t or :foo." (or (fboundp symbol) - (helpful--variable-p symbol))) + (helpful--variable-p symbol) + (facep symbol))) (defun helpful--bookmark-jump (bookmark) "Create and switch to helpful bookmark BOOKMARK." @@ -2773,9 +2791,31 @@ nil if SYMBOL doesn't begin with \"F\" or \"V\"." prefix (s-replace "_" "-" string)))))) +(defun helpful--disambiguate (sym choices) + "Prompt the user to disambiguate SYM via a `read-char-choice' selection. + +CHOICES is a list of tuples of the form (FN DESC CHAR), where + + CHAR is the input character associated with the choice + DESC is a short description of the choice to display in the prompt. + FN is the function being chosen, which takes SYM as an argument. + +For instance, the choice (#'helpful-variable \"[v]ariable\" ?v) +calls (helpful-variable SYM) when the key `v' is pressed in the prompt." + (let* ((prompt (format "%s is ambiguous: describe %s ?" + (propertize (symbol-name sym) 'face font-lock-keyword-face) + (mapconcat (-lambda ((_ desc _)) desc) + choices " / "))) + (chars (mapcar (-lambda ((_ _ char)) char) + choices)) + (lookup (mapcar (-lambda ((fn _ char)) (cons char fn)) + choices)) + (input (read-char-choice prompt chars))) + (funcall (alist-get input lookup) sym))) + ;;;###autoload (defun helpful-symbol (symbol) - "Show help for SYMBOL, a variable, function or macro. + "Show help for SYMBOL, a variable, function, macro, or face. See also `helpful-callable' and `helpful-variable'." (interactive @@ -2783,25 +2823,31 @@ See also `helpful-callable' and `helpful-variable'." "Symbol: " (helpful--symbol-at-point) #'helpful--bound-p))) - (let ((c-var-sym (helpful--convert-c-name symbol t)) - (c-fn-sym (helpful--convert-c-name symbol nil))) + (let (choices) + (when-let (c-var-sym (helpful--convert-c-name symbol t)) + (push (list (lambda (_) (helpful-variable c-var-sym)) + "c-style [V]ariable" ?V) + choices)) + (when-let (c-fn-sym (helpful--convert-c-name symbol nil)) + (push (list (lambda (_) (helpful-callable c-fn-sym)) + "c-style [F]unction" ?F) + choices)) + (when (fboundp symbol) + (push (list #'helpful-callable "[c]allable" ?c) choices)) + (when (boundp symbol) + (push (list #'helpful-variable "[v]ariable" ?v) choices)) + (when (facep symbol) + (push (list (lambda (face) + (describe-face face) + (funcall helpful-switch-buffer-function (help-buffer))) + "[f]ace" ?f) + choices)) (cond - ((and (boundp symbol) (fboundp symbol)) - (if (y-or-n-p - (format "%s is a both a variable and a callable, show variable?" - symbol)) - (helpful-variable symbol) - (helpful-callable symbol))) - ((fboundp symbol) - (helpful-callable symbol)) - ((boundp symbol) - (helpful-variable symbol)) - ((and c-fn-sym (fboundp c-fn-sym)) - (helpful-callable c-fn-sym)) - ((and c-var-sym (boundp c-var-sym)) - (helpful-variable c-var-sym)) - (t - (user-error "Not bound: %S" symbol))))) + ((null choices) + (user-error "Not bound: %S" symbol)) + ((= 1 (length choices)) + (funcall (caar choices) symbol)) + (t (helpful--disambiguate symbol choices))))) ;;;###autoload (defun helpful-variable (symbol) @@ -3005,6 +3051,33 @@ See also `helpful-max-buffers'." (defun helpful--org-link-follow (link _) (helpful-symbol (intern link))) +(defun helpful--outline-function (&optional bound move backward looking-at) + "`outline-search-function' for `helpful-mode`. +See documentation of `outline-search-function' for BOUND, MOVE, +BACKWARD and LOOKING-AT." + (if looking-at + (eq 'helpful-heading (get-text-property (point) 'face)) + (let ((heading-found nil) + (bound (if bound bound (if backward (point-min) (point-max))))) + (save-excursion + (when (eq 'helpful-heading (get-text-property (point) 'face)) + (forward-line (if backward -1 1))) + (if backward + (while (not (or (eq (point) bound) + (eq 'helpful-heading (get-text-property (point) 'face)))) + (goto-char (or (previous-single-property-change (point) 'face nil bound) + bound))) + (goto-char (or (text-property-any (point) bound 'face 'helpful-heading) + bound))) + (when (eq 'helpful-heading (get-text-property (point) 'face)) + (setq heading-found (point)))) + (if heading-found + (progn + (goto-char heading-found) + (set-match-data (list heading-found heading-found))) + (when move + (goto-char bound) nil))))) + (define-derived-mode helpful-mode special-mode "Helpful" "Major mode for *Helpful* buffers." (add-hook 'xref-backend-functions #'elisp--xref-backend nil t) @@ -3017,6 +3090,10 @@ See also `helpful-max-buffers'." (set (make-local-variable 'bookmark-make-record-function) #'helpful--bookmark-make-record) + ;; Enable outline support for Emacs 29 and newer + (unless (< emacs-major-version 29) + (setq-local outline-search-function #'helpful--outline-function)) + ;; This function should normally only be called once after Org and ;; helpful are loaded. To avoid using `eval-after-load' (which is ;; only recommended in user init files), the function is called each diff --git a/code/elpa/ido-completing-read+-20240130.30/ido-completing-read+-autoloads.el b/code/elpa/ido-completing-read+-20240130.30/ido-completing-read+-autoloads.el new file mode 100644 index 0000000..a9c1c84 --- /dev/null +++ b/code/elpa/ido-completing-read+-20240130.30/ido-completing-read+-autoloads.el @@ -0,0 +1,106 @@ +;;; ido-completing-read+-autoloads.el --- automatically extracted autoloads (do not edit) -*- lexical-binding: t -*- +;; Generated by the `loaddefs-generate' function. + +;; This file is part of GNU Emacs. + +;;; Code: + +(add-to-list 'load-path (or (and load-file-name (directory-file-name (file-name-directory load-file-name))) (car load-path))) + + + +;;; Generated autoloads from ido-completing-read+.el + +(defvar ido-cr+-minibuffer-depth -1 "\ +Minibuffer depth of the most recent ido-cr+ activation. + +If this equals the current minibuffer depth, then the minibuffer +is currently being used by ido-cr+, and ido-cr+ features will be +active. Otherwise, something else is using the minibuffer and +ido-cr+ features will be deactivated to avoid interfering with +the other command. + +This is set to -1 by default, since `(minibuffer-depth)' should +never return this value.") +(defvar ido-cr+-replace-completely nil "\ +If non-nil, replace `ido-completeing-read' completely with ido-cr+. + +Enabling this may interfere with or cause errors in other +packages that use `ido-completing-read'. If you discover any such +incompatibilities, please file a bug report at +https://github.com/DarwinAwardWinner/ido-completing-read-plus/issues") +(custom-autoload 'ido-cr+-replace-completely "ido-completing-read+" t) +(defsubst ido-cr+-active nil "\ +Return non-nil if ido-cr+ is currently using the minibuffer." (>= ido-cr+-minibuffer-depth (minibuffer-depth))) +(autoload 'ido-completing-read+ "ido-completing-read+" "\ +Ido-based method for reading from the minibuffer with completion. + +See `completing-read' for the meaning of the arguments. + +This function is a wrapper for `ido-completing-read' designed to +be used as the value of `completing-read-function'. Importantly, +it detects edge cases that ido cannot handle and uses normal +completion for them. + +See `completing-read' for the meaning of the arguments. + +(fn PROMPT COLLECTION &optional PREDICATE REQUIRE-MATCH INITIAL-INPUT HIST DEF INHERIT-INPUT-METHOD)") +(autoload 'ido-completing-read@ido-cr+-replace "ido-completing-read+" "\ +This advice allows ido-cr+ to completely replace `ido-completing-read'. + +See the varaible `ido-cr+-replace-completely' for more information. + +(fn ORIG-FUN &rest ARGS)") +(advice-add 'ido-completing-read :around #'ido-completing-read@ido-cr+-replace) +(autoload 'call-interactively@ido-cr+-record-current-command "ido-completing-read+" "\ +Let-bind the command being interactively called. + +See `ido-cr+-current-command' for more information. + +(fn ORIG-FUN COMMAND &rest ARGS)") +(advice-add 'call-interactively :around #'call-interactively@ido-cr+-record-current-command) +(defvar ido-ubiquitous-mode nil "\ +Non-nil if Ido-Ubiquitous mode is enabled. +See the `ido-ubiquitous-mode' command +for a description of this minor mode. +Setting this variable directly does not take effect; +either customize it (see the info node `Easy Customization') +or call the function `ido-ubiquitous-mode'.") +(custom-autoload 'ido-ubiquitous-mode "ido-completing-read+" nil) +(autoload 'ido-ubiquitous-mode "ido-completing-read+" "\ +Use ido completion instead of standard completion almost everywhere. + +If this mode causes problems for a function, you can customize +when ido completion is or is not used by customizing +`ido-cr+-disable-list'. + +This is a global minor mode. If called interactively, toggle the +`Ido-Ubiquitous mode' mode. If the prefix argument is positive, +enable the mode, and if it is zero or negative, disable the mode. + +If called from Lisp, toggle the mode if ARG is `toggle'. Enable +the mode if ARG is nil, omitted, or is a positive number. +Disable the mode if ARG is a negative number. + +To check whether the minor mode is enabled in the current buffer, +evaluate `(default-value \\='ido-ubiquitous-mode)'. + +The mode's hook is called both when the mode is enabled and when +it is disabled. + +(fn &optional ARG)" t) +(register-definition-prefixes "ido-completing-read+" '("ido-" "minibuf-eldef-update-minibuffer@ido-cr+-compat")) + +;;; End of scraped data + +(provide 'ido-completing-read+-autoloads) + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; no-native-compile: t +;; coding: utf-8-emacs-unix +;; End: + +;;; ido-completing-read+-autoloads.el ends here diff --git a/code/elpa/ido-completing-read+-20240130.30/ido-completing-read+-pkg.el b/code/elpa/ido-completing-read+-20240130.30/ido-completing-read+-pkg.el new file mode 100644 index 0000000..aa410a7 --- /dev/null +++ b/code/elpa/ido-completing-read+-20240130.30/ido-completing-read+-pkg.el @@ -0,0 +1,16 @@ +(define-package "ido-completing-read+" "20240130.30" "A completing-read-function using ido" + '((emacs "24.4") + (seq "0.5") + (memoize "1.1")) + :commit "1609049c0a9b3f674ffff3083adc8f5359746fa9" :authors + '(("Ryan C. Thompson" . "rct@thompsonclan.org")) + :maintainers + '(("Ryan C. Thompson" . "rct@thompsonclan.org")) + :maintainer + '("Ryan C. Thompson" . "rct@thompsonclan.org") + :keywords + '("ido" "completion" "convenience") + :url "https://github.com/DarwinAwardWinner/ido-completing-read-plus") +;; Local Variables: +;; no-byte-compile: t +;; End: diff --git a/code/elpa/ido-completing-read+-20240130.30/ido-completing-read+.el b/code/elpa/ido-completing-read+-20240130.30/ido-completing-read+.el new file mode 100644 index 0000000..b95b3f7 --- /dev/null +++ b/code/elpa/ido-completing-read+-20240130.30/ido-completing-read+.el @@ -0,0 +1,1285 @@ +;;; ido-completing-read+.el --- A completing-read-function using ido -*- lexical-binding: t -*- + +;; Copyright (C) 2011-2017 Ryan C. Thompson + +;; Filename: ido-completing-read+.el +;; Author: Ryan C. Thompson +;; Created: Sat Apr 4 13:41:20 2015 (-0700) +;; Version: 4.14 +;; Package-Requires: ((emacs "24.4") (seq "0.5") (memoize "1.1")) +;; URL: https://github.com/DarwinAwardWinner/ido-completing-read-plus +;; Keywords: ido, completion, convenience + +;; This file is NOT part of GNU Emacs. + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: + +;; If you use the excellent `ido-mode' for efficient completion of +;; file names and buffers, you might wonder if you can get ido-style +;; completion everywhere else too. Well, that's what this package +;; does! ido-ubiquitous is here to enable ido-style completion for +;; (almost) every function that uses the standard completion function +;; `completing-read'. + +;; This package implements the `ido-completing-read+' function, which +;; is a wrapper for `ido-completing-read'. Importantly, it detects +;; edge cases that ordinary ido cannot handle and either adjusts them +;; so ido *can* handle them, or else simply falls back to Emacs' +;; standard completion instead. Hence, you can safely set +;; `completing-read-function' to `ido-completing-read+' without +;; worrying about breaking completion features that are incompatible +;; with ido. (Package authors interested in implementing ido support +;; within their packages can also use `ido-completing-read+' instead +;; of `ido-completing-read' to provide a more consistent user +;; experience.) + +;; To use this package, call `ido-ubiquitous-mode' to enable the mode, +;; or use `M-x customize-variable ido-ubiquitous-mode' it to enable it +;; permanently. Once the mode is enabled, most functions that use +;; `completing-read' will now have ido completion. If you decide in +;; the middle of a command that you would rather not use ido, just use +;; C-f or C-b at the end/beginning of the input to fall back to +;; non-ido completion (this is the same shortcut as when using ido for +;; buffers or files). + +;; Note that `completing-read-default' is a very general function with +;; many complex behaviors that ido cannot emulate. This package +;; attempts to detect some of these cases and avoid using ido when it +;; sees them. So some functions will not have ido completion even when +;; this mode is enabled. Some other functions have ido disabled in +;; them because their packages already provide support for ido via +;; other means (for example, magit). See `M-x describe-variable +;; ido-cr+-disable-list' for more information. + +;; ido-completing-read+ version 4.0 is a major update. The formerly +;; separate package ido-ubiquitous has been subsumed into +;; ido-completing-read+, so ido-ubiquitous 4.0 is just a wrapper that +;; loads ido-completing-read+ and displays a warning about being +;; obsolete. If you have previously customized ido-ubiquitous, be sure +;; to check out `M-x customize-group ido-completing-read-plus' after +;; updating to 4.0 and make sure the new settings are to your liking. + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or (at +;; your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +(defconst ido-completing-read+-version "4.14" + "Currently running version of ido-completing-read+. + +Note that when you update ido-completing-read+, this variable may +not be updated until you restart Emacs.") + +(require 'nadvice) +(require 'ido) +(require 'seq) +(require 'minibuf-eldef) +(require 'cl-lib) +(require 'cus-edit) + +;; Optional dependency, only needed for optimization +(require 'memoize nil t) + +;; Silence some byte-compiler warnings +(eval-when-compile + (require 'minibuf-eldef) + (require 'flx-ido nil t)) + +;;; Debug messages + +(define-minor-mode ido-cr+-debug-mode + "If non-nil, ido-cr+ will print debug info. + +Debug info is printed to the *Messages* buffer." + :init-value nil + :global t + :group 'ido-completing-read-plus) + +(defsubst ido-cr+--debug-message (format-string &rest args) + "Emit a debug message for ido-cr+. + +This only has an effect when `ido-cr+-debug-mode' is non-nil. +Arguments are identical to `message'." + (when ido-cr+-debug-mode + (apply #'message (concat "ido-completing-read+: " format-string) args))) + +;;; Ido variables + +;; For unknown reasons, these variables need to be re-declared here to +;; silence byte-compiler warnings, despite already being declared in +;; ido.el. + +(defmacro ido-cr+-define-ido-internal-var (symbol &optional initvalue docstring) + "Declare and initialize SYMBOL an ido internal variable. + +This is used to suppress byte-compilation warnings about +reference to free variables when ido-cr+ attempts to access +internal ido variables with no initial value set. Such variables +are originally declared like `(defvar VARNAME)'. + +This is a wrapper for `defvar' that supplies a default for the +INITVALUE and DOCSTRING arguments." + `(defvar ,symbol ,initvalue + ,(or docstring + "Internal ido variable. + +This variable was originally declared in `ido.el' without an +initial value or docstring. The documentation you're reading +comes from re-declaring it in `ido-completing-read+.el' in order +to suppress some byte-compilation warnings. Setting another +package's variable is not safe in general, but in this case it +should be, because ido always let-binds this variable before +using it, so the initial value shouldn't matter."))) + +(ido-cr+-define-ido-internal-var ido-context-switch-command) +(ido-cr+-define-ido-internal-var ido-cur-list) +(ido-cr+-define-ido-internal-var ido-cur-item) +(ido-cr+-define-ido-internal-var ido-require-match) +(ido-cr+-define-ido-internal-var ido-process-ignore-lists) + +;; Vars and functions from flx-ido package +(defvar flx-ido-mode) +(declare-function flx-ido-reset "ext:flx-ido.el") + +;;;###autoload +(defvar ido-cr+-minibuffer-depth -1 + "Minibuffer depth of the most recent ido-cr+ activation. + +If this equals the current minibuffer depth, then the minibuffer +is currently being used by ido-cr+, and ido-cr+ features will be +active. Otherwise, something else is using the minibuffer and +ido-cr+ features will be deactivated to avoid interfering with +the other command. + +This is set to -1 by default, since `(minibuffer-depth)' should +never return this value.") + +(defvar ido-cr+-assume-static-collection nil + "If non-nil, ido-cr+ will assume that the collection is static. + +This is used to avoid unnecessary work in the case where the +collection is a function, since a function collection could +potentially change the set of completion candidates +dynamically.") + +(defvar ido-cr+-current-command nil + "Command most recently invoked by `call-interactively'. + +This is necessary because `command-execute' and +`call-interactively' do not set `this-command'. Instead, the C +code that calls `command-execute' sets it beforehand, so using +either of those functions directly won't set `this-command'.") + +(defvar ido-cr+-dynamic-collection nil + "Stores the collection argument if it is a function. + +This allows ido-cr+ to update the set of completion candidates +dynamically.") + +(defvar ido-cr+-last-dynamic-update-text nil + "The value of `ido-text' last time a dynamic update occurred.") + +(defvar ido-cr+-dynamic-update-idle-time 0.25 + "Time to wait before updating dynamic completion list.") + +(defvar ido-cr+-dynamic-update-timer nil + "Idle timer for updating dynamic completion list.") + +(defvar ido-cr+-exhibit-pending nil + "This is non-nil between calling `ido-tidy' and `ido-exhibit'. + +Typically this is non-nil while any command is running and nil at all +other times, since those two functions are in `pre-command-hook' +and `post-command-hook' respectively. In particular, this will +generally be nil while running an idle timer.") + +(make-obsolete-variable + 'ido-cr+-no-default-action + " This variable no longer has any effect. Customize `ido-cr+-nil-def-alternate-behavior-list' instead." + "4.2") + +(defvar ido-cr+-orig-completing-read-args nil + "Original arguments passed to `ido-completing-read+'. + +These are used for falling back to `completing-read-default'.") + +(defvar ido-cr+-all-completions-memoized 'all-completions + "Memoized version of `all-completions'. + +During completion with dynamic collection, this variable is set +to a memoized copy of `all-completions'.") + +(defvar ido-cr+-all-prefix-completions-memoized 'ido-cr+-all-prefix-completions + "Memoized version of `ido-cr+-all-prefix-completions'. + +During completion with dynamic collection, this variable is set +to a memoized copy of `ido-cr+-all-prefix-completions'.") + +(defvar ido-cr+-active-restrictions nil + "List of restrictions in place from `ido-restrict-to-matches'. + +Each element is a cons cell of (REMOVEP . TEXT), where REMOVEP is +the prefix argument to `ido-restrict-to-matches' and TEXT is the +pattern used to restrict.") + +(defvar ido-cr+-need-bug27807-workaround + (cl-letf* + ((ido-exit ido-exit) + ((symbol-function 'read-from-minibuffer) + (lambda (_prompt &optional initial-contents &rest _remaining-args) + (setq ido-exit 'takeprompt) ; Emulate pressing C-j in ido + (if (consp initial-contents) + (substring (car initial-contents) 0 (1- (cdr initial-contents))) + initial-contents))) + ;; Need to get the unadvised original of `ido-completing-read' + ;; because the advice is autoloaded, so calling it while + ;; loading the package will trigger a recursive load. + ((symbol-function 'ido-completing-read) + (advice--cd*r (symbol-function 'ido-completing-read))) + (input-before-point + (ido-completing-read "Pick: " '("aaa" "aab" "aac") nil nil '("aa" . 1)))) + ;; If an initial position of 1 yields a 0-length string, then this + ;; Emacs does not have the bug fix and requires the workaround. + (= (length input-before-point) 0)) + "If non-nil, enable the workaround for Emacs bug #27807. + +This variable is normally set when ido-cr+ is loaded, and should +not need to be modified by users.") + +(defgroup ido-completing-read-plus nil + "Extra features and compatibility for `ido-completing-read'." + :group 'ido) + +(defcustom ido-cr+-fallback-function + ;; Initialize to the current value of `completing-read-function', + ;; unless that is already set to the ido completer, in which case + ;; use `completing-read-default'. + (if (memq completing-read-function + '(ido-completing-read+ + ido-completing-read + ;; Current ido-ubiquitous function + completing-read-ido-ubiquitous + ;; Old ido-ubiquitous functions that shouldn't be used + completing-read-ido + ido-ubiquitous-completing-read)) + 'completing-read-default + completing-read-function) + "Alternate `completing-read-function' to use when ido is not wanted. + +This will be used for functions that are incompatible with ido +or if ido cannot handle the completion arguments. It will also be +used when the user requests non-ido completion manually via C-f +or C-b." + :type '(choice (const :tag "Standard emacs completion" + completing-read-default) + (function :tag "Other function")) + :group 'ido-completing-read-plus) + +(defcustom ido-cr+-max-items 30000 + "Max collection size to use ido-cr+ on. + +If `ido-completing-read+' is called on a collection larger than +this, the fallback completion method will be used instead. To +disable fallback based on collection size, set this to nil." + :type '(choice (const :tag "No limit" nil) + (integer + :tag "Limit" :value 30000 + :validate + (lambda (widget) + (let ((v (widget-value widget))) + (if (and (integerp v) + (> v 0)) + nil + (widget-put widget :error "This field should contain a positive integer") + widget))))) + :group 'ido-completing-read-plus) + +(define-obsolete-variable-alias + 'ido-cr+-function-blacklist + 'ido-cr+-disable-list + "ido-completing-read+ 4.14") + +(defcustom ido-cr+-disable-list + '(read-file-name-internal + read-buffer + internal-complete-buffer + ;; https://github.com/DarwinAwardWinner/ido-completing-read-plus/issues/60 + todo-add-category + ;; Gnus already supports ido on its own + gnus-emacs-completing-read + gnus-iswitchb-completing-read + grep-read-files + ;; Magit already supports ido on its own + magit-builtin-completing-read + ;; ESS already supports ido on its own + ess-completing-read + ;; https://github.com/DarwinAwardWinner/ido-completing-read-plus/issues/39 + Info-read-node-name + ;; https://github.com/DarwinAwardWinner/ido-completing-read-plus/issues/44 + tmm-prompt + ;; https://github.com/DarwinAwardWinner/ido-completing-read-plus/issues/156 + org-tags-completion-function + ;; https://github.com/DarwinAwardWinner/ido-completing-read-plus/issues/159 + ffap-read-file-or-url + ffap-read-file-or-url-internal + ;; https://github.com/DarwinAwardWinner/ido-completing-read-plus/issues/161 + sly-read-symbol-name + org-olpath-completing-read + ) + "Functions & commands for which ido-cr+ should be disabled. + +Each entry can be either a symbol or a string. A symbol means to +fall back specifically for the named function. A regular +expression means to fall back for any function whose name matches +that regular expression. When ido-cr+ is called through +`completing-read', if any function in the call stack of the +current command matches any of the disable list entries, ido-cr+ +will be disabled for that command. Additionally, if the +collection in the call to `completing-read' is a function name +that matches any of the entries, ido-cr+ will be disabled. + +Note that using specific function names is generally preferable +to regular expressions, because the associated function +definitions will be compared directly, so if the same function is +called by another name, it should still trigger the fallback. For +regular expressions, only name-based matching is possible." + :group 'ido-completing-read-plus + :type '(repeat (choice (symbol :tag "Function or command name") + (string :tag "Regexp")))) + +(define-obsolete-variable-alias + 'ido-cr+-function-whitelist + 'ido-cr+-allow-list + "ido-completing-read+ 4.14") + +(defcustom ido-cr+-allow-list + nil + "If non-nil, limit ido-cr+ only to the specified commands & functions. + +If this variable is nil, the ido-cr+ will be enabled for all +commands and functions not specified in all commands/functions +not specified in `ido-cr+-function-backlist'. + +If this variable is non-nil, ido-cr+'s limited mode will be +enabled, and ido-cr+ will be disabled for *all* functions unless +they match one of the entries in this variable. Matching is done +in the same manner as `ido-cr+-disable-list', and the disable +list also takes precedence over the allow list." + :group 'ido-completing-read-plus + :type '(repeat (choice (symbol :tag "Function or command name") + (string :tag "Regexp")))) + +(defvaralias 'ido-cr+-nil-def-wall-of-shame + 'ido-cr+-nil-def-alternate-behavior-list + "Functions and commands that use `completing-read' improperly. + +Many functions that call `completing-read' are written with the +assumption that the setting the REQUIRE-MATCH argument of +`completing-read' to t means it is required to return a match. +While that would make logical sense, it's wrong. the docstring +for `completing-read' describes the correct behavior. + +> If the input is null, ‘completing-read’ returns DEF, or the +> first element of the list of default values, or an empty string +> if DEF is nil, regardless of the value of REQUIRE-MATCH. + +This can be avoided by passing an element of COLLECTION as DEF +instead of leaving it as nil.") + +(defcustom ido-cr+-nil-def-alternate-behavior-list + '("\\`describe-\\(function\\|variable\\)\\'" + "\\`wl-" + ;; https://github.com/mrkkrp/ebal/issues/12 + "\\`ebal-" + ;; https://github.com/DarwinAwardWinner/ido-completing-read-plus/issues/4 + webjump + ;; https://github.com/DarwinAwardWinner/ido-completing-read-plus/issues/83 + where-is + ;; https://github.com/DarwinAwardWinner/ido-completing-read-plus/issues/51 + find-tag + ;; https://github.com/DarwinAwardWinner/ido-completing-read-plus/issues/89 + "\\`etags-select-" + ;; https://github.com/DarwinAwardWinner/ido-completing-read-plus/issues/58 + imenu--completion-buffer + ;; https://github.com/DarwinAwardWinner/ido-completing-read-plus/issues/116 + project--completing-read-strict + ;; https://github.com/DarwinAwardWinner/ido-completing-read-plus/issues/127#issuecomment-319463217 + bookmark-completing-read + ) + "Functions & commands with alternate behavior when DEF is nil. + +This variable has the same format as `ido-cr+-disable-list'. When +`ido-completing-read+` is called through `completing-read' +by/with any command, function, or collection matched by entries +in this list, it will behave differently when DEF is nil. Instead +of using the empty string as the default value, it will use the +first element of COLLECTION. + +This is needed for optimal compatibility with commands written +under the reasonable but wrong assumption that REQUIRE-MATCH +means that a match is required." + :group 'ido-completing-read-plus + :type '(repeat (choice (symbol :tag "Function or command name") + (string :tag "Regexp")))) + +;;;###autoload +(defcustom ido-cr+-replace-completely nil + "If non-nil, replace `ido-completeing-read' completely with ido-cr+. + +Enabling this may interfere with or cause errors in other +packages that use `ido-completing-read'. If you discover any such +incompatibilities, please file a bug report at +https://github.com/DarwinAwardWinner/ido-completing-read-plus/issues" + :type 'boolean) + +;; Signal used to trigger fallback +(define-error 'ido-cr+-fallback "ido-cr+-fallback") + +(defsubst ido-cr+--explain-fallback (arg) + "Emit a debug message explaining the reason for falling back. + +ARG can be a string or an ido-cr+-fallback signal. In the latter +case, the DATA part of the signal is used as the message." + (when ido-cr+-debug-mode + (when (and (listp arg) + (eq (car arg) 'ido-cr+-fallback)) + (setq arg (cadr arg))) + (ido-cr+--debug-message + "Falling back to `%s' because %s." + (if (symbolp ido-cr+-fallback-function) + ido-cr+-fallback-function + "ido-cr+-fallback-function") + arg))) + +;;;###autoload +(defsubst ido-cr+-active () + "Return non-nil if ido-cr+ is currently using the minibuffer." + (>= ido-cr+-minibuffer-depth (minibuffer-depth))) + +(defun ido-cr+--called-from-completing-read () + "Return non-nil if the most recent call to ido-cr+ was from `completing-read'." + (equal (cadr (backtrace-frame 1 'ido-completing-read+)) + 'completing-read)) + +(defmacro ido-cr+-function-is-in-list (fun fun-list &optional list-name) + "Return non-nil if FUN matches an entry in FUN-LIST. + +This is used to check for matches to `ido-cr+-disable-list' and +`ido-cr+-allow-list'. Read those docstrings to see how +the matching is done. + +This is declared as macro only in order to extract the variable +name used for the second argument so it can be used in a debug +message. It should be called as if it were a normal function. The +optional 3rd argument LIST-NAME can be used to provide this +information manually if it is known." + (when (null list-name) + (if (symbolp fun-list) + (setq list-name (symbol-name fun-list)) + (setq list-name "list"))) + `(cl-loop + for entry in ,fun-list + if (cond + ;; Nil: Never matches anything + ((null entry) + nil) + ;; Symbol: Compare names and function definitions + ((symbolp entry) + (or (eq entry ,fun) + (let ((entry-def (ignore-errors (indirect-function entry))) + (fun-def (ignore-errors (indirect-function ,fun)))) + (and + fun-def entry-def + (eq + (indirect-function entry-def) + (indirect-function fun-def)))))) + ;; String: Do regexp matching against function name if it is a + ;; symbol + ((stringp entry) + (and (symbolp ,fun) + (string-match-p entry (symbol-name ,fun)))) + ;; Anything else: invalid list entry + (t + (ido-cr+--debug-message "Ignoring invalid entry in %s: `%S'" ,list-name entry) + nil)) + return entry + ;; If no list entry matches, return nil + finally return nil)) + +(define-obsolete-function-alias + 'ido-cr+-function-is-blacklisted + 'ido-cr+-disabled-in-function-p + "ido-completing-read+ 4.14") + +(defsubst ido-cr+-disabled-in-function-p (fun) + "Return non-nil if ido-cr+ is disabled for FUN. + +See `ido-cr+-disable-list'." + (ido-cr+-function-is-in-list fun ido-cr+-disable-list)) + +(define-obsolete-function-alias + 'ido-cr+-function-is-whitelisted + 'ido-cr+-allowed-in-function-p + "ido-completing-read+ 4.14") + +(defsubst ido-cr+-allowed-in-function-p (fun) + "Return non-nil if ido-cr+ is allowed for FUN. + +See `ido-cr+-allow-list'." + (or (null ido-cr+-allow-list) + (ido-cr+-function-is-in-list fun ido-cr+-allow-list))) + +;;;###autoload +(defun ido-completing-read+ (prompt collection &optional predicate + require-match initial-input + hist def inherit-input-method) + "Ido-based method for reading from the minibuffer with completion. + +See `completing-read' for the meaning of the arguments. + +This function is a wrapper for `ido-completing-read' designed to +be used as the value of `completing-read-function'. Importantly, +it detects edge cases that ido cannot handle and uses normal +completion for them. + +See `completing-read' for the meaning of the arguments." + (let* (;; Save the original arguments in case we need to do the + ;; fallback + (ido-cr+-orig-completing-read-args + (list prompt collection predicate require-match + initial-input hist def inherit-input-method)) + ;; Need to save a copy of this since activating the + ;; minibuffer once will clear out any temporary minibuffer + ;; hooks, which need to get restored before falling back so + ;; that they will trigger again when the fallback function + ;; uses the minibuffer. We make a copy in case the original + ;; list gets modified in place. + (orig-minibuffer-setup-hook (cl-copy-list minibuffer-setup-hook)) + ;; Need just the string part of INITIAL-INPUT + (initial-input-string + (cond + ((consp initial-input) + (car initial-input)) + ((stringp initial-input) + initial-input) + ((null initial-input) + "") + (t + (signal 'wrong-type-argument (list 'stringp initial-input))))) + (ido-cr+-active-restrictions nil) + ;; If collection is a function, save it for later, unless + ;; instructed not to + (ido-cr+-dynamic-collection + (when (and (not ido-cr+-assume-static-collection) + (functionp collection)) + collection)) + (ido-cr+-last-dynamic-update-text nil) + ;; Only memoize if the collection is dynamic. + (ido-cr+-all-prefix-completions-memoized + (if (and ido-cr+-dynamic-collection (featurep 'memoize)) + (memoize (indirect-function 'ido-cr+-all-prefix-completions)) + 'ido-cr+-all-prefix-completions)) + (ido-cr+-all-completions-memoized + (if (and ido-cr+-dynamic-collection (featurep 'memoize)) + (memoize (indirect-function 'all-completions)) + 'all-completions)) + ;; If the allow list is empty, everything is allowed + (ido-cr+-allowed (not ido-cr+-allow-list)) + ;; If non-nil, we need alternate nil DEF handling + (alt-nil-def nil)) + (condition-case sig + (progn + ;; Check a bunch of fallback conditions + (when (and inherit-input-method current-input-method) + (signal 'ido-cr+-fallback + '("ido cannot handle alternate input methods"))) + + ;; Check for allow/disable-listed collection function + (when (functionp collection) + ;; Disable list + (when (ido-cr+-disabled-in-function-p collection) + (if (symbolp collection) + (signal 'ido-cr+-fallback + (list (format "collection function `%S' is disabled" collection))) + (signal 'ido-cr+-fallback + (list "collection function is disabled")))) + ;; Allow list + (when (and (not ido-cr+-allowed) + (ido-cr+-allowed-in-function-p collection)) + (ido-cr+--debug-message + (if (symbolp collection) + (format "Collection function `%S' is allowed" collection) + "Collection function is allowed")) + (setq ido-cr+-allowed t)) + ;; nil DEF list + (when (and + require-match (null def) + (ido-cr+-function-is-in-list + collection + ido-cr+-nil-def-alternate-behavior-list)) + (ido-cr+--debug-message + (if (symbolp collection) + (format "Using alternate nil DEF handling for collection function `%S'" collection) + "Using alternate nil DEF handling for collection function")) + (setq alt-nil-def t))) + + ;; Expand all currently-known completions. + (setq collection + (if ido-cr+-dynamic-collection + (funcall ido-cr+-all-prefix-completions-memoized + initial-input-string collection predicate) + (all-completions "" collection predicate))) + ;; No point in using ido unless there's a collection + (when (and (= (length collection) 0) + (not ido-cr+-dynamic-collection)) + (signal 'ido-cr+-fallback '("ido is not needed for an empty collection"))) + ;; Check for excessively large collection + (when (and ido-cr+-max-items + (> (length collection) ido-cr+-max-items)) + (signal 'ido-cr+-fallback + (list + (format + "there are more than %i items in COLLECTION (see `ido-cr+-max-items')" + ido-cr+-max-items)))) + + ;; If called from `completing-read', check for + ;; disabled/allowed commands/callers + (when (ido-cr+--called-from-completing-read) + ;; Check calling command and `ido-cr+-current-command' + (cl-loop + for cmd in (list this-command ido-cr+-current-command) + + if (ido-cr+-disabled-in-function-p cmd) + do (signal 'ido-cr+-fallback + (list "calling command `%S' is disabled" cmd)) + + if (and (not ido-cr+-allowed) + (ido-cr+-allowed-in-function-p cmd)) + do (progn + (ido-cr+--debug-message "Command `%S' is allowed" cmd) + (setq ido-cr+-allowed t)) + + if (and + require-match (null def) (not alt-nil-def) + (ido-cr+-function-is-in-list + cmd ido-cr+-nil-def-alternate-behavior-list)) + do (progn + (ido-cr+--debug-message + "Using alternate nil DEF handling for command `%S'" cmd) + (setq alt-nil-def t))) + + ;; Check every function in the call stack starting after + ;; `completing-read' until to the first + ;; `funcall-interactively' (for a call from the function + ;; body) or `call-interactively' (for a call from the + ;; interactive form, in which the function hasn't actually + ;; been called yet, so `funcall-interactively' won't be on + ;; the stack.) + (cl-loop for i upfrom 1 + for caller = (cadr (backtrace-frame i 'completing-read)) + while caller + while (not (memq (indirect-function caller) + '(internal--funcall-interactively + (indirect-function 'call-interactively)))) + + if (ido-cr+-disabled-in-function-p caller) + do (signal 'ido-cr+-fallback + (list (if (symbolp caller) + (format "calling function `%S' is disabled" caller) + "a calling function is disabled"))) + + if (and (not ido-cr+-allowed) + (ido-cr+-allowed-in-function-p caller)) + do (progn + (ido-cr+--debug-message + (if (symbolp caller) + (format "Calling function `%S' is allowed" caller) + "A calling function is allowed")) + (setq ido-cr+-allowed t)) + + if (and require-match (null def) (not alt-nil-def) + (ido-cr+-function-is-in-list + caller ido-cr+-nil-def-alternate-behavior-list)) + do (progn + (ido-cr+--debug-message + (if (symbolp caller) + (format "Using alternate nil DEF handling for calling function `%S'" caller) + "Using alternate nil DEF handling for a calling function")) + (setq alt-nil-def t)))) + + (unless ido-cr+-allowed + (signal 'ido-cr+-fallback + (list "no functions or commands matched the allow list for this call"))) + + (when (and require-match (null def)) + ;; Replace nil with "" for DEF if match is required, unless + ;; alternate nil DEF handling is enabled + (if alt-nil-def + (ido-cr+--debug-message + "Leaving the default at nil because alternate nil DEF handling is enabled.") + (ido-cr+--debug-message + "Adding \"\" as the default completion since no default was provided.") + (setq def (list "")))) + + ;; In ido, the semantics of "default" are simply "put it at + ;; the front of the list". Furthermore, ido can't handle a + ;; list of defaults, nor can it handle both DEF and + ;; INITIAL-INPUT being non-nil. So, just pre-process the + ;; collection to put the default(s) at the front and then + ;; set DEF to nil in the call to ido to avoid these issues. + (unless (listp def) + ;; Ensure DEF is a list + (setq def (list def))) + (when def + ;; Ensure DEF are strings + (setq def (mapcar (apply-partially #'format "%s") def)) + ;; Prepend DEF to COLLECTION and remove duplicates + (setq collection (delete-dups (append def collection)) + def nil)) + + ;; Check for a specific bug + (when (and ido-enable-dot-prefix + (version< emacs-version "26.1") + (member "" collection)) + (signal 'ido-cr+-fallback + '("ido cannot handle the empty string as an option when `ido-enable-dot-prefix' is non-nil; see https://debbugs.gnu.org/cgi/bugreport.cgi?bug=26997"))) + + ;; Fix ido's broken handling of cons-style INITIAL-INPUT on + ;; Emacsen older than 27. See Emacs bug #27807. + (when (and (consp initial-input) + ido-cr+-need-bug27807-workaround) + ;; `completing-read' uses 0-based index while + ;; `read-from-minibuffer' uses 1-based index. + (cl-incf (cdr initial-input))) + + ;; Finally ready to do actual ido completion + (prog1 + (let ((ido-cr+-minibuffer-depth (1+ (minibuffer-depth))) + (ido-cr+-dynamic-update-timer nil) + (ido-cr+-exhibit-pending t) + ;; Reset this for recursive calls to ido-cr+ + (ido-cr+-assume-static-collection nil)) + (unwind-protect + (let ((return-value + (ido-completing-read + prompt collection + predicate require-match initial-input hist def + inherit-input-method))) + ;; Functions like `read-from-kill-ring' add + ;; display properties for things like ellipses, + ;; which need to be removed. (Somehow + ;; `completing-read-default' removes these + ;; properties from its return value, though I + ;; don't understand how.) + (remove-text-properties 0 (length return-value) '(display) return-value) + return-value) + (when ido-cr+-dynamic-update-timer + (cancel-timer ido-cr+-dynamic-update-timer) + (setq ido-cr+-dynamic-update-timer nil)))) + ;; This detects when the user triggered fallback mode + ;; manually. + (when (eq ido-exit 'fallback) + (signal 'ido-cr+-fallback '("user manually triggered fallback"))))) + + ;; Handler for ido-cr+-fallback signal + (ido-cr+-fallback + (let (;; Reset `minibuffer-setup-hook' to original value + (minibuffer-setup-hook orig-minibuffer-setup-hook) + ;; Reset this for recursive calls to ido-cr+ + (ido-cr+-assume-static-collection nil)) + (ido-cr+--explain-fallback sig) + (apply ido-cr+-fallback-function ido-cr+-orig-completing-read-args)))))) + +;;;###autoload +(defun ido-completing-read@ido-cr+-replace (orig-fun &rest args) + "This advice allows ido-cr+ to completely replace `ido-completing-read'. + +See the varaible `ido-cr+-replace-completely' for more information." + (if (or (ido-cr+-active) + (not ido-cr+-replace-completely)) + ;; ido-cr+ has either already activated or isn't going to + ;; activate, so just run the function as normal + (apply orig-fun args) + ;; Otherwise, we need to activate ido-cr+. + (apply #'ido-completing-read+ args))) +;;;###autoload +(advice-add 'ido-completing-read :around + #'ido-completing-read@ido-cr+-replace) + +;;;###autoload +(defun call-interactively@ido-cr+-record-current-command + (orig-fun command &rest args) + "Let-bind the command being interactively called. + +See `ido-cr+-current-command' for more information." + (let ((ido-cr+-current-command command)) + (apply orig-fun command args))) +;;;###autoload +(advice-add 'call-interactively :around + #'call-interactively@ido-cr+-record-current-command) + +;; Fallback on magic C-f and C-b +(defun ido-magic-forward-char@ido-cr+-fallback (&rest _args) + "Allow falling back in ido-completing-read+." + (when (ido-cr+-active) + ;; `ido-context-switch-command' is already let-bound at this + ;; point. + (setq ido-context-switch-command #'ido-fallback-command))) +(advice-add 'ido-magic-forward-char :before + #'ido-magic-forward-char@ido-cr+-fallback) + +(defun ido-magic-backward-char@ido-cr+-fallback (&rest _args) + "Allow falling back in ido-completing-read+." + (when (ido-cr+-active) + ;; `ido-context-switch-command' is already let-bound at this + ;; point. + (setq ido-context-switch-command #'ido-fallback-command))) +(advice-add 'ido-magic-backward-char :before + #'ido-magic-backward-char@ido-cr+-fallback) + +(defun ido-select-text@ido-cr+-fix-require-match (orig-fun &rest args) + "Fix ido behavior when `require-match' is non-nil. + +Standard ido will allow C-j to exit with an incomplete completion +even when `require-match' is non-nil. Ordinary completion does +not allow this. In ordinary completion, RET on an incomplete +match is equivalent to TAB, and C-j selects the first match. +Since RET in ido already selects the first match, this advice +sets up C-j to be equivalent to TAB in the same situation. + +This advice only activates if the current ido completion was +called through ido-cr+." + (if (and + ;; Only override C-j behavior if... + ;; We're using ico-cr+, and... + (ido-cr+-active) + ;; Require-match is non-nil, and... + ido-require-match + ;; The current input doesn't exactly match a known option, and... + (not (member ido-text ido-cur-list)) + ;; The current input doesn't exactly match an option according + ;; to `test-completion' (or the collection is not dynamic). + (or (not ido-cr+-dynamic-collection) + (test-completion ido-text ido-cr+-dynamic-collection + (nth 2 ido-cr+-orig-completing-read-args)))) + (progn + (ido-cr+--debug-message + "Overriding C-j behavior for require-match: performing completion instead of exiting with current text. (This might still exit with a match if `ido-confirm-unique-completion' is nil)") + (ido-complete)) + (apply orig-fun args))) +(advice-add 'ido-select-text :around + #'ido-select-text@ido-cr+-fix-require-match) + +(defun ido-tidy@ido-cr+-set-exhibit-pending (&rest _args) + "Advice to manage the value of `ido-cr+-exhibit-pending'." + (setq ido-cr+-exhibit-pending t)) +(advice-add 'ido-tidy :after 'ido-tidy@ido-cr+-set-exhibit-pending) + +(defun ido-exhibit@ido-cr+-clear-exhibit-pending (&rest _args) + "Advice to manage the value of `ido-cr+-exhibit-pending'." + (setq ido-cr+-exhibit-pending nil)) +(advice-add 'ido-exhibit :before 'ido-exhibit@ido-cr+-clear-exhibit-pending) + +(defun ido-cr+-all-prefix-completions + (string collection &optional predicate) + "Run `all-completions' on every prefix of STRING. + +Arguments COLLECTION and PREDICATE are as in `all-completions'. +Note that \"all prefixes\" includes both STRING itself and the +empty string. The return value is the union of all the returned +lists, with elements ordered by their first occurrence. + +This function is only useful if COLLECTION is a function that +might return additional completions for certain non-empty strings +that it wouldn't return for the empty string. If COLLECTION is +not a function, this is equivalent to +`(all-completions \"\" COLELCTION PREDICATE)'." + (cond + ;; Dynamic collection. + ((functionp collection) + ;; Collect completions for all prefixes of STRING starting from + ;; "". + (cl-loop + for i from 0 upto (length string) + append (funcall + ido-cr+-all-completions-memoized + (substring string 0 i) + collection + predicate) + into completion-list + finally return (delete-dups completion-list))) + ;; If COLLECTION is not dynamic, then just call `all-completions' + ;; on the empty string, which will already return every possible + ;; completion. + (t + (all-completions "" collection predicate)))) + +(defun ido-cr+-apply-restrictions (collection restrictions) + "Filter COLLECTION through RESTRICTIONS in sequence. + +COLLECTION is a list of strings. RESTRICTIONS is a list of cons +cells, with the cdr being the restriction text and the car being +nil to include matches for that text and t to exclude matches for +that text. The return value is a list of strings that satisfy all +the restrictions, in the same order as they appeared in +COLLECTION. + +RESTRICTIONS are applied one by one in order, which is important +because in theory the order can make a difference to the final +result." + (cl-loop + with filtered-collection = collection + with need-reverse = nil + for (removep . text) in restrictions + for restriction-matches = + (let ((ido-text text) + (ido-cur-item (or ido-cur-item 'list))) + (ido-set-matches-1 filtered-collection t)) + do (setq filtered-collection + (if removep + (seq-difference filtered-collection restriction-matches) + (setq need-reverse (not need-reverse)) + restriction-matches)) + ;; Each run of `ido-set-matches-1' reverses the order, so reverse + ;; it one more time if it had an odd number of reverses. + finally return + (if need-reverse + (nreverse filtered-collection) + filtered-collection))) + +(defun ido-cr+-cyclicp (x) + "Return non-nill if X is a list containing a circular reference." + (cl-loop + for tortoise on x + for hare on (cdr x) by #'cddr + thereis (eq tortoise hare))) + +(defun ido-cr+-update-dynamic-collection () + "Update the set of completions for a dynamic collection. + +This has no effect unless `ido-cr+-dynamic-collection' is non-nil." + (when (and ido-cr+-dynamic-collection + (ido-cr+-active)) + ;; (cl-assert (not (ido-cr+-cyclicp ido-cur-list))) + (let ((orig-ido-cur-list ido-cur-list) + (ido-text + (buffer-substring-no-properties (minibuffer-prompt-end) + ido-eoinput))) + ;; If current `ido-text' is equal to or a prefix of the previous + ;; one, a dynamic update is not needed. + (when (or (null ido-cr+-last-dynamic-update-text) + (not (string-prefix-p ido-text ido-cr+-last-dynamic-update-text))) + (ido-cr+--debug-message "Doing a dynamic update because `ido-text' changed from %S to %S" + ido-cr+-last-dynamic-update-text ido-text) + (setq ido-cr+-last-dynamic-update-text ido-text) + (condition-case-unless-debug err + (let* ((predicate (nth 2 ido-cr+-orig-completing-read-args)) + (first-match (car ido-matches)) + (strings-to-check + (cond + ;; If no match, then we only check `ido-text' + ((null first-match) + (list ido-text)) + ;; If `ido-text' is a prefix of `first-match', then we + ;; only need to check `first-match' + ((and first-match + (string-prefix-p ido-text first-match)) + (list first-match)) + ;; Otherwise we need to check both + (t + (list ido-text first-match)))) + (new-completions + (cl-loop + for string in strings-to-check + append + (funcall + ido-cr+-all-prefix-completions-memoized + string ido-cr+-dynamic-collection predicate) + into result + finally return result))) + ;; (cl-assert (not (ido-cr+-cyclicp new-completions))) + (if (equal new-completions ido-cur-list) + (ido-cr+--debug-message "Skipping dynamic update because the completion list did not change.") + (when (and (bound-and-true-p flx-ido-mode) + (functionp 'flx-ido-reset)) + ;; Reset flx-ido since the set of completions has changed + (funcall 'flx-ido-reset)) + (setq ido-cur-list (delete-dups (append ido-cur-list new-completions))) + (when ido-cr+-active-restrictions + (setq ido-cur-list (ido-cr+-apply-restrictions + ido-cur-list + ido-cr+-active-restrictions))) + (ido-cr+--debug-message + "Updated completion candidates for dynamic collection. `ido-cur-list' now has %s elements" + ido-text (length ido-cur-list)) + ;; Recompute matches with new completions + (let ((ido-rescan t)) + (ido-set-matches)) + (setq ido-rescan nil) + ;; Put the pre-update first match (if any) back in + ;; front + (when (and first-match + (not (equal first-match (car ido-matches))) + (member first-match ido-matches)) + (ido-cr+--debug-message "Restoring first match %S after dynamic update" first-match) + (setq ido-matches (ido-chop ido-matches first-match))) + ;; Rebuild the completion display unless ido is already planning + ;; to do it anyway + (unless ido-cr+-exhibit-pending + (ido-tidy) + (let ((ido-rescan nil)) + (ido-exhibit))))) + (error + (display-warning 'ido-cr+ + (format + "Disabling dynamic update due to error: %S" + err)) + ;; Reset any variables that might have been modified during + ;; the failed update + (setq ido-cur-list orig-ido-cur-list) + ;; Prevent any further attempts at dynamic updating + (setq ido-cr+-dynamic-collection nil)))))) + ;; Always cancel an active timer when this function is called. + (when ido-cr+-dynamic-update-timer + (cancel-timer ido-cr+-dynamic-update-timer) + (setq ido-cr+-dynamic-update-timer nil))) + +(defun ido-cr+-schedule-dynamic-collection-update () + "Schedule a dynamic collection update for now or in the future." + (when (and (ido-cr+-active) + ido-cr+-dynamic-collection) + ;; Cancel the previous timer + (when ido-cr+-dynamic-update-timer + (cancel-timer ido-cr+-dynamic-update-timer) + (setq ido-cr+-dynamic-update-timer nil)) + (cl-assert (not (ido-cr+-cyclicp ido-cur-list))) + (if (<= (length ido-matches) 1) + ;; If we've narrowed it down to zero or one matches, update + ;; immediately. + (ido-cr+-update-dynamic-collection) + ;; If there are still several choices, defer update until idle + (setq ido-cr+-dynamic-update-timer + (run-with-idle-timer (max 0.01 ido-cr+-dynamic-update-idle-time) nil + #'ido-cr+-update-dynamic-collection))))) + +(defun ido-cr+-minibuffer-setup () + "Set up minibuffer `post-command-hook' for ido-cr+." + (when (ido-cr+-active) + (add-hook 'post-command-hook + 'ido-cr+-schedule-dynamic-collection-update))) +(add-hook 'ido-minibuffer-setup-hook + 'ido-cr+-minibuffer-setup) + +;; Also need to update dynamic collections on TAB, and do so *before* +;; deciding to exit based on `ido-confirm-unique-completion' +(defun ido-complete@ido-cr+-update-dynamic-collection (oldfun &rest args) + "Maybe update the set of completions when pressing TAB." + (when ido-cr+-dynamic-collection + ;; First run with `ido-confirm-unique-completion' non-nil so it + ;; can't exit + (let ((ido-confirm-unique-completion t)) + (apply oldfun args)) + ;; Update `ido-eoinput' + (setq ido-eoinput (point-max)) + ;; Clear this var to force an update + (setq ido-cr+-last-dynamic-update-text nil) + ;; Now do update + (ido-cr+-update-dynamic-collection)) + ;; After maybe updating the dynamic collection, if there's still + ;; only one completion, now it's allowed to exit + (apply oldfun args)) +(advice-add 'ido-complete :around 'ido-complete@ido-cr+-update-dynamic-collection) + +;; When using `ido-restrict-to-matches', we also need to add an +;; equivalent predicate to the dynamic collection so that +;; dynamically-added completions are also properly restricted. +(defun ido-restrict-to-matches@ido-cr+-record-restriction + (&optional removep) + "Record the restriction criterion for ido-cr+." + (ido-cr+--debug-message "Appending restriction %S to `ido-cr+-active-restrictions'" + (cons removep ido-text)) + (add-to-list 'ido-cr+-active-restrictions (cons removep ido-text) t)) +(advice-add 'ido-restrict-to-matches :before + 'ido-restrict-to-matches@ido-cr+-record-restriction) + +;; Interoperation with minibuffer-electric-default-mode: only show the +;; default when the input is empty and the empty string is the +;; selected choice +(defun minibuf-eldef-update-minibuffer@ido-cr+-compat (orig-fun &rest args) + "This advice allows `minibuffer-electric-default-mode' to work with ido-cr+." + (if (ido-cr+-active) + (unless (eq minibuf-eldef-showing-default-in-prompt + (and (string= (car ido-cur-list) "") + (string= ido-text ""))) + ;; Swap state. + (setq minibuf-eldef-showing-default-in-prompt + (not minibuf-eldef-showing-default-in-prompt)) + (overlay-put minibuf-eldef-overlay 'invisible + (not minibuf-eldef-showing-default-in-prompt))) + (apply orig-fun args))) +(advice-add 'minibuf-eldef-update-minibuffer :around + #'minibuf-eldef-update-minibuffer@ido-cr+-compat) + +;;;###autoload +(define-minor-mode ido-ubiquitous-mode + "Use ido completion instead of standard completion almost everywhere. + +If this mode causes problems for a function, you can customize +when ido completion is or is not used by customizing +`ido-cr+-disable-list'." + :init-value nil + :global t + :group 'ido-completing-read-plus + ;; Actually enable/disable the mode by setting + ;; `completing-read-function'. + (setq completing-read-function + (if ido-ubiquitous-mode + #'ido-completing-read+ + ido-cr+-fallback-function))) + +(defcustom ido-cr+-auto-update-disable-list 'notify + "Whether to add new overrides when updating ido-cr+. + +This variable has 3 possible values, with the following meanings: + + t: Auto-update the disable list + `notify': Notify you about updates but do not apply them + nil: Ignore all disable list updates + +Ido-cr+ comes with a default list of commands that are known to +be incompatible with ido completion. New versions of ido-cr+ may +come with updates to this \"disable list\" as more incompatible +commands are discovered. However, customizing your own overrides +would normally prevent you from receiving these updates, since +Emacs will not overwrite your customizations. + +To resolve this problem, you can set this variable to t, and then +ido-cr+ can automatically add any new built-in overrides whenever +it is updated. (Actually, the update will happen the next time +Emacs is restarted after the update.) This allows you to add your +own overrides but still receive updates to the default set. + +If you want ido-cr+ to just notify you about new defaults instead +of adding them itself, set this variable to `notify'. If you +don't want this auto-update behavior at all, set it to nil. + +\(Note that having this option enabled effectively prevents you +from removing any of the built-in default entries, since they +will simply be re-added the next time Emacs starts.)" + :type '(choice :tag "When new overrides are available:" + (const :menu-tag "Auto-add" + :tag "Add them automatically" + t) + (const :menu-tag "Notify" + :tag "Notify me about them" + notify) + (const :menu-tag "Ignore" + :tag "Ignore them" + nil)) + :group 'ido-completing-read-plus) + +(define-obsolete-function-alias + 'ido-cr+-update-blacklist + 'ido-cr+-update-disable-list + "ido-completing-read+ 4.14") + +(defun ido-cr+-update-disable-list (&optional save quiet) + "Re-add any missing default entries to `ido-cr+-disable-list'. + +This is useful after an update of ido-ubiquitous that adds new +default overrides. See `ido-cr+-auto-update-disable-list' for +more information. + +If SAVE is non-nil, also save the new disable list to the user's +Custom file (but only if it was already customized beforehand). +When called interactively, a prefix argument triggers a save. + +Unless QUIET is non-nil, this function produces messages indicating +all changes that were made. + +When called from Lisp code, this function returns non-nil if the +disable list was modified." + (interactive "P") + (let* ((var-state (custom-variable-state 'ido-cr+-disable-list + ido-cr+-disable-list)) + (curval ido-cr+-disable-list) + (defval (eval (car (get 'ido-cr+-disable-list 'standard-value)))) + (newval (delete-dups (append defval curval))) + (new-entries (cl-set-difference defval curval :test #'equal)) + (modified nil) + (saved nil) + (message-lines ())) + (cl-case var-state + (standard + ;; Var is not customized, just set the new default + (ido-cr+--debug-message "Disable list was not customized, so it has been updated to the new default value.") + (setq ido-cr+-disable-list defval + modified new-entries)) + ((saved set changed) + ;; Var has been customized and saved by the user, so set the + ;; new value and maybe save it + (ido-cr+--debug-message "Updating user-customized disable list with new default entries.") + (setq ido-cr+-disable-list newval + modified t) + (when (and save (eq var-state 'saved)) + (ido-cr+--debug-message "Saving new disable list value to Custom file.") + (customize-save-variable 'ido-cr+-disable-list ido-cr+-disable-list) + (setq saved t))) + (otherwise + (ido-cr+--debug-message "Customization status of disable list is unknown. Not modifying it."))) + (if (and modified (not quiet)) + (progn + (push (format "Added the following entries to `ido-cr+-disable-list': %S" new-entries) + message-lines) + (if saved + (push "Saved the new value of `ido-cr+-disable-list' to your Custom file." + message-lines) + (push "However, the new value of `ido-cr+-disable-list' has not yet been saved for future sessions. To save it. re-run this command with a prefix argument: `C-u M-x ido-cr+-update-disable-list'; or else manually inspect and save the value using `M-x customize-variable ido-cr+-disable-list'." + message-lines))) + (push "No updates were required to `ido-cr+-disable-list'." message-lines)) + (unless quiet + (message (mapconcat #'identity (nreverse message-lines) "\n"))) + modified)) + +(define-obsolete-function-alias + 'ido-cr+-maybe-update-blacklist + 'ido-cr+-maybe-update-disable-list + "ido-completing-read+ 4.14") + +(defun ido-cr+-maybe-update-disable-list () + "Maybe call `ico-cr+-update-disable-list. + + See `ido-cr+-auto-update-disable-list' for more information." + (if ido-cr+-auto-update-disable-list + (let* ((curval ido-cr+-disable-list) + (defval (eval (car (get 'ido-cr+-disable-list 'standard-value)))) + (new-entries (cl-set-difference defval curval :test #'equal))) + (if new-entries + (if (eq ido-cr+-auto-update-disable-list 'notify) + (display-warning 'ido-completing-read+ (format "There are %s new disable list entries available. Use `M-x ido-cr+-update-disable-list' to install them. (See `ido-cr+-auto-update-disable-list' for more information.)" (length new-entries))) + (ido-cr+--debug-message "Initiating disable list update.") + (ido-cr+-update-disable-list t)) + (ido-cr+--debug-message "No disable list updates available."))) + (ido-cr+--debug-message "Skipping disable list update by user request."))) + +(ido-cr+-maybe-update-disable-list) + +(provide 'ido-completing-read+) + +;;; ido-completing-read+.el ends here diff --git a/code/elpa/json-mode-20240228.1443/json-mode-autoloads.el b/code/elpa/json-mode-20240228.1443/json-mode-autoloads.el new file mode 100644 index 0000000..3da9c76 --- /dev/null +++ b/code/elpa/json-mode-20240228.1443/json-mode-autoloads.el @@ -0,0 +1,62 @@ +;;; json-mode-autoloads.el --- automatically extracted autoloads (do not edit) -*- lexical-binding: t -*- +;; Generated by the `loaddefs-generate' function. + +;; This file is part of GNU Emacs. + +;;; Code: + +(add-to-list 'load-path (or (and load-file-name (directory-file-name (file-name-directory load-file-name))) (car load-path))) + + + +;;; Generated autoloads from json-mode.el + +(defconst json-mode-standard-file-ext '(".json" ".jsonld") "\ +List of JSON file extensions.") +(defsubst json-mode--update-auto-mode (filenames) "\ +Update the `json-mode' entry of `auto-mode-alist'. + +FILENAMES should be a list of file as string. +Return the new `auto-mode-alist' entry" (let* ((new-regexp (rx-to-string `(seq (eval (cons 'or (append json-mode-standard-file-ext ',filenames))) eot))) (new-entry (cons new-regexp 'json-mode)) (old-entry (when (boundp 'json-mode--auto-mode-entry) json-mode--auto-mode-entry))) (setq auto-mode-alist (delete old-entry auto-mode-alist)) (add-to-list 'auto-mode-alist new-entry) new-entry)) +(defvar json-mode-auto-mode-list '(".babelrc" ".bowerrc" "composer.lock") "\ +List of filenames for the JSON entry of `auto-mode-alist'. + +Note however that custom `json-mode' entries in `auto-mode-alist' +won’t be affected.") +(custom-autoload 'json-mode-auto-mode-list "json-mode" nil) +(defvar json-mode--auto-mode-entry (json-mode--update-auto-mode json-mode-auto-mode-list) "\ +Regexp generated from the `json-mode-auto-mode-list'.") +(autoload 'json-mode "json-mode" "\ +Major mode for editing JSON files. + +(fn)" t) +(autoload 'jsonc-mode "json-mode" "\ +Major mode for editing JSON files with comments. + +(fn)" t) +(add-to-list 'magic-fallback-mode-alist '("^[{[]$" . json-mode)) +(autoload 'json-mode-show-path "json-mode" "\ +Print the path to the node at point to the minibuffer." t) +(autoload 'json-mode-kill-path "json-mode" "\ +Save JSON path to object at point to kill ring." t) +(autoload 'json-mode-beautify "json-mode" "\ +Beautify/pretty-print from BEGIN to END. + +If the region is not active, beautify the entire buffer . + +(fn BEGIN END)" t) +(register-definition-prefixes "json-mode" '("json")) + +;;; End of scraped data + +(provide 'json-mode-autoloads) + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; no-native-compile: t +;; coding: utf-8-emacs-unix +;; End: + +;;; json-mode-autoloads.el ends here diff --git a/code/elpa/json-mode-20240228.1443/json-mode-pkg.el b/code/elpa/json-mode-20240228.1443/json-mode-pkg.el new file mode 100644 index 0000000..672dcdf --- /dev/null +++ b/code/elpa/json-mode-20240228.1443/json-mode-pkg.el @@ -0,0 +1,14 @@ +(define-package "json-mode" "20240228.1443" "Major mode for editing JSON files" + '((json-snatcher "1.0.0") + (emacs "24.4")) + :commit "72f340d3fb4b796589e75cb5985797a7f177f34a" :authors + '(("Josh Johnston") + ("taku0")) + :maintainers + '(("Josh Johnston")) + :maintainer + '("Josh Johnston") + :url "https://github.com/joshwnj/json-mode") +;; Local Variables: +;; no-byte-compile: t +;; End: diff --git a/code/elpa/json-mode-20240228.1443/json-mode.el b/code/elpa/json-mode-20240228.1443/json-mode.el new file mode 100644 index 0000000..9019618 --- /dev/null +++ b/code/elpa/json-mode-20240228.1443/json-mode.el @@ -0,0 +1,308 @@ +;;; json-mode.el --- Major mode for editing JSON files -*- lexical-binding: t; -*- + +;; Copyright (C) 2011-2023 Josh Johnston, taku0 + +;; Author: Josh Johnston +;; taku0 +;; URL: https://github.com/joshwnj/json-mode +;; Version: 1.9.1 +;; Package-Requires: ((json-snatcher "1.0.0") (emacs "24.4")) + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; extend the builtin js-mode's syntax highlighting + +;;; Code: + +(require 'js) +(require 'rx) +(require 'json-snatcher) + +(defgroup json '() + "Major mode for editing JSON files." + :group 'js) + +;;;###autoload +(defconst json-mode-standard-file-ext '(".json" ".jsonld") + "List of JSON file extensions.") + +;; This is to be sure the customization is loaded. Otherwise, +;; autoload discards any defun or defcustom. +;;;###autoload +(defsubst json-mode--update-auto-mode (filenames) + "Update the `json-mode' entry of `auto-mode-alist'. + +FILENAMES should be a list of file as string. +Return the new `auto-mode-alist' entry" + (let* ((new-regexp + (rx-to-string + `(seq (eval + (cons 'or + (append json-mode-standard-file-ext + ',filenames))) eot))) + (new-entry (cons new-regexp 'json-mode)) + (old-entry (when (boundp 'json-mode--auto-mode-entry) + json-mode--auto-mode-entry))) + (setq auto-mode-alist (delete old-entry auto-mode-alist)) + (add-to-list 'auto-mode-alist new-entry) + new-entry)) + +;;; make byte-compiler happy +(defvar json-mode--auto-mode-entry) + +;;;###autoload +(defcustom json-mode-auto-mode-list '(".babelrc" + ".bowerrc" + "composer.lock") + "List of filenames for the JSON entry of `auto-mode-alist'. + +Note however that custom `json-mode' entries in `auto-mode-alist' +won’t be affected." + :group 'json + :type '(repeat string) + :set (lambda (symbol value) + "Update SYMBOL with a new regexp made from VALUE. + +This function calls `json-mode--update-auto-mode' to change the +`json-mode--auto-mode-entry' entry in `auto-mode-alist'." + (set-default symbol value) + (setq json-mode--auto-mode-entry (json-mode--update-auto-mode value)))) + +;; Autoload needed to initalize the the `auto-list-mode' entry. +;;;###autoload +(defvar json-mode--auto-mode-entry (json-mode--update-auto-mode json-mode-auto-mode-list) + "Regexp generated from the `json-mode-auto-mode-list'.") + +(defconst json-mode-quoted-string-re + (rx (group (char ?\") + (zero-or-more (or (seq ?\\ ?\\) + (seq ?\\ ?\") + (seq ?\\ (not (any ?\" ?\\))) + (not (any ?\" ?\\)))) + (char ?\")))) +(defconst json-mode-quoted-key-re + (rx (group (char ?\") + (zero-or-more (or (seq ?\\ ?\\) + (seq ?\\ ?\") + (seq ?\\ (not (any ?\" ?\\))) + (not (any ?\" ?\\)))) + (char ?\")) + (zero-or-more blank) + ?\:)) +(defconst json-mode-number-re (rx (group (optional ?-) + (one-or-more digit) + (optional ?\. (one-or-more digit))))) +(defconst json-mode-keyword-re (rx (group (or "true" "false" "null")))) + +(defconst json-font-lock-keywords-1 + (list + (list json-mode-keyword-re 1 font-lock-constant-face) + (list json-mode-number-re 1 font-lock-constant-face)) + "Level one font lock.") + +(defvar json-mode-syntax-table + (let ((st (make-syntax-table))) + ;; Objects + (modify-syntax-entry ?\{ "(}" st) + (modify-syntax-entry ?\} "){" st) + ;; Arrays + (modify-syntax-entry ?\[ "(]" st) + (modify-syntax-entry ?\] ")[" st) + ;; Strings + (modify-syntax-entry ?\" "\"" st) + ;; Comments + (modify-syntax-entry ?\n ">" st) + ;; Dot in floating point number literal. + (modify-syntax-entry ?. "_" st) + st)) + +(defvar json-mode--string-syntax-table + (let ((st (copy-syntax-table json-mode-syntax-table))) + (modify-syntax-entry ?. "." st) + st) + "Syntax table for strings.") + +(defvar jsonc-mode-syntax-table + (let ((st (copy-syntax-table json-mode-syntax-table))) + ;; Comments + (modify-syntax-entry ?/ ". 124" st) + (modify-syntax-entry ?\n ">" st) + (modify-syntax-entry ?\^m ">" st) + (modify-syntax-entry ?* ". 23bn" st) + st)) + +(defvar jsonc-mode--string-syntax-table + (let ((st (copy-syntax-table jsonc-mode-syntax-table))) + (modify-syntax-entry ?. "." st) + st) + "Syntax table for strings and comments.") + +(defun json-mode--syntactic-face (state) + "Return syntactic face function for the position represented by STATE. +STATE is a `parse-partial-sexp' state, and the returned function is the +json font lock syntactic face function." + (cond + ((nth 3 state) + ;; This might be a string or a name + (let ((startpos (nth 8 state))) + (save-excursion + (goto-char startpos) + (if (looking-at-p json-mode-quoted-key-re) + font-lock-keyword-face + font-lock-string-face)))) + ((nth 4 state) font-lock-comment-face))) + +(defun json-mode-forward-sexp (&optional arg) + "Move point forward an atom or balanced bracket. + +See `forward-sexp for ARG." + (interactive "p") + (unless arg + (setq arg 1)) + (let ((forward-sexp-function nil) + (sign (if (< arg 0) -1 1)) + state) + (while (not (zerop arg)) + (setq state (syntax-ppss)) + (if (nth 8 state) + ;; Inside a string or comment. + (progn + (with-syntax-table + (if (eq major-mode 'jsonc-mode) + jsonc-mode--string-syntax-table + json-mode--string-syntax-table) + (forward-sexp sign))) + (forward-sexp sign)) + (setq arg (- arg sign))))) + +;;;###autoload +(define-derived-mode json-mode javascript-mode "JSON" + "Major mode for editing JSON files." + :syntax-table json-mode-syntax-table + (setq font-lock-defaults + '(json-font-lock-keywords-1 + nil nil nil nil + (font-lock-syntactic-face-function . json-mode--syntactic-face))) + (setq-local forward-sexp-function #'json-mode-forward-sexp)) + +;;;###autoload +(define-derived-mode jsonc-mode json-mode "JSONC" + "Major mode for editing JSON files with comments." + :syntax-table jsonc-mode-syntax-table + (setq font-lock-defaults '(json-font-lock-keywords-1 t))) + +;; Well formatted JSON files almost always begin with “{” or “[”. +;;;###autoload +(add-to-list 'magic-fallback-mode-alist '("^[{[]$" . json-mode)) + +;;;###autoload +(defun json-mode-show-path () + "Print the path to the node at point to the minibuffer." + (interactive) + (message (jsons-print-path))) + +(define-key json-mode-map (kbd "C-c C-p") 'json-mode-show-path) + +;;;###autoload +(defun json-mode-kill-path () + "Save JSON path to object at point to kill ring." + (interactive) + (kill-new (jsons-print-path))) + +(define-key json-mode-map (kbd "C-c C-k") 'json-mode-kill-path) + +;;;###autoload +(defun json-mode-beautify (begin end) + "Beautify/pretty-print from BEGIN to END. + +If the region is not active, beautify the entire buffer ." + (interactive "r") + (unless (use-region-p) + (setq begin (point-min) + end (point-max))) + (json-pretty-print begin end)) + +(define-key json-mode-map (kbd "C-c C-f") 'json-mode-beautify) + +(defun json-toggle-boolean () + "If point is on `true' or `false', toggle it." + (interactive) + (unless (nth 8 (syntax-ppss)) ; inside a keyword, string or comment + (let* ((bounds (bounds-of-thing-at-point 'symbol)) + (string (and bounds (buffer-substring-no-properties (car bounds) (cdr bounds)))) + (pt (point))) + (when (and bounds (member string '("true" "false"))) + (delete-region (car bounds) (cdr bounds)) + (cond + ((string= "true" string) + (insert "false") + (goto-char (if (= pt (cdr bounds)) (1+ pt) pt))) + (t + (insert "true") + (goto-char (if (= pt (cdr bounds)) (1- pt) pt)))))))) + +(define-key json-mode-map (kbd "C-c C-t") 'json-toggle-boolean) + +(defun json-nullify-sexp () + "Replace the sexp at point with `null'." + (interactive) + (let ((syntax (syntax-ppss)) symbol) + (cond + ((nth 4 syntax) nil) ; inside a comment + ((nth 3 syntax) ; inside a string + (goto-char (nth 8 syntax)) + (when (save-excursion (forward-sexp) (skip-chars-forward "[:space:]") (eq (char-after) ?:)) + ;; sexp is an object key, so we nullify the entire object + (goto-char (nth 1 syntax))) + (kill-sexp) + (insert "null")) + ((setq symbol (bounds-of-thing-at-point 'symbol)) + (cond + ((looking-at-p "null")) + ((save-excursion (skip-chars-backward "-0-9.") (looking-at json-mode-number-re)) + (kill-region (match-beginning 0) (match-end 0)) + (insert "null")) + (t (kill-region (car symbol) (cdr symbol)) (insert "null")))) + ((< 0 (nth 0 syntax)) + (goto-char (nth 1 syntax)) + (kill-sexp) + (insert "null")) + (t nil)))) + +(define-key json-mode-map (kbd "C-c C-k") 'json-nullify-sexp) + +(defun json-increment-number-at-point (&optional delta) + "Add DELTA to the number at point; DELTA defaults to 1." + (interactive "P") + (when (save-excursion (skip-chars-backward "-0-9.") (looking-at json-mode-number-re)) + (let ((num (+ (or delta 1) + (string-to-number (buffer-substring-no-properties (match-beginning 0) (match-end 0))))) + (pt (point))) + (delete-region (match-beginning 0) (match-end 0)) + (insert (number-to-string num)) + (goto-char pt)))) + +(define-key json-mode-map (kbd "C-c C-i") 'json-increment-number-at-point) + +(defun json-decrement-number-at-point (&optional delta) + "Subtract DELTA from the number at point; DELTA defaults to 1." + (interactive "P") + (json-increment-number-at-point (- (or delta 1)))) + +(define-key json-mode-map (kbd "C-c C-d") 'json-decrement-number-at-point) + +(provide 'json-mode) +;;; json-mode.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-actionscript.el b/code/elpa/lsp-mode-20240319.1043/lsp-actionscript.el new file mode 100644 index 0000000..370ed23 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-actionscript.el @@ -0,0 +1,135 @@ +;;; lsp-actionscript.el --- ActionScript Client settings -*- lexical-binding: t; -*- + +;; Copyright (C) 2021 Jen-Chieh Shen + +;; Author: Jen-Chieh Shen +;; Keywords: actionscript lsp + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP client for ActionScript + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-actionscript nil + "LSP support for ActionScript." + :group 'lsp-mode + :link '(url-link "https://github.com/BowlerHatLLC/vscode-as3mxml") + :package-version `(lsp-mode . "8.0.0")) + +(defcustom lsp-actionscript-java-path "java" + "Path of the java executable." + :group 'lsp-actionscript + :type 'string) + +(defcustom lsp-actionscript-sdk-path "" + "Path to supported SDK. +See https://github.com/BowlerHatLLC/vscode-as3mxml/wiki/Choose-an-ActionScript-SDK-for-the-current-workspace-in-Visual-Studio-Code." + :type 'string + :group 'lsp-actionscript + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-actionscript-version "1.5.0" + "Version of ActionScript language server." + :type 'string + :group 'lsp-actionscript + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-actionscript-extension-name + (format "vscode-nextgenas-%s.vsix" lsp-actionscript-version) + "File name of the extension file from language server." + :type 'string + :group 'lsp-actionscript + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-actionscript-server-download-url + (format "https://github.com/BowlerHatLLC/vscode-as3mxml/releases/download/v%s/%s" + lsp-actionscript-version lsp-actionscript-extension-name) + "Automatic download url for lsp-actionscript." + :type 'string + :group 'lsp-actionscript + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-actionscript-server-store-path + (f-join lsp-server-install-dir "as3mxml") + "The path to the file in which `lsp-actionscript' will be stored." + :type 'file + :group 'lsp-actionscript + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-actionscript-option-charset "UTF8" + "The charset to use by the ActionScript Language server." + :type 'string + :group 'lsp-actionscript + :package-version '(lsp-mode . "8.0.0")) + +(defun lsp-actionscript--extension-root () + "The path that the downloaded extension will extract to." + (f-join lsp-actionscript-server-store-path + (format "vscode-nextgenas-%s" lsp-actionscript-version))) + +(defun lsp-actionscript--extension-path () + "Return full path of the downloaded extension." + (f-join lsp-actionscript-server-store-path lsp-actionscript-extension-name)) + +(defun lsp-actionscript--extension-dir () + "Return as3mxml extension path." + (f-join (lsp-actionscript--extension-root) "extension")) + +(defun lsp-actionscript--server-command () + "Startup command for ActionScript language server." + (list lsp-actionscript-java-path + (format "-Droyalelib=%s" lsp-actionscript-sdk-path) + (format "-Dfile.encoding=%s" lsp-actionscript-option-charset) + "-cp" + (format "%s/bundled-compiler/*;%s/bin/*" + (lsp-actionscript--extension-dir) (lsp-actionscript--extension-dir)) + "com.as3mxml.vscode.Main")) + +(defun lsp-actionscript--extension-path-zip () + "Change extension path from .vsix to .zip." + (concat (f-no-ext (lsp-actionscript--extension-path)) ".zip")) + +(lsp-dependency + 'as3mxml + '(:system "as3mxml") + `(:download :url lsp-actionscript-server-download-url + :store-path ,(lsp-actionscript--extension-path-zip))) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection + #'lsp-actionscript--server-command + (lambda () (f-exists? (lsp-actionscript--extension-path-zip)))) + :major-modes '(actionscript-mode) + :priority -1 + :server-id 'as3mxml-ls + :download-server-fn (lambda (_client callback error-callback _update?) + (lsp-package-ensure + 'as3mxml + (lambda () + ;; TODO: Error handling when unzip failed + (lsp-unzip (lsp-actionscript--extension-path-zip) + (lsp-actionscript--extension-root)) + (funcall callback)) + error-callback)))) + +(lsp-consistency-check lsp-actionscript) + +(provide 'lsp-actionscript) +;;; lsp-actionscript.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-ada.el b/code/elpa/lsp-mode-20240319.1043/lsp-ada.el new file mode 100644 index 0000000..56d0fd6 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-ada.el @@ -0,0 +1,184 @@ +;;; lsp-ada.el --- description -*- lexical-binding: t; -*- + +;; Copyright (C) 2020 emacs-lsp maintainers + +;; Author: emacs-lsp maintainers +;; Keywords: lsp, ada + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP Clients for the Ada Programming Language + +;;; Code: + +(require 'lsp-mode) +(require 'lsp-semantic-tokens) + +(defgroup lsp-ada nil + "Settings for Ada Language Server." + :group 'tools + :tag "Language Server" + :package-version '(lsp-mode . "6.2")) + +(lsp-defcustom lsp-ada-project-file "default.gpr" + "Set the project file full path to configure the language server with. + The ~ prefix (for the user home directory) is supported. + See https://github.com/AdaCore/ada_language_server for a per-project + configuration example." + :type 'string + :group 'lsp-ada + :package-version '(lsp-mode . "6.2") + :lsp-path "ada.projectFile") + +(lsp-defcustom lsp-ada-option-charset "UTF-8" + "The charset to use by the Ada Language server. Defaults to 'UTF-8'." + :type 'string + :group 'lsp-ada + :package-version '(lsp-mode . "6.2") + :lsp-path "ada.defaultCharset") + +(lsp-defcustom lsp-ada-enable-diagnostics t + "A boolean to disable diagnostics. Defaults to true." + :type 'boolean + :group 'lsp-ada + :package-version '(lsp-mode . "6.2") + :lsp-path "ada.enableDiagnostics") + +(defcustom lsp-ada-als-executable "ada_language_server" + "Command to start the Ada language server." + :group 'lsp-ada + :risky t + :type 'file) + +(defcustom lsp-ada-alire-executable "alr" + "The alire executable to run when a project is detected." + :type 'string + :group 'lsp-ada + :package-version '(lsp-mode "8.0.1")) + +(defcustom lsp-ada-semantic-token-face-overrides + '(("namespace" . default) + ("modifier" . lsp-face-semhl-keyword)) + "Semantic token face overrides to be applied." + :type '(alist :key-type string + :value-type (choice (face :tag "Face") + (const :tag "No Face" nil))) + :group 'lsp-ada + :package-version '(lsp-mode "8.0.1")) + +(defcustom lsp-ada-semantic-token-modifier-face-overrides + '(("declaration") + ("definition") + ("implementation") + ("static") + ("modification") + ("documentation") + ("defaultLibrary")) + "Semantic token modifier face overrides to be applied." + :type '(alist :key-type string + :value-type (choice (face :tag "Face") + (const :tag "No Face" nil))) + :group 'lsp-ada + :package-version '(lsp-mode "8.0.1")) + +(defvar lsp-ada--als-download-url-cache nil) + +(defvar lsp-ada--als-downloaded-executable + (f-join lsp-server-install-dir + "ada-ls" + (symbol-name (lsp-resolve-value lsp--system-arch)) + (pcase system-type + ('gnu/linux "linux") + ('darwin "darwin") + ('windows-nt "win32") + (_ "linux")) + (concat "ada_language_server" + (pcase system-type + ('windows-nt ".exe") + (_ ""))))) + +(defun lsp-ada--als-latest-release-url () + "URL for the latest release of the Ada Language Server." + (setq lsp-ada--als-download-url-cache + (lsp--find-latest-gh-release-url + "https://api.github.com/repos/AdaCore/ada_language_server/releases/latest" + (format "%s.zip" + (pcase (list system-type (lsp-resolve-value lsp--system-arch)) + ('(gnu/linux x64) "Linux_amd64") + ('(gnu/linux arm64) "Linux_aarch64") + ('(darwin x64) "macOS_amd64") + ('(darwin arm64) "macOS_aarch64") + ('(windows-nt x64) "Windows_amd64") + (`(,_ x64) "Linux_amd64")))))) + +(defun lsp-ada--als-store-path () + "Store Path for the downloaded Ada Language Server." + (f-join lsp-server-install-dir + "ada-ls" + (file-name-base (or lsp-ada--als-download-url-cache + (lsp-ada--als-latest-release-url) + "ada-ls")))) + +(defun lsp-ada--environment () + "Add environmental variables if needed." + (let ((project-root (lsp-workspace-root))) + ;; When there is an alire project, include its environment + (when (file-exists-p + (concat (file-name-as-directory project-root) + "alire.toml")) + (let ((alr-executable (executable-find lsp-ada-alire-executable))) + (if alr-executable + ;; Transform output variables to environment + (let ((env-output (shell-command-to-string (concat alr-executable " printenv --unix")))) + (let ((var-strings (split-string env-output "\n"))) + (mapcar (lambda (string) + (if (string-match (rx "export" space (group (one-or-more ascii)) "=" "\"" (group (one-or-more ascii)) "\"") string) + (let ((var-name (match-string 1 string)) + (var-value (match-string 2 string))) + (cons var-name var-value)))) + var-strings))) + (lsp--error "Found alire.toml but the executable %s could not be found" alr-executable)))))) + +(lsp-dependency + 'ada-ls + '(:download :url lsp-ada--als-latest-release-url + :store-path lsp-ada--als-store-path + :decompress :zip + :binary-path lsp-ada--als-downloaded-executable + :set-executable? t) + '(:system lsp-ada-als-executable)) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection + (lambda () (lsp-package-path 'ada-ls))) + :major-modes '(ada-mode ada-ts-mode) + :priority -1 + :initialized-fn (lambda (workspace) + (with-lsp-workspace workspace + (lsp--set-configuration + (lsp-configuration-section "ada")))) + :download-server-fn (lambda (_client callback error-callback _update?) + (lsp-package-ensure 'ada-ls callback error-callback)) + :semantic-tokens-faces-overrides `( :types ,lsp-ada-semantic-token-face-overrides + :modifiers ,lsp-ada-semantic-token-modifier-face-overrides) + :server-id 'ada-ls + :synchronize-sections '("ada") + :environment-fn 'lsp-ada--environment)) + +(lsp-consistency-check lsp-ada) + +(provide 'lsp-ada) +;;; lsp-ada.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-angular.el b/code/elpa/lsp-mode-20240319.1043/lsp-angular.el new file mode 100644 index 0000000..288c43e --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-angular.el @@ -0,0 +1,103 @@ +;;; lsp-angular.el --- description -*- lexical-binding: t; -*- + +;; Copyright (C) 2020 emacs-lsp maintainers + +;; Author: emacs-lsp maintainers +;; Keywords: lsp, + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP Clients for the Angular Web application framework. + +;;; Code: + +(require 'lsp-mode) +(require 'f) + + +;;; Angular +(defgroup lsp-angular nil + "Angular LSP client, provided by the Angular Language Service Server." + :group 'lsp-mode + :version "8.0.0" + :link '(url-link "https://github.com/angular/vscode-ng-language-service")) + +(defcustom lsp-clients-angular-language-server-command + nil + "The command that starts the angular language server." + :group 'lsp-angular + :type '(choice + (string :tag "Single string value") + (repeat :tag "List of string values" + string))) + +(defcustom lsp-clients-angular-node-get-prefix-command + "npm config get --global prefix" + "The shell command that returns the path of NodeJS's prefix. +Has no effects when `lsp-clients-angular-language-server-command' is set." + :group 'lsp-angular + :type 'string) + +(defun lsp-client--angular-start-loading (_workspace params) + (lsp--info "Started loading project %s" params)) + +(defun lsp-client--angular-finished-loading (_workspace params) + (lsp--info "Finished loading project %s" params)) + +(lsp-register-client + (make-lsp-client + :new-connection + (lsp-stdio-connection + (lambda () + (if lsp-clients-angular-language-server-command + lsp-clients-angular-language-server-command + (let ((node-modules-path + (f-join + (string-trim + (shell-command-to-string lsp-clients-angular-node-get-prefix-command)) + (if (eq system-type 'windows-nt) + "node_modules" + "lib/node_modules")))) + ;; The shell command takes a significant time to run, + ;; so we "cache" its results after running once + (setq lsp-clients-angular-language-server-command + (list + "node" + (f-join node-modules-path "@angular/language-server") + "--ngProbeLocations" + node-modules-path + "--tsProbeLocations" + node-modules-path + "--stdio")) + lsp-clients-angular-language-server-command)))) + :activation-fn + (lambda (&rest _args) + (and (string-match-p "\\(\\.html\\|\\.ts\\)\\'" (buffer-file-name)) + (lsp-workspace-root) + (file-exists-p (f-join (lsp-workspace-root) "angular.json")))) + :priority -1 + :notification-handlers + (ht ("angular/projectLoadingStart" #'lsp-client--angular-start-loading) + ("angular/projectLoadingFinish" #'lsp-client--angular-finished-loading) + ("angular/projectLanguageService" #'ignore)) + :add-on? t + :server-id 'angular-ls)) + + +(lsp-consistency-check lsp-angular) + +(provide 'lsp-angular) +;;; lsp-angular.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-ansible.el b/code/elpa/lsp-mode-20240319.1043/lsp-ansible.el new file mode 100644 index 0000000..0ffd20b --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-ansible.el @@ -0,0 +1,258 @@ +;;; lsp-ansible.el --- lsp-mode ansible integration -*- lexical-binding: t; -*- + +;; Copyright (C) 2022 emacs-lsp maintainers + +;; Author: lsp-mode maintainers +;; Keywords: lsp, yaml, ansible + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP Client for the Ansible Language + +;;; Code: + +(require 'lsp-mode) +(require 'json) + +;;; Ansible +(defgroup lsp-ansible nil + "Settings for the Ansible Language Server." + :group 'lsp-mode + :link '(url-link "https://github.com/ansible/ansible-language-server") + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-ansible-add-on? t + "Make the client `add-on' so that it works with other language servers. +`yamlls`is a common one. + +Enabled by default." + :type 'boolean + :group 'lsp-ansible + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-ansible-language-server-command + '("ansible-language-server" "--stdio") + "The command that starts the ansible language server." + :type '(repeat :tag "List of string values" string) + :group 'lsp-ansible + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-ansible-ansible-path "ansible" + "Path to the ansible executable. +$PATH is searched for the executable." + :type 'string + :group 'lsp-ansible + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-ansible-use-fully-qualified-collection-names t + "Toggles use of fully qualified collection names when inserting a module name. +Disabling it will only use FQCNs when necessary, that is when the collection is +not configured for the task." + :type 'boolean + :group 'lsp-ansible + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-ansible-validation-enabled t + "Toggle validation provider. +If enabled and ansible-lint is disabled, validation falls back to +ansible-playbook --syntax-check." + :type 'boolean + :group 'lsp-ansible + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-ansible-validation-lint-arguments "" + "Optional command line arguments to be appended to ansible-lint invocation. +See ansible-lint documentation." + :type 'string + :group 'lsp-ansible + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-ansible-validation-lint-enabled t + "Enables/disables use of ansible-lint." + :type 'boolean + :group 'lsp-ansible + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-ansible-validation-lint-path "ansible-lint" + "Path to the ansible-lint executable. +$PATH is searched for the executable." + :type 'string + :group 'lsp-ansible + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-ansible-completion-provide-redirect-modules t + "Toggle redirected module provider when completing modules." + :type 'boolean + :group 'lsp-ansible + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-ansible-completion-provide-module-option-aliases t + "Toggle alias provider when completing module options." + :type 'boolean + :group 'lsp-ansible + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-ansible-execution-environment-container-engine "auto" + "The container engine to be used while running with execution environment. +Valid values are auto, podman and docker. For auto it will look for podman then +docker." + :type '(choice (const "auto") + (const "podman") + (const "docker")) + :group 'lsp-ansible + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-ansible-execution-environment-enabled nil + "Enable or disable the use of an execution environment." + :type 'boolean + :group 'lsp-ansible + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-ansible-execution-environment-image "quay.io/ansible/creator-ee:latest" + "Specify the name of the execution environment image." + :type 'string + :group 'lsp-ansible + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-ansible-execution-environment-pull-policy "missing" + "Specify the image pull policy. +Valid values are always, missing, never and tag. Setting always will always +pull the image when extension is activated or reloaded. Setting missing will +pull if not locally available. Setting never will never pull the image and +setting tag will always pull if the image tag is ‘latest’, otherwise pull +if not locally available." + :type '(choice (const "always") + (const "missing") + (const "never") + (const "tag")) + :group 'lsp-ansible + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-ansible-execution-environment-pull-arguments "" + "Specify any additional parameters for the pull command. +Example: ‘--tls-verify=false’" + :type 'string + :group 'lsp-ansible + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-ansible-execution-environment-container-options "" + "Extra parameters passed to the container engine command. +Example: ‘-–net=host’" + :type 'string + :group 'lsp-ansible + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-ansible-execution-environment-volume-mounts [] + "Additonnal volumes to mount in container. +The value is a vector of plists. Expected properties are: +- src: the name of the local volume or path to be mounted within execution + environment +- dest: the path where the file or directory are mounted in the container +- options: the property is optional, and is a comma-separated list of options. + Example: ro,Z" + :type '(lsp-repeatable-vector plist) + :group 'lsp-ansible + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-ansible-python-interpreter-path "" + "Path to the python/python3 executable. +This setting may be used to make the extension work with ansible and +ansible-lint installations in a Python virtual environment." + :type 'string + :group 'lsp-ansible + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-ansible-python-activation-script "" + "Path to a custom activate script. +It will be used instead of `lsp-ansible-python-interpreter-path' to run in a +Python virtual environment." + :type 'string + :group 'lsp-ansible + :package-version '(lsp-mode . "8.0.1")) + +(lsp-dependency 'ansible-language-server + '(:system "ansible-language-server") + '(:npm :package "@ansible/ansible-language-server" + :path "ansible-language-server")) + +(lsp-register-custom-settings + '(("ansible.ansible.path" lsp-ansible-ansible-path) + ("ansible.ansible.useFullyQualifiedCollectionNames" lsp-ansible-use-fully-qualified-collection-names t) + ("ansible.validation.enabled" lsp-ansible-validation-enabled t) + ("ansible.validation.lint.arguments" lsp-ansible-validation-lint-arguments) + ("ansible.validation.lint.enabled" lsp-ansible-validation-lint-enabled t) + ("ansible.validation.lint.path" lsp-ansible-validation-lint-path) + ("ansible.completion.provideRedirectModules" lsp-ansible-completion-provide-redirect-modules t) + ("ansible.completion.provideModuleOptionAliases" lsp-ansible-completion-provide-module-option-aliases t) + ("ansible.executionEnvironment.containerEngine" lsp-ansible-execution-environment-container-engine) + ("ansible.executionEnvironment.enabled" lsp-ansible-execution-environment-enabled t) + ("ansible.executionEnvironment.image" lsp-ansible-execution-environment-image) + ("ansible.executionEnvironment.pull.policy" lsp-ansible-execution-environment-pull-policy) + ("ansible.executionEnvironment.pull.arguments" lsp-ansible-execution-environment-pull-arguments) + ("ansible.executionEnvironment.containerOptions" lsp-ansible-execution-environment-container-options) + ("ansible.executionEnvironment.volumeMounts" lsp-ansible-execution-environment-volume-mounts) + ("ansible.python.interpreterPath" lsp-ansible-python-interpreter-path) + ("ansible.python.activationScript" lsp-ansible-python-activation-script))) + +(defun lsp-ansible-check-ansible-minor-mode (&rest _) + "Check whether ansible minor mode is active. +This prevents the Ansible server from being turned on in all yaml files." + (and (or (derived-mode-p 'yaml-mode) + (derived-mode-p 'yaml-ts-mode)) + ;; emacs-ansible provides ansible, not ansible-mode + (with-no-warnings (bound-and-true-p ansible)))) + +(declare-function lsp-completion--clear-cache "lsp-completion" (&optional keep-last-result)) + +(defun lsp-ansible-resync-inventory () + "Resync the inventory cache used by Ansible Language Server for hosts completion." + (interactive) + (lsp-notify "resync/ansible-inventory" nil) + (require 'lsp-completion) + (lsp-completion--clear-cache)) + +(defun lsp-ansible-update-metadata-handler (_workspace params) + "Handler for `update/ansible-metadata' notification. +Pretty print the content of PARAMS." + (let ((json-encoding-pretty-print t)) + (message "Ansible Language Server metadata: %s" (json-encode params)))) + +(defun lsp-ansible-show-server-metadata () + "Show information about Ansible environment used by the Ansible Language Server." + (interactive) + (lsp-notify "update/ansible-metadata" nil)) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection + (lambda () + `(,(or (executable-find + (cl-first lsp-ansible-language-server-command)) + (lsp-package-path 'ansible-language-server)) + ,@(cl-rest lsp-ansible-language-server-command)))) + :priority 1 + :add-on? lsp-ansible-add-on? + :multi-root t + :notification-handlers (ht ("update/ansible-metadata" #'lsp-ansible-update-metadata-handler)) + :activation-fn #'lsp-ansible-check-ansible-minor-mode + :server-id 'ansible-ls + :download-server-fn (lambda (_client callback error-callback _update?) + (lsp-package-ensure 'ansible-language-server callback error-callback)))) + +(lsp-consistency-check lsp-ansible) + +(provide 'lsp-ansible) +;;; lsp-ansible.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-asm.el b/code/elpa/lsp-mode-20240319.1043/lsp-asm.el new file mode 100644 index 0000000..8a0c4ed --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-asm.el @@ -0,0 +1,93 @@ +;;; lsp-asm.el --- Assembly Language Client settings -*- lexical-binding: t; -*- + +;; Copyright (C) 2023 Jen-Chieh Shen + +;; Author: Jen-Chieh Shen +;; Keywords: asm lsp + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP client for Assembly Language + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-asm nil + "LSP support for Assembly Language." + :group 'lsp-mode + :link '(url-link "https://github.com/bergercookie/asm-lsp") + :package-version `(lsp-mode . "8.0.1")) + +(defcustom lsp-asm-active-modes + '( asm-mode fasm-mode masm-mode nasm-mode gas-mode) + "List of major mode that work with asm-lsp." + :type '(list symbol) + :group 'lsp-asm) + +(defcustom lsp-asm-home-url + "https://github.com/bergercookie/asm-lsp" + "Url we use to install asm-lsp." + :type 'string + :group 'lsp-asm + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-asm-store-path (f-join lsp-server-install-dir "asm") + "The path to the file in which `asm-lsp' will be stored." + :type 'file + :group 'lsp-asm + :package-version '(lsp-mode . "8.0.1")) + +(defun lsp-asm--download-server (_client callback error-callback update?) + "Install/update asm-ls language server using `cargo install'. + +Will invoke CALLBACK or ERROR-CALLBACK based on result. +Will update if UPDATE? is t." + (when update? + (ignore-errors (delete-directory lsp-asm-store-path t))) + (lsp-async-start-process + callback + error-callback + "cargo" "install" "--git" lsp-asm-home-url "--root" lsp-asm-store-path)) + +(defun lsp-asm--executable () + "Return asm-lsp executable." + (let ((local (f-join lsp-asm-store-path "bin" + (if (eq system-type 'windows-nt) + "asm-lsp.exe" + "asm-lsp")))) + (or (and (f-exists? local) local) + (executable-find "asm-lsp") + (user-error "`asm-lsp' is not installed; for installation see %s for more information" lsp-asm-home-url)))) + +(defun lsp-asm--server-command () + "Startup command for Assembly language server." + (list (lsp-asm--executable))) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection + #'lsp-asm--server-command + (lambda () (f-exists? lsp-asm-store-path))) + :major-modes lsp-asm-active-modes + :priority -1 + :server-id 'asm-lsp + :download-server-fn #'lsp-asm--download-server)) + +(lsp-consistency-check lsp-asm) + +(provide 'lsp-asm) +;;; lsp-asm.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-astro.el b/code/elpa/lsp-mode-20240319.1043/lsp-astro.el new file mode 100644 index 0000000..ba1c455 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-astro.el @@ -0,0 +1,50 @@ +;;; lsp-astro.el --- lsp-mode astro integration -*- lexical-binding: t; -*- + +;; Copyright (C) 2022 Paweł Kobojek, Luca Fanselau + +;; Author: Paweł Kobojek +;; Keywords: languages,astro + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; client for astro-ls + +;;; Code: + +(require 'lsp-mode) + +(defun lsp-astro--get-initialization-options () + "Try to get the typescript server path, to supply to the astro language server." + (let ((library (f-join (lsp-workspace-root) "node_modules/typescript/lib"))) + (if (file-exists-p library) + `(:typescript (:tsdk ,library)) + (lsp-warn "Unable to find typescript server path for astro-ls. Guessed: %s" library)))) + +(defgroup lsp-astro nil + "LSP support for Astro.build, using astro-ls." + :group 'lsp-mode + :link '(url-link "https://github.com/withastro/language-tools")) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection '("astro-ls" "--stdio")) + :activation-fn (lsp-activate-on "astro") + :initialization-options #'lsp-astro--get-initialization-options + :server-id 'astro-ls)) + +(lsp-consistency-check lsp-astro) + +(provide 'lsp-astro) +;;; lsp-astro.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-autotools.el b/code/elpa/lsp-mode-20240319.1043/lsp-autotools.el new file mode 100644 index 0000000..2a49e5f --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-autotools.el @@ -0,0 +1,78 @@ +;;; lsp-autotools.el --- Support configure.ac, Makefile.am, Makefile -*- lexical-binding: t; -*- + +;; Copyright (C) 2023 Jen-Chieh Shen + +;; Author: Jen-Chieh Shen +;; Keywords: autotools lsp + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; Support configure.ac, Makefile.am, Makefile + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-autotools nil + "LSP support for Autotools." + :group 'lsp-mode + :link '(url-link "https://github.com/Freed-Wu/autotools-language-server") + :package-version `(lsp-mode . "8.0.1")) + +(defcustom lsp-autotools-active-modes + '( autoconf-mode + makefile-mode + makefile-automake-mode + makefile-gmake-mode + makefile-makepp-mode + makefile-bsdmake-mode + makefile-imake-mode) + "List of major mode that work with Autotools." + :type 'list + :group 'lsp-autotools) + +(defun lsp-autotools--download-server (_client callback error-callback update?) + "Install/update Autotools language server using `pip + +Will invoke CALLBACK or ERROR-CALLBACK based on result. +Will update if UPDATE? is t." + (lsp-async-start-process + callback + error-callback + "pip" "install" "autotools-language-server" (when update? "-U"))) + +(defun lsp-autotools--server-command () + "Startup command for Autotools language server." + (list "autotools-language-server")) + +(defun lsp-autotools--test-present () + "Return non-nil if Autotools language server is installed globally." + (executable-find "autotools-language-server")) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection + #'lsp-autotools--server-command + #'lsp-autotools--test-present) + :major-modes lsp-autotools-active-modes + :priority -1 + :server-id 'autotools-ls + :download-server-fn #'lsp-autotools--download-server)) + +(lsp-consistency-check lsp-autotools) + +(provide 'lsp-autotools) +;;; lsp-autotools.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-awk.el b/code/elpa/lsp-mode-20240319.1043/lsp-awk.el new file mode 100644 index 0000000..596e0e5 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-awk.el @@ -0,0 +1,49 @@ +;;; lsp-awk.el --- AWK client -*- lexical-binding: t; -*- + +;; Copyright (C) 2023 emacs-lsp maintainers + +;; Author: Konstantin Kharlamov +;; Keywords: languages lsp awk + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: +;; +;; LSP client for AWK language. +;; + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-awk nil + "LSP support for AWK." + :group 'lsp-mode + :link '(url-link "https://github.com/Beaglefoot/awk-language-server")) + +(defcustom lsp-awk-executable '("awk-language-server") + "Command to run the AWK language server." + :group 'lsp-awk + :risky t + :type 'list) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection (lambda () lsp-awk-executable)) + :activation-fn (lsp-activate-on "awk") + :priority -1 + :server-id 'awkls)) + +(provide 'lsp-awk) +;;; lsp-awk.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-bash.el b/code/elpa/lsp-mode-20240319.1043/lsp-bash.el new file mode 100644 index 0000000..ff5aa86 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-bash.el @@ -0,0 +1,91 @@ +;;; lsp-bash.el --- description -*- lexical-binding: t; -*- + +;; Copyright (C) 2020 emacs-lsp maintainers + +;; Author: emacs-lsp maintainers +;; Keywords: lsp, bash, shell-script + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP Clients for the Bash Programming Language + +;;; Code: + +(require 'lsp-mode) + +;;; Bash +(defgroup lsp-bash nil + "Settings for the Bash Language Server." + :group 'lsp-mode + :link '(url-link "https://github.com/bash-lsp/bash-language-server") + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-bash-explainshell-endpoint nil + "The endpoint to use explainshell.com to answer `onHover' queries. +See instructions at https://marketplace.visualstudio.com/items?itemName=mads-hartmann.bash-ide-vscode" + :type 'string + :risky t + :group 'lsp-bash + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-bash-highlight-parsing-errors nil + "Consider parsing errors in scripts as `problems'." + :type 'boolean + :group 'lsp-bash + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-bash-glob-pattern nil + "Glob pattern used to find shell script files to parse." + :type 'string + :group 'lsp-bash + :package-version '(lsp-mode . "6.3")) + +(defun lsp-bash--bash-ls-server-command () + "Startup command for Bash language server." + (list (lsp-package-path 'bash-language-server) "start")) + +(lsp-dependency 'bash-language-server + '(:system "bash-language-server") + '(:npm :package "bash-language-server" + :path "bash-language-server")) + +(defvar sh-shell) + +(defun lsp-bash-check-sh-shell (&rest _) + "Check whether `sh-shell' is sh or bash. + +This prevents the Bash server from being turned on in zsh files." + (and (memq major-mode '(sh-mode bash-ts-mode ebuild-mode envrc-file-mode)) + (memq sh-shell '(sh bash)))) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection #'lsp-bash--bash-ls-server-command) + :major-modes '(sh-mode bash-ts-mode ebuild-mode envrc-file-mode) + :priority -1 + :activation-fn #'lsp-bash-check-sh-shell + :environment-fn (lambda () + '(("EXPLAINSHELL_ENDPOINT" . lsp-bash-explainshell-endpoint) + ("HIGHLIGHT_PARSING_ERRORS" . lsp-bash-highlight-parsing-errors) + ("GLOB_PATTERN" . lsp-bash-glob-pattern))) + :server-id 'bash-ls + :download-server-fn (lambda (_client callback error-callback _update?) + (lsp-package-ensure 'bash-language-server callback error-callback)))) + +(lsp-consistency-check lsp-bash) + +(provide 'lsp-bash) +;;; lsp-bash.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-beancount.el b/code/elpa/lsp-mode-20240319.1043/lsp-beancount.el new file mode 100644 index 0000000..807d93c --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-beancount.el @@ -0,0 +1,64 @@ +;;; lsp-beancount.el --- Beancount Client settings -*- lexical-binding: t; -*- + +;; Copyright (C) 2021 emacs-lsp maintainers + +;; Author: emacs-lsp maintainers +;; Keywords: lsp, beancount + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP client for Beancount + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-beancount nil + "Settings for the Beancount Language Server." + :group 'lsp-mode + :link '(url-link "https://github.com/polarmutex/beancount-language-server") + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-beancount-langserver-executable "beancount-language-server" + "Command to start Beancount language server." + :type 'string + :group 'lsp-beancount + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-beancount-journal-file nil + "Path to Beancount journal file. + +The path can be absolute, or relative to the currently opened file. +Use nil (the default) to use the current beancount buffer as the journal file." + :type 'string + :group 'lsp-beancount + :package-version '(lsp-mode . "8.0.0")) + +(lsp-register-client + (make-lsp-client + :new-connection + (lsp-stdio-connection + (lambda () + `(,lsp-beancount-langserver-executable "--stdio"))) + :major-modes '(beancount-mode) + :initialization-options + `((journalFile . ,lsp-beancount-journal-file)) + :server-id 'beancount-ls)) + +(lsp-consistency-check lsp-beancount) + +(provide 'lsp-beancount) +;;; lsp-beancount.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-bufls.el b/code/elpa/lsp-mode-20240319.1043/lsp-bufls.el new file mode 100644 index 0000000..5d95b39 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-bufls.el @@ -0,0 +1,69 @@ +;;; lsp-bufls.el --- bufls-langserver Client settings -*- lexical-binding: t; -*- + +;; Copyright (C) 2023 Jim Myhrberg + +;; Author: Jim Myhrberg +;; Keywords: lsp, protobuf, buf, bufls + +;; This file is not part of GNU Emacs + +;;; License: +;; +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: +;; +;; lsp-bufls client + +;;; Code: + +(require 'lsp-mode) +(require 'lsp-go) + +(defgroup lsp-bufls nil + "Configuration options for lsp-bufls." + :group 'lsp-mode + :link '(url-lint "https://github.com/bufbuild/buf-language-server") + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-bufls-args nil + "Arguments to pass to bufls serve." + :type '(repeat string) + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-bufls-path "bufls" + "Command to run bufls." + :type 'string + :package-version '(lsp-mode . "8.0.1")) + +(defun lsp-bufls-server--stdio-command () + "Return the command and args to start bufls-langserver." + (let ((args (list lsp-bufls-path "serve"))) + (when (and (listp lsp-bufls-args) + (> (length lsp-bufls-args) 0)) + (setq args (append args lsp-bufls-args))) + args)) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection + #'lsp-bufls-server--stdio-command) + :activation-fn (lsp-activate-on "protobuf") + :language-id "protobuf" + :priority 0 + :server-id 'bufls)) + +(lsp-consistency-check lsp-bufls) + +(provide 'lsp-bufls) +;;; lsp-bufls.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-camel.el b/code/elpa/lsp-mode-20240319.1043/lsp-camel.el new file mode 100644 index 0000000..851ff5e --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-camel.el @@ -0,0 +1,68 @@ +;;; lsp-camel.el --- LSP Camel server integration -*- lexical-binding: t; -*- + + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-camel nil + "LSP support for Camel, using camel-language-server" + :group 'lsp-mode + :tag "Language Server" + :package-version '(lsp-mode . "8.0.1")) + +;; Define a variable to store camel language server jar version +(defconst lsp-camel-jar-version "1.5.0") + +;; Define a variable to store camel language server jar name +(defconst lsp-camel-jar-name (format "camel-lsp-server-%s.jar" lsp-camel-jar-version)) + +;; Directory in which the servers will be installed. Lsp Server Install Dir: ~/.emacs.d/.cache/camells +(defcustom lsp-camel-jar-file (f-join lsp-server-install-dir "camells" lsp-camel-jar-name) + "Camel Language server jar command." + :type 'string + :group 'lsp-camel + :type 'file + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-camel-jar-download-url + (format "https://repo1.maven.org/maven2/com/github/camel-tooling/camel-lsp-server/%s/%s" lsp-camel-jar-version lsp-camel-jar-name) + "Automatic download url for lsp-camel." + :type 'string + :group 'lsp-camel + :package-version '(lsp-mode . "8.0.1")) + +(lsp-dependency + 'camells + '(:system lsp-camel-jar-file) + `(:download :url lsp-camel-jar-download-url + :store-path lsp-camel-jar-file)) + +(defcustom lsp-camel-server-command `("java" "-jar" , lsp-camel-jar-file) + "Camel server command." + :type '(repeat string) + :group 'lsp-camel + :package-version '(lsp-mode . "8.0.1")) + +(defun lsp-camel--create-connection () + (lsp-stdio-connection + (lambda () lsp-camel-server-command) + (lambda () (f-exists? lsp-camel-jar-file)))) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-camel--create-connection) + :activation-fn (lsp-activate-on "xml" "java") + :priority 0 + :server-id 'camells + :add-on? t + :multi-root t + :initialized-fn (lambda (workspace) + (with-lsp-workspace workspace + (lsp--set-configuration (lsp-configuration-section "camel")))) + :download-server-fn (lambda (_client callback error-callback _update?) + (lsp-package-ensure 'camells callback error-callback)))) + +(lsp-consistency-check lsp-camel) + +(provide 'lsp-camel) +;;; lsp-camel.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-clangd.el b/code/elpa/lsp-mode-20240319.1043/lsp-clangd.el new file mode 100644 index 0000000..6308b45 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-clangd.el @@ -0,0 +1,318 @@ +;;; lsp-clangd.el --- LSP clients for the C Languages Family -*- lexical-binding: t; -*- + +;; Copyright (C) 2020 Daniel Martin & emacs-lsp maintainers +;; URL: https://github.com/emacs-lsp/lsp-mode +;; Keywords: languages, c, cpp, clang + +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP clients for the C Languages Family. + +;; ** Clang-tidy Flycheck integration (Clangd) ** +;; +;; If you invoke `flycheck-display-error-explanation' on a +;; `clang-tidy' error (if Clangd is configured to show `clang-tidy' +;; diagnostics), Emacs will open a detailed explanation about the +;; message by querying the LLVM website. As an embedded web browser is +;; used to show the documentation, this feature requires that Emacs is +;; compiled with libxml2 support. + +;;; Code: + +(require 'lsp-mode) +(require 'cl-lib) +(require 'rx) +(require 'seq) +(require 'dom) +(eval-when-compile (require 'subr-x)) + +(require 'dash) +(require 's) + +(defvar flycheck-explain-error-buffer) +(declare-function flycheck-error-id "ext:flycheck" (err) t) +(declare-function flycheck-error-group "ext:flycheck" (err) t) +(declare-function flycheck-error-message "ext:flycheck" (err) t) + +(defcustom lsp-clangd-version "15.0.6" + "Clangd version to download. +It has to be set before `lsp-clangd.el' is loaded and it has to +be available here: https://github.com/clangd/clangd/releases/" + :type 'string + :group 'lsp-clangd + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-clangd-download-url + (format (pcase system-type + ('darwin "https://github.com/clangd/clangd/releases/download/%s/clangd-mac-%s.zip") + ('windows-nt "https://github.com/clangd/clangd/releases/download/%s/clangd-windows-%s.zip") + (_ "https://github.com/clangd/clangd/releases/download/%s/clangd-linux-%s.zip")) + lsp-clangd-version + lsp-clangd-version) + "Automatic download url for clangd" + :type 'string + :group 'lsp-clangd + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-clangd-binary-path + (f-join lsp-server-install-dir (format "clangd/clangd_%s/bin" + lsp-clangd-version) + (pcase system-type + ('windows-nt "clangd.exe") + (_ "clangd"))) + "The path to `clangd' binary." + :type 'file + :group 'lsp-clangd + :package-version '(lsp-mode . "8.0.0")) + +(lsp-dependency + 'clangd + `(:download :url lsp-clangd-download-url + :decompress :zip + :store-path ,(f-join lsp-server-install-dir "clangd" "clangd.zip") + :binary-path lsp-clangd-binary-path + :set-executable? t)) + +(defun lsp-cpp-flycheck-clang-tidy--skip-http-headers () + "Position point just after HTTP headers." + (re-search-forward "^$")) + +(defun lsp-cpp-flycheck-clang-tidy--narrow-to-http-body () + "Narrow the current buffer to contain the body of an HTTP response." + (lsp-cpp-flycheck-clang-tidy--skip-http-headers) + (narrow-to-region (point) (point-max))) + +(defun lsp-cpp-flycheck-clang-tidy--decode-region-as-utf8 (start end) + "Decode a region from START to END in UTF-8." + (condition-case nil + (decode-coding-region start end 'utf-8) + (coding-system-error nil))) + +(defun lsp-cpp-flycheck-clang-tidy--remove-crlf () + "Remove carriage return and line feeds from the current buffer." + (save-excursion + (while (re-search-forward "\r$" nil t) + (replace-match "" t t)))) + +(defun lsp-cpp-flycheck-clang-tidy--extract-relevant-doc-section () + "Extract the parts of the LLVM clang-tidy documentation that are relevant. + +This function assumes that the current buffer contains the result +of browsing `clang.llvm.org', as returned by `url-retrieve'. +More concretely, this function returns the main
element +with class `section', and also removes `headerlinks'." + (goto-char (point-min)) + (lsp-cpp-flycheck-clang-tidy--narrow-to-http-body) + (lsp-cpp-flycheck-clang-tidy--decode-region-as-utf8 (point-min) (point-max)) + (lsp-cpp-flycheck-clang-tidy--remove-crlf) + (let* ((dom (libxml-parse-html-region (point-min) (point-max))) + (section (dom-by-class dom "section"))) + (dolist (headerlink (dom-by-class section "headerlink")) + (dom-remove-node section headerlink)) + section)) + +(defun lsp-cpp-flycheck-clang-tidy--explain-error (explanation &rest args) + "Explain an error in the Flycheck error explanation buffer using EXPLANATION. + +EXPLANATION is a function with optional ARGS that, when +evaluated, inserts the content in the appropriate Flycheck +buffer." + (with-current-buffer flycheck-explain-error-buffer + (let ((inhibit-read-only t) + (inhibit-modification-hooks t)) + (erase-buffer) + (apply explanation args) + (goto-char (point-min))))) + +(defun lsp-cpp-flycheck-clang-tidy--show-loading-status () + "Show a loading string while clang-tidy documentation is fetched from llvm.org. +Recent versions of `flycheck' call `display-message-or-buffer' to +display error explanations. `display-message-or-buffer' displays +the documentation string either in the echo area or in a separate +window, depending on the string's height. This function forces to +always display it in a separate window by appending the required +number of newlines." + (let* ((num-lines-threshold + (round (if resize-mini-windows + (cond ((floatp max-mini-window-height) + (* (frame-height) + max-mini-window-height)) + ((integerp max-mini-window-height) + max-mini-window-height) + (t + 1)) + 1))) + (extra-new-lines (make-string (1+ num-lines-threshold) ?\n))) + (concat "Loading documentation..." extra-new-lines))) + +(defun lsp-cpp-flycheck-clang-tidy--show-documentation (error-id) + "Show clang-tidy documentation about ERROR-ID. + +Information comes from the clang.llvm.org website." + ;; Example error-id: modernize-loop-convert + ;; Example url: https://clang.llvm.org/extra/clang-tidy/checks/modernize/loop-convert.html + (setq error-id (s-join "/" (s-split-up-to "-" error-id 1 t))) + (url-retrieve (format + "https://clang.llvm.org/extra/clang-tidy/checks/%s.html" error-id) + (lambda (status) + (if-let ((error-status (plist-get status :error))) + (lsp-cpp-flycheck-clang-tidy--explain-error + #'insert + (format + "Error accessing clang-tidy documentation: %s" + (error-message-string error-status))) + (let ((doc-contents + (lsp-cpp-flycheck-clang-tidy--extract-relevant-doc-section))) + (lsp-cpp-flycheck-clang-tidy--explain-error + #'shr-insert-document doc-contents))))) + (lsp-cpp-flycheck-clang-tidy--show-loading-status)) + +;;;###autoload +(defun lsp-cpp-flycheck-clang-tidy-error-explainer (error) + "Explain a clang-tidy ERROR by scraping documentation from llvm.org." + (unless (fboundp 'libxml-parse-html-region) + (error "This function requires Emacs to be compiled with libxml2")) + (if-let ((clang-tidy-error-id (flycheck-error-id error))) + (condition-case err + (lsp-cpp-flycheck-clang-tidy--show-documentation clang-tidy-error-id) + (error + (format + "Error accessing clang-tidy documentation: %s" + (error-message-string err)))) + (error "The clang-tidy error message does not contain an [error-id]"))) + + +;;; lsp-clangd +(defgroup lsp-clangd nil + "LSP support for C-family languages (C, C++, Objective-C, Objective-C++, CUDA), using clangd." + :group 'lsp-mode + :link '(url-link "https://clang.llvm.org/extra/clangd")) + +(defcustom lsp-clients-clangd-executable nil + "The clangd executable to use. +When `'non-nil' use the name of the clangd executable file +available in your path to use. Otherwise the system will try to +find a suitable one. Set this variable before loading lsp." + :group 'lsp-clangd + :risky t + :type '(choice (file :tag "Path") + (const :tag "Auto" nil))) + +(defvar lsp-clients--clangd-default-executable nil + "Clang default executable full path when found. +This must be set only once after loading the clang client.") + +(defcustom lsp-clients-clangd-args '("--header-insertion-decorators=0") + "Extra arguments for the clangd executable." + :group 'lsp-clangd + :risky t + :type '(repeat string)) + +(defcustom lsp-clients-clangd-library-directories '("/usr") + "List of directories which will be considered to be libraries." + :risky t + :type '(repeat string) + :group 'lsp-clangd + :package-version '(lsp-mode . "8.0.1")) + +(defun lsp-clients--clangd-command () + "Generate the language server startup command." + (unless lsp-clients--clangd-default-executable + (setq lsp-clients--clangd-default-executable + (or (lsp-package-path 'clangd) + (-first #'executable-find + (-map (lambda (version) + (concat "clangd" version)) + ;; Prefer `clangd` without a version number appended. + (cl-list* "" (-map + (lambda (vernum) (format "-%d" vernum)) + (number-sequence 17 6 -1))))) + (lsp-clients-executable-find "xcodebuild" "-find-executable" "clangd") + (lsp-clients-executable-find "xcrun" "--find" "clangd")))) + + `(,(or lsp-clients-clangd-executable lsp-clients--clangd-default-executable "clangd") + ,@lsp-clients-clangd-args)) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection + 'lsp-clients--clangd-command) + :activation-fn (lsp-activate-on "c" "cpp" "objective-c" "cuda") + :priority -1 + :server-id 'clangd + :library-folders-fn (lambda (_workspace) lsp-clients-clangd-library-directories) + :download-server-fn (lambda (_client callback error-callback _update?) + (lsp-package-ensure 'clangd callback error-callback)))) + +(defun lsp-clangd-join-region (beg end) + "Apply join-line from BEG to END. +This function is useful when an indented function prototype needs +to be shown in a single line." + (save-excursion + (let ((end (copy-marker end))) + (goto-char beg) + (while (< (point) end) + (join-line 1))) + (s-trim (buffer-string)))) + +(cl-defmethod lsp-clients-extract-signature-on-hover (contents (_server-id (eql clangd))) + "Extract a representative line from clangd's CONTENTS, to show in the echo area. +This function tries to extract the type signature from CONTENTS, +or the first line if it cannot do so. A single line is always +returned to avoid that the echo area grows uncomfortably." + (with-temp-buffer + (-let [value (lsp:markup-content-value contents)] + (insert value) + (goto-char (point-min)) + (if (re-search-forward (rx (seq "```cpp\n" + (opt (group "//" + (zero-or-more nonl) + "\n")) + (group + (one-or-more + (not (any "`"))) + "\n") + "```")) nil t nil) + (progn (narrow-to-region (match-beginning 2) (match-end 2)) + (lsp--render-element (lsp-make-marked-string + :language "cpp" + :value (lsp-clangd-join-region (point-min) (point-max))))) + (car (s-lines (lsp--render-element contents))))))) + +(cl-defmethod lsp-diagnostics-flycheck-error-explainer (e (_server-id (eql clangd))) + "Explain a `flycheck-error' E that was generated by the Clangd language server." + (cond ((string-equal "clang-tidy" (flycheck-error-group e)) + (lsp-cpp-flycheck-clang-tidy-error-explainer e)) + (t (flycheck-error-message e)))) + +(defun lsp-clangd-find-other-file (&optional new-window) + "Switch between the corresponding C/C++ source and header file. +If NEW-WINDOW (interactively the prefix argument) is non-nil, +open in a new window. + +Only works with clangd." + (interactive "P") + (let ((other (lsp-send-request (lsp-make-request + "textDocument/switchSourceHeader" + (lsp--text-document-identifier))))) + (unless (s-present? other) + (user-error "Could not find other file")) + (funcall (if new-window #'find-file-other-window #'find-file) + (lsp--uri-to-path other)))) + +(lsp-consistency-check lsp-clangd) + +(provide 'lsp-clangd) +;;; lsp-clangd.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-clojure.el b/code/elpa/lsp-mode-20240319.1043/lsp-clojure.el new file mode 100644 index 0000000..1241401 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-clojure.el @@ -0,0 +1,618 @@ +;;; lsp-clojure.el --- Clojure Client settings -*- lexical-binding: t; -*- + +;; Copyright (C) 2019 Benedek Fazekas + +;; Author: Benedek Fazekas +;; Keywords: languages,tools + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; lsp-clojure client + +;;; Code: + +(require 'lsp-mode) +(require 'lsp-protocol) +(require 'cl-lib) +(require 'lsp-semantic-tokens) + +(defgroup lsp-clojure nil + "LSP support for Clojure." + :link '(url-link "https://github.com/snoe/clojure-lsp") + :group 'lsp-mode + :tag "Lsp Clojure") + +(define-obsolete-variable-alias 'lsp-clojure-server-command + 'lsp-clojure-custom-server-command "lsp-mode 8.0.0") + +(defcustom lsp-clojure-custom-server-command nil + "The clojure-lisp server command." + :group 'lsp-clojure + :risky t + :type '(repeat string)) + +(defcustom lsp-clojure-server-download-url + (format "https://github.com/clojure-lsp/clojure-lsp/releases/latest/download/clojure-lsp-native-%s.zip" + (let ((arch (car (split-string system-configuration "-")))) + (pcase system-type + ('gnu/linux (concat "linux-" + (cond + ((string= "x86_64" arch) "amd64") + (t arch)))) + ('darwin (concat "macos-" + (cond + ((string= "x86_64" arch) "amd64") + (t arch)))) + ('windows-nt "windows-amd64")))) + "Automatic download url for lsp-clojure." + :type 'string + :group 'lsp-clojure + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-clojure-server-store-path + (f-join lsp-server-install-dir + "clojure" + (if (eq system-type 'windows-nt) + "clojure-lsp.exe" + "clojure-lsp")) + "The path to the file in which `clojure-lsp' will be stored." + :type 'file + :group 'lsp-clojure + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-clojure-trace-enable nil + "Enable trace logs between client and clojure-lsp server." + :group 'lsp-clojure + :type 'boolean) + +(defcustom lsp-clojure-workspace-dir (expand-file-name (locate-user-emacs-file "workspace/")) + "LSP clojure workspace directory." + :group 'lsp-clojure + :risky t + :type 'directory) + +(defcustom lsp-clojure-workspace-cache-dir (expand-file-name ".cache/" lsp-clojure-workspace-dir) + "LSP clojure workspace cache directory." + :group 'lsp-clojure + :risky t + :type 'directory) + +(defcustom lsp-clojure-library-dirs (list lsp-clojure-workspace-cache-dir + (expand-file-name "~/.gitlibs/libs")) + "LSP clojure dirs that should be considered library folders." + :group 'lsp-clojure + :type 'list) + +(defcustom lsp-clojure-test-tree-position-params nil + "The optional test tree position params. +Defaults to side following treemacs default." + :type 'alist + :group 'lsp-clojure) + +(defcustom lsp-clojure-project-tree-position-params nil + "The optional project tree position params. +Defaults to side following treemacs default." + :type 'alist + :group 'lsp-clojure) + +;; Internal + +(lsp-interface + (Clojure:CursorInfoParams (:textDocument :position) nil)) + +(lsp-dependency + 'clojure-lsp + `(:download :url lsp-clojure-server-download-url + :decompress :zip + :store-path lsp-clojure-server-store-path + :set-executable? t) + '(:system "clojure-lsp")) + +;; Refactorings + +(defun lsp-clojure--execute-command (command &optional args) + "Send an executeCommand request for COMMAND with ARGS." + (lsp--cur-workspace-check) + (lsp-send-execute-command command (apply #'vector args))) + +(defun lsp-clojure--refactoring-call (refactor-name &rest additional-args) + "Send an executeCommand request for REFACTOR-NAME with ADDITIONAL-ARGS. +If there are more arguments expected after the line and column numbers." + (lsp--cur-workspace-check) + (lsp-clojure--execute-command refactor-name (cl-list* (lsp--buffer-uri) + (- (line-number-at-pos) 1) ;; clojure-lsp expects line numbers to start at 0 + (current-column) + additional-args))) + +(defun lsp-clojure-add-import-to-namespace (import-name) + "Add to IMPORT-NAME to :import form." + (interactive "MImport name: ") + (lsp-clojure--refactoring-call "add-import-to-namespace" import-name)) + +(defun lsp-clojure-add-missing-libspec () + "Apply add-missing-libspec refactoring at point." + (interactive) + (lsp-clojure--refactoring-call "add-missing-libspec")) + +(defun lsp-clojure-clean-ns () + "Apply clean-ns refactoring at point." + (interactive) + (lsp-clojure--refactoring-call "clean-ns")) + +(defun lsp-clojure-cycle-coll () + "Apply cycle-coll refactoring at point." + (interactive) + (lsp-clojure--refactoring-call "cycle-coll")) + +(defun lsp-clojure-cycle-privacy () + "Apply cycle-privacy refactoring at point." + (interactive) + (lsp-clojure--refactoring-call "cycle-privacy")) + +(defun lsp-clojure-expand-let () + "Apply expand-let refactoring at point." + (interactive) + (lsp-clojure--refactoring-call "expand-let")) + +(defun lsp-clojure-extract-function (function-name) + "Move form at point into a new function named FUNCTION-NAME." + (interactive "MFunction name: ") ;; Name of the function + (lsp-clojure--refactoring-call "extract-function" function-name)) + +(defun lsp-clojure-inline-symbol () + "Apply inline-symbol refactoring at point." + (interactive) + (lsp-clojure--refactoring-call "inline-symbol")) + +(defun lsp-clojure-introduce-let (binding-name) + "Move form at point into a new let binding as BINDING-NAME." + (interactive "MBinding name: ") ;; Name of the let binding + (lsp-clojure--refactoring-call "introduce-let" binding-name)) + +(defun lsp-clojure-move-to-let (binding-name) + "Move form at point into nearest existing let binding as BINDING-NAME." + (interactive "MBinding name: ") ;; Name of the let binding + (lsp-clojure--refactoring-call "move-to-let" binding-name)) + +(defun lsp-clojure-thread-first () + "Apply thread-first refactoring at point." + (interactive) + (lsp-clojure--refactoring-call "thread-first")) + +(defun lsp-clojure-thread-first-all () + "Apply thread-first-all refactoring at point." + (interactive) + (lsp-clojure--refactoring-call "thread-first-all")) + +(defun lsp-clojure-thread-last () + "Apply thread-last refactoring at point." + (interactive) + (lsp-clojure--refactoring-call "thread-last")) + +(defun lsp-clojure-thread-last-all () + "Apply thread-last-all refactoring at point." + (interactive) + (lsp-clojure--refactoring-call "thread-last-all")) + +(defun lsp-clojure-unwind-all () + "Apply unwind-all refactoring at point." + (interactive) + (lsp-clojure--refactoring-call "unwind-all")) + +(defun lsp-clojure-unwind-thread () + "Apply unwind-thread refactoring at point." + (interactive) + (lsp-clojure--refactoring-call "unwind-thread")) + +(defun lsp-clojure-create-function () + "Apply create-function refactoring at point." + (interactive) + (lsp-clojure--refactoring-call "create-function")) + +(defun lsp-clojure-create-test () + "Apply create-test refactoring at point." + (interactive) + (lsp-clojure--refactoring-call "create-test")) + +(defun lsp-clojure-sort-map () + "Apply sort-map refactoring at point." + (interactive) + (lsp-clojure--refactoring-call "sort-map")) + +(defun lsp-clojure-move-coll-entry-up () + "Apply move coll entry up refactoring at point." + (interactive) + (lsp-clojure--refactoring-call "move-coll-entry-up")) + +(defun lsp-clojure-move-coll-entry-down () + "Apply move coll entry down refactoring at point." + (interactive) + (lsp-clojure--refactoring-call "move-coll-entry-down")) + +(defun lsp-clojure-forward-slurp () + "Apply forward slurp refactoring at point." + (interactive) + (lsp-clojure--refactoring-call "forward-slurp")) + +(defun lsp-clojure-forward-barf () + "Apply forward barf refactoring at point." + (interactive) + (lsp-clojure--refactoring-call "forward-barf")) + +(defun lsp-clojure-backward-slurp () + "Apply backward slurp refactoring at point." + (interactive) + (lsp-clojure--refactoring-call "backward-slurp")) + +(defun lsp-clojure-backward-barf () + "Apply backward slurp refactoring at point." + (interactive) + (lsp-clojure--refactoring-call "backward-barf")) + +(defun lsp-clojure-move-form (dest-filename) + "Apply move-form refactoring at point to DEST-FILENAME." + (interactive + (list (or (read-file-name "Move form to: ") + (user-error "No filename selected. Aborting")))) + (lsp-clojure--refactoring-call "move-form" (expand-file-name dest-filename))) + +(defun lsp-clojure-server-info () + "Request server info." + (interactive) + (lsp--cur-workspace-check) + (lsp-notify "clojure/serverInfo/log" nil)) + +(defvar lsp-clojure-server-buffer-name "*lsp-clojure-server-log*") + +(defun lsp-clojure--server-log-revert-function (original-file-log-buffer &rest _) + "Spit contents to ORIGINAL-FILE-LOG-BUFFER." + (with-current-buffer (get-buffer-create lsp-clojure-server-buffer-name) + (erase-buffer) + (insert (with-current-buffer original-file-log-buffer (buffer-string))) + (goto-char (point-max)) + (read-only-mode))) + +(defun lsp-clojure-server-log () + "Open a buffer with the server logs." + (interactive) + (lsp--cur-workspace-check) + (let* ((log-path (-> (lsp--json-serialize (lsp-request "clojure/serverInfo/raw" nil)) + (lsp--read-json) + (lsp-get :log-path)))) + (with-current-buffer (find-file log-path) + (read-only-mode) + (goto-char (point-max))))) + +(defun lsp-clojure-server-info-raw () + "Request server info raw data." + (interactive) + (lsp--cur-workspace-check) + (message "%s" (lsp--json-serialize (lsp-request "clojure/serverInfo/raw" nil)))) + +(defun lsp-clojure-cursor-info () + "Request cursor info at point." + (interactive) + (lsp--cur-workspace-check) + (lsp-notify "clojure/cursorInfo/log" + (lsp-make-clojure-cursor-info-params + :textDocument (lsp-make-text-document-identifier :uri (lsp--buffer-uri)) + :position (lsp-make-position :line (- (line-number-at-pos) 1) + :character (current-column))))) + +(defun lsp-clojure-resolve-macro-as () + "Ask to user how the unresolved macro should be resolved." + (interactive) + (lsp--cur-workspace-check) + (lsp-clojure--execute-command "resolve-macro-as" + (list (lsp--buffer-uri) + (- (line-number-at-pos) 1) ;; clojure-lsp expects line numbers to start at 0 + (current-column)))) + +(defun lsp-clojure--ensure-dir (path) + "Ensure that directory PATH exists." + (unless (file-directory-p path) + (make-directory path t))) + +(defun lsp-clojure--get-metadata-location (file-location) + "Given a FILE-LOCATION return the file containing the metadata for the file." + (format "%s.%s.metadata" + (file-name-directory file-location) + (file-name-base file-location))) + +(defun lsp-clojure--file-in-jar (uri) + "Check URI for a valid jar and include it in workspace." + (string-match "^\\(jar\\|zip\\):\\(file:.+\\)!/\\(.+\\)" uri) + (let* ((ns-path (match-string 3 uri)) + (ns (s-replace "/" "." ns-path)) + (file-location (concat lsp-clojure-workspace-cache-dir ns))) + (unless (file-readable-p file-location) + (lsp-clojure--ensure-dir (file-name-directory file-location)) + (with-lsp-workspace (lsp-find-workspace 'clojure-lsp nil) + (let ((content (lsp-send-request (lsp-make-request "clojure/dependencyContents" (list :uri uri))))) + (with-temp-file file-location + (insert content)) + (with-temp-file (lsp-clojure--get-metadata-location file-location) + (insert uri))))) + file-location)) + +(defun lsp-clojure--server-executable-path () + "Return the clojure-lsp server command." + (or (executable-find "clojure-lsp") + (lsp-package-path 'clojure-lsp))) + +(lsp-defun lsp-clojure--show-references ((&Command :arguments? args)) + "Show references for command with ARGS. +ARGS is a vector which the first element is the uri, the second the line +and the third the column." + (lsp-show-xrefs + (lsp--locations-to-xref-items + (lsp-request "textDocument/references" + (lsp--make-reference-params + (lsp--text-document-position-params + (list :uri (seq-elt args 0)) + (list :line (1- (seq-elt args 1)) + :character (1- (seq-elt args 2))))))) + nil + t)) + +;; Test tree + +(defvar-local lsp-clojure--test-tree-data nil) +(defconst lsp-clojure--test-tree-buffer-name "*Clojure Test Tree*") + +(defvar treemacs-position) +(defvar treemacs-width) +(declare-function lsp-treemacs-render "ext:lsp-treemacs" (tree title expand-depth &optional buffer-name right-click-actions clear-cache?)) +(declare-function lsp-treemacs--open-file-in-mru "ext:lsp-treemacs" (file)) + +(defun lsp-clojure--test-tree-ret-action (uri range) + "Build the ret action for an item in the test tree view. +URI is the source of the item. +RANGE is the range of positions to where this item should point." + (interactive) + (lsp-treemacs--open-file-in-mru (lsp--uri-to-path uri)) + (goto-char (lsp--position-to-point (lsp:range-start range))) + (run-hooks 'xref-after-jump-hook)) + +(lsp-defun lsp-clojure--test-tree-data->tree (uri (&clojure-lsp:TestTreeNode :name :range :kind :children?)) + "Builds a test tree. +URI is the source of the test tree. +NODE is the node with all test children data." + (-let* ((icon (cl-case kind + (1 'namespace) + (2 'method) + (3 'field))) + (base-tree (list :key name + :label name + :icon icon + :ret-action (lambda (&rest _) (lsp-clojure--test-tree-ret-action uri range)) + :uri uri))) + (if (seq-empty-p children?) + base-tree + (plist-put base-tree :children (seq-map (-partial #'lsp-clojure--test-tree-data->tree uri) children?))))) + +(lsp-defun lsp-clojure--render-test-tree ((&clojure-lsp:TestTreeParams :uri :tree)) + "Render a test tree view for current test tree buffer data." + (save-excursion + (lsp-treemacs-render + (list (lsp-clojure--test-tree-data->tree uri tree)) + "Clojure Test Tree" + t + lsp-clojure--test-tree-buffer-name))) + +(defun lsp-clojure--show-test-tree (ignore-focus?) + "Show a test tree for current buffer. +Focus on it if IGNORE-FOCUS? is nil." + (if lsp-clojure--test-tree-data + (-let* ((tree-buffer (lsp-clojure--render-test-tree lsp-clojure--test-tree-data)) + (position-params (or lsp-clojure-test-tree-position-params + `((side . ,treemacs-position) + (slot . 2) + (window-width . ,treemacs-width)))) + (window (display-buffer-in-side-window tree-buffer position-params))) + (unless ignore-focus? + (select-window window) + (set-window-dedicated-p window t))) + (unless ignore-focus? + (lsp-log "No Clojure test tree data found.")))) + +(lsp-defun lsp-clojure--handle-test-tree (_workspace (notification &as &clojure-lsp:TestTreeParams :uri)) + "Test tree notification handler for workspace WORKSPACE. +NOTIFICATION is the test tree notification data received from server. +It updates the test tree view data." + (when (require 'lsp-treemacs nil t) + (when-let (buffer (find-buffer-visiting (lsp--uri-to-path uri))) + (with-current-buffer buffer + (setq lsp-clojure--test-tree-data notification) + (when (get-buffer-window lsp-clojure--test-tree-buffer-name) + (lsp-clojure--show-test-tree t)))))) + +;;;###autoload +(defun lsp-clojure-show-test-tree (ignore-focus?) + "Show a test tree and focus on it if IGNORE-FOCUS? is nil." + (interactive "P") + (if (require 'lsp-treemacs nil t) + (lsp-clojure--show-test-tree ignore-focus?) + (error "The package lsp-treemacs is not installed"))) + +;; Project Tree + +(defconst lsp-clojure--project-tree-buffer-name "*Clojure Project Tree*") + +(defun lsp-clojure--project-tree-type->icon (type) + "Convert the project tree type TYPE to icon." + (cl-case type + (1 'project) + (2 'folder) + (3 'library) + (4 'jar) + (5 'namespace) + (6 'class) + (7 'method) + (8 'variable) + (9 'interface))) + +(defun lsp-clojure--project-tree-ret-action (uri range) + "Build the ret action for an item in the project tree view. +URI is the source of the item." + (interactive) + (lsp-treemacs--open-file-in-mru (lsp--uri-to-path uri)) + (goto-char (lsp--position-to-point (lsp:range-start range))) + (run-hooks 'xref-after-jump-hook)) + +(lsp-defun lsp-clojure--project-tree-children-data->tree (buffer current-node &optional _ callback) + "Builds a project tree considering CURRENT-NODE." + (with-current-buffer buffer + (lsp-request-async + "clojure/workspace/projectTree/nodes" + current-node + (-lambda ((&clojure-lsp:ProjectTreeNode :nodes?)) + (funcall + callback + (-map + (-lambda ((node &as &clojure-lsp:ProjectTreeNode :id? :name :type :uri? :range? :detail? :final?)) + (-let ((label (if detail? + (format "%s %s" name (propertize detail? 'face 'lsp-details-face)) + name))) + `(:label ,label + :key ,(or id? name) + :icon ,(lsp-clojure--project-tree-type->icon type) + ,@(unless final? + (list :children-async (-partial #'lsp-clojure--project-tree-children-data->tree buffer node))) + ,@(when uri? + (list :uri uri? + :ret-action (lambda (&rest _) + (interactive) + (lsp-clojure--project-tree-ret-action uri? range?))))))) + nodes?))) + :mode 'detached))) + +(defun lsp-clojure--project-tree-data->tree () + "Builds a project tree considering CURRENT-NODE." + (-let* (((&clojure-lsp:ProjectTreeNode :id? :name :nodes? :uri?) (lsp-request "clojure/workspace/projectTree/nodes" nil)) + (buffer (current-buffer))) + (list :key (or id? name) + :label name + :icon "clj" + :children (seq-map (-lambda ((node &as &clojure-lsp:ProjectTreeNode :id? :name :type :uri?)) + (list :key (or id? name) + :label name + :icon (lsp-clojure--project-tree-type->icon type) + :children-async (-partial #'lsp-clojure--project-tree-children-data->tree buffer node) + :uri uri?)) + nodes?) + :uri uri?))) + +(defun lsp-clojure--render-project-tree () + "Render a project tree view." + (save-excursion + (lsp-treemacs-render + (list (lsp-clojure--project-tree-data->tree)) + "Clojure Project Tree" + nil + lsp-clojure--project-tree-buffer-name + nil + t))) + +(defun lsp-clojure--show-project-tree (ignore-focus?) + "Show a project tree for current project. +Focus on it if IGNORE-FOCUS? is nil." + (-let* ((tree-buffer (lsp-clojure--render-project-tree)) + (position-params (or lsp-clojure-project-tree-position-params + `((side . ,treemacs-position) + (slot . 2) + (window-width . ,treemacs-width)))) + (window (display-buffer-in-side-window tree-buffer position-params))) + (unless ignore-focus? + (select-window window) + (set-window-dedicated-p window t)))) + +;;;###autoload +(defun lsp-clojure-show-project-tree (ignore-focus?) + "Show a project tree with source-paths and dependencies. +Focus on it if IGNORE-FOCUS? is nil." + (interactive "P") + (if (require 'lsp-treemacs nil t) + (lsp-clojure--show-project-tree ignore-focus?) + (error "The package lsp-treemacs is not installed"))) + +(defun lsp-clojure--build-command () + "Build clojure-lsp start command." + (let* ((base-command (or lsp-clojure-custom-server-command + (-some-> (lsp-clojure--server-executable-path) list)))) + (if lsp-clojure-trace-enable + (-map-last #'stringp + (lambda (command) + (concat command " --trace")) + base-command) + base-command))) + +(lsp-register-client + (make-lsp-client + :download-server-fn (lambda (_client callback error-callback _update?) + (lsp-package-ensure 'clojure-lsp callback error-callback)) + :semantic-tokens-faces-overrides '(:types (("macro" . font-lock-keyword-face) + ("keyword" . clojure-keyword-face) + ("event" . default))) + :new-connection (lsp-stdio-connection + #'lsp-clojure--build-command + #'lsp-clojure--build-command) + :major-modes '(clojure-mode clojurec-mode clojurescript-mode + clojure-ts-mode clojure-ts-clojurec-mode clojure-ts-clojurescript-mode) + :library-folders-fn (lambda (_workspace) lsp-clojure-library-dirs) + :uri-handlers (lsp-ht ("jar" #'lsp-clojure--file-in-jar)) + :action-handlers (lsp-ht ("code-lens-references" #'lsp-clojure--show-references)) + :notification-handlers (lsp-ht ("clojure/textDocument/testTree" #'lsp-clojure--handle-test-tree)) + :initialization-options '(:dependency-scheme "jar" + :show-docs-arity-on-same-line? t) + :custom-capabilities `((experimental . ((testTree . ,(and (require 'lsp-treemacs nil t) t))))) + :server-id 'clojure-lsp)) + +(lsp-consistency-check lsp-clojure) + +;; For debugging + +(declare-function cider-connect-clj "ext:cider" (params)) + +(defun lsp-clojure-nrepl-connect () + "Connect to the running nrepl debug server of clojure-lsp." + (interactive) + (let ((info (lsp-clojure-server-info-raw))) + (save-match-data + (when (functionp 'cider-connect-clj) + (when-let (port (and (string-match "\"port\":\\([0-9]+\\)" info) + (match-string 1 info))) + (cider-connect-clj `(:host "localhost" + :port ,port))))))) + +;; Cider integration + +(defun lsp-clojure-semantic-tokens-refresh (&rest _) + "Force refresh semantic tokens." + (when-let ((workspace (and lsp-semantic-tokens-enable + (lsp-find-workspace 'clojure-lsp (buffer-file-name))))) + (--each (lsp--workspace-buffers workspace) + (when (lsp-buffer-live-p it) + (lsp-with-current-buffer it + (lsp-semantic-tokens--enable)))))) + +(with-eval-after-load 'cider + (when lsp-semantic-tokens-enable + ;; refresh tokens as cider flush font-faces after disconnected + (add-hook 'cider-mode-hook #'lsp-clojure-semantic-tokens-refresh))) + +(provide 'lsp-clojure) +;;; lsp-clojure.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-cmake.el b/code/elpa/lsp-mode-20240319.1043/lsp-cmake.el new file mode 100644 index 0000000..0b10503 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-cmake.el @@ -0,0 +1,62 @@ +;;; lsp-cmake.el --- description -*- lexical-binding: t; -*- + +;; Copyright (C) 2020-2023 emacs-lsp maintainers + +;; Author: emacs-lsp maintainers +;; Keywords: lsp, cmake + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP Clients for the CMake build tool. + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-cmake nil + "LSP support for CMake, using cmake-language-server." + :group 'lsp-mode + :link '(url-link "https://github.com/regen100/cmake-language-server")) + +(defcustom lsp-cmake-server-command "cmake-language-server" + "The binary (or full path to binary) which executes the server." + :type 'string + :group 'lsp-cmake + :package-version '(lsp-mode . "8.0.1")) + +(defun lsp-cmake--download-server (_client callback error-callback update?) + "Install/update CMake language server using `pip + +Will invoke CALLBACK or ERROR-CALLBACK based on result. +Will update if UPDATE? is t." + (lsp-async-start-process + callback + error-callback + "pip" "install" "cmake-language-server" (when update? "-U"))) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection + (lambda () + lsp-cmake-server-command)) + :activation-fn (lsp-activate-on "cmake") + :priority -1 + :server-id 'cmakels + :download-server-fn #'lsp-cmake--download-server)) + +(lsp-consistency-check lsp-cmake) + +(provide 'lsp-cmake) +;;; lsp-cmake.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-cobol.el b/code/elpa/lsp-mode-20240319.1043/lsp-cobol.el new file mode 100644 index 0000000..7378722 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-cobol.el @@ -0,0 +1,191 @@ +;;; lsp-cobol.el --- COBOL support -*- lexical-binding: t; -*- + +;; Copyright (C) 2024 Shen, Jen-Chieh + +;; This file is not part of GNU Emacs. + +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: +;; +;; COBOL support. +;; + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-cobol nil + "LSP support for COBOL." + :group 'lsp-mode + :link '(url-link "https://github.com/eclipse-che4z/che-che4z-lsp-for-cobol") + :package-version `(lsp-mode . "8.0.1")) + +(defcustom lsp-cobol-server-path nil + "Path points for COBOL language service. + +This is only for development use." + :type 'string + :group 'lsp-cobol) + +(defcustom lsp-cobol-port 1044 + "Port to connect server to." + :type 'integer + :group 'lsp-cobol) + +;; +;;; Util + +(defmacro lsp-cobol--mute-apply (&rest body) + "Execute BODY without message." + (declare (indent 0) (debug t)) + `(let (message-log-max) + (with-temp-message (or (current-message) nil) + (let ((inhibit-message t)) ,@body)))) + +(defun lsp-cobol--execute (cmd &rest args) + "Return non-nil if CMD executed succesfully with ARGS." + (save-window-excursion + (lsp-cobol--mute-apply + (= 0 (shell-command (concat cmd " " + (mapconcat #'shell-quote-argument + (cl-remove-if #'null args) + " "))))))) + +;; +;;; Installation + +(defcustom lsp-cobol-server-store-path + (expand-file-name "cobol/" lsp-server-install-dir) + "The path to the file in which COBOL language service will be stored." + :type 'file + :group 'lsp-cobol) + +(defcustom lsp-cobol-server-version "2.1.1" + "The COBOL language service version to install." + :type 'file + :group 'lsp-cobol) + +(defconst lsp-cobol-download-url-format + "https://github.com/eclipse-che4z/che-che4z-lsp-for-cobol/releases/download/%s/cobol-language-support-%s-%s-%s%s.vsix" + "Format to the download url link.") + +(defun lsp-cobol--server-url () + "Return Url points to the cobol language service's zip/tar file." + (let* ((x86 (string-prefix-p "x86_64" system-configuration)) + (arch (if x86 "x64" "arm64")) + (version lsp-cobol-server-version)) + (cl-case system-type + ((cygwin windows-nt ms-dos) + (format lsp-cobol-download-url-format + version "win32" arch version "-signed")) + (darwin + (format lsp-cobol-download-url-format + version "darwin" arch version "")) + (gnu/linux + (format lsp-cobol-download-url-format + version "linux" arch version ""))))) + +(defvar lsp-cobol--server-download-url (lsp-cobol--server-url) + "The actual url used to download language server.") + +(defvar lsp-cobol--downloaded-file (f-join lsp-cobol-server-store-path "temp.tar") + "The full file path after downloading the server zipped file.") + +(defun lsp-cobol--extract-compressed-file (callback) + "Install COBOL language service." + (cond ((file-exists-p lsp-cobol--downloaded-file) + ;; Suprisingly, you can just use `tar' to unzip a zip file on Windows. + ;; Therefore, just use the same command. + (lsp-cobol--execute "tar" "-xvzf" lsp-cobol--downloaded-file "-C" lsp-cobol-server-store-path) + ;; Delete the zip file. + (ignore-errors (delete-file lsp-cobol--downloaded-file))) + (t + (error "Can't extract the downloaded file: %s" lsp-cobol--downloaded-file))) + (funcall callback)) + +(defun lsp-cobol--stored-executable () + "Return the stored COBOL language service executable." + (executable-find + (f-join lsp-cobol-server-store-path + (concat "extension/server/native/" + (cl-case system-type + ((cygwin windows-nt ms-dos) "engine.exe") + (darwin "server-mac") + (gnu/linux "server-linux")))))) + +(lsp-dependency + 'cobol-ls + '(:system "cobol-ls") + `(:download :url ,lsp-cobol--server-download-url + :store-path ,lsp-cobol--downloaded-file)) + +;; +;;; Server + +;;;###autoload +(add-hook 'cobol-mode-hook #'lsp-cobol-start-ls) + +;;;###autoload +(defun lsp-cobol-start-ls () + "Start the COBOL language service." + (interactive) + (when-let ((exe (lsp-cobol--executable)) + ((lsp--port-available "localhost" lsp-cobol-port))) + (lsp-async-start-process #'ignore #'ignore exe))) + +;; +;;; Core + +(defun lsp-cobol--executable () + "Return the COBOL language service executable." + (or lsp-cobol-server-path + (lsp-cobol--stored-executable))) + +(defun lsp-cobol-server-start-fn (&rest _) + "Define COOBL language service start function." + `(,(lsp-cobol--executable))) + +(defun lsp-cobol--tcp-connect-to-port () + "Define a TCP connection to language server." + (list + :connect + (lambda (filter sentinel name _environment-fn _workspace) + (let* ((host "localhost") + (port lsp-cobol-port) + (tcp-proc (lsp--open-network-stream host port (concat name "::tcp")))) + + ;; TODO: Same :noquery issue (see above) + (set-process-query-on-exit-flag tcp-proc nil) + (set-process-filter tcp-proc filter) + (set-process-sentinel tcp-proc sentinel) + (cons tcp-proc tcp-proc))) + :test? (lambda () (file-executable-p (lsp-cobol--executable))))) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-cobol--tcp-connect-to-port) + :activation-fn (lsp-activate-on "cobol") + :priority -1 + :server-id 'cobol-ls + :download-server-fn + (lambda (_client callback error-callback _update?) + (lsp-package-ensure 'cobol-ls + (lambda () (lsp-cobol--extract-compressed-file callback)) + error-callback)))) + +(lsp-consistency-check lsp-cobol) + +(provide 'lsp-cobol) +;;; lsp-cobol.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-completion.el b/code/elpa/lsp-mode-20240319.1043/lsp-completion.el new file mode 100644 index 0000000..fda4ffc --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-completion.el @@ -0,0 +1,820 @@ +;;; lsp-completion.el --- LSP completion -*- lexical-binding: t; -*- +;; +;; Copyright (C) 2020 emacs-lsp maintainers +;; +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . +;; +;;; Commentary: +;; +;; LSP completion +;; +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-completion nil + "LSP support for completion." + :prefix "lsp-completion-" + :group 'lsp-mode + :tag "LSP Completion") + +;;;###autoload +(define-obsolete-variable-alias 'lsp-prefer-capf + 'lsp-completion-provider "lsp-mode 7.0.1") + +(defcustom lsp-completion-provider :capf + "The completion backend provider." + :type '(choice + (const :tag "Use company-capf" :capf) + (const :tag "None" :none)) + :group 'lsp-completion + :package-version '(lsp-mode . "7.0.1")) + +;;;###autoload +(define-obsolete-variable-alias 'lsp-enable-completion-at-point + 'lsp-completion-enable "lsp-mode 7.0.1") + +(defcustom lsp-completion-enable t + "Enable `completion-at-point' integration." + :type 'boolean + :group 'lsp-completion) + +(defcustom lsp-completion-enable-additional-text-edit t + "Whether or not to apply additional text edit when performing completion. + +If set to non-nil, `lsp-mode' will apply additional text edits +from the server. Otherwise, the additional text edits are +ignored." + :type 'boolean + :group 'lsp-completion + :package-version '(lsp-mode . "6.3.2")) + +(defcustom lsp-completion-show-kind t + "Whether or not to show kind of completion candidates." + :type 'boolean + :group 'lsp-completion + :package-version '(lsp-mode . "7.0.1")) + +(defcustom lsp-completion-show-detail t + "Whether or not to show detail of completion candidates." + :type 'boolean + :group 'lsp-completion) + +(defcustom lsp-completion-show-label-description t + "Whether or not to show description of completion candidates." + :type 'boolean + :group 'lsp-completion + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-completion-no-cache nil + "Whether or not caching the returned completions from server." + :type 'boolean + :group 'lsp-completion + :package-version '(lsp-mode . "7.0.1")) + +(defcustom lsp-completion-filter-on-incomplete t + "Whether or not filter incomplete results." + :type 'boolean + :group 'lsp-completion + :package-version '(lsp-mode . "7.0.1")) + +(defcustom lsp-completion-sort-initial-results t + "Whether or not filter initial results from server." + :type 'boolean + :group 'lsp-completion + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-completion-use-last-result t + "Temporarily use last server result when interrupted by keyboard. +This will help minimize popup flickering issue in `company-mode'." + :type 'boolean + :group 'lsp-completion + :package-version '(lsp-mode . "8.0.0")) + +(defconst lsp-completion--item-kind + [nil + "Text" + "Method" + "Function" + "Constructor" + "Field" + "Variable" + "Class" + "Interface" + "Module" + "Property" + "Unit" + "Value" + "Enum" + "Keyword" + "Snippet" + "Color" + "File" + "Reference" + "Folder" + "EnumMember" + "Constant" + "Struct" + "Event" + "Operator" + "TypeParameter"]) + +(defvar yas-indent-line) +(defvar company-backends) +(defvar company-abort-on-unique-match) + +(defvar lsp-completion--no-reordering nil + "Dont do client-side reordering completion items when set.") + +(declare-function company-mode "ext:company") +(declare-function yas-expand-snippet "ext:yasnippet") + +(defun lsp-doc-buffer (&optional string) + "Return doc for STRING." + (with-current-buffer (get-buffer-create "*lsp-documentation*") + (erase-buffer) + (fundamental-mode) + (when string + (save-excursion + (insert string) + (visual-line-mode))) + (current-buffer))) + +(defun lsp-falsy? (val) + "Non-nil if VAL is falsy." + ;; https://developer.mozilla.org/en-US/docs/Glossary/Falsy + (or (not val) (equal val "") (equal val 0))) + +(cl-defun lsp-completion--make-item (item &key markers prefix) + "Make completion item from lsp ITEM and with MARKERS and PREFIX." + (-let (((&CompletionItem :label + :sort-text? + :_emacsStartPoint start-point) + item)) + (propertize label + 'lsp-completion-item item + 'lsp-sort-text sort-text? + 'lsp-completion-start-point start-point + 'lsp-completion-markers markers + 'lsp-completion-prefix prefix))) + +(defun lsp-completion--annotate (item) + "Annotate ITEM detail." + (-let (((&CompletionItem :detail? :kind? :label-details?) (plist-get (text-properties-at 0 item) + 'lsp-completion-item))) + (concat (when (and lsp-completion-show-detail detail?) + (concat " " (s-replace "\r" "" detail?))) + (when (and lsp-completion-show-label-description label-details?) + (when-let ((description (and label-details? (lsp:label-details-description label-details?)))) + (format " %s" description))) + (when lsp-completion-show-kind + (when-let ((kind-name (and kind? (aref lsp-completion--item-kind kind?)))) + (format " (%s)" kind-name)))))) + +(defun lsp-completion--looking-back-trigger-characterp (trigger-characters) + "Return character if text before point match any of the TRIGGER-CHARACTERS." + (unless (= (point) (line-beginning-position)) + (seq-some + (lambda (trigger-char) + (and (equal (buffer-substring-no-properties (- (point) (length trigger-char)) (point)) + trigger-char) + trigger-char)) + trigger-characters))) + +(defvar lsp-completion--cache nil + "Cached candidates for completion at point function. +In the form of plist (prefix-pos items :lsp-items :prefix ...). +When the completion is incomplete, `items' contains value of :incomplete.") + +(defvar lsp-completion--last-result nil + "Last completion result.") + +(defun lsp-completion--clear-cache (&optional keep-last-result) + "Clear completion caches. +KEEP-LAST-RESULT if specified." + (-some-> lsp-completion--cache + (cddr) + (plist-get :markers) + (cl-second) + (set-marker nil)) + (setq lsp-completion--cache nil) + (unless keep-last-result (setq lsp-completion--last-result nil))) + +(defcustom lsp-completion-default-behaviour :replace + "Default behaviour of `InsertReplaceEdit'." + :type '(choice + (const :insert :tag "Default completion inserts") + (const :replace :tag "Default completion replaces")) + :group 'lsp-mode + :package-version '(lsp-mode . "8.0.0")) + +(lsp-defun lsp-completion--guess-prefix ((item &as &CompletionItem :text-edit?)) + "Guess ITEM's prefix start point according to following heuristics: +- If `textEdit' exists, use insertion range start as prefix start point. +- Else, find the point before current point is longest prefix match of +`insertText' or `label'. And: + - The character before prefix is not word constitute +Return `nil' when fails to guess prefix." + (cond + ((lsp-insert-replace-edit? text-edit?) + (lsp--position-to-point (lsp:range-start (lsp:insert-replace-edit-insert text-edit?)))) + (text-edit? + (lsp--position-to-point (lsp:range-start (lsp:text-edit-range text-edit?)))) + (t + (-let* (((&CompletionItem :label :insert-text?) item) + (text (or (unless (lsp-falsy? insert-text?) insert-text?) label)) + (point (point)) + (start (max 1 (- point (length text)))) + (char-before (char-before start)) + start-point) + (while (and (< start point) (not start-point)) + (unless (or (and char-before (equal (char-syntax char-before) ?w)) + (not (string-prefix-p (buffer-substring-no-properties start point) + text))) + (setq start-point start)) + (cl-incf start) + (setq char-before (char-before start))) + start-point)))) + +(defun lsp-completion--to-internal (items) + "Convert ITEMS into internal form." + (--> items + (-map (-lambda ((item &as &CompletionItem + :label + :filter-text? + :_emacsStartPoint start-point + :score?)) + `( :label ,(or (unless (lsp-falsy? filter-text?) filter-text?) label) + :item ,item + :start-point ,start-point + :score ,score?)) + it))) + +(cl-defun lsp-completion--filter-candidates (items &key + lsp-items + markers + prefix + &allow-other-keys) + "List all possible completions in cached ITEMS with their prefixes. +We can pass LSP-ITEMS, which will be used when there's no cache. +The MARKERS and PREFIX value will be attached to each candidate." + (lsp--while-no-input + (->> + (if items + (--> + (let (queries fuz-queries) + (-keep (-lambda ((cand &as &plist :label :start-point :score)) + (let* ((query (or (plist-get queries start-point) + (let ((s (buffer-substring-no-properties + start-point (point)))) + (setq queries (plist-put queries start-point s)) + s))) + (fuz-query (or (plist-get fuz-queries start-point) + (let ((s (lsp-completion--regex-fuz query))) + (setq fuz-queries + (plist-put fuz-queries start-point s)) + s))) + (label-len (length label))) + (when (string-match fuz-query label) + (put-text-property 0 label-len 'match-data (match-data) label) + (plist-put cand + :sort-score + (* (or (lsp-completion--fuz-score query label) 1e-05) + (or score 0.001))) + cand))) + items)) + (if lsp-completion--no-reordering + it + (sort it (lambda (o1 o2) + (> (plist-get o1 :sort-score) + (plist-get o2 :sort-score))))) + ;; TODO: pass additional function to sort the candidates + (-map (-rpartial #'plist-get :item) it)) + lsp-items) + (-map (lambda (item) (lsp-completion--make-item item + :markers markers + :prefix prefix)))))) + +(defconst lsp-completion--kind->symbol + '((1 . text) + (2 . method) + (3 . function) + (4 . constructor) + (5 . field) + (6 . variable) + (7 . class) + (8 . interface) + (9 . module) + (10 . property) + (11 . unit) + (12 . value) + (13 . enum) + (14 . keyword) + (15 . snippet) + (16 . color) + (17 . file) + (18 . reference) + (19 . folder) + (20 . enum-member) + (21 . constant) + (22 . struct) + (23 . event) + (24 . operator) + (25 . type-parameter))) + +(defun lsp-completion--candidate-kind (item) + "Return ITEM's kind." + (alist-get (lsp:completion-item-kind? (get-text-property 0 'lsp-completion-item item)) + lsp-completion--kind->symbol)) + +(defun lsp-completion--candidate-deprecated (item) + "Return if ITEM is deprecated." + (let ((completion-item (get-text-property 0 'lsp-completion-item item))) + (or (lsp:completion-item-deprecated? completion-item) + (seq-position (lsp:completion-item-tags? completion-item) + lsp/completion-item-tag-deprecated)))) + +(defun lsp-completion--company-match (candidate) + "Return highlight of typed prefix inside CANDIDATE." + (let* ((prefix (downcase + (buffer-substring-no-properties + (plist-get (text-properties-at 0 candidate) 'lsp-completion-start-point) + (point)))) + ;; Workaround for bug #4192 + ;; `lsp-completion-start-point' above might be from cached/previous completion and + ;; pointing to a very distant point, which results in `prefix' being way too long. + ;; So let's consider only the first line. + (prefix (car (s-lines prefix))) + (prefix-len (length prefix)) + (prefix-pos 0) + (label (downcase candidate)) + (label-len (length label)) + (label-pos 0) + matches start) + (while (and (not matches) + (< prefix-pos prefix-len)) + (while (and (< prefix-pos prefix-len) + (< label-pos label-len)) + (if (equal (aref prefix prefix-pos) (aref label label-pos)) + (progn + (unless start (setq start label-pos)) + (cl-incf prefix-pos)) + (when start + (setq matches (nconc matches `((,start . ,label-pos)))) + (setq start nil))) + (cl-incf label-pos)) + (when start (setq matches (nconc matches `((,start . ,label-pos))))) + ;; Search again when the whole prefix is not matched + (when (< prefix-pos prefix-len) + (setq matches nil)) + ;; Start search from next offset of prefix to find a match with label + (unless matches + (cl-incf prefix-pos) + (setq label-pos 0))) + matches)) + +(defun lsp-completion--get-documentation (item) + "Get doc comment for completion ITEM." + (unless (get-text-property 0 'lsp-completion-resolved item) + (let ((resolved-item + (-some->> item + (get-text-property 0 'lsp-completion-item) + (lsp-completion--resolve))) + (len (length item))) + (put-text-property 0 len 'lsp-completion-item resolved-item item) + (put-text-property 0 len 'lsp-completion-resolved t item))) + (-some->> item + (get-text-property 0 'lsp-completion-item) + (lsp:completion-item-documentation?) + (lsp--render-element))) + +(defun lsp-completion--get-context (trigger-characters same-session?) + "Get completion context with provided TRIGGER-CHARACTERS and SAME-SESSION?." + (let* ((triggered-by-char non-essential) + (trigger-char (when triggered-by-char + (lsp-completion--looking-back-trigger-characterp + trigger-characters))) + (trigger-kind (cond + (trigger-char + lsp/completion-trigger-kind-trigger-character) + ((and same-session? + (equal (cl-second lsp-completion--cache) :incomplete)) + lsp/completion-trigger-kind-trigger-for-incomplete-completions) + (t lsp/completion-trigger-kind-invoked)))) + (apply #'lsp-make-completion-context + (nconc + `(:trigger-kind ,trigger-kind) + (when trigger-char + `(:trigger-character? ,trigger-char)))))) + +(defun lsp-completion--sort-completions (completions) + "Sort COMPLETIONS." + (sort + completions + (-lambda ((&CompletionItem :sort-text? sort-text-left :label label-left) + (&CompletionItem :sort-text? sort-text-right :label label-right)) + (if (equal sort-text-left sort-text-right) + (string-lessp label-left label-right) + (string-lessp sort-text-left sort-text-right))))) + +;;;###autoload +(defun lsp-completion-at-point () + "Get lsp completions." + (when (or (--some (lsp--client-completion-in-comments? (lsp--workspace-client it)) + (lsp-workspaces)) + (not (nth 4 (syntax-ppss)))) + (let* ((trigger-chars (-> (lsp--capability-for-method "textDocument/completion") + (lsp:completion-options-trigger-characters?))) + (bounds-start (or (cl-first (bounds-of-thing-at-point 'symbol)) + (point))) + result done? + (candidates + (lambda () + (lsp--catch 'input + (let ((lsp--throw-on-input lsp-completion-use-last-result) + (same-session? (and lsp-completion--cache + ;; Special case for empty prefix and empty result + (or (cl-second lsp-completion--cache) + (not (string-empty-p + (plist-get (cddr lsp-completion--cache) :prefix)))) + (equal (cl-first lsp-completion--cache) bounds-start) + (s-prefix? + (plist-get (cddr lsp-completion--cache) :prefix) + (buffer-substring-no-properties bounds-start (point)))))) + (cond + ((or done? result) result) + ((and (not lsp-completion-no-cache) + same-session? + (listp (cl-second lsp-completion--cache))) + (setf result (apply #'lsp-completion--filter-candidates + (cdr lsp-completion--cache)))) + (t + (-let* ((resp (lsp-request-while-no-input + "textDocument/completion" + (plist-put (lsp--text-document-position-params) + :context (lsp-completion--get-context trigger-chars same-session?)))) + (completed (and resp + (not (and (lsp-completion-list? resp) + (lsp:completion-list-is-incomplete resp))))) + (items (lsp--while-no-input + (--> (cond + ((lsp-completion-list? resp) + (lsp:completion-list-items resp)) + (t resp)) + (if (or completed + (seq-some #'lsp:completion-item-sort-text? it)) + (lsp-completion--sort-completions it) + it) + (-map (lambda (item) + (lsp-put item + :_emacsStartPoint + (or (lsp-completion--guess-prefix item) + bounds-start))) + it)))) + (markers (list bounds-start (copy-marker (point) t))) + (prefix (buffer-substring-no-properties bounds-start (point))) + (lsp-completion--no-reordering (not lsp-completion-sort-initial-results))) + (lsp-completion--clear-cache same-session?) + (setf done? completed + lsp-completion--cache (list bounds-start + (cond + ((and done? (not (seq-empty-p items))) + (lsp-completion--to-internal items)) + ((not done?) :incomplete)) + :lsp-items nil + :markers markers + :prefix prefix) + result (lsp-completion--filter-candidates + (cond (done? + (cl-second lsp-completion--cache)) + (lsp-completion-filter-on-incomplete + (lsp-completion--to-internal items))) + :lsp-items items + :markers markers + :prefix prefix)))))) + (:interrupted lsp-completion--last-result) + (`,res (setq lsp-completion--last-result res)))))) + (list + bounds-start + (point) + (lambda (probe pred action) + (cond + ((eq action 'metadata) + '(metadata (category . lsp-capf) + (display-sort-function . identity) + (cycle-sort-function . identity))) + ((eq (car-safe action) 'boundaries) nil) + (t + (complete-with-action action (funcall candidates) probe pred)))) + :annotation-function #'lsp-completion--annotate + :company-kind #'lsp-completion--candidate-kind + :company-deprecated #'lsp-completion--candidate-deprecated + :company-require-match 'never + :company-prefix-length + (save-excursion + (and (lsp-completion--looking-back-trigger-characterp trigger-chars) t)) + :company-match #'lsp-completion--company-match + :company-doc-buffer (-compose #'lsp-doc-buffer + #'lsp-completion--get-documentation) + :exit-function + (-rpartial #'lsp-completion--exit-fn candidates))))) + +(defun lsp-completion--find-workspace (server-id) + (--first (eq (lsp--client-server-id (lsp--workspace-client it)) server-id) + (lsp-workspaces))) + +(defun lsp-completion--exit-fn (candidate _status &optional candidates) + "Exit function of `completion-at-point'. +CANDIDATE is the selected completion item. +Others: CANDIDATES" + (unwind-protect + (-let* ((candidate (if (plist-member (text-properties-at 0 candidate) + 'lsp-completion-item) + candidate + (cl-find candidate (funcall candidates) :test #'equal))) + ((&plist 'lsp-completion-item item + 'lsp-completion-start-point start-point + 'lsp-completion-markers markers + 'lsp-completion-resolved resolved + 'lsp-completion-prefix prefix) + (text-properties-at 0 candidate)) + ((&CompletionItem? :label :insert-text? :text-edit? :insert-text-format? + :additional-text-edits? :insert-text-mode? :command?) + ;; see #3498 typescript-language-server does not provide the + ;; proper insertText without resolving. + (if (and (lsp-completion--find-workspace 'ts-ls) + (not resolved)) + (lsp-completion--resolve item) + item))) + (cond + (text-edit? + (apply #'delete-region markers) + (insert prefix) + (pcase text-edit? + ((TextEdit) (lsp--apply-text-edit text-edit?)) + ((InsertReplaceEdit :insert :replace :new-text) + (lsp--apply-text-edit + (lsp-make-text-edit + :new-text new-text + :range (if (or (and current-prefix-arg (eq lsp-completion-default-behaviour :replace)) + (and (not current-prefix-arg) (eq lsp-completion-default-behaviour :insert))) + insert + replace)))))) + ((or (unless (lsp-falsy? insert-text?) insert-text?) label) + (apply #'delete-region markers) + (insert prefix) + (delete-region start-point (point)) + (insert (or (unless (lsp-falsy? insert-text?) insert-text?) label)))) + + (lsp--indent-lines start-point (point) insert-text-mode?) + (when (equal insert-text-format? lsp/insert-text-format-snippet) + (lsp--expand-snippet (buffer-substring start-point (point)) + start-point + (point))) + + (when lsp-completion-enable-additional-text-edit + (if (or (get-text-property 0 'lsp-completion-resolved candidate) + (not (seq-empty-p additional-text-edits?))) + (lsp--apply-text-edits additional-text-edits? 'completion) + (-let [(callback cleanup-fn) (lsp--create-apply-text-edits-handlers)] + (lsp-completion--resolve-async + item + (-compose callback #'lsp:completion-item-additional-text-edits?) + cleanup-fn)))) + + (if (or (get-text-property 0 'lsp-completion-resolved candidate) + command?) + (when command? (lsp--execute-command command?)) + (lsp-completion--resolve-async + item + (-lambda ((&CompletionItem? :command?)) + (when command? (lsp--execute-command command?))))) + + (when (and (or + (equal lsp-signature-auto-activate t) + (memq :after-completion lsp-signature-auto-activate) + (and (memq :on-trigger-char lsp-signature-auto-activate) + (-when-let ((&SignatureHelpOptions? :trigger-characters?) + (lsp--capability :signatureHelpProvider)) + (lsp-completion--looking-back-trigger-characterp + trigger-characters?)))) + (lsp-feature? "textDocument/signatureHelp")) + (lsp-signature-activate)) + + (setq-local lsp-inhibit-lsp-hooks nil)) + (lsp-completion--clear-cache))) + +(defun lsp-completion--regex-fuz (str) + "Build a regex sequence from STR. Insert .* between each char." + (apply #'concat + (cl-mapcar + #'concat + (cons "" (cdr (seq-map (lambda (c) (format "[^%c]*" c)) str))) + (seq-map (lambda (c) + (format "\\(%s\\)" (regexp-quote (char-to-string c)))) + str)))) + +(defun lsp-completion--fuz-score (query str) + "Calculate fuzzy score for STR with query QUERY. +The return is nil or in range of (0, inf)." + (-when-let* ((md (cddr (or (get-text-property 0 'match-data str) + (let ((re (lsp-completion--regex-fuz query))) + (when (string-match re str) + (match-data)))))) + (start (pop md)) + (len (length str)) + ;; To understand how this works, consider these bad ascii(tm) + ;; diagrams showing how the pattern "foo" flex-matches + ;; "fabrobazo", "fbarbazoo" and "barfoobaz": + + ;; f abr o baz o + ;; + --- + --- + + + ;; f barbaz oo + ;; + ------ ++ + + ;; bar foo baz + ;; --- +++ --- + + ;; "+" indicates parts where the pattern matched. A "hole" in + ;; the middle of the string is indicated by "-". Note that there + ;; are no "holes" near the edges of the string. The completion + ;; score is a number bound by ]0..1]: the higher the better and + ;; only a perfect match (pattern equals string) will have score + ;; 1. The formula takes the form of a quotient. For the + ;; numerator, we use the number of +, i.e. the length of the + ;; pattern. For the denominator, it first computes + ;; + ;; hole_i_contrib = 1 + (Li-1)^1.05 for first hole + ;; hole_i_contrib = 1 + (Li-1)^0.25 for hole i of length Li + ;; + ;; The final value for the denominator is then given by: + ;; + ;; (SUM_across_i(hole_i_contrib) + 1) + ;; + (score-numerator 0) + (score-denominator 0) + (last-b -1) + (q-ind 0) + (update-score + (lambda (a b) + "Update score variables given match range (A B)." + (setq score-numerator (+ score-numerator (- b a))) + (unless (= a len) + ;; case mismatch will be pushed to near next rank + (unless (equal (aref query q-ind) (aref str a)) + (cl-incf a 0.9)) + (setq score-denominator + (+ score-denominator + (if (= a last-b) 0 + (+ 1 (* (if (< 0 (- a last-b 1)) 1 -1) + (expt (abs (- a last-b 1)) + ;; Give a higher score for match near start + (if (eq last-b -1) 0.75 0.25)))))))) + (setq last-b b)))) + (while md + (funcall update-score start (cl-first md)) + ;; Due to the way completion regex is constructed, `(eq end (+ start 1))` + (cl-incf q-ind) + (pop md) + (setq start (pop md))) + (unless (zerop len) + (/ score-numerator (1+ score-denominator) 1.0)))) + +(defun lsp-completion--fix-resolve-data (item) + "Patch `CompletionItem' ITEM for rust-analyzer otherwise resolve will fail. +See #2675" + (let ((data (lsp:completion-item-data? item))) + (when (lsp-member? data :import_for_trait_assoc_item) + (unless (lsp-get data :import_for_trait_assoc_item) + (lsp-put data :import_for_trait_assoc_item :json-false))))) + +(defun lsp-completion--resolve (item) + "Resolve completion ITEM." + (cl-assert item nil "Completion item must not be nil") + (lsp-completion--fix-resolve-data item) + (or (ignore-errors + (when (lsp-feature? "completionItem/resolve") + (lsp-request "completionItem/resolve" + (lsp-delete (lsp-copy item) :_emacsStartPoint)))) + item)) + +(defun lsp-completion--resolve-async (item callback &optional cleanup-fn) + "Resolve completion ITEM asynchronously with CALLBACK. +The CLEANUP-FN will be called to cleanup." + (cl-assert item nil "Completion item must not be nil") + (lsp-completion--fix-resolve-data item) + (ignore-errors + (if (lsp-feature? "completionItem/resolve") + (lsp-request-async "completionItem/resolve" + (lsp-delete (lsp-copy item) :_emacsStartPoint) + (lambda (result) + (funcall callback result) + (when cleanup-fn (funcall cleanup-fn))) + :error-handler (lambda (err) + (when cleanup-fn (funcall cleanup-fn)) + (error (lsp:json-error-message err))) + :cancel-handler cleanup-fn + :mode 'alive) + (funcall callback item) + (when cleanup-fn (funcall cleanup-fn))))) + + +;;;###autoload +(defun lsp-completion--enable () + "Enable LSP completion support." + (when (and lsp-completion-enable + (lsp-feature? "textDocument/completion")) + (lsp-completion-mode 1))) + +(defun lsp-completion--disable () + "Disable LSP completion support." + (lsp-completion-mode -1)) + +(defun lsp-completion-passthrough-all-completions (_string table pred _point) + "Like `completion-basic-all-completions' but have prefix ignored. +TABLE PRED" + (completion-basic-all-completions "" table pred 0)) + +;;;###autoload +(define-minor-mode lsp-completion-mode + "Toggle LSP completion support." + :group 'lsp-completion + :global nil + :lighter "" + (let ((completion-started-fn (lambda (&rest _) + (setq-local lsp-inhibit-lsp-hooks t))) + (after-completion-fn (lambda (result) + (when (stringp result) + (lsp-completion--clear-cache)) + (setq-local lsp-inhibit-lsp-hooks nil)))) + (cond + (lsp-completion-mode + (make-local-variable 'completion-at-point-functions) + ;; Ensure that `lsp-completion-at-point' the first CAPF to be tried, + ;; unless user has put it elsewhere in the list by their own + (add-to-list 'completion-at-point-functions #'lsp-completion-at-point) + (make-local-variable 'completion-category-defaults) + (setf (alist-get 'lsp-capf completion-category-defaults) '((styles . (lsp-passthrough)))) + (make-local-variable 'completion-styles-alist) + (setf (alist-get 'lsp-passthrough completion-styles-alist) + '(completion-basic-try-completion + lsp-completion-passthrough-all-completions + "Passthrough completion.")) + + (cond + ((equal lsp-completion-provider :none)) + ((and (not (equal lsp-completion-provider :none)) + (fboundp 'company-mode)) + (setq-local company-abort-on-unique-match nil) + (company-mode 1) + (setq-local company-backends (cl-adjoin 'company-capf company-backends :test #'equal))) + (t + (lsp--warn "Unable to autoconfigure company-mode."))) + + (when (bound-and-true-p company-mode) + (add-hook 'company-completion-started-hook + completion-started-fn + nil + t) + (add-hook 'company-after-completion-hook + after-completion-fn + nil + t)) + (add-hook 'lsp-unconfigure-hook #'lsp-completion--disable nil t)) + (t + (remove-hook 'completion-at-point-functions #'lsp-completion-at-point t) + (setq-local completion-category-defaults + (cl-remove 'lsp-capf completion-category-defaults :key #'cl-first)) + (setq-local completion-styles-alist + (cl-remove 'lsp-passthrough completion-styles-alist :key #'cl-first)) + (remove-hook 'lsp-unconfigure-hook #'lsp-completion--disable t) + (when (featurep 'company) + (remove-hook 'company-completion-started-hook + completion-started-fn + t) + (remove-hook 'company-after-completion-hook + after-completion-fn + t)))))) + +;;;###autoload +(add-hook 'lsp-configure-hook (lambda () + (when (and lsp-auto-configure + lsp-completion-enable) + (lsp-completion--enable)))) + +(lsp-consistency-check lsp-completion) + +(provide 'lsp-completion) +;;; lsp-completion.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-credo.el b/code/elpa/lsp-mode-20240319.1043/lsp-credo.el new file mode 100644 index 0000000..b42631c --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-credo.el @@ -0,0 +1,97 @@ +;;; lsp-credo.el --- lsp-mode Credo integration -*- lexical-binding: t; -*- + +;; Copyright (C) 2023 Wilhelm H Kirschbaum + +;; Author: Wilhelm H Kirschbaum +;; Keywords: lsp, elixir, credo + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP Client for Elixir Credo + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-credo nil + "Settings for credo language server." + :group 'lsp-mode + :link '(url-link "https://github.com/elixir-tools/credo-language-server") + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-credo-command + `(,(f-join lsp-server-install-dir "credo-language-server" + "credo-language-server") + "--stdio=true") + "The command that starts credo-language-server." + :type '(repeat :tag "List of string values" string) + :group 'lsp-credo + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-credo-version "0.3.0" + "Credo language server version to download. +It has to be set before `lsp-credo.el' is loaded and it has to +be available here: https://github.com/elixir-tools/credo-language-server/releases." + :type 'string + :group 'lsp-credo + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-credo-download-url + (format (concat "https://github.com/elixir-tools/credo-language-server" + "/releases/download/v%s/credo-language-server") + lsp-credo-version) + "Automatic download url for credo-language-server." + :type 'string + :group 'lsp-credo + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-credo-binary-path + (f-join lsp-server-install-dir + "credo-language-server" + "credo-language-server") + "The path to `credo-language-server' binary." + :type 'file + :group 'lsp-credo + :package-version '(lsp-mode . "8.0.1")) + +(lsp-dependency + 'credo-language-server + `(:download :url lsp-credo-download-url + :store-path lsp-credo-binary-path + :set-executable? t)) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection + (lambda () + `(,(or (executable-find + (cl-first lsp-credo-command)) + (lsp-package-path 'credo-language-server)) + ,@(cl-rest lsp-credo-command)))) + :activation-fn (lsp-activate-on "elixir") + :priority -1 + :add-on? t + :multi-root nil + :server-id 'credo-language-server + :download-server-fn + (lambda (_client callback error-callback _update?) + (lsp-package-ensure 'credo-language-server callback error-callback)))) + +(lsp-consistency-check lsp-credo) + +(provide 'lsp-credo) + +;;; lsp-credo.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-crystal.el b/code/elpa/lsp-mode-20240319.1043/lsp-crystal.el new file mode 100644 index 0000000..c447932 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-crystal.el @@ -0,0 +1,48 @@ +;;; lsp-crystal.el --- description -*- lexical-binding: t; -*- + +;; Copyright (C) 2020 emacs-lsp maintainers + +;; Author: emacs-lsp maintainers +;; Keywords: lsp, crystal + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP Clients for the Crystal Programming Language. + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-crystalline nil + "LSP support for Crystal via crystalline." + :group 'lsp-mode + :link '(url-link "https://github.com/elbywan/crystalline")) + +(defcustom lsp-clients-crystal-executable '("crystalline" "--stdio") + "Command to start the crystalline language server." + :group 'lsp-crystalline + :risky t + :type 'file) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection lsp-clients-crystal-executable) + :major-modes '(crystal-mode) + :server-id 'crystalline)) + +(lsp-consistency-check lsp-crystal) + +(provide 'lsp-crystal) +;;; lsp-crystal.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-csharp.el b/code/elpa/lsp-mode-20240319.1043/lsp-csharp.el new file mode 100644 index 0000000..bb62a6c --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-csharp.el @@ -0,0 +1,467 @@ +;;; lsp-csharp.el --- description -*- lexical-binding: t; -*- + +;; Copyright (C) 2019 Jostein Kjønigsen, Saulius Menkevicius + +;; Author: Saulius Menkevicius +;; Keywords: + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; lsp-csharp client + +;;; Code: + +(require 'lsp-mode) +(require 'gnutls) +(require 'f) + +(defgroup lsp-csharp nil + "LSP support for C#, using the Omnisharp Language Server. +Version 1.34.3 minimum is required." + :group 'lsp-mode + :link '(url-link "https://github.com/OmniSharp/omnisharp-roslyn")) + +(defgroup lsp-csharp-omnisharp nil + "LSP support for C#, using the Omnisharp Language Server. +Version 1.34.3 minimum is required." + :group 'lsp-mode + :link '(url-link "https://github.com/OmniSharp/omnisharp-roslyn") + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-csharp-server-install-dir + (f-join lsp-server-install-dir "omnisharp-roslyn/") + "Installation directory for OmniSharp Roslyn server." + :group 'lsp-csharp-omnisharp + :type 'directory) + +(defcustom lsp-csharp-server-path + nil + "The path to the OmniSharp Roslyn language-server binary. +Set this if you have the binary installed or have it built yourself." + :group 'lsp-csharp-omnisharp + :type '(string :tag "Single string value or nil")) + +(defcustom lsp-csharp-test-run-buffer-name + "*lsp-csharp test run*" + "The name of buffer used for outputting lsp-csharp test run results." + :group 'lsp-csharp-omnisharp + :type 'string) + +(defcustom lsp-csharp-solution-file + nil + "Solution to load when starting the server. +Usually this is to be set in your .dir-locals.el on the project root directory." + :group 'lsp-csharp-omnisharp + :type 'string) + +(defcustom lsp-csharp-omnisharp-roslyn-download-url + (concat "https://github.com/omnisharp/omnisharp-roslyn/releases/latest/download/" + (cond ((eq system-type 'windows-nt) + ; On Windows we're trying to avoid a crash starting 64bit .NET PE binaries in + ; Emacs by using x86 version of omnisharp-roslyn on older (<= 26.4) versions + ; of Emacs. See https://lists.nongnu.org/archive/html/bug-gnu-emacs/2017-06/msg00893.html" + (if (and (string-match "^x86_64-.*" system-configuration) + (version<= "26.4" emacs-version)) + "omnisharp-win-x64.zip" + "omnisharp-win-x86.zip")) + + ((eq system-type 'darwin) + (if (string-match "aarch64-.*" system-configuration) + "omnisharp-osx-arm64-net6.0.zip" + "omnisharp-osx-x64-net6.0.zip")) + + ((and (eq system-type 'gnu/linux) + (or (eq (string-match "^x86_64" system-configuration) 0) + (eq (string-match "^i[3-6]86" system-configuration) 0))) + "omnisharp-linux-x64-net6.0.zip") + + (t "omnisharp-mono.zip"))) + "Automatic download url for omnisharp-roslyn." + :group 'lsp-csharp-omnisharp + :type 'string) + +(defcustom lsp-csharp-omnisharp-roslyn-store-path + (f-join lsp-csharp-server-install-dir "latest" "omnisharp-roslyn.zip") + "The path where omnisharp-roslyn .zip archive will be stored." + :group 'lsp-csharp-omnisharp + :type 'file) + +(defcustom lsp-csharp-omnisharp-roslyn-binary-path + (f-join lsp-csharp-server-install-dir "latest" (if (eq system-type 'windows-nt) + "OmniSharp.exe" + "OmniSharp")) + "The path where omnisharp-roslyn binary after will be stored." + :group 'lsp-csharp-omnisharp + :type 'file) + +(defcustom lsp-csharp-omnisharp-roslyn-server-dir + (f-join lsp-csharp-server-install-dir "latest" "omnisharp-roslyn") + "The path where omnisharp-roslyn .zip archive will be extracted." + :group 'lsp-csharp-omnisharp + :type 'file) + +(lsp-dependency + 'omnisharp-roslyn + `(:download :url lsp-csharp-omnisharp-roslyn-download-url + :decompress :zip + :store-path lsp-csharp-omnisharp-roslyn-store-path + :binary-path lsp-csharp-omnisharp-roslyn-binary-path + :set-executable? t) + '(:system "OmniSharp")) + +(defun lsp-csharp--omnisharp-download-server (_client callback error-callback _update?) + "Download zip package for omnisharp-roslyn and install it. +Will invoke CALLBACK on success, ERROR-CALLBACK on error." + (lsp-package-ensure 'omnisharp-roslyn callback error-callback)) + +(defun lsp-csharp--language-server-path () + "Resolve path to use to start the server." + (let ((executable-name (if (eq system-type 'windows-nt) + "OmniSharp.exe" + "OmniSharp"))) + (or (and lsp-csharp-server-path + (executable-find lsp-csharp-server-path)) + (executable-find executable-name) + (lsp-package-path 'omnisharp-roslyn)))) + +(defun lsp-csharp-open-project-file () + "Open corresponding project file (.csproj) for the current file." + (interactive) + (-let* ((project-info-req (lsp-make-omnisharp-project-information-request :file-name (buffer-file-name))) + (project-info (lsp-request "o#/project" project-info-req)) + ((&omnisharp:ProjectInformation :ms-build-project) project-info) + ((&omnisharp:MsBuildProject :path) ms-build-project)) + (find-file path))) + +(defun lsp-csharp--get-buffer-code-elements () + "Retrieve code structure by calling into the /v2/codestructure endpoint. +Returns :elements from omnisharp:CodeStructureResponse." + (-let* ((code-structure (lsp-request "o#/v2/codestructure" + (lsp-make-omnisharp-code-structure-request :file-name (buffer-file-name)))) + ((&omnisharp:CodeStructureResponse :elements) code-structure)) + elements)) + +(defun lsp-csharp--inspect-code-elements-recursively (fn elements) + "Invoke FN for every omnisharp:CodeElement found recursively in ELEMENTS." + (seq-each + (lambda (el) + (funcall fn el) + (-let (((&omnisharp:CodeElement :children) el)) + (lsp-csharp--inspect-code-elements-recursively fn children))) + elements)) + +(defun lsp-csharp--collect-code-elements-recursively (predicate elements) + "Flatten the omnisharp:CodeElement tree in ELEMENTS matching PREDICATE." + (let ((results nil)) + (lsp-csharp--inspect-code-elements-recursively (lambda (el) + (when (funcall predicate el) + (setq results (cons el results)))) + elements) + results)) + +(lsp-defun lsp-csharp--l-c-within-range (l c (&omnisharp:Range :start :end)) + "Determine if L (line) and C (column) are within RANGE." + (-let* (((&omnisharp:Point :line start-l :column start-c) start) + ((&omnisharp:Point :line end-l :column end-c) end)) + (or (and (= l start-l) (>= c start-c) (or (> end-l start-l) (<= c end-c))) + (and (> l start-l) (< l end-l)) + (and (= l end-l) (<= c end-c))))) + +(defun lsp-csharp--code-element-stack-on-l-c (l c elements) + "Return omnisharp:CodeElement stack at L (line) and C (column) in ELEMENTS tree." + (when-let ((matching-element (seq-find (lambda (el) + (-when-let* (((&omnisharp:CodeElement :ranges) el) + ((&omnisharp:RangeList :full?) ranges)) + (lsp-csharp--l-c-within-range l c full?))) + elements))) + (-let (((&omnisharp:CodeElement :children) matching-element)) + (cons matching-element (lsp-csharp--code-element-stack-on-l-c l c children))))) + +(defun lsp-csharp--code-element-stack-at-point () + "Return omnisharp:CodeElement stack at point as a list." + (let ((pos-line (plist-get (lsp--cur-position) :line)) + (pos-col (plist-get (lsp--cur-position) :character))) + (lsp-csharp--code-element-stack-on-l-c pos-line + pos-col + (lsp-csharp--get-buffer-code-elements)))) + +(lsp-defun lsp-csharp--code-element-test-method-p (element) + "Return test method name and test framework for a given ELEMENT." + (when element + (-when-let* (((&omnisharp:CodeElement :properties) element) + ((&omnisharp:CodeElementProperties :test-method-name? :test-framework?) properties)) + (list test-method-name? test-framework?)))) + +(defun lsp-csharp--reset-test-buffer (present-buffer) + "Create new or reuse an existing test result output buffer. +PRESENT-BUFFER will make the buffer be presented to the user." + (with-current-buffer (get-buffer-create lsp-csharp-test-run-buffer-name) + (compilation-mode) + (read-only-mode) + (let ((inhibit-read-only t)) + (erase-buffer))) + + (when present-buffer + (display-buffer lsp-csharp-test-run-buffer-name))) + +(defun lsp-csharp--start-tests (test-method-framework test-method-names) + "Run test(s) identified by TEST-METHOD-NAMES using TEST-METHOD-FRAMEWORK." + (if (and test-method-framework test-method-names) + (let ((request-message (lsp-make-omnisharp-run-tests-in-class-request + :file-name (buffer-file-name) + :test-frameworkname test-method-framework + :method-names (vconcat test-method-names)))) + (lsp-csharp--reset-test-buffer t) + (lsp-session-set-metadata "last-test-method-framework" test-method-framework) + (lsp-session-set-metadata "last-test-method-names" test-method-names) + (lsp-request-async "o#/v2/runtestsinclass" + request-message + (-lambda ((&omnisharp:RunTestResponse)) + (message "lsp-csharp: Test run has started")))) + (message "lsp-csharp: No test methods to run"))) + +(defun lsp-csharp--test-message (message) + "Emit a MESSAGE to lsp-csharp test run buffer." + (when-let ((existing-buffer (get-buffer lsp-csharp-test-run-buffer-name)) + (inhibit-read-only t)) + (with-current-buffer existing-buffer + (save-excursion + (goto-char (point-max)) + (insert message "\n"))))) + +(defun lsp-csharp-run-test-at-point () + "Start test run at current point (if any)." + (interactive) + (let* ((stack (lsp-csharp--code-element-stack-at-point)) + (element-on-point (car (last stack))) + (test-method (lsp-csharp--code-element-test-method-p element-on-point)) + (test-method-name (car test-method)) + (test-method-framework (car (cdr test-method)))) + (lsp-csharp--start-tests test-method-framework (list test-method-name)))) + +(defun lsp-csharp-run-all-tests-in-buffer () + "Run all test methods in the current buffer." + (interactive) + (let* ((elements (lsp-csharp--get-buffer-code-elements)) + (test-methods (lsp-csharp--collect-code-elements-recursively 'lsp-csharp--code-element-test-method-p elements)) + (test-method-framework (car (cdr (lsp-csharp--code-element-test-method-p (car test-methods))))) + (test-method-names (mapcar (lambda (method) + (car (lsp-csharp--code-element-test-method-p method))) + test-methods))) + (lsp-csharp--start-tests test-method-framework test-method-names))) + +(defun lsp-csharp-run-test-in-buffer () + "Run selected test in current buffer." + (interactive) + (when-let* ((elements (lsp-csharp--get-buffer-code-elements)) + (test-methods (lsp-csharp--collect-code-elements-recursively 'lsp-csharp--code-element-test-method-p elements)) + (test-method-framework (car (cdr (lsp-csharp--code-element-test-method-p (car test-methods))))) + (test-method-names (mapcar (lambda (method) + (car (lsp-csharp--code-element-test-method-p method))) + test-methods)) + (selected-test-method-name (lsp--completing-read "Select test:" test-method-names 'identity))) + (lsp-csharp--start-tests test-method-framework (list selected-test-method-name)))) + +(defun lsp-csharp-run-last-tests () + "Re-run test(s) that were run last time." + (interactive) + (if-let ((last-test-method-framework (lsp-session-get-metadata "last-test-method-framework")) + (last-test-method-names (lsp-session-get-metadata "last-test-method-names"))) + (lsp-csharp--start-tests last-test-method-framework last-test-method-names) + (message "lsp-csharp: No test method(s) found to be ran previously on this workspace"))) + +(lsp-defun lsp-csharp--handle-os-error (_workspace (&omnisharp:ErrorMessage :file-name :text)) + "Handle the `o#/error' (interop) notification displaying a message." + (lsp-warn "%s: %s" file-name text)) + +(lsp-defun lsp-csharp--handle-os-testmessage (_workspace (&omnisharp:TestMessageEvent :message)) + "Handle the `o#/testmessage and display test message on test output buffer." + (lsp-csharp--test-message message)) + +(lsp-defun lsp-csharp--handle-os-testcompleted (_workspace (&omnisharp:DotNetTestResult + :method-name + :outcome + :error-message + :error-stack-trace + :standard-output + :standard-error)) + "Handle the `o#/testcompleted' message from the server. + +Will display the results of the test on the lsp-csharp test output buffer." + (let ((passed (string-equal "passed" outcome))) + (lsp-csharp--test-message + (format "[%s] %s " + (propertize (upcase outcome) 'font-lock-face (if passed 'success 'error)) + method-name)) + + (unless passed + (lsp-csharp--test-message error-message) + + (when error-stack-trace + (lsp-csharp--test-message error-stack-trace)) + + (unless (seq-empty-p standard-output) + (lsp-csharp--test-message "STANDARD OUTPUT:") + (seq-doseq (stdout-line standard-output) + (lsp-csharp--test-message stdout-line))) + + (unless (seq-empty-p standard-error) + (lsp-csharp--test-message "STANDARD ERROR:") + (seq-doseq (stderr-line standard-error) + (lsp-csharp--test-message stderr-line)))))) + +(lsp-defun lsp-csharp--action-client-find-references ((&Command :arguments?)) + "Read first argument from ACTION as Location and display xrefs for that location +using the `textDocument/references' request." + (-if-let* (((&Location :uri :range) (lsp-seq-first arguments?)) + ((&Range :start range-start) range) + (find-refs-params (append (lsp--text-document-position-params (list :uri uri) range-start) + (list :context (list :includeDeclaration json-false)))) + (locations-found (lsp-request "textDocument/references" find-refs-params))) + (lsp-show-xrefs (lsp--locations-to-xref-items locations-found) nil t) + (message "No references found"))) + +(lsp-register-client + (make-lsp-client :new-connection + (lsp-stdio-connection + #'(lambda () + (append + (list (lsp-csharp--language-server-path) "-lsp") + (when lsp-csharp-solution-file + (list "-s" (expand-file-name lsp-csharp-solution-file))))) + #'(lambda () + (when-let ((binary (lsp-csharp--language-server-path))) + (f-exists? binary)))) + :activation-fn (lsp-activate-on "csharp") + :server-id 'omnisharp + :priority -1 + :action-handlers (ht ("omnisharp/client/findReferences" 'lsp-csharp--action-client-find-references)) + :notification-handlers (ht ("o#/projectadded" 'ignore) + ("o#/projectchanged" 'ignore) + ("o#/projectremoved" 'ignore) + ("o#/packagerestorestarted" 'ignore) + ("o#/msbuildprojectdiagnostics" 'ignore) + ("o#/packagerestorefinished" 'ignore) + ("o#/unresolveddependencies" 'ignore) + ("o#/error" 'lsp-csharp--handle-os-error) + ("o#/testmessage" 'lsp-csharp--handle-os-testmessage) + ("o#/testcompleted" 'lsp-csharp--handle-os-testcompleted) + ("o#/projectconfiguration" 'ignore) + ("o#/projectdiagnosticstatus" 'ignore) + ("o#/backgrounddiagnosticstatus" 'ignore)) + :download-server-fn #'lsp-csharp--omnisharp-download-server)) + +;; +;; Alternative "csharp-ls" language server support +;; see https://github.com/razzmatazz/csharp-language-server +;; +(lsp-defun lsp-csharp--cls-metadata-uri-handler (uri) + "Handle `csharp:/(metadata)' uri from csharp-ls server. + +`csharp/metadata' request is issued to retrieve metadata from the server. +A cache file is created on project root dir that stores this metadata and +filename is returned so lsp-mode can display this file." + + (-when-let* ((metadata-req (lsp-make-csharp-ls-c-sharp-metadata + :text-document (lsp-make-text-document-identifier :uri uri))) + (metadata (lsp-request "csharp/metadata" metadata-req)) + ((&csharp-ls:CSharpMetadataResponse :project-name + :assembly-name + :symbol-name + :source) metadata) + (filename (f-join ".cache" + "lsp-csharp" + "metadata" + "projects" project-name + "assemblies" assembly-name + (concat symbol-name ".cs"))) + (file-location (expand-file-name filename (lsp-workspace-root))) + (metadata-file-location (concat file-location ".metadata-uri")) + (path (f-dirname file-location))) + + (unless (file-exists-p file-location) + (unless (file-directory-p path) + (make-directory path t)) + + (with-temp-file metadata-file-location + (insert uri)) + + (with-temp-file file-location + (insert source))) + + file-location)) + +(defun lsp-csharp--cls-before-file-open (_workspace) + "Set `lsp-buffer-uri' variable after C# file is open from *.metadata-uri file." + + (let ((metadata-file-name (concat buffer-file-name ".metadata-uri"))) + (setq-local lsp-buffer-uri + (when (file-exists-p metadata-file-name) + (with-temp-buffer (insert-file-contents metadata-file-name) + (buffer-string)))))) + +(defun lsp-csharp--cls-make-launch-cmd () + "Return command line to invoke csharp-ls." + + ;; emacs-28.1 on macOS has an issue + ;; that it launches processes using posix_spawn but does not reset sigmask properly + ;; thus causing dotnet runtime to lockup awaiting a SIGCHLD signal that never comes + ;; from subprocesses that quit + ;; + ;; as a workaround we will wrap csharp-ls invocation in "/bin/ksh -c" on macos + ;; so it launches with proper sigmask + ;; + ;; see https://lists.gnu.org/archive/html/emacs-devel/2022-02/msg00461.html + + (let ((startup-wrapper (cond ((and (eq 'darwin system-type) + (version= "28.1" emacs-version)) + (list "/bin/ksh" "-c")) + + (t nil))) + + (csharp-ls-exec (or (executable-find "csharp-ls") + (f-join (or (getenv "USERPROFILE") (getenv "HOME")) + ".dotnet" "tools" "csharp-ls"))) + + (solution-file-params (when lsp-csharp-solution-file + (list "-s" lsp-csharp-solution-file)))) + (append startup-wrapper + (list csharp-ls-exec) + solution-file-params))) + +(defun lsp-csharp--cls-download-server (_client callback error-callback update?) + "Install/update csharp-ls language server using `dotnet tool'. + +Will invoke CALLBACK or ERROR-CALLBACK based on result. +Will update if UPDATE? is t" + (lsp-async-start-process + callback + error-callback + "dotnet" "tool" (if update? "update" "install") "-g" "csharp-ls")) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection #'lsp-csharp--cls-make-launch-cmd) + :priority -2 + :server-id 'csharp-ls + :activation-fn (lsp-activate-on "csharp") + :before-file-open-fn #'lsp-csharp--cls-before-file-open + :uri-handlers (ht ("csharp" #'lsp-csharp--cls-metadata-uri-handler)) + :download-server-fn #'lsp-csharp--cls-download-server)) + +(lsp-consistency-check lsp-csharp) + +(provide 'lsp-csharp) +;;; lsp-csharp.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-css.el b/code/elpa/lsp-mode-20240319.1043/lsp-css.el new file mode 100644 index 0000000..b825a36 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-css.el @@ -0,0 +1,254 @@ +;;; lsp-css.el --- CSS language server configuration -*- lexical-binding: t; -*- + +;; Copyright (C) 2019 Ivan Yonchovski + +;; Author: Ivan Yonchovski +;; Keywords: + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; + +;;; Code: + +(require 'lsp-protocol) +(require 'lsp-mode) + +(defgroup lsp-css nil + "LSP support for CSS." + :group 'lsp-mode + :link '(url-link + "https://github.com/microsoft/vscode/tree/main/extensions/css-language-features/server")) + +(defcustom lsp-css-experimental-custom-data nil + "A list of JSON file paths that define custom CSS data that +loads custom properties, at directives, pseudo classes / +elements." + :type '(repeat string)) + +(defcustom lsp-css-completion-trigger-property-value-completion t + "By default, VS Code triggers property value completion after +selecting a CSS property. Use this setting to disable this +behavior." + :type 'boolean) + +(defcustom lsp-css-validate t + "Enables or disables all validations." + :type 'boolean) + +(defcustom lsp-css-lint-compatible-vendor-prefixes "ignore" + "When using a vendor-specific prefix make sure to also include +all other vendor-specific properties." + :type '(choice + (const "ignore") + (const "warning") + (const "error"))) + +(defcustom lsp-css-lint-vendor-prefix "warning" + "When using a vendor-specific prefix, also include the standard +property." + :type '(choice + (const "ignore") + (const "warning") + (const "error"))) + +(defcustom lsp-css-lint-duplicate-properties "ignore" + "Do not use duplicate style definitions." + :type '(choice + (const "ignore") + (const "warning") + (const "error"))) + +(defcustom lsp-css-lint-empty-rules "warning" + "Do not use empty rulesets." + :type '(choice + (const "ignore") + (const "warning") + (const "error"))) + +(defcustom lsp-css-lint-import-statement "ignore" + "Import statements do not load in parallel." + :type '(choice + (const "ignore") + (const "warning") + (const "error"))) + +(defcustom lsp-css-lint-box-model "ignore" + nil + :type '(choice + (const "ignore") + (const "warning") + (const "error"))) + +(defcustom lsp-css-lint-universal-selector "ignore" + nil + :type '(choice + (const "ignore") + (const "warning") + (const "error"))) + +(defcustom lsp-css-lint-zero-units "ignore" + "No unit for zero needed." + :type '(choice + (const "ignore") + (const "warning") + (const "error"))) + +(defcustom lsp-css-lint-font-face-properties "warning" + nil + :type '(choice + (const "ignore") + (const "warning") + (const "error"))) + +(defcustom lsp-css-lint-hex-color-length "error" + "Hex colors must consist of three or six hex numbers." + :type '(choice + (const "ignore") + (const "warning") + (const "error"))) + +(defcustom lsp-css-lint-arguments-in-color-function "error" + "Invalid number of parameters." + :type '(choice + (const "ignore") + (const "warning") + (const "error"))) + +(defcustom lsp-css-lint-unknown-properties "warning" + "Unknown property." + :type '(choice + (const "ignore") + (const "warning") + (const "error"))) + +(defcustom lsp-css-lint-valid-properties nil + "A list of properties that are not validated against the +`unknownProperties` rule." + :type '(repeat string)) + +(defcustom lsp-css-lint-ie-hack "ignore" + "IE hacks are only necessary when supporting IE7 and older." + :type '(choice + (const "ignore") + (const "warning") + (const "error"))) + +(defcustom lsp-css-lint-unknown-vendor-specific-properties "ignore" + "Unknown vendor specific property." + :type '(choice + (const "ignore") + (const "warning") + (const "error"))) + +(defcustom lsp-css-lint-property-ignored-due-to-display "warning" + nil + :type '(choice + (const "ignore") + (const "warning") + (const "error"))) + +(defcustom lsp-css-lint-important "ignore" + nil + :type '(choice + (const "ignore") + (const "warning") + (const "error"))) + +(defcustom lsp-css-lint-float "ignore" + nil + :type '(choice + (const "ignore") + (const "warning") + (const "error"))) + +(defcustom lsp-css-lint-id-selector "ignore" + "Selectors should not contain IDs because these rules are too +tightly coupled with the HTML." + :type '(choice + (const "ignore") + (const "warning") + (const "error"))) + +(defcustom lsp-css-lint-unknown-at-rules "warning" + "Unknown at-rule." + :type '(choice + (const "ignore") + (const "warning") + (const "error"))) + +(defcustom lsp-css-trace-server "off" + "Traces the communication between VS Code and the CSS language +server." + :type '(choice + (const "off") + (const "messages") + (const "verbose"))) + +(lsp-register-custom-settings + '(("css.trace.server" lsp-css-trace-server) + ("css.lint.unknownAtRules" lsp-css-lint-unknown-at-rules) + ("css.lint.idSelector" lsp-css-lint-id-selector) + ("css.lint.float" lsp-css-lint-float) + ("css.lint.important" lsp-css-lint-important) + ("css.lint.propertyIgnoredDueToDisplay" lsp-css-lint-property-ignored-due-to-display) + ("css.lint.unknownVendorSpecificProperties" lsp-css-lint-unknown-vendor-specific-properties) + ("css.lint.ieHack" lsp-css-lint-ie-hack) + ("css.lint.validProperties" lsp-css-lint-valid-properties) + ("css.lint.unknownProperties" lsp-css-lint-unknown-properties) + ("css.lint.argumentsInColorFunction" lsp-css-lint-arguments-in-color-function) + ("css.lint.hexColorLength" lsp-css-lint-hex-color-length) + ("css.lint.fontFaceProperties" lsp-css-lint-font-face-properties) + ("css.lint.zeroUnits" lsp-css-lint-zero-units) + ("css.lint.universalSelector" lsp-css-lint-universal-selector) + ("css.lint.boxModel" lsp-css-lint-box-model) + ("css.lint.importStatement" lsp-css-lint-import-statement) + ("css.lint.emptyRules" lsp-css-lint-empty-rules) + ("css.lint.duplicateProperties" lsp-css-lint-duplicate-properties) + ("css.lint.vendorPrefix" lsp-css-lint-vendor-prefix) + ("css.lint.compatibleVendorPrefixes" lsp-css-lint-compatible-vendor-prefixes) + ("css.validate" lsp-css-validate t) + ("css.completion.triggerPropertyValueCompletion" lsp-css-completion-trigger-property-value-completion t) + ("css.experimental.customData" lsp-css-experimental-custom-data))) + +(defun lsp-css--server-command () + "Generate startup command for CSS language server." + (list (lsp-package-path 'css-languageserver) "--stdio")) + +;;; CSS +(lsp-defun lsp-css--apply-code-action ((&Command :arguments?)) + "Apply ACTION as workspace edit command." + (lsp--apply-text-edits (cl-caddr arguments?) 'code-action)) + +(lsp-dependency 'css-languageserver + '(:system "vscode-css-language-server") + '(:npm :package "vscode-langservers-extracted" + :path "vscode-css-language-server")) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection #'lsp-css--server-command) + :activation-fn (lsp-activate-on "css" "scss" "sass" "less") + :priority -1 + :action-handlers (lsp-ht ("_css.applyCodeAction" #'lsp-css--apply-code-action)) + :server-id 'css-ls + :download-server-fn (lambda (_client callback error-callback _update?) + (lsp-package-ensure 'css-languageserver callback error-callback)))) + +(lsp-consistency-check lsp-css) + +(provide 'lsp-css) +;;; lsp-css.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-cucumber.el b/code/elpa/lsp-mode-20240319.1043/lsp-cucumber.el new file mode 100644 index 0000000..dccd0b2 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-cucumber.el @@ -0,0 +1,66 @@ +;;; lsp-cucumber.el --- LSP Clients for Cucumber -*- lexical-binding: t; -*- + +;; Copyright (C) 2024 Shen, Jen-Chieh + +;; This file is not part of GNU Emacs. + +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: +;; +;; LSP server implementation for Cucumber +;; + +;;; Code: + +(defgroup lsp-cucumber nil + "LSP server implementation for Cucumber." + :group 'lsp-mode + :link '(url-link "https://github.com/cucumber/language-server")) + +(defcustom lsp-cucumber-server-path nil + "Path points for Cucumber language server. + +This is only for development use." + :type 'string + :group 'lsp-cucumber) + +(defcustom lsp-cucumber-active-modes + '( feature-mode) + "List of major mode that work with Cucumber language server." + :type 'list + :group 'lsp-cucumber) + +(defun lsp-cucumber--server-command () + "Generate startup command for Cucumber language server." + (or (and lsp-cucumber-server-path + (list lsp-cucumber-server-path "--stdio")) + (list (lsp-package-path 'cucumber-language-server) "--stdio"))) + +(lsp-dependency 'cucumber-language-server + '(:system "cucumber-language-server") + '(:npm :package "@cucumber/language-server" + :path "cucumber-language-server")) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection #'lsp-cucumber--server-command) + :major-modes lsp-cucumber-active-modes + :priority -1 + :server-id 'cucumber-language-server + :download-server-fn (lambda (_client callback error-callback _update?) + (lsp-package-ensure 'cucumber-language-server callback error-callback)))) + +(provide 'lsp-cucumber) +;;; lsp-cucumber.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-cypher.el b/code/elpa/lsp-mode-20240319.1043/lsp-cypher.el new file mode 100644 index 0000000..5f082c6 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-cypher.el @@ -0,0 +1,53 @@ +;;; lsp-cypher.el --- Cypher Client -*- lexical-binding: t; -*- + +;; Copyright (C) 2023 Gustav Hedengran + +;; Author: Gustav Hedengran +;; Keywords: languages lsp cypher + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-cypher nil + "LSP support for Cypher." + :group 'lsp-mode + :link '(url-link "https://github.com/neo4j/cypher-language-support/blob/main/packages/language-server")) + +(lsp-dependency 'cypher-language-server + '(:system "cypher-language-server") + '(:npm :package "@neo4j-cypher/language-server" + :path "cypher-language-server")) + +(defun lsp-client--cypher-ls-server-command () + "Startup command for Cypher language server." + (list (lsp-package-path 'cypher-language-server) "--stdio")) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection #'lsp-client--cypher-ls-server-command) + :activation-fn (lsp-activate-on "cypher") + :language-id "cypher" + :server-id 'cypher-ls + :priority 0 + :download-server-fn (lambda (_client callback error-callback _update?) + (lsp-package-ensure 'cypher-language-server callback error-callback)))) + +(lsp-consistency-check lsp-cypher) + +(provide 'lsp-cypher) +;;; lsp-cypher.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-d.el b/code/elpa/lsp-mode-20240319.1043/lsp-d.el new file mode 100644 index 0000000..d26369a --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-d.el @@ -0,0 +1,41 @@ +;;; lsp-d.el --- lsp-mode dlang integration -*- lexical-binding: t; -*- + +;; Copyright (C) 2021 lsp-mode maintainers + +;; Author: lsp-mode maintainers +;; Keywords: languages + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; client for serve-d + +;;; Code: + +(require 'lsp-mode) +(require 'ht) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection "serve-d") + :major-modes '(d-mode) + :notification-handlers + (ht ("coded/changedSelectedWorkspace" #'ignore) + ("coded/initDubTree" #'ignore)) + :server-id 'serve-d)) + +(lsp-consistency-check lsp-d) + +(provide 'lsp-d) +;;; lsp-d.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-dhall.el b/code/elpa/lsp-mode-20240319.1043/lsp-dhall.el new file mode 100644 index 0000000..7b10597 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-dhall.el @@ -0,0 +1,43 @@ +;;; lsp-dhall.el --- description -*- lexical-binding: t; -*- + +;; Copyright (C) 2020 emacs-lsp maintainers + +;; Author: emacs-lsp maintainers +;; Keywords: lsp, dhall + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP Clients for the Dhall Programming Language. + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-dhall nil + "LSP support for Dhall, using dhall-lsp-server." + :group 'lsp-mode + :link '(url-link "https://github.com/dhall-lang/dhall-haskell")) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection "dhall-lsp-server") + :major-modes '(dhall-mode) + :priority -1 + :server-id 'dhallls)) + +(lsp-consistency-check lsp-dhall) + +(provide 'lsp-dhall) +;;; lsp-dhall.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-diagnostics.el b/code/elpa/lsp-mode-20240319.1043/lsp-diagnostics.el new file mode 100644 index 0000000..9673c10 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-diagnostics.el @@ -0,0 +1,370 @@ +;;; lsp-diagnostics.el --- LSP diagnostics integration -*- lexical-binding: t; -*- +;; +;; Copyright (C) 2020 emacs-lsp maintainers +;; +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . +;; +;;; Commentary: +;; +;; LSP diagnostics integration +;; +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-diagnostics nil + "LSP support for diagnostics" + :prefix "lsp-disagnostics-" + :group 'lsp-mode + :tag "LSP Diagnostics") + +;;;###autoload +(define-obsolete-variable-alias 'lsp-diagnostic-package + 'lsp-diagnostics-provider "lsp-mode 7.0.1") + +(defcustom lsp-diagnostics-provider :auto + "The checker backend provider." + :type + '(choice + (const :tag "Pick flycheck if present and fallback to flymake" :auto) + (const :tag "Pick flycheck" :flycheck) + (const :tag "Pick flymake" :flymake) + (const :tag "Use neither flymake nor lsp" :none) + (const :tag "Prefer flymake" t) + (const :tag "Prefer flycheck" nil)) + :group 'lsp-diagnostics + :package-version '(lsp-mode . "6.3")) + +;;;###autoload +(define-obsolete-variable-alias 'lsp-flycheck-default-level + 'lsp-diagnostics-flycheck-default-level "lsp-mode 7.0.1") + +(defcustom lsp-diagnostics-flycheck-default-level 'error + "Error level to use when the server does not report back a diagnostic level." + :type '(choice + (const error) + (const warning) + (const info)) + :group 'lsp-diagnostics) + +(defcustom lsp-diagnostics-attributes + `((unnecessary :foreground "gray") + (deprecated :strike-through t)) + "The Attributes used on the diagnostics. +List containing (tag attributes) where tag is the LSP diagnostic tag and +attributes is a `plist' containing face attributes which will be applied +on top the flycheck face for that error level." + :type '(repeat (list symbol plist)) + :group 'lsp-diagnostics) + +(defcustom lsp-diagnostics-disabled-modes nil + "A list of major models for which `lsp-diagnostics-mode' should be disabled." + :type '(repeat symbol) + :group 'lsp-diagnostics + :package-version '(lsp-mode . "8.0.0")) + +;; Flycheck integration + +(declare-function flycheck-mode "ext:flycheck") +(declare-function flycheck-define-generic-checker + "ext:flycheck" (symbol docstring &rest properties)) +(declare-function flycheck-error-new "ext:flycheck" t t) +(declare-function flycheck-error-message "ext:flycheck" (err) t) +(declare-function flycheck-define-error-level "ext:flycheck" (level &rest properties)) +(declare-function flycheck-buffer "ext:flycheck") +(declare-function flycheck-valid-checker-p "ext:flycheck") +(declare-function flycheck-stop "ext:flycheck") + +(defvar flycheck-mode) +(defvar flycheck-check-syntax-automatically) +(defvar flycheck-checker) +(defvar flycheck-checkers) + + +(defvar-local lsp-diagnostics--flycheck-enabled nil + "True when lsp diagnostics flycheck integration has been enabled in this buffer.") + +(defvar-local lsp-diagnostics--flycheck-checker nil + "The value of flycheck-checker before lsp diagnostics was activated.") + +(defun lsp-diagnostics--flycheck-level (flycheck-level tags) + "Generate flycheck level from the original FLYCHECK-LEVEL (e. +g. `error', `warning') and list of LSP TAGS." + (let ((name (format "lsp-flycheck-%s-%s" + flycheck-level + (mapconcat #'symbol-name tags "-")))) + (or (intern-soft name) + (let* ((face (--doto (intern (format "%s-face" name)) + (copy-face (-> flycheck-level + (get 'flycheck-overlay-category) + (get 'face)) + it) + (mapc (lambda (tag) + (apply #'set-face-attribute it nil + (cl-rest (assoc tag lsp-diagnostics-attributes)))) + tags))) + (category (--doto (intern (format "%s-category" name)) + (setf (get it 'face) face + (get it 'priority) 100))) + (new-level (intern name)) + (bitmap (or (get flycheck-level 'flycheck-fringe-bitmaps) + (get flycheck-level 'flycheck-fringe-bitmap-double-arrow)))) + (flycheck-define-error-level new-level + :severity (get flycheck-level 'flycheck-error-severity) + :compilation-level (get flycheck-level 'flycheck-compilation-level) + :overlay-category category + :fringe-bitmap bitmap + :fringe-face (get flycheck-level 'flycheck-fringe-face) + :error-list-face face) + new-level)))) + +(defun lsp-diagnostics--flycheck-calculate-level (severity tags) + "Calculate flycheck level by SEVERITY and TAGS." + (let ((level (pcase severity + (1 'error) + (2 'warning) + (3 'info) + (4 'info) + (_ lsp-flycheck-default-level))) + ;; materialize only first tag. + (tags (seq-map (lambda (tag) + (cond + ((= tag lsp/diagnostic-tag-unnecessary) 'unnecessary) + ((= tag lsp/diagnostic-tag-deprecated) 'deprecated))) + tags))) + (if tags + (lsp-diagnostics--flycheck-level level tags) + level))) + +(defun lsp-diagnostics--flycheck-start (checker callback) + "Start an LSP syntax check with CHECKER. + +CALLBACK is the status callback passed by Flycheck." + + (remove-hook 'lsp-on-idle-hook #'lsp-diagnostics--flycheck-buffer t) + + (->> (lsp--get-buffer-diagnostics) + (-map (-lambda ((&Diagnostic :message :severity? :tags? :code? :source? + :range (&Range :start (&Position :line start-line + :character start-character) + :end (&Position :line end-line + :character end-character)))) + (flycheck-error-new + :buffer (current-buffer) + :checker checker + :filename buffer-file-name + :message message + :level (lsp-diagnostics--flycheck-calculate-level severity? tags?) + :id code? + :group source? + :line (lsp-translate-line (1+ start-line)) + :column (1+ (lsp-translate-column start-character)) + :end-line (lsp-translate-line (1+ end-line)) + :end-column (1+ (lsp-translate-column end-character))))) + (funcall callback 'finished))) + +(defun lsp-diagnostics--flycheck-buffer () + "Trigger flyckeck on buffer." + (remove-hook 'lsp-on-idle-hook #'lsp-diagnostics--flycheck-buffer t) + (when (bound-and-true-p flycheck-mode) + (flycheck-buffer))) + +(defun lsp-diagnostics--flycheck-report () + "Report flycheck. +This callback is invoked when new diagnostics are received +from the language server." + (when (and (or (memq 'idle-change flycheck-check-syntax-automatically) + (and (memq 'save flycheck-check-syntax-automatically) + (not (buffer-modified-p)))) + lsp--cur-workspace) + ;; make sure diagnostics are published even if the diagnostics + ;; have been received after idle-change has been triggered + (->> lsp--cur-workspace + (lsp--workspace-buffers) + (mapc (lambda (buffer) + (when (and (lsp-buffer-live-p buffer) + (or + (not (bufferp buffer)) + (and (get-buffer-window buffer) + (not (-contains? (buffer-local-value 'lsp-on-idle-hook buffer) + 'lsp-diagnostics--flycheck-buffer))))) + (lsp-with-current-buffer buffer + (add-hook 'lsp-on-idle-hook #'lsp-diagnostics--flycheck-buffer nil t) + (lsp--idle-reschedule (current-buffer))))))))) + +(cl-defgeneric lsp-diagnostics-flycheck-error-explainer (e _server-id) + "Explain a `flycheck-error' E in a generic way depending on the SERVER-ID." + (flycheck-error-message e)) + +(defvar lsp-diagnostics-mode) ;; properly defined by define-minor-mode below + +;;;###autoload +(defun lsp-diagnostics-lsp-checker-if-needed () + (unless (flycheck-valid-checker-p 'lsp) + (flycheck-define-generic-checker 'lsp + "A syntax checker using the Language Server Protocol (LSP) +provided by lsp-mode. +See https://github.com/emacs-lsp/lsp-mode." + :start #'lsp-diagnostics--flycheck-start + :modes '(lsp-placeholder-mode) ;; placeholder + :predicate (lambda () lsp-diagnostics-mode) + :error-explainer (lambda (e) + (lsp-diagnostics-flycheck-error-explainer + e (lsp--workspace-server-id (car-safe (lsp-workspaces)))))))) + +(defun lsp-diagnostics-flycheck-enable (&rest _) + "Enable flycheck integration for the current buffer." + (require 'flycheck) + (lsp-diagnostics-lsp-checker-if-needed) + (and (not lsp-diagnostics--flycheck-enabled) + (not (eq flycheck-checker 'lsp)) + (setq lsp-diagnostics--flycheck-checker flycheck-checker)) + (setq-local lsp-diagnostics--flycheck-enabled t) + (flycheck-mode 1) + (flycheck-stop) + (setq-local flycheck-checker 'lsp) + (lsp-flycheck-add-mode major-mode) + (add-to-list 'flycheck-checkers 'lsp) + (add-hook 'lsp-diagnostics-updated-hook #'lsp-diagnostics--flycheck-report nil t) + (add-hook 'lsp-managed-mode-hook #'lsp-diagnostics--flycheck-report nil t)) + +(defun lsp-diagnostics-flycheck-disable () + "Disable flycheck integration for the current buffer is it was enabled." + (when lsp-diagnostics--flycheck-enabled + (flycheck-stop) + (when (eq flycheck-checker 'lsp) + (setq-local flycheck-checker lsp-diagnostics--flycheck-checker)) + (setq lsp-diagnostics--flycheck-checker nil) + (setq-local lsp-diagnostics--flycheck-enabled nil) + (when flycheck-mode + (flycheck-mode 1)))) + +;; Flymake integration + +(declare-function flymake-mode "ext:flymake") +(declare-function flymake-make-diagnostic "ext:flymake") +(declare-function flymake-diag-region "ext:flymake") + +(defvar flymake-diagnostic-functions) +(defvar flymake-mode) +(defvar-local lsp-diagnostics--flymake-report-fn nil) + +(defun lsp-diagnostics--flymake-setup () + "Setup flymake." + (setq lsp-diagnostics--flymake-report-fn nil) + (add-hook 'flymake-diagnostic-functions 'lsp-diagnostics--flymake-backend nil t) + (add-hook 'lsp-diagnostics-updated-hook 'lsp-diagnostics--flymake-after-diagnostics nil t) + (flymake-mode 1)) + +(defun lsp-diagnostics--flymake-after-diagnostics () + "Handler for `lsp-diagnostics-updated-hook'." + (cond + ((and lsp-diagnostics--flymake-report-fn flymake-mode) + (lsp-diagnostics--flymake-update-diagnostics)) + ((not flymake-mode) + (setq lsp-diagnostics--flymake-report-fn nil)))) + +(defun lsp-diagnostics--flymake-backend (report-fn &rest _args) + "Flymake backend using REPORT-FN." + (let ((first-run (null lsp-diagnostics--flymake-report-fn))) + (setq lsp-diagnostics--flymake-report-fn report-fn) + (when first-run + (lsp-diagnostics--flymake-update-diagnostics)))) + +(defun lsp-diagnostics--flymake-update-diagnostics () + "Report new diagnostics to flymake." + (funcall lsp-diagnostics--flymake-report-fn + (-some->> (lsp-diagnostics t) + (gethash (lsp--fix-path-casing buffer-file-name)) + (--map (-let* (((&Diagnostic :message :severity? + :range (range &as &Range + :start (&Position :line start-line :character) + :end (&Position :line end-line))) it) + ((start . end) (lsp--range-to-region range))) + (when (= start end) + (if-let ((region (flymake-diag-region (current-buffer) + (1+ start-line) + character))) + (setq start (car region) + end (cdr region)) + (lsp-save-restriction-and-excursion + (goto-char (point-min)) + (setq start (line-beginning-position (1+ start-line)) + end (line-end-position (1+ end-line)))))) + (flymake-make-diagnostic (current-buffer) + start + end + (cl-case severity? + (1 :error) + (2 :warning) + (t :note)) + message)))) + ;; This :region keyword forces flymake to delete old diagnostics in + ;; case the buffer hasn't changed since the last call to the report + ;; function. See https://github.com/joaotavora/eglot/issues/159 + :region (cons (point-min) (point-max)))) + + + +;;;###autoload +(defun lsp-diagnostics--enable () + "Enable LSP checker support." + (when (and (member lsp-diagnostics-provider '(:auto :none :flycheck :flymake t nil)) + (not (member major-mode lsp-diagnostics-disabled-modes))) + (lsp-diagnostics-mode 1))) + +(defun lsp-diagnostics--disable () + "Disable LSP checker support." + (lsp-diagnostics-mode -1)) + +;;;###autoload +(define-minor-mode lsp-diagnostics-mode + "Toggle LSP diagnostics integration." + :group 'lsp-diagnostics + :global nil + :lighter "" + (cond + (lsp-diagnostics-mode + (cond + ((and (or + (and (eq lsp-diagnostics-provider :auto) + (functionp 'flycheck-mode)) + (and (eq lsp-diagnostics-provider :flycheck) + (or (functionp 'flycheck-mode) + (user-error "The lsp-diagnostics-provider is set to :flycheck but flycheck is not installed?"))) + ;; legacy + (null lsp-diagnostics-provider)) + (require 'flycheck nil t)) + (lsp-diagnostics-flycheck-enable)) + ((or (eq lsp-diagnostics-provider :auto) + (eq lsp-diagnostics-provider :flymake) + (eq lsp-diagnostics-provider t)) + (require 'flymake) + (lsp-diagnostics--flymake-setup)) + ((not (eq lsp-diagnostics-provider :none)) + (lsp--warn "Unable to autoconfigure flycheck/flymake. The diagnostics won't be rendered."))) + + (add-hook 'lsp-unconfigure-hook #'lsp-diagnostics--disable nil t)) + (t (lsp-diagnostics-flycheck-disable) + (remove-hook 'lsp-unconfigure-hook #'lsp-diagnostics--disable t)))) + +;;;###autoload +(add-hook 'lsp-configure-hook (lambda () + (when lsp-auto-configure + (lsp-diagnostics--enable)))) + +(lsp-consistency-check lsp-diagnostics) + +(provide 'lsp-diagnostics) +;;; lsp-diagnostics.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-dired.el b/code/elpa/lsp-mode-20240319.1043/lsp-dired.el new file mode 100644 index 0000000..6a8bff5 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-dired.el @@ -0,0 +1,181 @@ +;;; lsp-dired.el --- `lsp-mode' diagnostics integrated into `dired' -*- lexical-binding: t -*- + +;; Copyright (C) 2021 + +;; Author: Alexander Miller +;; Author: Ivan Yonchovski + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: +;;; `lsp-mode' diagnostics integrated into `dired' + +;;; Code: + +(require 'dired) +(require 'pcase) +(require 'lsp-mode) + +(defgroup lsp-dired nil + "LSP support for dired" + :prefix "lsp-dired-" + :group 'lsp-mode + :tag "LSP Dired") + +(defvar lsp-dired--ranger-adjust nil) +(with-eval-after-load 'ranger (setf lsp-dired--ranger-adjust t)) + +(defvar-local lsp-dired-displayed nil + "Flags whether icons have been added.") + +(defvar-local lsp-dired--covered-subdirs nil + "List of subdirs icons were already added for.") + +(defun lsp-dired--display () + "Display the icons of files in a dired buffer." + (when (and (display-graphic-p) + (not lsp-dired-displayed) + dired-subdir-alist) + (setq-local lsp-dired-displayed t) + (pcase-dolist (`(,path . ,pos) dired-subdir-alist) + (lsp-dired--insert-for-subdir path pos)))) + +(defun lsp-dired--insert-for-subdir (path pos) + "Display icons for subdir PATH at given POS." + (let ((buf (current-buffer))) + ;; run the function after current to make sure that we are creating the + ;; overlays after `treemacs-icons-dired' has run. + (run-with-idle-timer + 0.0 nil + (lambda () + (unless (and (member path lsp-dired--covered-subdirs) + (not (buffer-live-p buf))) + (with-current-buffer buf + (add-to-list 'lsp-dired--covered-subdirs path) + (let (buffer-read-only) + (save-excursion + (goto-char pos) + (forward-line (if lsp-dired--ranger-adjust 1 2)) + (cl-block :file + (while (not (eobp)) + (if (dired-move-to-filename nil) + (let* ((file (dired-get-filename nil t)) + (bol (progn + (search-forward-regexp "^[[:space:]]*" (line-end-position) t) + (point))) + (face (lsp-dired--face-for-path file))) + (when face + (-doto (make-overlay bol (line-end-position)) + (overlay-put 'evaporate t) + (overlay-put 'face face)))) + (cl-return-from :file nil)) + (forward-line 1))))))))))) + +(defface lsp-dired-path-face '((t :inherit font-lock-string-face)) + "Face used for breadcrumb paths on headerline." + :group 'lsp-dired) + +(defface lsp-dired-path-error-face + '((t :underline (:style wave :color "Red1"))) + "Face used for breadcrumb paths on headerline when there is an error under +that path" + :group 'lsp-dired) + +(defface lsp-dired-path-warning-face + '((t :underline (:style wave :color "Yellow"))) + "Face used for breadcrumb paths on headerline when there is an warning under +that path" + :group 'lsp-dired) + +(defface lsp-dired-path-info-face + '((t :underline (:style wave :color "Green"))) + "Face used for breadcrumb paths on headerline when there is an info under that +path" + :group 'lsp-dired) + +(defface lsp-dired-path-hint-face + '((t :underline (:style wave :color "Green"))) + "Face used for breadcrumb paths on headerline when there is an hint under that +path" + :group 'lsp-dired) + +(defun lsp-dired--face-for-path (dir) + "Calculate the face for DIR." + (when-let ((diags (lsp-diagnostics-stats-for (directory-file-name dir)))) + (cl-labels ((check-severity + (severity) + (not (zerop (aref diags severity))))) + (cond + ((check-severity lsp/diagnostic-severity-error) + 'lsp-dired-path-error-face) + ((check-severity lsp/diagnostic-severity-warning) + 'lsp-dired-path-warning-face) + ((check-severity lsp/diagnostic-severity-information) + 'lsp-dired-path-info-face) + ((check-severity lsp/diagnostic-severity-hint) + 'lsp-dired-path-hint-face))))) + +(defun lsp-dired--insert-subdir-advice (&rest args) + "Advice to dired & dired+ insert-subdir commands. +Will add icons for the subdir in the `car' of ARGS." + (let* ((path (car args)) + (pos (cdr (assoc path dired-subdir-alist)))) + (when pos + (lsp-dired--insert-for-subdir path pos)))) + +(defun lsp-dired--kill-subdir-advice (&rest _args) + "Advice to dired kill-subdir commands. +Will remove the killed subdir from `lsp-dired--covered-subdirs'." + (setf lsp-dired--covered-subdirs (delete (dired-current-directory) + lsp-dired--covered-subdirs))) + +(defun lsp-dired--reset (&rest _args) + "Reset metadata on revert." + (setq-local lsp-dired--covered-subdirs nil) + (setq-local lsp-dired-displayed nil)) + +;;;###autoload +(define-minor-mode lsp-dired-mode + "Display `lsp-mode' icons for each file in a dired buffer." + :require 'lsp-dired + :init-value nil + :global t + :group 'lsp-dired + (cond + (lsp-dired-mode + (add-hook 'dired-after-readin-hook #'lsp-dired--display) + (advice-add 'dired-kill-subdir :before #'lsp-dired--kill-subdir-advice) + (advice-add 'dired-insert-subdir :after #'lsp-dired--insert-subdir-advice) + (advice-add 'diredp-insert-subdirs :after #'lsp-dired--insert-subdir-advice) + (advice-add 'dired-revert :before #'lsp-dired--reset) + (dolist (buffer (buffer-list)) + (with-current-buffer buffer + (when (derived-mode-p 'dired-mode) + (lsp-dired--display))))) + (t + (advice-remove 'dired-kill-subdir #'lsp-dired--kill-subdir-advice) + (advice-remove 'dired-insert-subdir #'lsp-dired--insert-subdir-advice) + (advice-remove 'diredp-insert-subdirs #'lsp-dired--insert-subdir-advice) + (advice-remove 'dired-revert #'lsp-dired--reset) + (remove-hook 'dired-after-readin-hook #'lsp-dired--display) + (dolist (buffer (buffer-list)) + (with-current-buffer buffer + (when (derived-mode-p 'dired-mode) + (dired-revert))))))) + + +(lsp-consistency-check lsp-dired)(provide 'lsp-dired) + + +;;; lsp-dired.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-dockerfile.el b/code/elpa/lsp-mode-20240319.1043/lsp-dockerfile.el new file mode 100644 index 0000000..b1f1817 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-dockerfile.el @@ -0,0 +1,66 @@ +;;; lsp-dockerfile.el --- description -*- lexical-binding: t; -*- + +;; Copyright (C) 2020 emacs-lsp maintainers + +;; Author: emacs-lsp maintainers +;; Keywords: lsp, dockerfile + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP Clients for Dockerfile documents. + +;;; Code: + +(require 'lsp-mode) + + +;;; Dockerfile + +(defgroup lsp-dockerfile nil + "Dockerfile LSP client, provided by the Dockerfile Language Server." + :group 'lsp-mode + :version "8.0.0" + :link '(url-link "https://github.com/rcjsuen/dockerfile-language-server-nodejs")) + +(defcustom lsp-dockerfile-language-server-command + '("docker-langserver" "--stdio") + "The command that starts the docker language server." + :group 'lsp-dockerfile + :type '(repeat :tag "List of string values" string)) + +(lsp-dependency 'docker-langserver + '(:system "docker-langserver") + '(:npm :package "dockerfile-language-server-nodejs" + :path "docker-langserver")) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection + (lambda () + `(,(or (executable-find + (cl-first lsp-dockerfile-language-server-command)) + (lsp-package-path 'docker-langserver)) + ,@(cl-rest lsp-dockerfile-language-server-command)))) + :activation-fn (lsp-activate-on "dockerfile") + :priority -1 + :server-id 'dockerfile-ls + :download-server-fn (lambda (_client callback error-callback _update?) + (lsp-package-ensure 'docker-langserver + callback error-callback)))) + +(lsp-consistency-check lsp-dockerfile) + +(provide 'lsp-dockerfile) +;;; lsp-dockerfile.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-dot.el b/code/elpa/lsp-mode-20240319.1043/lsp-dot.el new file mode 100644 index 0000000..7d9b41f --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-dot.el @@ -0,0 +1,57 @@ +;;; lsp-dot.el --- LSP client for the DOT/Graphviz language -*- lexical-binding: t; -*- + +;; Copyright (C) 2022 Abdelhak Bougouffa + +;; Author: Abdelhak Bougouffa +;; Keywords: languages, tools + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP client for the DOT/Graphviz language + +;;; Code: + +(require 'lsp-mode) + +;;; DOT Language (Graphviz) +(defgroup lsp-dot nil + "Settings for the DOT Language Server." + :group 'lsp-mode + :link '(url-link "https://github.com/nikeee/dot-language-server") + :package-version '(lsp-mode . "8.0.0")) + +(defun lsp-dot--dot-ls-server-command () + "Startup command for the DOT language server." + (list (lsp-package-path 'dot-language-server) "--stdio")) + +(lsp-dependency 'dot-language-server + '(:system "dot-language-server") + '(:npm :package "dot-language-server" + :path "dot-language-server")) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection #'lsp-dot--dot-ls-server-command) + :priority -1 + :activation-fn (lsp-activate-on "dot") + :server-id 'dot-ls + :download-server-fn (lambda (_client callback error-callback _update?) + (lsp-package-ensure 'dot-language-server callback error-callback)))) + +(lsp-consistency-check lsp-dot) + +(provide 'lsp-dot) +;;; lsp-dot.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-elixir.el b/code/elpa/lsp-mode-20240319.1043/lsp-elixir.el new file mode 100644 index 0000000..bb461e6 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-elixir.el @@ -0,0 +1,214 @@ +;;; lsp-elixir.el --- description -*- lexical-binding: t; -*- + +;; Copyright (C) 2021 emacs-lsp maintainers + +;; Author: emacs-lsp maintainers +;; Keywords: lsp, elixir + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP Clients for the Elixir Programming Language. + +;;; Code: + +(require 'lsp-mode) +(require 'ht) + +(defcustom lsp-elixir-dialyzer-enabled t + "Run ElixirLS's rapid Dialyzer when code is saved." + :type 'boolean + :group 'lsp-elixir + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-elixir-dialyzer-warn-opts '() + "Dialyzer options to enable or disable warnings. + +See Dialyzer's documentation for options. Note that the \"race_conditions\" +option is unsupported" + :type '(repeat string) + :group 'lsp-elixir + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-elixir-dialyzer-format "dialyxir_long" + "Formatter to use for Dialyzer warnings." + :type 'string + :group 'lsp-elixir + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-elixir-mix-env "test" + "Mix environment to use for compilation." + :type 'string + :group 'lsp-elixir + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-elixir-mix-target nil + "Mix target to use for compilation (requires Elixir >= 1.8)." + :type 'string + :group 'lsp-elixir + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-elixir-project-dir nil + "Subdirectory containing Mix project if not in the project root. + +If value is `\"\"` then defaults to the workspace rootUri." + :type 'string + :group 'lsp-elixir + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-elixir-fetch-deps nil + "Automatically fetch project dependencies when compiling." + :type 'boolean + :group 'lsp-elixir + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-elixir-suggest-specs t + "Suggest @spec annotations inline using Dialyzer's inferred success typings. +This requires Dialyzer." + :type 'boolean + :group 'lsp-elixir + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-elixir-signature-after-complete t + "Show signature help after confirming autocomplete." + :type 'boolean + :group 'lsp-elixir + :package-version '(lsp-mode . "8.0.0")) + +(defgroup lsp-elixir nil + "LSP support for Elixir, using elixir-ls." + :group 'lsp-mode + :link '(url-link "https://github.com/elixir-lsp/elixir-ls")) + +(define-obsolete-variable-alias 'lsp-clients-elixir-server-executable 'lsp-elixir-server-command "2021-04-05") + +(defcustom lsp-elixir-server-command + (if (equal system-type 'windows-nt) + '("language_server.bat") + '("language_server.sh")) + "Command to start elixir-ls. + +Leave as default to let `executable-find' search for it." + :group 'lsp-elixir + :type '(repeat string) + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-elixir-ls-version "v0.20.0" + "Elixir-Ls version to download. +It has to be set before `lsp-elixir.el' is loaded and it has to +be available here: https://github.com/elixir-lsp/elixir-ls/releases/" + :type 'string + :group 'lsp-elixir + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-elixir-ls-download-url + (format "https://github.com/elixir-lsp/elixir-ls/releases/download/%1$s/elixir-ls-%1$s.zip" + lsp-elixir-ls-version) + "Automatic download url for elixir-ls." + :type 'string + :group 'lsp-elixir + :package-version '(lsp-mode . "8.0.1")) + + +(defconst lsp-elixir-ls-server-dir + (f-join lsp-server-install-dir "elixir-ls") + "Elixir-ls local server Directory.") + +(defcustom lsp-elixir-local-server-command + (f-join lsp-elixir-ls-server-dir + (cl-first lsp-elixir-server-command)) + "Command to start local elixir-ls binary." + :group 'lsp-elixir + :type '(repeat string) + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-elixir-enable-test-lenses t + "Suggest Tests." + :type 'boolean + :group 'lsp-elixir + :package-version '(lsp-mode . "8.0.0")) + +(defun lsp-elixir--build-test-command (argument) + "Builds the test command from the ARGUMENT." + (let ((test-name (lsp-get argument :testName)) + (module (lsp-get argument :module)) + (describe (lsp-get argument :describe))) + (cond (module (concat "\"" "module:" module "\"")) + ((not test-name) (concat "\"" "describe:" describe "\"")) + (describe (concat "\"" "test:test " describe " " test-name "\"" )) + (t (concat "\"" "test:test " test-name "\"" ))))) + +(lsp-defun lsp-elixir--run-test ((&Command :arguments?)) + "Runs tests." + (let* ((argument (lsp-seq-first arguments?)) + (file-path (lsp-get argument :filePath)) + (test-command (lsp-elixir--build-test-command argument))) + (compile + (concat "cd " (lsp-workspace-root file-path) " && " + "mix test --exclude test --include " test-command " " file-path + " --no-color")) + file-path)) + +(lsp-dependency + 'elixir-ls + `(:download :url lsp-elixir-ls-download-url + :decompress :zip + :store-path ,(f-join lsp-server-install-dir "elixir-ls" "elixir-ls.zip") + :binary-path lsp-elixir-server-command + :set-executable? t)) + +(lsp-register-custom-settings + '(("elixirLS.dialyzerEnabled" lsp-elixir-dialyzer-enabled t) + ("elixirLS.dialyzerWarnOpts" lsp-elixir-dialyzer-warn-opts) + ("elixirLS.dialyzerFormat" lsp-elixir-dialyzer-format) + ("elixirLS.mixEnv" lsp-elixir-mix-env) + ("elixirLS.mixTarget" lsp-elixir-mix-target) + ("elixirLS.projectDir" lsp-elixir-project-dir) + ("elixirLS.fetchDeps" lsp-elixir-fetch-deps t) + ("elixirLS.suggestSpecs" lsp-elixir-suggest-specs t) + ("elixirLS.signatureAfterComplete" lsp-elixir-signature-after-complete t) + ("elixirLS.enableTestLenses" lsp-elixir-enable-test-lenses t))) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection + (lambda () + `(,(or (when (f-exists? lsp-elixir-local-server-command) + lsp-elixir-local-server-command) + (or (executable-find + (cl-first lsp-elixir-server-command)) + (lsp-package-path 'elixir-ls)) + "language_server.bat") + ,@(cl-rest lsp-elixir-server-command)))) + :activation-fn (lsp-activate-on "elixir") + :priority -1 + :server-id 'elixir-ls + :action-handlers (ht ("elixir.lens.test.run" 'lsp-elixir--run-test)) + :download-server-fn (lambda (_client callback error-callback _update?) + (lsp-package-ensure 'elixir-ls callback error-callback)) + :initialized-fn (lambda (workspace) + (with-lsp-workspace workspace + (lsp--set-configuration + (lsp-configuration-section "elixirLS"))) + (lsp-put + (lsp--workspace-server-capabilities workspace) + :textDocumentSync + (lsp-make-text-document-sync-options + :save t + :change 2))))) + +(lsp-consistency-check lsp-elixir) + +(provide 'lsp-elixir) +;;; lsp-elixir.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-elm.el b/code/elpa/lsp-mode-20240319.1043/lsp-elm.el new file mode 100644 index 0000000..55f9f27 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-elm.el @@ -0,0 +1,137 @@ +;;; lsp-elm.el --- Elm Client settings -*- lexical-binding: t; -*- + +;; Copyright (C) 2019 Daniel V + +;; Author: Daniel V +;; Keywords: elm lsp + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; lsp-elm client + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-elm nil + "LSP support for the Elm programming language, using the server from https://github.com/elm-tooling/elm-language-server" + :group 'lsp-mode + :link '(url-link "https://github.com/elm-tooling/elm-language-server")) + +(defcustom lsp-elm-elm-language-server-path nil + "Path for elm-language-server. +Can be installed globally with: npm i -g @elm-tooling/elm-language-server, +or manually by cloning the repo and following the installing instructions." + :group 'lsp-elm + :risky t + :type 'file) + +(defcustom lsp-elm-trace-server + nil + "Enable/disable trace logging of client and server communication." + :type 'boolean + :group 'lsp-elm) + +(defcustom lsp-elm-elm-path + "" + "The path to your elm executable. + +Should be empty by default, in that case it will assume the name and try +to first get it from a local npm installation or a global one. If you +set it manually it will not try to load from the npm folder." + :type 'file + :group 'lsp-elm) + +(defcustom lsp-elm-elm-format-path + "" + "The path to your elm-format executable. + +Should be empty by default, in that case it will assume the name and try +to first get it from a local npm installation or a global one. If you +set it manually it will not try to load from the npm folder." + :type 'file + :group 'lsp-elm) + +(defcustom lsp-elm-elm-test-path + "" + "The path to your elm-test executable. + +Should be empty by default, in that case it will assume the name and try +to first get it from a local npm installation or a global one. If you +set it manually it will not try to load from the npm folder." + :type 'file + :group 'lsp-elm) + +(defcustom lsp-elm-disable-elmls-diagnostics + nil + "Enable/Disable linting diagnostics from the language server." + :type 'boolean + :group 'lsp-elm) + +(defcustom lsp-elm-only-update-diagnostics-on-save + nil + "Only update compiler diagnostics on save, not on document change." + :type 'boolean + :group 'lsp-elm) + +(defcustom lsp-elm-skip-install-package-confirmation + nil + "Skip confirmation for the Install Package code action." + :type 'boolean + :group 'lsp-elm) + +(defcustom lsp-elm-server-args + '("--stdio") + "Arguments to pass to the server." + :type '(repeat string) + :group 'lsp-elm) + +(defun lsp-elm--elm-language-server-command () + "Generate LSP startup command for the Elm Language Server." + (cons + (or lsp-elm-elm-language-server-path + (lsp-package-path 'elm-language-server)) + lsp-elm-server-args)) + +(defun lsp-clients-elm--make-init-options () + "Init options for elm-language-server." + `(:elmPath ,lsp-elm-elm-path + :elmFormatPath ,lsp-elm-elm-format-path + :elmTestPath ,lsp-elm-elm-test-path + :disableElmLSDiagnostics ,(lsp-json-bool lsp-elm-disable-elmls-diagnostics) + :onlyUpdateDiagnosticsOnSave ,(lsp-json-bool lsp-elm-only-update-diagnostics-on-save) + :skipInstallPackageConfirmation ,(lsp-json-bool lsp-elm-skip-install-package-confirmation) + :trace.server ,(lsp-json-bool lsp-elm-trace-server))) + +(lsp-dependency 'elm-language-server + '(:system "elm-language-server") + '(:npm :package "@elm-tooling/elm-language-server" + :path "elm-language-server")) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection #'lsp-elm--elm-language-server-command) + :major-modes '(elm-mode) + :priority -1 + :initialization-options #'lsp-clients-elm--make-init-options + :server-id 'elm-ls + :download-server-fn (lambda (_client callback error-callback _update?) + (lsp-package-ensure 'elm-language-server callback error-callback)))) + +(lsp-consistency-check lsp-elm) + +(provide 'lsp-elm) +;;; lsp-elm.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-emmet.el b/code/elpa/lsp-mode-20240319.1043/lsp-emmet.el new file mode 100644 index 0000000..4795812 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-emmet.el @@ -0,0 +1,65 @@ +;;; lsp-emmet.el --- lsp-mode Emmet integration -*- lexical-binding: t; -*- + +;; Copyright (C) 2022 emacs-lsp maintainers + +;; Author: lsp-mode maintainers +;; Keywords: lsp, emmet + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP Client for Emmet + +;;; Code: + +(require 'lsp-mode) + +;;; emmet-ls +(defgroup lsp-emmet-ls nil + "Settings for emmet-ls." + :group 'lsp-mode + :link '(url-link "https://github.com/aca/emmet-ls") + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-emmet-ls-command '("emmet-ls" "--stdio") + "The command that starts emmet-ls." + :type '(repeat :tag "List of string values" string) + :group 'lsp-emmet-ls + :package-version '(lsp-mode . "8.0.1")) + +(lsp-dependency 'emmet-ls + '(:system "emmet-ls") + '(:npm :package "emmet-ls" + :path "emmet-ls")) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection + (lambda () + `(,(or (executable-find (cl-first lsp-emmet-ls-command)) + (lsp-package-path 'emmet-ls)) + ,@(cl-rest lsp-emmet-ls-command)))) + :activation-fn (lsp-activate-on "html" "css" "scss" "less" "javascriptreact" "typescriptreact") + :priority -1 + :add-on? t + :multi-root t + :server-id 'emmet-ls + :download-server-fn (lambda (_client callback error-callback _update?) + (lsp-package-ensure 'emmet-ls callback error-callback)))) + +(lsp-consistency-check lsp-emmet) + +(provide 'lsp-emmet) +;;; lsp-emmet.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-erlang.el b/code/elpa/lsp-mode-20240319.1043/lsp-erlang.el new file mode 100644 index 0000000..aa3c314 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-erlang.el @@ -0,0 +1,228 @@ +;;; lsp-erlang.el --- Erlang Client settings -*- lexical-binding: t; -*- + +;; Copyright (C) 2019-2023 Roberto Aloi, Alan Zimmerman + +;; Author: Roberto Aloi, Alan Zimmerman +;; Keywords: erlang lsp + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; lsp-erlang client + +;;; Code: + +(require 'lsp-mode) +(require 'lsp-semantic-tokens) + +(defgroup lsp-erlang nil + "LSP support for the Erlang programming language. +It can use erlang-ls or erlang-language-platform (ELP)." + :group 'lsp-mode) + +(defgroup lsp-erlang-ls nil + "LSP support for the Erlang programming language using erlang-ls." + :group 'lsp-mode + :link '(url-link "https://github.com/erlang-ls/erlang_ls")) + +(defgroup lsp-erlang-elp nil + "LSP support for the Erlang programming language using erlang-language-platform (ELP)." + :group 'lsp-mode + :link '(url-link "https://github.com/WhatsApp/erlang-language-platform")) + +(defgroup lsp-erlang-elp-semantic-tokens nil + "LSP semantic tokens support for ELP." + :group 'lsp-erlang-elp + :link '(url-link "https://github.com/WhatsApp/erlang-language-platform") + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-erlang-server 'erlang-ls + "Choose LSP server." + :type '(choice (const :tag "erlang-ls" erlang-ls) + (const :tag "erlang-language-platform" erlang-language-platform)) + :group 'lsp-erlang + :package-version '(lsp-mode . "6.2")) + +;; erlang-ls + +(defcustom lsp-erlang-ls-server-path + "erlang_ls" + "Path to the Erlang Language Server binary." + :group 'lsp-erlang-ls + :risky t + :type 'file) + +(defcustom lsp-erlang-ls-server-connection-type + 'stdio + "Type of connection to use with the Erlang Language Server: tcp or stdio." + :group 'lsp-erlang-ls + :risky t + :type 'symbol) + +(defun lsp-erlang-ls-server-start-fun (port) + "Command to start erlang_ls in TCP mode on the given PORT." + `(,lsp-erlang-ls-server-path + "--transport" "tcp" + "--port" ,(number-to-string port))) + +(defun lsp-erlang-ls-server-connection () + "Command to start erlang_ls in stdio mode." + (if (eq lsp-erlang-ls-server-connection-type 'tcp) + (lsp-tcp-connection 'lsp-erlang-ls-server-start-fun) + (lsp-stdio-connection `(,lsp-erlang-ls-server-path "--transport" "stdio")))) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-erlang-ls-server-connection) + :major-modes '(erlang-mode) + :priority -1 + :server-id 'erlang-ls)) + + +;; erlang-language-platform + +(lsp-defcustom lsp-erlang-elp-types-on-hover t + "Show eqWAlizer types on hover." + :type 'boolean + :group 'lsp-erlang-elp + :package-version '(lsp-mode . "8.0.1") + :lsp-path "elp.typesOnHover.enable") + +(defcustom lsp-erlang-elp-server-command '("elp" "server") + "Command to start erlang-language-platform." + :type '(repeat string) + :group 'lsp-erlang-elp + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-erlang-elp-download-url + (format "https://github.com/WhatsApp/erlang-language-platform/releases/latest/download/%s" + (pcase system-type + ('gnu/linux "elp-linux-x86_64-unknown-linux-gnu-otp-26.tar.gz") + ('darwin + (if (string-match "^aarch64-.*" system-configuration) + "elp-macos-aarch64-apple-darwin-otp-25.3.tar.gz" + "elp-macos-x86_64-apple-darwin-otp-25.3.tar.gz")))) + "Automatic download url for erlang-language-platform." + :type 'string + :group 'lsp-erlang-elp + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-erlang-elp-store-path (f-join lsp-server-install-dir + "erlang" + (if (eq system-type 'windows-nt) + "elp.exe" + "elp")) + "The path to the file in which `elp' will be stored." + :type 'file + :group 'lsp-erlang-elp + :package-version '(lsp-mode . "8.0.0")) + +(lsp-dependency + 'erlang-language-platform + `(:download :url lsp-erlang-elp-download-url + :decompress :targz + :store-path lsp-erlang-elp-store-path + :set-executable? t) + '(:system "elp")) + +;; Semantic tokens + +;; Modifier faces + +(defface lsp-erlang-elp-bound-modifier-face + '((t :underline t)) + "The face modification to use for bound variables in patterns." + :group 'lsp-erlang-elp-semantic-tokens) + +(defface lsp-erlang-elp-exported-function-modifier-face + '((t :underline t)) + "The face modification to use for exported functions." + :group 'lsp-erlang-elp-semantic-tokens) + +(defface lsp-erlang-elp-deprecated-function-modifier-face + '((t :strike-through t)) + "The face modification to use for deprecated functions." + :group 'lsp-erlang-elp-semantic-tokens) + + +;; --------------------------------------------------------------------- +;; Semantic token modifier face customization + +(defcustom lsp-erlang-elp-bound-modifier 'lsp-erlang-elp-bound-modifier-face + "Face for semantic token modifier for `bound' attribute." + :type 'face + :group 'lsp-erlang-elp-semantic-tokens + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-erlang-elp-exported-function-modifier 'lsp-erlang-elp-exported-function-modifier-face + "Face for semantic token modifier for `exported_function' attribute." + :type 'face + :group 'lsp-erlang-elp-semantic-tokens + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-erlang-elp-deprecated-function-modifier 'lsp-erlang-elp-deprecated-function-modifier-face + "Face for semantic token modifier for `deprecated_function' attribute." + :type 'face + :group 'lsp-erlang-elp-semantic-tokens + :package-version '(lsp-mode . "8.0.1")) + +;; --------------------------------------------------------------------- + +(defun lsp-erlang-elp--semantic-modifiers () + "Mapping between rust-analyzer keywords and fonts to apply. +The keywords are sent in the initialize response, in the semantic +tokens legend." + `( + ("bound" . ,lsp-erlang-elp-bound-modifier) + ("exported_function" . ,lsp-erlang-elp-exported-function-modifier) + ("deprecated_function" . ,lsp-erlang-elp-deprecated-function-modifier))) + +;; --------------------------------------------------------------------- +;; Client + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection + (lambda () + `(,(or (executable-find + (cl-first lsp-erlang-elp-server-command)) + (lsp-package-path 'erlang-language-platform) + "elp") + ,@(cl-rest lsp-erlang-elp-server-command)))) + :activation-fn (lsp-activate-on "erlang") + :priority (if (eq lsp-erlang-server 'erlang-language-platform) 1 -2) + :semantic-tokens-faces-overrides `(:discard-default-modifiers t + :modifiers + ,(lsp-erlang-elp--semantic-modifiers)) + :server-id 'elp + :custom-capabilities `((experimental . ((snippetTextEdit . ,(and lsp-enable-snippet (featurep 'yasnippet)))))) + :download-server-fn (lambda (_client callback error-callback _update?) + (lsp-package-ensure 'erlang-language-platform callback error-callback)))) + +(defun lsp-erlang-switch-server (&optional lsp-server) + "Switch priorities of lsp servers, unless LSP-SERVER is already active." + (interactive) + (let ((current-server (if (> (lsp--client-priority (gethash 'erlang-ls lsp-clients)) 0) + 'erlang-ls + 'erlang-language-platform))) + (unless (eq lsp-server current-server) + (dolist (server '(erlang-ls erlang-language-platform)) + (when (natnump (setf (lsp--client-priority (gethash server lsp-clients)) + (* (lsp--client-priority (gethash server lsp-clients)) -1))) + (message (format "Switched to server %s." server))))))) + +(lsp-consistency-check lsp-erlang) + +(provide 'lsp-erlang) +;;; lsp-erlang.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-eslint.el b/code/elpa/lsp-mode-20240319.1043/lsp-eslint.el new file mode 100644 index 0000000..419077e --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-eslint.el @@ -0,0 +1,454 @@ +;;; lsp-eslint.el --- lsp-mode eslint integration -*- lexical-binding: t; -*- + +;; Copyright (C) 2019 Ivan Yonchovski + +;; Author: Ivan Yonchovski +;; Keywords: languages + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; + +;;; Code: + +(require 'lsp-protocol) +(require 'lsp-mode) + +(defconst lsp-eslint/status-ok 1) +(defconst lsp-eslint/status-warn 2) +(defconst lsp-eslint/status-error 3) + +(defgroup lsp-eslint nil + "ESLint language server group." + :group 'lsp-mode + :link '(url-link "https://github.com/microsoft/vscode-eslint")) + +(defcustom lsp-eslint-unzipped-path (f-join lsp-server-install-dir "eslint/unzipped") + "The path to the file in which `eslint' will be stored." + :type 'file + :group 'lsp-eslint + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-eslint-download-url "https://github.com/emacs-lsp/lsp-server-binaries/blob/master/dbaeumer.vscode-eslint-2.2.2.vsix?raw=true" + "ESLint language server download url." + :type 'string + :group 'lsp-eslint + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-eslint-server-command `("node" + "~/server/out/eslintServer.js" + "--stdio") + "Command to start ESLint server." + :risky t + :type '(repeat string) + :package-version '(lsp-mode . "6.3")) + +(defcustom lsp-eslint-enable t + "Controls whether ESLint is enabled for JavaScript files or not." + :type 'boolean + :package-version '(lsp-mode . "6.3")) + +(defcustom lsp-eslint-package-manager "npm" + "The package manager you use to install node modules." + :type '(choice (const :tag "npm" "npm") + (const :tag "yarn" "yarn") + (const :tag "pnpm" "pnpm") + (string :tag "other")) + :package-version '(lsp-mode . "6.3")) + +(defcustom lsp-eslint-format t + "Whether to perform format." + :type 'boolean + :package-version '(lsp-mode . "6.3")) + +(defcustom lsp-eslint-node-path nil + "A path added to NODE_PATH when resolving the `eslint' module." + :type '(repeat string) + :package-version '(lsp-mode . "6.3")) + +(defcustom lsp-eslint-node "node" + "Path to Node.js." + :type 'file + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-eslint-options nil + "The ESLint options object to provide args normally passed to + `eslint' when executed from a command line (see + https://eslint.org/docs/latest/integrate/nodejs-api)." + :type 'alist) + +(defcustom lsp-eslint-experimental nil + "The eslint experimental configuration." + :type 'alist) + +(defcustom lsp-eslint-config-problems nil + "The eslint problems configuration." + :type 'alist) + +(defcustom lsp-eslint-time-budget nil + "The eslint config to inform you of slow validation times and + long ESLint runs when computing code fixes during save." + :type 'alist) + +(defcustom lsp-eslint-trace-server "off" + "Traces the communication between VSCode and the ESLint linter service." + :type 'string) + +(defcustom lsp-eslint-run "onType" + "Run the linter on save (onSave) or on type (onType)" + :type '(choice (const :tag "onSave" "onSave") + (const :tag "onType" "onType")) + :package-version '(lsp-mode . "6.3")) + +(defcustom lsp-eslint-auto-fix-on-save nil + "Turns auto fix on save on or off." + :type 'boolean + :package-version '(lsp-mode . "6.3")) + +(defcustom lsp-eslint-fix-all-problem-type "all" + "Determines which problems are fixed when running the +source.fixAll code action." + :type '(choice + (const "all") + (const "problems") + string) + :package-version '(lsp-mode . "7.0.1")) + +(defcustom lsp-eslint-quiet nil + "Turns on quiet mode, which ignores warnings." + :type 'boolean + :package-version '(lsp-mode . "6.3")) + +(defcustom lsp-eslint-working-directories [] + "A vector of working directory names to use. Can be a pattern, an absolute path +or a path relative to the workspace. Examples: + - \"/home/user/abc/\" + - \"abc/\" + - (directory \"abc\") which is equivalent to \"abc\" above + - (pattern \"abc/*\") +Note that the home directory reference ~/ is not currently supported, use +/home/[user]/ instead." + :type 'lsp-string-vector + :package-version '(lsp-mode . "6.3")) + +(defcustom lsp-eslint-validate '("svelte") + "An array of language ids which should always be validated by ESLint." + :type '(repeat string) + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-eslint-provide-lint-task nil + "Controls whether a task for linting the whole workspace will be available." + :type 'boolean + :package-version '(lsp-mode . "6.3")) + +(defcustom lsp-eslint-lint-task-enable nil + "Controls whether a task for linting the whole workspace will be available." + :type 'boolean + :package-version '(lsp-mode . "6.3")) + +(defcustom lsp-eslint-lint-task-options "." + "Command line options applied when running the task for linting the whole +workspace (see https://eslint.org/docs/user-guide/command-line-interface)." + :type 'string + :package-version '(lsp-mode . "6.3")) + +(defcustom lsp-eslint-runtime nil + "The location of the node binary to run ESLint under." + :type '(repeat string) + :package-version '(lsp-mode . "6.3")) + +(defcustom lsp-eslint-code-action-disable-rule-comment t + "Controls whether code actions to add a rule-disabling comment should be shown." + :type 'bool + :package-version '(lsp-mode . "6.3")) + +(defcustom lsp-eslint-code-action-disable-rule-comment-location "separateLine" + "Controls where the disable rule code action places comments. + +Accepts the following values: +- \"separateLine\": Add the comment above the line to be disabled (default). +- \"sameLine\": Add the comment on the same line that will be disabled." + :type '(choice + (const "separateLine") + (const "sameLine")) + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-eslint-code-action-show-documentation t + "Controls whether code actions to show documentation for an ESLint rule should +be shown." + :type 'bool + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-eslint-warn-on-ignored-files nil + "Controls whether a warning should be emitted when a file is ignored." + :type 'bool + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-eslint-rules-customizations [] + "Controls severity overrides for ESLint rules. + +The value is a vector of alists, with each alist containing the following keys: +- rule - The rule to match. Can match wildcards with *, or be prefixed with ! + to negate the match. +- severity - The severity to report this rule as. Can be one of the following: + - \"off\": Disable the rule. + - \"info\": Report as informational. + - \"warn\": Report as a warning. + - \"error\": Report as an error. + - \"upgrade\": Increase by 1 severity level (eg. warning -> error). + - \"downgrade\": Decrease by 1 severity level (eg. warning -> info). + - \"default\": Report as the same severity specified in the ESLint config." + :type '(lsp-repeatable-vector + (alist :options ((rule string) + (severity (choice + (const "off") + (const "info") + (const "warn") + (const "error") + (const "upgrade") + (const "downgrade") + (const "default")))))) + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-eslint-experimental-incremental-sync t + "Controls whether the new incremental text document synchronization should +be used." + :type 'boolean + :package-version '(lsp-mode . "6.3")) + +(defcustom lsp-eslint-save-library-choices t + "Controls whether to remember choices made to permit or deny ESLint libraries +from running." + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-eslint-library-choices-file (expand-file-name (locate-user-emacs-file ".lsp-eslint-choices")) + "The file where choices to permit or deny ESLint libraries from running is +stored." + :type 'string + :package-version '(lsp-mode . "8.0.0")) + +(defun lsp--find-eslint () + (or + (when-let ((workspace-folder (lsp-find-session-folder (lsp-session) default-directory))) + (let ((eslint-local-path (f-join workspace-folder "node_modules" ".bin" + (if (eq system-type 'windows-nt) "eslint.cmd" "eslint")))) + (when (f-exists? eslint-local-path) + eslint-local-path))) + "eslint")) + +(defun lsp-eslint-create-default-configuration () + "Create default ESLint configuration." + (interactive) + (unless (lsp-session-folders (lsp-session)) + (user-error "There are no workspace folders")) + (pcase (->> (lsp-session) + lsp-session-folders + (-filter (lambda (dir) + (-none? + (lambda (file) (f-exists? (f-join dir file))) + '(".eslintrc.js" ".eslintrc.yaml" ".eslintrc.yml" ".eslintrc" ".eslintrc.json"))))) + (`nil (user-error "All workspace folders contain ESLint configuration")) + (folders (let ((default-directory (completing-read "Select project folder: " folders nil t))) + (async-shell-command (format "%s --init" (lsp--find-eslint))))))) + +(lsp-defun lsp-eslint-status-handler (workspace (&eslint:StatusParams :state)) + (setf (lsp--workspace-status-string workspace) + (propertize "ESLint" + 'face (cond + ((eq state lsp-eslint/status-error) 'error) + ((eq state lsp-eslint/status-warn) 'warn) + (t 'success))))) + +(lsp-defun lsp-eslint--configuration (_workspace (&ConfigurationParams :items)) + (->> items + (seq-map (-lambda ((&ConfigurationItem :scope-uri?)) + (-when-let* ((file (lsp--uri-to-path scope-uri?)) + (buffer (find-buffer-visiting file)) + (workspace-folder (lsp-find-session-folder (lsp-session) file))) + (with-current-buffer buffer + (let ((working-directory (lsp-eslint--working-directory workspace-folder file))) + (list :validate (if (member (lsp-buffer-language) lsp-eslint-validate) "on" "probe") + :packageManager lsp-eslint-package-manager + :codeAction (list + :disableRuleComment (list + :enable (lsp-json-bool lsp-eslint-code-action-disable-rule-comment) + :location lsp-eslint-code-action-disable-rule-comment-location) + :showDocumentation (list + :enable (lsp-json-bool lsp-eslint-code-action-show-documentation))) + :codeActionOnSave (list :enable (lsp-json-bool lsp-eslint-auto-fix-on-save) + :mode lsp-eslint-fix-all-problem-type) + :format (lsp-json-bool lsp-eslint-format) + :quiet (lsp-json-bool lsp-eslint-quiet) + :onIgnoredFiles (if lsp-eslint-warn-on-ignored-files "warn" "off") + :options (or lsp-eslint-options (ht)) + :experimental (or lsp-eslint-experimental (ht)) + :problems (or lsp-eslint-config-problems (ht)) + :timeBudget (or lsp-eslint-time-budget (ht)) + :rulesCustomizations lsp-eslint-rules-customizations + :run lsp-eslint-run + :nodePath lsp-eslint-node-path + :workingDirectory (when working-directory + (list + :directory working-directory + :!cwd :json-false)) + :workspaceFolder (list :uri (lsp--path-to-uri workspace-folder) + :name (f-filename workspace-folder)))))))) + (apply #'vector))) + +(defun lsp-eslint--working-directory (workspace current-file) + "Find the first directory in the parameter config.workingDirectories which +contains the current file" + (let ((directories (-map (lambda (dir) + (when (and (listp dir) (plist-member dir 'directory)) + (setq dir (plist-get dir 'directory))) + (if (and (listp dir) (plist-member dir 'pattern)) + (progn + (setq dir (plist-get dir 'pattern)) + (when (not (f-absolute? dir)) + (setq dir (f-join workspace dir))) + (f-glob dir)) + (if (f-absolute? dir) + dir + (f-join workspace dir)))) + (append lsp-eslint-working-directories nil)))) + (-first (lambda (dir) (f-ancestor-of-p dir current-file)) (-flatten directories)))) + +(lsp-defun lsp-eslint--open-doc (_workspace (&eslint:OpenESLintDocParams :url)) + "Open documentation." + (browse-url url)) + +(defun lsp-eslint-apply-all-fixes () + "Apply all autofixes in the current buffer." + (interactive) + (lsp-send-execute-command "eslint.applyAllFixes" (vector (lsp--versioned-text-document-identifier)))) + +;; XXX: replace with `lsp-make-interactive-code-action' macro +;; (lsp-make-interactive-code-action eslint-fix-all "source.fixAll.eslint") + +(defun lsp-eslint-fix-all () + "Perform the source.fixAll.eslint code action, if available." + (interactive) + (condition-case nil + (lsp-execute-code-action-by-kind "source.fixAll.eslint") + (lsp-no-code-actions + (when (called-interactively-p 'any) + (lsp--info "source.fixAll.eslint action not available"))))) + +(defun lsp-eslint-server-command () + (if (lsp-eslint-server-exists? lsp-eslint-server-command) + lsp-eslint-server-command + `(,lsp-eslint-node ,(f-join lsp-eslint-unzipped-path + "extension/server/out/eslintServer.js") + "--stdio"))) + +(defun lsp-eslint-server-exists? (eslint-server-command) + (let* ((command-name (f-base (f-filename (cl-first eslint-server-command)))) + (first-argument (cl-second eslint-server-command)) + (first-argument-exist (and first-argument (file-exists-p first-argument)))) + (if (equal command-name lsp-eslint-node) + first-argument-exist + (executable-find (cl-first eslint-server-command))))) + +(defvar lsp-eslint--stored-libraries (ht) + "Hash table defining if a given path to an ESLint library is allowed to run. +If the value for a key is 4, it will be allowed. If it is 1, it will not. If a +value does not exist for the key, or the value is nil, the user will be prompted +to allow or deny it.") + +(when (and (file-exists-p lsp-eslint-library-choices-file) + lsp-eslint-save-library-choices) + (setq lsp-eslint--stored-libraries (lsp--read-from-file lsp-eslint-library-choices-file))) + +(lsp-defun lsp-eslint--confirm-local (_workspace (&eslint:ConfirmExecutionParams :library-path) callback) + (if-let ((option-alist '(("Always" 4 . t) + ("Yes" 4 . nil) + ("No" 1 . nil) + ("Never" 1 . t))) + (remembered-answer (gethash library-path lsp-eslint--stored-libraries))) + (funcall callback remembered-answer) + (lsp-ask-question + (format + "Allow lsp-mode to execute %s? Note: The latest versions of the ESLint language server no longer create this prompt." + library-path) + (mapcar 'car option-alist) + (lambda (response) + (let ((option (cdr (assoc response option-alist)))) + (when (cdr option) + (puthash library-path (car option) lsp-eslint--stored-libraries) + (when lsp-eslint-save-library-choices + (lsp--persist lsp-eslint-library-choices-file lsp-eslint--stored-libraries))) + (funcall callback (car option))))))) + +(defun lsp-eslint--probe-failed (_workspace _message) + "Called when the server detects a misconfiguration in ESLint." + (lsp--error "ESLint is not configured correctly. Please ensure your eslintrc is set up for the languages you are using.")) + +(lsp-register-client + (make-lsp-client + :new-connection + (lsp-stdio-connection + (lambda () (lsp-eslint-server-command)) + (lambda () (lsp-eslint-server-exists? (lsp-eslint-server-command)))) + :activation-fn (lambda (filename &optional _) + (when lsp-eslint-enable + (or (string-match-p (rx (one-or-more anything) "." + (or "ts" "js" "jsx" "tsx" "html" "vue" "svelte")eos) + filename) + (and (derived-mode-p 'js-mode 'js2-mode 'typescript-mode 'typescript-ts-mode 'html-mode 'svelte-mode) + (not (string-match-p "\\.json\\'" filename)))))) + :priority -1 + :completion-in-comments? t + :add-on? t + :multi-root t + :notification-handlers (ht ("eslint/status" #'lsp-eslint-status-handler)) + :request-handlers (ht ("workspace/configuration" #'lsp-eslint--configuration) + ("eslint/openDoc" #'lsp-eslint--open-doc) + ("eslint/probeFailed" #'lsp-eslint--probe-failed)) + :async-request-handlers (ht ("eslint/confirmESLintExecution" #'lsp-eslint--confirm-local)) + :server-id 'eslint + :initialized-fn (lambda (workspace) + (with-lsp-workspace workspace + (lsp--server-register-capability + (lsp-make-registration + :id "random-id" + :method "workspace/didChangeWatchedFiles" + :register-options? (lsp-make-did-change-watched-files-registration-options + :watchers + `[,(lsp-make-file-system-watcher + :glob-pattern "**/.eslintr{c.js,c.yaml,c.yml,c,c.json}") + ,(lsp-make-file-system-watcher + :glob-pattern "**/.eslintignore") + ,(lsp-make-file-system-watcher + :glob-pattern "**/package.json")]))))) + :download-server-fn (lambda (_client callback error-callback _update?) + (let ((tmp-zip (make-temp-file "ext" nil ".zip"))) + (delete-file tmp-zip) + (lsp-download-install + (lambda (&rest _) + (condition-case err + (progn + (lsp-unzip tmp-zip lsp-eslint-unzipped-path) + (funcall callback)) + (error (funcall error-callback err)))) + error-callback + :url lsp-eslint-download-url + :store-path tmp-zip))))) + +(lsp-consistency-check lsp-eslint) + +(provide 'lsp-eslint) +;;; lsp-eslint.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-fortran.el b/code/elpa/lsp-mode-20240319.1043/lsp-fortran.el new file mode 100644 index 0000000..65c4f03 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-fortran.el @@ -0,0 +1,61 @@ +;;; lsp-fortran.el --- description -*- lexical-binding: t; -*- + +;; Copyright (C) 2020 emacs-lsp maintainers + +;; Author: emacs-lsp maintainers +;; Keywords: lsp, fortran + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP Clients for the Fortran Programming Language. + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-fortran nil + "LSP support for Fortran, using the Fortran Language Server." + :group 'lsp-mode + :link '(url-link "https://gnikit.github.io/fortls")) + +(defcustom lsp-clients-fortls-executable "fortls" + "The fortls executable to use. +Leave as just the executable name to use the default behavior of +finding the executable with `exec-path'." + :group 'lsp-fortran + :risky t + :type 'file) + +(defcustom lsp-clients-fortls-args '() + "Extra arguments for the fortls executable" + :group 'lsp-fortran + :risky t + :type '(repeat string)) + +(defun lsp-clients--fortls-command () + "Generate the language server startup command." + `(,lsp-clients-fortls-executable,@lsp-clients-fortls-args)) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection 'lsp-clients--fortls-command) + :major-modes '(f90-mode fortran-mode) + :priority -1 + :server-id 'fortls)) + +(lsp-consistency-check lsp-fortran) + +(provide 'lsp-fortran) +;;; lsp-fortran.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-fsharp.el b/code/elpa/lsp-mode-20240319.1043/lsp-fsharp.el new file mode 100644 index 0000000..59c203c --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-fsharp.el @@ -0,0 +1,313 @@ +;;; lsp-fsharp.el --- description -*- lexical-binding: t; -*- + +;; Copyright (C) 2019 Reed Mullanix + +;; Author: Reed Mullanix +;; Keywords: + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; lsp-fsharp client + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-fsharp nil + "LSP support for the F# Programming Language, using the FsharpAutoComplete server." + :link '(url-link "https://github.com/fsharp/FsAutoComplete") + :group 'lsp-mode + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-fsharp-server-install-dir (f-join lsp-server-install-dir "fsautocomplete/") + "Install directory for fsautocomplete server. +The slash is expected at the end." + :group 'lsp-fsharp + :risky t + :type 'directory + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-fsharp-server-args nil + "Extra arguments for the F# language server." + :type '(repeat string) + :group 'lsp-fsharp + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-fsharp-keywords-autocomplete t + "Provides keywords in autocomplete list." + :group 'lsp-fsharp + :type 'boolean + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-fsharp-external-autocomplete nil + "Provides autocompletion for symbols from not opened namespaces/modules; +inserts open on accept." + :group 'lsp-fsharp + :type 'boolean + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-fsharp-linter t + "Enables FSharpLint integration, provides additional warnings and code +action fixes." + :group 'lsp-fsharp + :type 'boolean + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-fsharp-union-case-stub-generation t + "Enables a code action to generate pattern matching cases." + :group 'lsp-fsharp + :type 'boolean + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-fsharp-union-case-stub-generation-body "failwith \"Not Implemented\"" + "Defines dummy body used by pattern matching generator." + :group 'lsp-fsharp + :type 'string + :risky t + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-fsharp-record-stub-generation t + "Enables code action to generate record stub." + :group 'lsp-fsharp + :type 'boolean + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-fsharp-record-stub-generation-body "failwith \"Not Implemented\"" + "Defines dummy body used by record stub generator." + :group 'lsp-fsharp + :type 'string + :risky t + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-fsharp-interface-stub-generation t + "Enables code action to generate an interface stub." + :group 'lsp-fsharp + :type 'boolean + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-fsharp-interface-stub-generation-object-identifier "this" + "Defines object identifier used by interface stub generator, +e.g. `this' or `self'." + :group 'lsp-fsharp + :type 'string + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-fsharp-interface-stub-generation-method-body "failwith \"Not Implemented\"" + "Defines dummy body used by interface stub generator." + :group 'lsp-fsharp + :type 'string + :risky t + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-fsharp-unused-opens-analyzer t + "Enables unused open detection." + :group 'lsp-fsharp + :type 'boolean + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-fsharp-unused-declarations-analyzer t + "Enables unused symbol detection." + :group 'lsp-fsharp + :type 'boolean + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-fsharp-simplify-name-analyzer nil + "Enables simplify name analyzer and remove redundant qualifier quick fix." + :group 'lsp-fsharp + :type 'boolean + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-fsharp-resolve-namespaces t + "Enables resolve namespace quick fix; adds `open' if symbol is from not yet +opened module/namespace." + :group 'lsp-fsharp + :type 'boolean + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-fsharp-enable-reference-code-lens t + "Enables reference count code lenses." + :group 'lsp-fsharp + :type 'boolean + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-fsharp-auto-workspace-init nil + "Enable automatic workspace initialization. +Do note that this can cause unexpected or challenging behaviors, as solutions +with test projects are not autoloaded by FSharpAutoComplete." + :group 'lsp-fsharp + :type 'boolean + :risky t) + +(defcustom lsp-fsharp-generate-binlog nil + "Generate a binlog for debugging project cracking." + :group 'lsp-fsharp + :type 'boolean + :package-version '(lsp-mode . "8.0.1")) + +(defun lsp-fsharp--fsac-install (_client callback error-callback update?) + "Install/update fsautocomplete language server using `dotnet tool'. +Will invoke CALLBACK or ERROR-CALLBACK based on result. Will update if +UPDATE? is t." + (lsp-async-start-process + callback + error-callback + "dotnet" "tool" (if update? "update" "install") "-g" "fsautocomplete")) + +(defcustom lsp-fsharp-use-dotnet-tool-for-fsac t + "Run FsAutoComplete as a dotnet tool. + +The binary will be invoked via \"dotnet fsautocomplete\" in the +project's root directory, which will run a project-local tool if +available, else the globally installed tool." + :group 'lsp-fsharp + :type 'boolean + :risky t) + +(defun lsp-fsharp--fsac-cmd () + "The location of fsautocomplete executable." + (or (-let [maybe-local-executable (expand-file-name "fsautocomplete" lsp-fsharp-server-install-dir)] + (when (f-exists-p maybe-local-executable) + maybe-local-executable)) + (executable-find "fsautocomplete") + (f-join (or (getenv "USERPROFILE") (getenv "HOME")) + ".dotnet" "tools" "fsautocomplete"))) + +(defun lsp-fsharp--make-launch-cmd () + "Build the command required to launch fsautocomplete." + + ;; emacs-28.1 on macOS has an issue + ;; that it launches processes using posix_spawn but does not reset sigmask properly + ;; thus causing dotnet runtime to lockup awaiting a SIGCHLD signal that never comes + ;; from subprocesses that quit + ;; + ;; as a workaround we will wrap fsautocomplete invocation in "/bin/ksh -c" (on macos) + ;; so it launches with proper sigmask + ;; + ;; see https://lists.gnu.org/archive/html/emacs-devel/2022-02/msg00461.html + ;; -- + ;; we also try to resolve full path to fsautocomplete using `executable-find' as + ;; our `startup-wrapper' may use $PATH to interpret the location of fsautocomplete + ;; and we want to actually use `exec-path' here + + (let ((startup-wrapper (cond ((and (eq 'darwin system-type) + (version= "28.1" emacs-version)) + (list "/bin/ksh" "-c")) + + (t nil))) + (fsautocomplete-exec (lsp-fsharp--fsac-cmd))) + (append startup-wrapper + (list fsautocomplete-exec) + lsp-fsharp-server-args))) + +(defun lsp-fsharp--test-fsautocomplete-present () + "Return non-nil if dotnet tool fsautocomplete is installed globally." + (if lsp-fsharp-use-dotnet-tool-for-fsac + (string-match-p "fsautocomplete" + (shell-command-to-string "dotnet tool list -g")) + (f-exists? (lsp-fsharp--fsac-cmd)))) + +(defun lsp-fsharp--project-list (workspace) + "Get the list of files we need to send to fsharp/workspaceLoad." + (let* ((response (lsp-request "fsharp/workspacePeek" + `(:directory ,(lsp--workspace-root workspace) + :deep 10 + :excludedDirs ["paket-files" ".git" "packages" "node_modules"]))) + (data (lsp--read-json (lsp-get response :content))) + (found (-> data (lsp-get :Data) (lsp-get :Found))) + (directory (seq-find (lambda (d) (equal "directory" (lsp-get d :Type))) found))) + (-> directory (lsp-get :Data) (lsp-get :Fsprojs)))) + +;;;###autoload +(defun lsp-fsharp--workspace-load (projects) + "Load all of the provided PROJECTS." + (lsp-request-async "fsharp/workspaceLoad" + `(:textDocuments ,(vconcat [] (mapcar (lambda (p) `(:uri ,p)) projects))) + (lambda (_) + (lsp--info "Workspace Loaded!")))) + +(defvar lsp-fsharp--default-init-options (list) + "Default init options to be passed to FSharpAutoComplete, + updated conditionally by `lsp-fsharp--make-init-options'.") + +(defun lsp-fsharp--make-init-options () + "Init options for F#." + (-let [opts lsp-fsharp--default-init-options] + (if lsp-fsharp-auto-workspace-init + (push '(:AutomaticWorkspaceInit . t) opts) + opts))) + +(lsp-register-custom-settings + `(("FSharp.KeywordsAutocomplete" lsp-fsharp-keywords-autocomplete t) + ("FSharp.ExternalAutocomplete" lsp-fsharp-external-autocomplete t) + ("FSharp.Linter" lsp-fsharp-linter t) + ("FSharp.UnionCaseStubGeneration" lsp-fsharp-union-case-stub-generation t) + ("FSharp.UnionCaseStubGenerationBody" lsp-fsharp-union-case-stub-generation-body) + ("FSharp.RecordStubGeneration" lsp-fsharp-record-stub-generation t) + ("FSharp.RecordStubGenerationBody" lsp-fsharp-record-stub-generation-body) + ("FSharp.InterfaceStubGeneration" lsp-fsharp-interface-stub-generation t) + ("FSharp.InterfaceStubGenerationObjectIdentifier" lsp-fsharp-interface-stub-generation-object-identifier) + ("FSharp.InterfaceStubGenerationMethodBody" lsp-fsharp-interface-stub-generation-method-body) + ("FSharp.UnusedOpensAnalyzer" lsp-fsharp-unused-opens-analyzer t) + ("FSharp.UnusedDeclarationsAnalyzer" lsp-fsharp-unused-declarations-analyzer t) + ("FSharp.SimplifyNameAnalyzer" lsp-fsharp-simplify-name-analyzer t) + ("FSharp.ResolveNamespaces" lsp-fsharp-resolve-namespaces t) + ("FSharp.EnableReferenceCodeLens" lsp-fsharp-enable-reference-code-lens t) + ("FSharp.GenerateBinlog" lsp-fsharp-generate-binlog t))) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection + #'lsp-fsharp--make-launch-cmd + #'lsp-fsharp--test-fsautocomplete-present) + :major-modes '(fsharp-mode) + :notification-handlers (ht ("fsharp/notifyCancel" #'ignore) + ("fsharp/notifyWorkspace" #'ignore) + ("fsharp/fileParsed" #'ignore) + ("fsharp/notifyWorkspacePeek" #'ignore) + ("fsharp/documentAnalyzed" #'ignore) + ("workspace/codeLens/refresh" #'ignore) + ("fsharp/testDetected" #'ignore)) + :initialization-options 'lsp-fsharp--make-init-options + :initialized-fn (lambda (workspace) + (with-lsp-workspace workspace + ;; Something needs to be calling lsp--set-configuration + (progn + (lsp--set-configuration + (lsp-configuration-section "fsharp")) + (lsp-fsharp--workspace-load + (lsp-fsharp--project-list workspace))))) + :after-open-fn ;; workaround https://github.com/fsharp/FsAutoComplete/issues/833 + (lambda () + (setq-local lsp-default-create-error-handler-fn + (lambda (method) + (lambda (error) + (when + (not + (seq-find (lambda (s) + (string= s (lsp-get error :message))) + '("Index was outside the bounds of the array." + "No symbol information found" + "No ident at this location"))) + (lsp--warn + "%s" + (or (lsp--error-string error) + (format "%s Request has failed" method)))))))) + :server-id 'fsac + :download-server-fn #'lsp-fsharp--fsac-install)) + +(lsp-consistency-check lsp-fsharp) + +(provide 'lsp-fsharp) +;;; lsp-fsharp.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-gdscript.el b/code/elpa/lsp-mode-20240319.1043/lsp-gdscript.el new file mode 100644 index 0000000..e9448bc --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-gdscript.el @@ -0,0 +1,62 @@ +;;; lsp-gdscript.el --- LSP mode -*- lexical-binding: t; -*- + +;; Copyright (C) 2020 Oliver Frank + +;; Author: Oliver Frank +;; Keywords: languages + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; lsp-gdscript client + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-gdscript nil + "LSP support for GDScript, using godot's language server." + :group 'lsp-mode + :link '(url-link "https://github.com/godotengine/godot") + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-gdscript-port 6005 + "Port to connect server to" + :type 'integer + :group 'lsp-gdscript) + +(defun lsp-gdscript-tcp-connect-to-port () + "Define a TCP connection to language server." + (list + :connect (lambda (filter sentinel name _environment-fn _workspace) + (let* ((host "localhost") + (port lsp-gdscript-port) + (tcp-proc (lsp--open-network-stream host port (concat name "::tcp")))) + + (set-process-query-on-exit-flag tcp-proc nil) + (set-process-filter tcp-proc filter) + (set-process-sentinel tcp-proc sentinel) + (cons tcp-proc tcp-proc))) + :test? (lambda () t))) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-gdscript-tcp-connect-to-port) + :activation-fn (lsp-activate-on "gdscript") + :server-id 'gdscript)) + +(lsp-consistency-check lsp-gdscript) + +(provide 'lsp-gdscript) +;;; lsp-gdscript.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-gleam.el b/code/elpa/lsp-mode-20240319.1043/lsp-gleam.el new file mode 100644 index 0000000..f78756f --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-gleam.el @@ -0,0 +1,48 @@ +;;; lsp-gleam.el --- gleam client -*- lexical-binding: t; -*- + +;; Copyright (C) 2022 emacs-lsp maintainers + +;; Author: Jonathan Arnett +;; Keywords: lsp gleam + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP client for the Gleam Programming Language. + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-gleam nil + "LSP support for Gleam." + :group 'lsp-mode + :link '(url-link "https://gleam.run")) + +(defcustom lsp-gleam-executable '("gleam" "lsp") + "Command to run the Gleam LSP server." + :group 'lsp-gleam + :risky t + :type 'file) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection lsp-gleam-executable) + :major-modes '(gleam-mode) + :priority -1 + :server-id 'gleam-lsp)) + +(provide 'lsp-gleam) +;;; lsp-gleam.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-glsl.el b/code/elpa/lsp-mode-20240319.1043/lsp-glsl.el new file mode 100644 index 0000000..7855915 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-glsl.el @@ -0,0 +1,49 @@ +;;; lsp-glsl.el --- GLSL client -*- lexical-binding: t; -*- + +;; Copyright (C) 2023 emacs-lsp maintainers + +;; Author: Jen-Chieh Shen +;; Keywords: languages lsp glsl + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: +;; +;; LSP client for the GLSL. +;; + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-glsl nil + "LSP support for GLSL." + :group 'lsp-mode + :link '(url-link "https://github.com/svenstaro/glsl-language-server")) + +(defcustom lsp-glsl-executable '("glslls" "--stdin") + "Command to run the GLSL language server." + :group 'lsp-glsl + :risky t + :type 'list) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection lsp-glsl-executable) + :activation-fn (lsp-activate-on "glsl") + :priority -1 + :server-id 'glslls)) + +(provide 'lsp-glsl) +;;; lsp-glsl.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-go.el b/code/elpa/lsp-mode-20240319.1043/lsp-go.el new file mode 100644 index 0000000..6d3b4ae --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-go.el @@ -0,0 +1,360 @@ +;;; lsp-go.el --- Go Client settings -*- lexical-binding: t; -*- + +;; Copyright (C) 2019 Muir Manders + +;; Author: Muir Manders +;; Keywords: + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; lsp-go client + +;;; Code: + +(require 'lsp-mode) +(require 'lsp-completion) + +(defgroup lsp-go nil + "LSP support for the Go Programming Language, using the gopls language server." + :link '(url-link "https://github.com/golang/tools/blob/master/gopls/README.md") + :group 'lsp-mode + :package-version '(lsp-mode . "6.3.2")) + +(define-obsolete-variable-alias + 'lsp-gopls-server-path + 'lsp-go-gopls-server-path + "lsp-mode 7.0.1") + +(defcustom lsp-go-gopls-server-path "gopls" + "Path to gopls server binary." + :type 'string + :group 'lsp-go) + +(define-obsolete-variable-alias + 'lsp-gopls-server-args + 'lsp-go-gopls-server-args + "lsp-mode 7.0.1") + +(defcustom lsp-go-gopls-server-args '("-remote=auto") + "Extra CLI arguments for gopls." + :type '(repeat string) + :group 'lsp-go) + +(define-obsolete-variable-alias + 'lsp-gopls-use-placeholders + 'lsp-go-use-placeholders + "lsp-mode 7.0.1") + +(defcustom lsp-go-use-placeholders t + "Cause gopls to provide placeholder parameter snippets when +completing function calls." + :type 'boolean + :group 'lsp-go) + +(define-obsolete-variable-alias + 'lsp-gopls-build-flags + 'lsp-go-build-flags + "lsp-mode 7.0.1") + +(defcustom lsp-go-build-flags [] + "A vector of flags passed on to the build system when invoked, + applied to queries like `go list'." + :type 'lsp-string-vector + :group 'lsp-go + :risky t + :package-version '(lsp-mode "6.2")) + +(define-obsolete-variable-alias + 'lsp-gopls-env + 'lsp-go-env + "lsp-mode 7.0.1") + +(defcustom lsp-go-env nil + "`gopls' has the unusual ability to set environment variables, + intended to affect the behavior of commands invoked by `gopls' + on the user's behalf. This variable takes a hash table of env + var names to desired values." + :type '(alist :key-type (symbol :tag "env var name") :value-type (string :tag "value")) + :group 'lsp-go + :risky t + :package-version '(lsp-mode "6.2")) + +(defcustom lsp-go-directory-filters [] + "A vector of directory filters." + :link '(url-link "https://github.com/golang/tools/blob/67e49ef2d0f326051e22a4a55bdf9344ae1a8ed8/gopls/doc/settings.md#directoryfilters-string") + :group 'lsp-go + :type 'lsp-string-vector + :package-version '(lsp-mode "8.0.0")) + +(define-obsolete-variable-alias + 'lsp-gopls-hover-kind + 'lsp-go-hover-kind + "lsp-mode 7.0.1") + +(defcustom lsp-go-hover-kind "SynopsisDocumentation" + "`gopls' allows the end user to select the desired amount of + documentation returned during e.g. hover and thing-at-point + operations." + :type '(choice (const "SynopsisDocumentation") + (const "NoDocumentation") + (const "FullDocumentation") + (const "SingleLine") + (const "Structured")) + :group 'lsp-go + :risky t + :package-version '(lsp-mode "6.2")) + +(define-obsolete-variable-alias + 'lsp-gopls-available-codelens + 'lsp-go-available-codelenses + "lsp-mode 7.0.1") + +(define-obsolete-variable-alias + 'lsp-go-available-codelens + 'lsp-go-available-codelenses + "lsp-mode 7.0.1") + +(defvar lsp-go-available-codelenses + '( + (gc_details . "Toggle the calculation of gc annotations") + (generate . "Run `go generate` for a directory") + (regenerate_cgo . "Regenerate cgo definitions") + (test . "Run `go test` for a specific set of test or benchmark functions (legacy)") + (tidy . "Run `go mod tidy` for a module") + (upgrade_dependency . "Upgrade a dependency") + (vendor . "Runs `go mod vendor' for a module")) + "Available codelenses that can be further enabled or disabled + through `lsp-go-codelenses'.") + +(defun lsp-go--defcustom-available-as-alist-type (alist) + "Return a list for the `:type' field in `defcustom' used to populate an alist. + +The input ALIST has the form `((\"name\" . \"documentation sentence\") [...])' + +The returned type provides a tri-state that either: + - does not include the element in the alist + - sets element to false (actually, :json-false) + - sets element to true \(actually, t)" + (let ((list '())) + (dolist (v alist) + (push `(cons + :tag ,(cdr v) + (const :format "" ,(car v)) + (choice (const :tag "Enable" t) (const :tag "Disable" :json-false))) + list)) + (push 'set list) + list)) + +(define-obsolete-variable-alias + 'lsp-gopls-codelens + 'lsp-go-codelenses + "lsp-mode 7.0.1") + +(define-obsolete-variable-alias + 'lsp-go-codelens + 'lsp-go-codelenses + "lsp-mode 7.0.1") + +(defcustom lsp-go-codelenses '((gc_details . :json-false) + (generate . t) + (regenerate_cgo . t) + (tidy . t) + (upgrade_dependency . t) + (test . t) + (vendor . t)) + "Select what codelenses should be enabled or not. + +The codelenses can be found at https://github.com/golang/tools/blob/3fa0e8f87c1aae0a9adc2a63af1a1945d16d9359/internal/lsp/source/options.go#L106-L112." + :type (lsp-go--defcustom-available-as-alist-type lsp-go-available-codelenses) + :group 'lsp-go + :risky t + :package-version '(lsp-mode "7.0")) + +(define-obsolete-variable-alias + 'lsp-clients-go-library-directories + 'lsp-go-library-directories + "lsp-mode 7.0.1") + +(defcustom lsp-go-library-directories '("/usr") + "List of directories which will be considered to be libraries." + :group 'lsp-go + :risky t + :type '(repeat string)) + +(define-obsolete-variable-alias + 'lsp-clients-go-library-directories-include-go-modules + 'lsp-go-library-directories-include-go-modules + "lsp-mode 7.0.1") + +(defcustom lsp-go-library-directories-include-go-modules t + "Whether or not $GOPATH/pkg/mod should be included as a library directory." + :type 'boolean + :group 'lsp-go) + +(defun lsp-go--library-default-directories (_workspace) + "Calculate go library directories. + +If `lsp-go-library-directories-include-go-modules' is non-nil +and the environment variable GOPATH is set this function will return +$GOPATH/pkg/mod along with the value of +`lsp-go-library-directories'." + (let ((library-dirs lsp-go-library-directories)) + (when (and lsp-go-library-directories-include-go-modules + (or (and (not (file-remote-p default-directory)) (executable-find "go")) + (and (version<= "27.0" emacs-version) (with-no-warnings (executable-find "go" (file-remote-p default-directory)))))) + (with-temp-buffer + (when (zerop (process-file "go" nil t nil "env" "GOPATH")) + (setq library-dirs + (append + library-dirs + (list + (concat + (string-trim-right (buffer-substring (point-min) (point-max))) + "/pkg/mod"))))))) + (if (file-remote-p default-directory) + (mapcar (lambda (path) (concat (file-remote-p default-directory) path)) library-dirs) + library-dirs))) + +(defcustom lsp-go-link-target "pkg.go.dev" + "Which website to use for displaying Go documentation." + :type '(choice (const "pkg.go.dev") + (string :tag "A custom website")) + :group 'lsp-go + :package-version '(lsp-mode "7.0.1")) + +(defcustom lsp-go-links-in-hover t + "If non-nil, hover documentation includes links." + :type 'boolean + :group 'lsp-go + :package-version '(lsp-mode "8.0.0")) + +(defcustom lsp-go-use-gofumpt nil + "If non-nil, use gofumpt formatting." + :type 'boolean + :group 'lsp-go + :package-version '(lsp-mode "8.0.0")) + +(defcustom lsp-go-goimports-local "" + "Equivalent of the goimports -local flag, which puts imports beginning with + this string after third-party packages. It should be the prefix of the import + path whose imports should be grouped separately." + :type 'string + :group 'lsp-go + :package-version '(lsp-mode "8.0.0")) + +(defcustom lsp-go-analyses nil + "Specify analyses that the user would like to enable or disable. A map of the + names of analysis passes that should be enabled/disabled. A full list of + analyzers that gopls uses can be found at + https://github.com/golang/tools/blob/master/gopls/doc/analyzers.md" + :type '(alist :key-type (string :tag "analyzer name") :value-type (boolean :tag "value")) + :group 'lsp-go + :risky t + :package-version '(lsp-mode "8.0.0")) + +(defcustom lsp-go-import-shortcut "Both" + "Specifies whether import statements should link to documentation or go to + definitions." + :type '(choice (const "Both") + (const "Link") + (const "Definition")) + :group 'lsp-go + :risky t + :package-version '(lsp-mode "8.0.0")) + +(defcustom lsp-go-symbol-matcher "Fuzzy" + "Sets the algorithm that is used when finding workspace symbols." + :type '(choice (const "Fuzzy") + (const "CaseInsensitive") + (const "CaseSensitive")) + :group 'lsp-go + :risky t + :package-version '(lsp-mode "8.0.0")) + +(defcustom lsp-go-symbol-style "Dynamic" + "Controls how symbols are qualified in symbol responses. + + `Dynamic' uses whichever qualifier results in the highest scoring match for + the given symbol query. Here a `qualifier' is any `/' or '.' delimited suffix + of the fully qualified symbol. i.e. `to/pkg.Foo.Field' or just `Foo.Field'. + + `Full' is fully qualified symbols, i.e. `path/to/pkg.Foo.Field'. + + `Package' is package qualified symbols i.e. `pkg.Foo.Field'." + :type '(choice (const "Dynamic") + (const "Full") + (const "Package")) + :group 'lsp-go + :risky t + :package-version '(lsp-mode "8.0.0")) + +(lsp-register-custom-settings + '(("gopls.usePlaceholders" lsp-go-use-placeholders t) + ("gopls.hoverKind" lsp-go-hover-kind) + ("gopls.buildFlags" lsp-go-build-flags) + ("gopls.env" lsp-go-env) + ("gopls.linkTarget" lsp-go-link-target) + ("gopls.codelenses" lsp-go-codelenses) + ("gopls.linksInHover" lsp-go-links-in-hover t) + ("gopls.gofumpt" lsp-go-use-gofumpt t) + ("gopls.local" lsp-go-goimports-local) + ("gopls.directoryFilters" lsp-go-directory-filters) + ("gopls.analyses" lsp-go-analyses) + ("gopls.importShortcut" lsp-go-import-shortcut) + ("gopls.symbolMatcher" lsp-go-symbol-matcher) + ("gopls.symbolStyle" lsp-go-symbol-style))) + +(defcustom lsp-go-server-wrapper-function + #'identity + "Function to wrap the language server process started by lsp-go. + +For example, you can pick a go binary provided by a repository's +flake.nix file with: + + (use-package nix-sandbox) + (defun my/nix--lsp-go-wrapper (args) + (if-let ((sandbox (nix-current-sandbox))) + (apply `nix-shell-command sandbox args) + args)) + (setq lsp-go-server-path \"gopls\" + lsp-go-server-wrapper-function `my/nix--lsp-go-wrapper)" + :group 'lsp-go + :type '(choice + (function-item :tag "None" :value identity) + (function :tag "Custom function"))) + +(defun lsp-go--server-command () + "Command and arguments for launching the inferior language server process. +These are assembled from the customizable variables `lsp-go-server-path' +and `lsp-go-server-wrapper-function'." + (funcall lsp-go-server-wrapper-function (append (list lsp-go-gopls-server-path) lsp-go-gopls-server-args))) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection 'lsp-go--server-command) + :activation-fn (lsp-activate-on "go" "go.mod") + :language-id "go" + :priority 0 + :server-id 'gopls + :completion-in-comments? t + :library-folders-fn #'lsp-go--library-default-directories + :after-open-fn (lambda () + ;; https://github.com/golang/tools/commit/b2d8b0336 + (setq-local lsp-completion-filter-on-incomplete nil)))) + +(lsp-consistency-check lsp-go) + +(provide 'lsp-go) +;;; lsp-go.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-golangci-lint.el b/code/elpa/lsp-mode-20240319.1043/lsp-golangci-lint.el new file mode 100644 index 0000000..b25b547 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-golangci-lint.el @@ -0,0 +1,168 @@ +;;; lsp-golangci-lint.el --- golangci-lint-langserver Client settings -*- lexical-binding: t; -*- + +;; Copyright (C) 2023 Jim Myhrberg + +;; Author: Jim Myhrberg +;; Keywords: lsp, go, golang, golangci-lint + +;; This file is not part of GNU Emacs + +;;; License: +;; +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: +;; +;; lsp-golangci-lint client + +;;; Code: + +(require 'lsp-mode) +(require 'lsp-go) +(require 'cl-lib) + +(defgroup lsp-golangci-lint nil + "Configuration options for lsp-golangci-lint." + :group 'lsp-mode + :link '(url-lint "https://github.com/nametake/golangci-lint-langserver") + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-golangci-lint-server-path "golangci-lint-langserver" + "Command to run golangci-lint-langserver." + :type 'string + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-golangci-lint-server-debug nil + "Whether to run golangci-lint-langserver in debug mode or not." + :type 'boolean + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-golangci-lint-server-args nil + "Arguments to pass to golangci-lint-langserver." + :type '(repeat string) + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-golangci-lint-path "golangci-lint" + "Command to run golangci-lint." + :type 'string + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-golangci-lint-allow-parallel-runners t + "If not nil, pass --allow-parallel-runners flag to golangci-lint run." + :type 'boolean + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-golangci-lint-build-tags nil + "If non-empty list, pass as --build-tags flag value to golangci-lint run." + :type '(repeat string) + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-golangci-lint-fast nil + "If not nil, pass --fast flag to golangci-lint run." + :type 'boolean + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-golangci-lint-enable-all nil + "If not nil, pass --enable-all flag to golangci-lint run." + :type 'boolean + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-golangci-lint-enable nil + "If non-empty list, pass as --enable flag value to golangci-lint run." + :type '(repeat string) + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-golangci-lint-disable-all nil + "If not nil, pass --disable-all to golangci-lint run." + :type 'boolean + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-golangci-lint-disable nil + "If non-empty list, pass as --disable flag value to golangci-lint run." + :type '(repeat string) + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-golangci-lint-config nil + "If set, pass value as --config flag to golangci-lint run." + :type 'string + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-golangci-lint-no-config nil + "If not nil, pass --no-config flag to golangci-lint run." + :type 'boolean + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-golangci-lint-run-args nil + "Arguments to pass to golangci-lint run command." + :type '(repeat string) + :package-version '(lsp-mode . "8.0.1")) + +(defun lsp-golangci-lint-server--stdio-command () + "Return the command and args to start golangci-lint-langserver." + (let ((args (list lsp-golangci-lint-server-path))) + (when (and (listp lsp-golangci-lint-server-args) + (> (length lsp-golangci-lint-server-args) 0)) + (setq args (append args lsp-golangci-lint-server-args))) + (when lsp-golangci-lint-server-debug + (setq args (append args '("-debug")))) + args)) + +(defun lsp-golangci-lint--run-args () + "Return the arguments to pass to golangci-lint run command." + (let* ((tags (string-join lsp-golangci-lint-build-tags " ")) + (enable (string-join lsp-golangci-lint-enable ",")) + (disable (string-join lsp-golangci-lint-disable ",")) + (args (cl-loop for (condition flag value) in + `((,lsp-golangci-lint-fast "--fast" nil) + (,(not (string-empty-p tags)) "--build-tags" ,tags) + (,lsp-golangci-lint-enable-all "--enable-all" nil) + (,lsp-golangci-lint-disable-all "--disable-all" nil) + (,(not (string-empty-p enable)) "--enable" ,enable) + (,(not (string-empty-p disable)) "--disable" ,disable) + (,lsp-golangci-lint-allow-parallel-runners + "--allow-parallel-runners" nil) + (,(and (stringp lsp-golangci-lint-config) + (not (string-empty-p lsp-golangci-lint-config))) + "--config" lsp-golangci-lint-config)) + when condition + append (if value (list flag value) (list flag))))) + (when (and (listp lsp-golangci-lint-run-args) + (> (length lsp-golangci-lint-run-args) 0)) + (setq args (append args lsp-golangci-lint-run-args))) + args)) + +(defun lsp-golangci-lint--get-initialization-options () + "Return initialization options for golangci-lint-langserver." + (let ((opts (make-hash-table :test 'equal)) + (command (vconcat `(,lsp-golangci-lint-path) + ["run" "--out-format=json" "--issues-exit-code=1"] + (lsp-golangci-lint--run-args)))) + (puthash "command" command opts) + opts)) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection + #'lsp-golangci-lint-server--stdio-command) + :activation-fn (lsp-activate-on "go") + :language-id "go" + :priority 0 + :server-id 'golangci-lint + :add-on? t + :library-folders-fn #'lsp-go--library-default-directories + :initialization-options #'lsp-golangci-lint--get-initialization-options)) + +(lsp-consistency-check lsp-golangci-lint) + +(provide 'lsp-golangci-lint) +;;; lsp-golangci-lint.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-graphql.el b/code/elpa/lsp-mode-20240319.1043/lsp-graphql.el new file mode 100644 index 0000000..2a93dc3 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-graphql.el @@ -0,0 +1,74 @@ +;;; lsp-graphql.el --- lsp client for graphql -*- lexical-binding: t; -*- + +;; Copyright (C) 2021 Binbin Ye + +;; Author: Binbin Ye +;; Keywords: lsp, graphql + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; Support for running graphql lsp. Support multiple server running at the same time when editing tsx/jsx. + +;;; Code: + +(require 'lsp-mode) + +(lsp-dependency 'graphql-language-service-cli + '(:system "graphql-lsp") + '(:npm :package "graphql-language-service-cli" + :path "graphql-lsp")) + + +(defgroup lsp-graphql nil + "LSP support for the GraphQL, using the graphql-language-service-cli as language server." + :link '(url-link "https://github.com/graphql/graphiql/tree/main/packages/graphql-language-service-cli#readme") + :group 'lsp-mode) + +(defcustom lsp-clients-graphql-server-args '("server" "--method=stream") + "CLI arguments for graphql language server." + :type '(repeat string) + :risky t + :group 'lsp-graphql) + +(defun lsp-graphql-activate-p (filename &optional _) + "Check if the GraphQL language server should be enabled based on FILENAME." + (or (string-match-p (rx (one-or-more anything) "." + (or "ts" "js" "jsx" "tsx" "vue" "graphql" "gql")eos) + filename) + (and (derived-mode-p 'js-mode 'js2-mode 'typescript-mode 'typescript-ts-mode) + (not (derived-mode-p 'json-mode))))) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection (lambda() + (cons (lsp-package-path 'graphql-language-service-cli) + lsp-clients-graphql-server-args))) + :major-modes '(graphql-mode) + :language-id "graphql" + :server-id 'graphql-lsp + :priority -3 + :add-on? t + :multi-root t + :activation-fn 'lsp-graphql-activate-p + :download-server-fn (lambda (_client callback error-callback _update?) + (lsp-package-ensure + 'graphql-language-service-cli + callback + error-callback)))) + +(lsp-consistency-check lsp-graphql) + +(provide 'lsp-graphql) +;;; lsp-graphql.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-groovy.el b/code/elpa/lsp-mode-20240319.1043/lsp-groovy.el new file mode 100644 index 0000000..c1fcaaf --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-groovy.el @@ -0,0 +1,66 @@ +;;; lsp-groovy.el --- description -*- lexical-binding: t; -*- + +;; Copyright (C) 2020 emacs-lsp maintainers + +;; Author: emacs-lsp maintainers +;; Keywords: lsp, groovy + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP Clients for the Groovy Programming Language. + +;;; Code: + +(require 'lsp-mode) +(require 'f) + +(defgroup lsp-groovy nil + "LSP support for Groovy, using groovy-language-server." + :group 'lsp-mode + :link '(url-link "https://github.com/prominic/groovy-language-server")) + +(defcustom lsp-groovy-server-file (f-join lsp-server-install-dir "groovy-language-server-all.jar") + "JAR file path for groovy-language-server-all.jar." + :group 'lsp-groovy + :risky t + :type 'file) + +(defun lsp-groovy--lsp-command () + "Generate LSP startup command." + `("java" "-jar" ,(expand-file-name lsp-groovy-server-file))) + +(defcustom lsp-groovy-classpath ["/usr/local/opt/groovy/libexec/lib"] + "List of paths to Groovy JARs." + :group 'lsp-groovy + :risky t + :type 'lsp-string-vector) + +(lsp-register-custom-settings + '(("groovy.classpath" lsp-groovy-classpath))) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection 'lsp-groovy--lsp-command) + :major-modes '(groovy-mode) + :priority -1 + :server-id 'groovy-ls + :initialized-fn (lambda (workspace) + (with-lsp-workspace workspace + (lsp--set-configuration (lsp-configuration-section "groovy")))))) + +(lsp-consistency-check lsp-groovy) + +(provide 'lsp-groovy) +;;; lsp-groovy.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-hack.el b/code/elpa/lsp-mode-20240319.1043/lsp-hack.el new file mode 100644 index 0000000..161659a --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-hack.el @@ -0,0 +1,54 @@ +;;; lsp-xxx.el --- description -*- lexical-binding: t; -*- + +;; Copyright (C) 2020 emacs-lsp maintainers + +;; Author: emacs-lsp maintainers +;; Keywords: lsp, hack + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP Clients for the Hack Programming Language. + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-hack nil + "LSP support for Hack, using HHVM." + :group 'lsp-mode + :link '(url-link "https://docs.hhvm.com/hhvm")) + +(defcustom lsp-clients-hack-command '("hh_client" "lsp" "--from" "emacs") + "Command to start hh_client." + :group 'lsp-hack + :risky t + :type '(repeat string)) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection (lambda () lsp-clients-hack-command)) + :major-modes '(hack-mode) + :priority -1 + :server-id 'hack + ;; ignore some unsupported messages from Nuclide + :notification-handlers (lsp-ht ("telemetry/event" 'ignore) + ("$/cancelRequest" 'ignore)) + :request-handlers (lsp-ht ("window/showStatus" 'ignore)))) + + +(lsp-consistency-check lsp-hack) + +(provide 'lsp-hack) +;;; lsp-hack.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-haxe.el b/code/elpa/lsp-mode-20240319.1043/lsp-haxe.el new file mode 100644 index 0000000..62707be --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-haxe.el @@ -0,0 +1,226 @@ +;;; lsp-haxe.el --- Haxe Client settings -*- lexical-binding: t; -*- + +;; Copyright (C) 2019 Yannik Böttcher + +;; Author: Yannik Böttcher +;; Keywords: + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; lsp-haxe client + +;;; Code: + + +;; adapted from lsp-clangd configuration +(require 'lsp-protocol) +(require 'lsp-mode) + +(defgroup lsp-haxe nil + "LSP support for Haxe using the language server provided by vshaxe" + :group 'lsp-mode + :link '(url-link "https://github.com/vshaxe/vshaxe")) + + +;; Haxe ls is executed via node +(defcustom lsp-clients--haxe-executable "node" + "Haxe ls is executed via node." + :group 'lsp-haxe + :risky t + :type 'file) + +;; The server.js is being passed to node as an argument +(defcustom lsp-clients--haxe-server-path (expand-file-name "~/.haxe-language-server/bin/server.js") + "The path to the server.js file." + :group 'lsp-haxe + :risky t + :type 'file) + +;; Build the actual Haxe ls command. +(defun lsp-clients--haxe-command () + "Haxe ls startup command." + `(,lsp-clients--haxe-executable ,lsp-clients--haxe-server-path)) + +;; https://github.com/yyoncho/lsp-mode/commit/72186e1adc089d772c87ed8f287eb3333b66bfa7 +;; This is to force the client to send a didChangeConfiguration Message. Without this, the server won't start, https://github.com/vshaxe/vshaxe/issues/328#issuecomment-471809093 +(defcustom lsp-clients--haxe-settings (list :haxe.executable "haxe") + "Lsp clients configuration settings." + :group 'lsp-haxe + :risky t + :type '(repeat string)) + +;; The build spec for the project. +(defcustom lsp-haxe-hxml "build.hxml" + "The compile file for the haxe project." + :type 'file + :group 'lsp-haxe + :package-version '(lsp-mode . "7.0")) + +;; https://github.com/emacs-lsp/lsp-mode/blob/150a933694349df960dc8fd7a15e04f5727e6433/lsp-rust.el#L251 +(lsp-defun lsp-clients--haxe-processStart (_workspace (&haxe:ProcessStartNotification :title)) + "Handle processStart notification. Just logs PARAMS." + (lsp-log title)) + +(defcustom lsp-haxe-executable "haxe" + nil + :type 'file + :group 'lsp-haxe) + +(defcustom lsp-haxe-configurations nil + nil + :type '(repeat string) + :group 'lsp-haxe) + +(defcustom lsp-haxe-display-configurations nil + nil + :type '(repeat string) + :group 'lsp-haxe) + +(defcustom lsp-haxe-display-server nil + nil + :type 'string + :group 'lsp-haxe) + +(defcustom lsp-haxe-display-port "auto" + nil + :type 'number + :group 'lsp-haxe) + +(defcustom lsp-haxe-enable-compilation-server t + nil + :type 'boolean + :group 'lsp-haxe) + +(defcustom lsp-haxe-task-presentation + '((echo . t) + (reveal . "always") + (focus . :json-false) + (panel . "shared") + (showReuseMessage . t) + (clear . :json-false)) + nil + :type 'plist + :group 'lsp-haxe) + +(defcustom lsp-haxe-enable-code-lens t + nil + :type 'boolean + :group 'lsp-haxe) + +(defcustom lsp-haxe-enable-diagnostics t + nil + :type 'boolean + :group 'lsp-haxe) + +(defcustom lsp-haxe-enable-server-view nil + nil + :type 'boolean + :group 'lsp-haxe) + +(defcustom lsp-haxe-enable-methods-view nil + nil + :type 'boolean + :group 'lsp-haxe) + +(defcustom lsp-haxe-enable-signature-help-documentation t + nil + :type 'boolean + :group 'lsp-haxe) + +(defcustom lsp-haxe-diagnostics-path-filter "${workspaceRoot}" + nil + :type 'string + :group 'lsp-haxe) + +(defcustom lsp-haxe-build-completion-cache t + nil + :type 'boolean + :group 'lsp-haxe) + +(defcustom lsp-haxe-enable-completion-cache-warning t + nil + :type 'boolean + :group 'lsp-haxe) + +(defcustom lsp-haxe-code-generation nil + nil + :type 'string + :group 'lsp-haxe) + +(defcustom lsp-haxe-exclude ["zpp_nape"] + nil + :type '(repeat string) + :group 'lsp-haxe) + +(defcustom lsp-haxe-postfix-completion nil + nil + :type 'string + :group 'lsp-haxe) + +(lsp-register-custom-settings + '(("haxe.hxml" lsp-haxe-hxml) + ("haxe.postfixCompletion" lsp-haxe-postfix-completion) + ("haxe.exclude" lsp-haxe-exclude) + ("haxe.codeGeneration" lsp-haxe-code-generation) + ("haxe.enableCompletionCacheWarning" lsp-haxe-enable-completion-cache-warning t) + ("haxe.buildCompletionCache" lsp-haxe-build-completion-cache t) + ("haxe.diagnosticsPathFilter" lsp-haxe-diagnostics-path-filter) + ("haxe.enableSignatureHelpDocumentation" lsp-haxe-enable-signature-help-documentation t) + ("haxe.enableMethodsView" lsp-haxe-enable-methods-view t) + ("haxe.enableServerView" lsp-haxe-enable-server-view t) + ("haxe.enableDiagnostics" lsp-haxe-enable-diagnostics t) + ("haxe.enableCodeLens" lsp-haxe-enable-code-lens t) + ("haxe.taskPresentation" lsp-haxe-task-presentation) + ("haxe.enableCompilationServer" lsp-haxe-enable-compilation-server t) + ("haxe.displayPort" lsp-haxe-display-port) + ("haxe.displayServer" lsp-haxe-display-server) + ("haxe.displayConfigurations" lsp-haxe-display-configurations) + ("haxe.configurations" lsp-haxe-configurations) + ("haxe.executable" lsp-haxe-executable))) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection #'lsp-clients--haxe-command) + :major-modes '(haxe-mode) ; force didChangeConfiguration message + :initialized-fn + (lambda (workspace) + (with-lsp-workspace workspace + (lsp--set-configuration (lsp-configuration-section "haxe")))) + :priority -1 + :server-id 'haxe + :initialization-options + (lambda () + `(:sendMethodResults t + :haxelibConfig (:executable "haxelib") + :displayServerConfig + ( :print (:reusing :json-false :completion :json-false) + :arguments [] + :env nil + :path "haxe") + :displayArguments [,lsp-haxe-hxml])) + :notification-handlers + (lsp-ht ("haxe/progressStart" 'lsp-clients--haxe-processStart) + ("haxe/progressStop" 'ignore) + ("haxe/didDetectOldPreview" 'ignore) + ("haxe/didChangeDisplayPort" 'ignore) + ("haxe/didRunHaxeMethod" 'ignore) + ("haxe/didChangeRequestQueue" 'ignore) + ("haxe/cacheBuildFailed" 'ignore)))) + +(lsp-consistency-check lsp-haxe) + +(provide 'lsp-haxe) +;;; lsp-haxe.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-headerline.el b/code/elpa/lsp-mode-20240319.1043/lsp-headerline.el new file mode 100644 index 0000000..cbdc765 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-headerline.el @@ -0,0 +1,493 @@ +;;; lsp-headerline.el --- LSP headerline features -*- lexical-binding: t; -*- +;; +;; Copyright (C) 2020 emacs-lsp maintainers +;; +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . +;; +;;; Commentary: +;; +;; LSP headerline features +;; +;;; Code: + +(require 'lsp-icons) +(require 'lsp-mode) + +(defgroup lsp-headerline nil + "LSP support for headerline" + :prefix "lsp-headerline-" + :group 'lsp-mode + :tag "LSP Headerline") + +(defcustom lsp-headerline-breadcrumb-segments '(path-up-to-project file symbols) + "Segments used in breadcrumb text on headerline." + :type '(repeat + (choice (const :tag "Include the project name." project) + (const :tag "Include the open file name." file) + (const :tag "Include the directories up to project." path-up-to-project) + (const :tag "Include document symbols if server supports it." symbols))) + :group 'lsp-headerline) + +(defcustom lsp-headerline-breadcrumb-enable-symbol-numbers nil + "Whether to label symbols with numbers on the breadcrumb." + :type 'boolean + :group 'lsp-headerline) + +(defcustom lsp-headerline-breadcrumb-enable-diagnostics t + "If non-nil, apply different face on the breadcrumb based on the errors." + :type 'boolean + :group 'lsp-headerline + :package-version '(lsp-mode . "8.0.0")) + +(defface lsp-headerline-breadcrumb-separator-face '((t :inherit shadow :height 0.8)) + "Face used for breadcrumb separator on headerline." + :group 'lsp-headerline) + +(defface lsp-headerline-breadcrumb-path-face '((t :inherit font-lock-string-face)) + "Face used for breadcrumb paths on headerline." + :group 'lsp-headerline) + +(defface lsp-headerline-breadcrumb-path-error-face + '((t :underline (:style wave :color "Red1") + :inherit lsp-headerline-breadcrumb-path-face)) + "Face used for breadcrumb paths on headerline when there is an error under +that path" + :group 'lsp-headerline) + +(defface lsp-headerline-breadcrumb-path-warning-face + '((t :underline (:style wave :color "Yellow") + :inherit lsp-headerline-breadcrumb-path-face)) + "Face used for breadcrumb paths on headerline when there is an warning under +that path" + :group 'lsp-headerline) + +(defface lsp-headerline-breadcrumb-path-info-face + '((t :underline (:style wave :color "Green") + :inherit lsp-headerline-breadcrumb-path-face)) + "Face used for breadcrumb paths on headerline when there is an info under +that path" + :group 'lsp-headerline) + +(defface lsp-headerline-breadcrumb-path-hint-face + '((t :underline (:style wave :color "Green") + :inherit lsp-headerline-breadcrumb-path-face)) + "Face used for breadcrumb paths on headerline when there is an hint under that +path" + :group 'lsp-headerline) + +(defface lsp-headerline-breadcrumb-project-prefix-face + '((t :inherit font-lock-string-face :weight bold)) + "Face used for breadcrumb prefix on headerline. +Only if `lsp-headerline-breadcrumb-prefix` is `project-name-only`." + :group 'lsp-headerline) + +(defface lsp-headerline-breadcrumb-unknown-project-prefix-face + '((t :inherit shadow :weight bold)) + "Face used for breadcrumb prefix on headerline. +Only if `lsp-headerline-breadcrumb-prefix` is `project-name-only`." + :group 'lsp-headerline) + +(defface lsp-headerline-breadcrumb-symbols-face + '((t :inherit font-lock-doc-face :weight bold)) + "Face used for breadcrumb symbols text on headerline." + :group 'lsp-headerline) + +(defface lsp-headerline-breadcrumb-symbols-error-face + '((t :inherit lsp-headerline-breadcrumb-symbols-face + :underline (:style wave :color "Red1"))) + "Face used for breadcrumb symbols text on headerline when there +is an error in symbols range." + :group 'lsp-headerline) + +(defface lsp-headerline-breadcrumb-symbols-warning-face + '((t :inherit lsp-headerline-breadcrumb-symbols-face + :underline (:style wave :color "Yellow"))) + "Face used for breadcrumb symbols text on headerline when there +is an warning in symbols range." + :group 'lsp-headerline) + +(defface lsp-headerline-breadcrumb-symbols-info-face + '((t :inherit lsp-headerline-breadcrumb-symbols-face + :underline (:style wave :color "Green"))) + "Face used for breadcrumb symbols text on headerline when there +is an info in symbols range." + :group 'lsp-headerline) + +(defface lsp-headerline-breadcrumb-symbols-hint-face + '((t :inherit lsp-headerline-breadcrumb-symbols-face + :underline (:style wave :color "Green"))) + "Face used for breadcrumb symbols text on headerline when there +is an hints in symbols range." + :group 'lsp-headerline) + +(defface lsp-headerline-breadcrumb-deprecated-face + '((t :inherit lsp-headerline-breadcrumb-symbols-face + :strike-through t)) + "Face used on breadcrumb deprecated text on modeline." + :group 'lsp-headerline) + +(defvar lsp-headerline-arrow nil + "Holds the current breadcrumb string on headerline.") + +(defvar-local lsp-headerline--path-up-to-project-segments nil + "Holds the current breadcrumb path-up-to-project segments for +caching purposes.") + +(defvar-local lsp-headerline--cached-workspace-root nil + "Holds the current value of lsp-workspace-root for caching purposes") + +;; Redefine local vars of `all-the-icons' to avoid bytecode compilation errors. +(defvar all-the-icons-default-adjust) +(defvar all-the-icons-scale-factor) + +(defun lsp-headerline--arrow-icon () + "Build the arrow icon for headerline breadcrumb." + (or + lsp-headerline-arrow + (setq lsp-headerline-arrow (let ((all-the-icons-scale-factor 1.0) + (all-the-icons-default-adjust 0)) + (lsp-icons-all-the-icons-material-icon + "chevron_right" + 'lsp-headerline-breadcrumb-separator-face + ">" + 'headerline-breadcrumb))))) + +(lsp-defun lsp-headerline--symbol-icon ((&DocumentSymbol :kind)) + "Build the SYMBOL icon for headerline breadcrumb." + (concat (lsp-icons-get-by-symbol-kind kind 'headerline-breadcrumb) + " ")) + +(lsp-defun lsp-headerline--go-to-symbol ((&DocumentSymbol + :selection-range (&RangeToPoint :start selection-start) + :range (&RangeToPoint :start narrowing-start + :end narrowing-end))) + "Go to breadcrumb symbol. +If the buffer is narrowed and the target symbol lies before the +minimum reachable point in the narrowed buffer, then widen and +narrow to the outer symbol." + (when (buffer-narrowed-p) + (narrow-to-region + (min (point-min) narrowing-start) + (max (point-max) narrowing-end))) + (goto-char selection-start)) + +(lsp-defun lsp-headerline--narrow-to-symbol ((&DocumentSymbol :range (&RangeToPoint :start :end))) + "Narrow to breadcrumb symbol range." + (narrow-to-region start end)) + +(defun lsp-headerline--with-action (local-map help-echo-string display-string) + "Assign LOCAL-MAP and HELP-ECHO-STRING to the region around the +DISPLAY-STRING." + (propertize display-string + 'mouse-face 'header-line-highlight + 'help-echo help-echo-string + 'local-map local-map)) + +(defmacro lsp-headerline--make-mouse-handler (&rest body) + "Making mouse event handler. +Switch to current mouse interacting window before doing BODY." + (declare (debug t) (indent 0)) + `(lambda (event) + (interactive "e") + (select-window (posn-window (elt event 1))) + ,@body)) + +(defun lsp-headerline--directory-with-action (full-path directory-display-string) + "Build action for FULL-PATH and DIRECTORY-DISPLAY-STRING." + (lsp-headerline--with-action (let ((map (make-sparse-keymap))) + (define-key map [header-line mouse-1] + (lsp-headerline--make-mouse-handler + (dired full-path))) + (define-key map [header-line mouse-2] + (lsp-headerline--make-mouse-handler + (dired-other-window full-path))) + map) + (format "mouse-1: browse '%s' with Dired\nmouse-2: browse '%s' with Dired in other window" + directory-display-string + directory-display-string) + (propertize directory-display-string + 'lsp-full-path full-path))) + +(declare-function evil-set-jump "ext:evil-jumps") + +(lsp-defun lsp-headerline--symbol-with-action ((symbol &as &DocumentSymbol :name) symbol-display-string) + "Build action for SYMBOL and SYMBOL-STRING." + (lsp-headerline--with-action (let ((map (make-sparse-keymap))) + (define-key map [header-line mouse-1] + (lsp-headerline--make-mouse-handler + (when (bound-and-true-p evil-mode) + (evil-set-jump)) + (lsp-headerline--go-to-symbol symbol))) + (define-key map [header-line mouse-2] + (lsp-headerline--make-mouse-handler + (-let (((&DocumentSymbol :range (&RangeToPoint :start :end)) symbol)) + (if (and (eq (point-min) start) (eq (point-max) end)) + (widen) + (lsp-headerline--narrow-to-symbol symbol))))) + map) + (format "mouse-1: go to '%s' symbol\nmouse-2: %s" + name + (-let (((&DocumentSymbol :range (&RangeToPoint :start :end)) symbol)) + (if (and (eq (point-min) start) (eq (point-max) end)) + "widen" + (format "narrow to '%s' range" name)))) + symbol-display-string)) + +(defun lsp-headerline--path-up-to-project-root (root-path path) + "Find recursively the folders until the project ROOT-PATH. +PATH is the current folder to be checked." + (let ((current-path path) + headerline-path-components) + (while (not (lsp-f-same? root-path current-path)) + (push (lsp-headerline--directory-with-action current-path + (f-filename current-path)) + headerline-path-components) + (setq current-path (lsp-f-parent current-path))) + headerline-path-components)) + +(defun lsp-headerline--build-project-string () + "Build the project-segment string for the breadcrumb." + (-if-let (root (lsp-headerline--workspace-root)) + (propertize (lsp-headerline--directory-with-action + root + (f-filename root)) + 'font-lock-face + 'lsp-headerline-breadcrumb-project-prefix-face) + (propertize "" + 'font-lock-face + 'lsp-headerline-breadcrumb-unknown-project-prefix-face))) + +(defun lsp-headerline--build-file-string () + "Build the file-segment string for the breadcrumb." + (let* ((file-path (or (buffer-file-name) "")) + (filename (f-filename file-path))) + (if-let ((file-ext (f-ext file-path))) + (concat (lsp-icons-get-by-file-ext file-ext 'headerline-breadcrumb) + " " + (propertize filename + 'font-lock-face + (lsp-headerline--face-for-path file-path))) + filename))) + + +(defun lsp-headerline--face-for-path (dir) + "Calculate the face for DIR." + (if-let ((diags (lsp-diagnostics-stats-for (directory-file-name dir)))) + (cl-labels ((check-severity + (severity) + (not (zerop (aref diags severity))))) + (cond + ((not lsp-headerline-breadcrumb-enable-diagnostics) + 'lsp-headerline-breadcrumb-path-face) + ((check-severity lsp/diagnostic-severity-error) + 'lsp-headerline-breadcrumb-path-error-face) + ((check-severity lsp/diagnostic-severity-warning) + 'lsp-headerline-breadcrumb-path-warning-face) + ((check-severity lsp/diagnostic-severity-information) + 'lsp-headerline-breadcrumb-path-info-face) + ((check-severity lsp/diagnostic-severity-hint) + 'lsp-headerline-breadcrumb-path-hint-face) + (t 'lsp-headerline-breadcrumb-path-face))) + 'lsp-headerline-breadcrumb-path-face)) + +(defun lsp-headerline--severity-level-for-range (range) + "Get the severity level for RANGE." + (let ((range-severity 10)) + (mapc (-lambda ((&Diagnostic :range (&Range :start) :severity?)) + (when (lsp-point-in-range? start range) + (setq range-severity (min range-severity severity?)))) + (lsp--get-buffer-diagnostics)) + range-severity)) + +(defun lsp-headerline--build-path-up-to-project-string () + "Build the path-up-to-project segment for the breadcrumb." + (if-let ((root (lsp-headerline--workspace-root))) + (let ((segments (or + lsp-headerline--path-up-to-project-segments + (setq lsp-headerline--path-up-to-project-segments + (lsp-headerline--path-up-to-project-root + root + (lsp-f-parent (buffer-file-name))))))) + (mapconcat (lambda (next-dir) + (propertize next-dir + 'font-lock-face + (lsp-headerline--face-for-path + (get-text-property + 0 'lsp-full-path next-dir)))) + segments + (concat " " (lsp-headerline--arrow-icon) " "))) + "")) + +(lsp-defun lsp-headerline--face-for-symbol ((&DocumentSymbol :deprecated? + :range)) + "Get the face for SYMBOL." + (let ((range-severity (lsp-headerline--severity-level-for-range range))) + (cond + (deprecated? 'lsp-headerline-breadcrumb-deprecated-face) + ((not lsp-headerline-breadcrumb-enable-diagnostics) + 'lsp-headerline-breadcrumb-symbols-face) + ((= range-severity lsp/diagnostic-severity-error) + 'lsp-headerline-breadcrumb-symbols-error-face) + ((= range-severity lsp/diagnostic-severity-warning) + 'lsp-headerline-breadcrumb-symbols-warning-face) + ((= range-severity lsp/diagnostic-severity-information) + 'lsp-headerline-breadcrumb-symbols-info-face) + ((= range-severity lsp/diagnostic-severity-hint) + 'lsp-headerline-breadcrumb-symbols-hint-face) + (t 'lsp-headerline-breadcrumb-symbols-face)))) + +(defun lsp-headerline--build-symbol-string () + "Build the symbol segment for the breadcrumb." + (if (lsp-feature? "textDocument/documentSymbol") + (-if-let* ((lsp--document-symbols-request-async t) + (symbols (lsp--get-document-symbols)) + (symbols-hierarchy (lsp--symbols->document-symbols-hierarchy symbols)) + (enumerated-symbols-hierarchy + (-map-indexed (lambda (index elt) + (cons elt (1+ index))) + symbols-hierarchy))) + (mapconcat + (-lambda (((symbol &as &DocumentSymbol :name) + . index)) + (let* ((symbol2-name + (propertize name + 'font-lock-face + (lsp-headerline--face-for-symbol symbol))) + (symbol2-icon (lsp-headerline--symbol-icon symbol)) + (full-symbol-2 + (concat + (if lsp-headerline-breadcrumb-enable-symbol-numbers + (concat + (propertize (number-to-string index) + 'face + 'lsp-headerline-breadcrumb-symbols-face) + " ") + "") + (if symbol2-icon + (concat symbol2-icon symbol2-name) + symbol2-name)))) + (lsp-headerline--symbol-with-action symbol full-symbol-2))) + enumerated-symbols-hierarchy + (concat " " (lsp-headerline--arrow-icon) " ")) + "") + "")) + +(defun lsp-headerline--build-string () + "Build the header-line string." + (string-trim-right + (mapconcat + (lambda (segment) + (let ((segment-string + (pcase segment + ('project (lsp-headerline--build-project-string)) + ('file (lsp-headerline--build-file-string)) + ('path-up-to-project (lsp-headerline--build-path-up-to-project-string)) + ('symbols (lsp-headerline--build-symbol-string)) + (_ (lsp-log "'%s' is not a valid entry for `lsp-headerline-breadcrumb-segments'" + (symbol-name segment)) + "")))) + (if (string-empty-p segment-string) + "" + (concat (lsp-headerline--arrow-icon) + " " + segment-string + " ")))) + lsp-headerline-breadcrumb-segments + ""))) + +(defun lsp-headerline--check-breadcrumb (&rest _) + "Request for document symbols to build the breadcrumb." + (set-window-parameter (selected-window) 'lsp-headerline--string (lsp-headerline--build-string)) + (force-mode-line-update)) + +(defun lsp-headerline--enable-breadcrumb () + "Enable headerline breadcrumb mode." + (when (and lsp-headerline-breadcrumb-enable + (lsp-feature? "textDocument/documentSymbol")) + (lsp-headerline-breadcrumb-mode 1))) + +(defun lsp-headerline--disable-breadcrumb () + "Disable headerline breadcrumb mode." + (lsp-headerline-breadcrumb-mode -1)) + +(defun lsp-headerline--workspace-root () + (or lsp-headerline--cached-workspace-root + (setq lsp-headerline--cached-workspace-root (lsp-workspace-root)))) + +;;;###autoload +(define-minor-mode lsp-headerline-breadcrumb-mode + "Toggle breadcrumb on headerline." + :group 'lsp-headerline + :global nil + (cond + (lsp-headerline-breadcrumb-mode + ;; make sure header-line-format, if non-nil, is a list. as + ;; mode-line-format says: "The value may be nil, a string, a + ;; symbol or a list." + (unless (listp header-line-format) + (setq header-line-format (list header-line-format))) + (add-to-list 'header-line-format '(t (:eval (window-parameter nil 'lsp-headerline--string) ))) + + (add-hook 'xref-after-jump-hook #'lsp-headerline--check-breadcrumb nil t) + + (add-hook 'lsp-on-idle-hook #'lsp-headerline--check-breadcrumb nil t) + (add-hook 'lsp-configure-hook #'lsp-headerline--enable-breadcrumb nil t) + (add-hook 'lsp-unconfigure-hook #'lsp-headerline--disable-breadcrumb nil t)) + (t + (remove-hook 'lsp-on-idle-hook #'lsp-headerline--check-breadcrumb t) + (remove-hook 'lsp-configure-hook #'lsp-headerline--enable-breadcrumb t) + (remove-hook 'lsp-unconfigure-hook #'lsp-headerline--disable-breadcrumb t) + + (remove-hook 'xref-after-jump-hook #'lsp-headerline--check-breadcrumb t) + + (setq lsp-headerline--path-up-to-project-segments nil) + (setq header-line-format (remove '(t (:eval (window-parameter nil 'lsp-headerline--string) )) header-line-format))))) + +;;;###autoload +(defun lsp-breadcrumb-go-to-symbol (symbol-position) + "Go to the symbol on breadcrumb at SYMBOL-POSITION." + (interactive "P") + (if (numberp symbol-position) + (if (lsp-feature? "textDocument/documentSymbol") + (-if-let* ((lsp--document-symbols-request-async t) + (symbols (lsp--get-document-symbols)) + (symbols-hierarchy (lsp--symbols->document-symbols-hierarchy symbols))) + (lsp-headerline--go-to-symbol (nth (1- symbol-position) symbols-hierarchy)) + (lsp--info "Symbol not found for position %s" symbol-position)) + (lsp--info "Server does not support breadcrumb.")) + (lsp--info "Call this function with a number representing the symbol position on breadcrumb"))) + +(declare-function evil-set-command-property "ext:evil-common") + +(with-eval-after-load 'evil + (evil-set-command-property 'lsp-breadcrumb-go-to-symbol :jump t)) + +;;;###autoload +(defun lsp-breadcrumb-narrow-to-symbol (symbol-position) + "Narrow to the symbol range on breadcrumb at SYMBOL-POSITION." + (interactive "P") + (if (numberp symbol-position) + (if (lsp-feature? "textDocument/documentSymbol") + (-if-let* ((lsp--document-symbols-request-async t) + (symbols (lsp--get-document-symbols)) + (symbols-hierarchy (lsp--symbols->document-symbols-hierarchy symbols))) + (lsp-headerline--narrow-to-symbol (nth (1- symbol-position) symbols-hierarchy)) + (lsp--info "Symbol not found for position %s" symbol-position)) + (lsp--info "Server does not support breadcrumb.")) + (lsp--info "Call this function with a number representing the symbol position on breadcrumb"))) + +(lsp-consistency-check lsp-headerline) + +(provide 'lsp-headerline) +;;; lsp-headerline.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-html.el b/code/elpa/lsp-mode-20240319.1043/lsp-html.el new file mode 100644 index 0000000..00b526a --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-html.el @@ -0,0 +1,200 @@ +;;; lsp-html.el --- vscode-html-languageserver configuration -*- lexical-binding: t; -*- + +;; Copyright (C) 2019 Vibhav Pant + +;; Author: Vibhav Pant +;; Keywords: + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-html nil + "LSP support for HTML, using vscode's built-in language server." + :group 'lsp-mode + :link '(url-link "https://github.com/microsoft/vscode/tree/main/extensions/html-language-features/server") + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-html-experimental-custom-data nil + "A list of JSON file paths that define custom tags, properties and other HTML +syntax constructs. Only workspace folder setting will be read." + :type '(choice (const nil) string) + :group 'lsp-html + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-html-format-enable t + "Enable/disable default HTML formatter." + :type 'boolean + :group 'lsp-html + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-html-format-wrap-line-length 120 + "Maximum amount of characters per line (0 = disable)." + :type 'number + :group 'lsp-html + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-html-format-unformatted "wbr" + nil + :type '(choice (const nil) string) + :group 'lsp-html + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-html-format-content-unformatted "pre,code,textarea" + nil + :group 'lsp-html + :type '(choice (const nil) string) + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-html-format-indent-inner-html nil + nil + :type 'boolean + :group 'lsp-html + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-html-format-preserve-new-lines t + "Controls whether existing line breaks before elements should be preserved. +Only works before elements, not inside tags or for text." + :type 'boolean + :group 'lsp-html + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-html-format-max-preserve-new-lines nil + nil + :type '(choice (const nil) integer) + :group 'lsp-html + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-html-format-indent-handlebars nil nil + :type 'boolean + :group 'lsp-html + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-html-format-end-with-newline nil + "End with a newline." + :type 'boolean + :group 'lsp-html + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-html-format-extra-liners "head, body, /html" + nil + :type '(choice (const nil) string) + :group 'lsp-html + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-html-format-wrap-attributes "auto" + "Wrap attributes." + :type '(choice + (const "auto") + (const "force") + (const "force-aligned") + (const "force-expand-multiline") + (const "aligned-multiple") + (const "preserve") + (const "preserve-aligned")) + :group 'lsp-html + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-html-suggest-html5 t + "Controls whether the built-in HTML language support suggests HTML5 tags, +properties and values." + :type 'boolean + :group 'lsp-html + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-html-validate-scripts t + "Controls whether the built-in HTML language support validates embedded +scripts." + :type 'boolean + :group 'lsp-html + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-html-validate-styles t + "Controls whether the built-in HTML language support validates embedded +styles." + :type 'boolean + :group 'lsp-html + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-html-auto-closing-tags t + "Enable/disable autoclosing of HTML tags." + :type 'boolean + :group 'lsp-html + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-html-trace-server "off" + "Traces the communication between VS Code and the HTML language server." + :type '(choice + (const "off") + (const "messages") + (const "verbose")) + :group 'lsp-html + :package-version '(lsp-mode . "6.1")) + +(lsp-register-custom-settings + '(("html.trace.server" lsp-html-trace-server) + ("html.autoClosingTags" lsp-html-auto-closing-tags t) + ("html.validate.styles" lsp-html-validate-styles t) + ("html.validate.scripts" lsp-html-validate-scripts t) + ("html.suggest.html5" lsp-html-suggest-html5 t) + ("html.format.wrapAttributes" lsp-html-format-wrap-attributes) + ("html.format.extraLiners" lsp-html-format-extra-liners) + ("html.format.endWithNewline" lsp-html-format-end-with-newline t) + ("html.format.indentHandlebars" lsp-html-format-indent-handlebars t) + ("html.format.maxPreserveNewLines" lsp-html-format-max-preserve-new-lines) + ("html.format.preserveNewLines" lsp-html-format-preserve-new-lines t) + ("html.format.indentInnerHtml" lsp-html-format-indent-inner-html t) + ("html.format.contentUnformatted" lsp-html-format-content-unformatted) + ("html.format.unformatted" lsp-html-format-unformatted) + ("html.format.wrapLineLength" lsp-html-format-wrap-line-length) + ("html.format.enable" lsp-html-format-enable t) + ("html.experimental.customData" lsp-html-experimental-custom-data))) + +(defcustom lsp-html-server-command-args '("--stdio") + "Command to start html-languageserver." + :type '(repeat string) + :group 'lsp-html + :package-version '(lsp-mode . "6.3")) + +(lsp-dependency 'html-language-server + '(:system "vscode-html-language-server") + '(:npm :package "vscode-langservers-extracted" + :path "vscode-html-language-server")) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection + (lambda () + (cons (lsp-package-path 'html-language-server) + lsp-html-server-command-args))) + :activation-fn (lsp-activate-on "html") + :priority -4 + :completion-in-comments? t + :server-id 'html-ls + :initialized-fn (lambda (w) + (with-lsp-workspace w + (lsp--set-configuration + (lsp-configuration-section "html")))) + :download-server-fn (lambda (_client callback error-callback _update?) + (lsp-package-ensure + 'html-language-server callback + error-callback)))) + +(lsp-consistency-check lsp-html) + +(provide 'lsp-html) +;;; lsp-html.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-hy.el b/code/elpa/lsp-mode-20240319.1043/lsp-hy.el new file mode 100644 index 0000000..4eb1380 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-hy.el @@ -0,0 +1,51 @@ +;;; lsp-rpm-spec.el --- lsp-mode integration for Hy -*- lexical-binding: t; -*- + +;; Copyright (C) 2024 emacs-lsp maintainers + +;; Author: emacs-lsp maintainers +;; Keywords: lsp, hy, hylang + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP Client for Hylang + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-hy nil + "LSP support for Hy." + :group 'lsp-mode + :link '(url-link "")) + +(defcustom lsp-clients-hy-server-executable + '("hyuga") + "LSP support for the Hy Programming Language, using the hyuga." + :group 'lsp-hy + :risky t + :type '(repeat string)) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection (lambda () lsp-clients-hy-server-executable)) + :activation-fn (lsp-activate-on "hy") + :priority 0 + :completion-in-comments? t + :major-modes '(hy-mode) + :server-id 'hyuga)) + +(lsp-consistency-check lsp-hy) + +(provide 'lsp-hy) diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-icons.el b/code/elpa/lsp-mode-20240319.1043/lsp-icons.el new file mode 100644 index 0000000..7bd8bc6 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-icons.el @@ -0,0 +1,96 @@ +;;; lsp-icons.el --- LSP icons management -*- lexical-binding: t; -*- +;; +;; Copyright (C) 2020 emacs-lsp maintainers +;; +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . +;; +;;; Commentary: +;; +;; LSP icons management +;; +;;; Code: +(require 'lsp-mode) + +(defgroup lsp-icons nil + "LSP icons" + :group 'lsp-mode + :tag "LSP Icons") + +(defcustom lsp-headerline-breadcrumb-icons-enable t + "If non-nil, icons support is enabled for headerline-breadcrumb." + :type 'boolean + :group 'lsp-icons) + +(declare-function all-the-icons-material "ext:all-the-icons" t t) +(declare-function lsp-treemacs-symbol-icon "ext:lsp-treemacs" (kind)) +(declare-function lsp-treemacs-get-icon "ext:lsp-treemacs" (icon-name)) + +(defun lsp-icons--enabled-for-feature (feature) + "Check if icons support is enabled for FEATURE." + (cond + ((eq feature 'headerline-breadcrumb) lsp-headerline-breadcrumb-icons-enable) + (t t))) + +(defun lsp-icons--fix-image-background (image) + "Fix IMAGE background if it is a file otherwise return as an icon." + (if image + (let ((display-image (get-text-property 0 'display image))) + (if (and (listp display-image) + (plist-member (cl-copy-list (cl-rest display-image)) :type)) + (propertize " " 'display + (cl-list* 'image + (plist-put + (cl-copy-list + (cl-rest display-image)) + :background (face-attribute 'header-line :background nil t)))) + (if (stringp display-image) + (replace-regexp-in-string "\s\\|\t" "" display-image) + (replace-regexp-in-string "\s\\|\t" "" image)))) + "")) + +(defun lsp-icons-get-by-file-ext (file-ext &optional feature) + "Get an icon by file FILE-EXT. +FEATURE is the feature that will use the icon which we should check +if its enabled." + (when (and file-ext + (lsp-icons--enabled-for-feature feature) + (functionp 'lsp-treemacs-get-icon)) + (lsp-icons--fix-image-background + (lsp-treemacs-get-icon file-ext)))) + +(defun lsp-icons-get-by-symbol-kind (kind &optional feature) + "Get an icon by symbol KIND. +FEATURE is the feature that will use the icon which we should check +if its enabled." + (when (and kind + (lsp-icons--enabled-for-feature feature) + (functionp 'lsp-treemacs-symbol-icon)) + (lsp-icons--fix-image-background + (lsp-treemacs-symbol-icon kind)))) + +(defun lsp-icons-all-the-icons-material-icon (icon-name face fallback &optional feature) + "Get a material icon from all-the-icons by ICON-NAME using FACE. +Fallback to FALLBACK string if not found or not available. +FEATURE is the feature that will use the icon which we should check +if its enabled." + (if (and (functionp 'all-the-icons-material) + (lsp-icons--enabled-for-feature feature)) + (all-the-icons-material icon-name + :face face) + (propertize fallback 'face face))) + +(lsp-consistency-check lsp-icons) + +(provide 'lsp-icons) +;;; lsp-icons.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-ido.el b/code/elpa/lsp-mode-20240319.1043/lsp-ido.el new file mode 100644 index 0000000..63b5434 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-ido.el @@ -0,0 +1,142 @@ +;;; lsp-ido.el --- `ido' integration -*- lexical-binding: t -*- +;; +;; Copyright (C) 2021 emacs-lsp maintainers +;; +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; This module provides an interactive ido interface to the workspace symbol +;; functionality offered by lsp-mode. + +;;; Code: + +(require 'ido) +(require 'lsp-protocol) +(require 'lsp-mode) + +(defgroup lsp-ido nil + "LSP support for ido-based symbol completion" + :group 'lsp-mode + :tag "LSP ido") + +(defcustom lsp-ido-symbol-kind-to-string + [" " ; Unknown - 0 + "File" ; File - 1 + "Modu" ; Module - 2 + "Nmsp" ; Namespace - 3 + "Pack" ; Package - 4 + "Clss" ; Class - 5 + "Meth" ; Method - 6 + "Prop" ; Property - 7 + "Fld " ; Field - 8 + "Cons" ; Constructor - 9 + "Enum" ; Enum - 10 + "Intf" ; Interface - 11 + "Func" ; Function - 12 + "Var " ; Variable - 13 + "Cnst" ; Constant - 14 + "Str " ; String - 15 + "Num " ; Number - 16 + "Bool " ; Boolean - 17 + "Arr " ; Array - 18 + "Obj " ; Object - 19 + "Key " ; Key - 20 + "Null" ; Null - 21 + "EmMm" ; EnumMember - 22 + "Srct" ; Struct - 23 + "Evnt" ; Event - 24 + "Op " ; Operator - 25 + "TPar"] ; TypeParameter - 26 + "A vector of 26 items representing the SymbolKind." + :group 'lsp-ido + :type '(vector string)) + +(defcustom lsp-ido-show-symbol-filename + t + "Whether to show the project-relative path to a symbol's point of definition." + :group 'lsp-ido + :type 'boolean) + +(defcustom lsp-ido-show-symbol-kind + t + "Whether to show the symbol's kind when showing lsp symbols." + :group 'lsp-ido + :type 'boolean) + +(eval-when-compile + (lsp-interface + (lsp-ido:FormattedSymbolInformation + (:kind :name :location :textualRepresentation) + (:containerName :deprecated)))) + +(lsp-defun lsp-ido--transform-candidate + ((symbol-information &as &SymbolInformation :kind :location (&Location :uri)) + lsp-ido--results project-root) + (let* ((sanitized-kind (if (< kind (length lsp-ido-symbol-kind-to-string)) kind 0)) + (type (elt lsp-ido-symbol-kind-to-string sanitized-kind)) + (typestr (if lsp-ido-show-symbol-kind + (format "[%s] " type) + "")) + (pathstr (if lsp-ido-show-symbol-filename + (propertize (format " . %s" (file-relative-name (lsp--uri-to-path uri) project-root)) + 'face 'font-lock-comment-face) + "")) + (textual-representation + (lsp-render-symbol-information symbol-information ".")) + (entry (concat typestr textual-representation pathstr))) + (puthash entry symbol-information lsp-ido--results))) + +(lsp-defun lsp-ido--jump-selected-candidate + ((&SymbolInformation + :location (&Location :uri :range (&Range :start (&Position :line :character))))) + "Jump to selected candidate." + (find-file (lsp--uri-to-path uri)) + (goto-char (point-min)) + (forward-line line) + (forward-char character)) + +(defun lsp-ido--workspace-symbol (workspaces query) + "Search against WORKSPACES based on QUERY." + (let* ((lsp-ido--results (make-hash-table :test 'equal)) + (workspace-root (lsp-workspace-root)) + (raw-choices + (with-lsp-workspaces workspaces + (lsp-request + "workspace/symbol" + (lsp-make-workspace-symbol-params :query query))))) + (mapc (lambda (it) + (lsp-ido--transform-candidate it lsp-ido--results workspace-root)) + raw-choices) + lsp-ido--results)) + +;;;###autoload +(defun lsp-ido-workspace-symbol (arg) + "`ido' for lsp workspace/symbol. +When called with prefix ARG the default selection will be symbol at point." + (interactive "P") + (let* ((query (if arg "" (read-string "Workspace symbol: "))) + (hash-table-candidates (lsp-ido--workspace-symbol (lsp-workspaces) query)) + (choice (ido-completing-read + "Workspace symbol: " + (hash-table-keys hash-table-candidates) + nil + nil + (when arg (thing-at-point 'symbol))))) + (lsp-ido--jump-selected-candidate (gethash choice hash-table-candidates)))) + +(lsp-consistency-check lsp-ido) + +(provide 'lsp-ido) +;;; lsp-ido.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-idris.el b/code/elpa/lsp-mode-20240319.1043/lsp-idris.el new file mode 100644 index 0000000..f13e501 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-idris.el @@ -0,0 +1,67 @@ +;;; lsp-idris.el --- Description -*- lexical-binding: t; -*- +;; +;; Copyright (C) 2022 skykanin +;; +;; Author: skykanin +;; Keywords: idris lsp + +;; 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 . + +;; This file is not part of GNU Emacs. +;; +;;; Commentary: + +;; LSP Client for the Idris2 Programming Language. + +;;; Code: + +(require 'lsp-mode) +(require 'lsp-semantic-tokens) + +(defgroup lsp-idris nil + "LSP support for Idris." + :link '(url-link "https://github.com/idris-community/idris2-lsp") + :group 'lsp-mode + :tag "Lsp Idirs" + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-idris2-lsp-path "idris2-lsp" + "Command to start Idris 2 language server process." + :group 'lsp-idris + :type 'string + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-idris2-lsp-trace-server "off" + "Traces the communication between VS Code and the language server." + :group 'lsp-idris + :type '(choice (:tag "off" "messages" "verbose")) + :package-version '(lsp-mode . "8.0.1")) + +(lsp-register-custom-settings + '(("idris2-lsp.trace.server" lsp-idris2-lsp-trace-server) + ("idris2-lsp.path" lsp-idris2-lsp-path))) + +;; Register the client itself +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection lsp-idris2-lsp-path) + ;; Activate lsp on idris or idris2 buffers + :activation-fn (lsp-activate-on "idris" "idris2") + ;; This should run under idris-mode and idris2-mode. + :major-modes '(idris-mode idris2-mode) + :language-id "idris" + :server-id 'idris2-lsp)) + +(provide 'lsp-idris) +;;; lsp-idris.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-iedit.el b/code/elpa/lsp-mode-20240319.1043/lsp-iedit.el new file mode 100644 index 0000000..55ae0a9 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-iedit.el @@ -0,0 +1,149 @@ +;;; lsp-iedit.el --- `iedit' integration -*- lexical-binding: t -*- +;; +;; Copyright (C) 2020 emacs-lsp maintainers +;; +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; This module provides features that allow starting `iedit' on various +;; different lsp-based, semantic units (like documentHighlights, and +;; linkedEditingRanges in the future). + +;;; Code: + +(require 'lsp-mode) +(require 'dash) + +(declare-function iedit-make-occurrence-overlay "iedit-lib" (begin end)) +(declare-function iedit-start-buffering "iedit-lib" ()) +(declare-function iedit-lib-start "iedit-lib" (mode-exit-func)) +(declare-function iedit-done "iedit" ()) +(declare-function evil-multiedit-mode "evil-multiedit" (mode)) +(declare-function evil-iedit-state "evil-iedit-state" ()) + +(defvar iedit-mode) +(defvar iedit-auto-buffering) +(defvar iedit-occurrences-overlays) +(defvar iedit-occurrence-keymap) +(defvar iedit-mode-occurrence-keymap) +(defvar evil-multiedit--dont-recall) + +(defun lsp-iedit--on-ranges (ranges) + "Start an `iedit' operation using RANGES. +RANGES shall be a list of lsp-`&Range's. They can be acquired +from various lsp protocol requests, e.g. +`textDocument/documentHighlight', ...." + (require 'iedit) + (unless (seq-empty-p ranges) + (mapc (-lambda ((&RangeToPoint :start :end)) + (push (iedit-make-occurrence-overlay start end) + iedit-occurrences-overlays)) + ranges) + ;; See `iedit-start'; TODO: upstream this + (setq iedit-occurrence-keymap iedit-mode-occurrence-keymap) + (setq iedit-mode t) + (when iedit-auto-buffering + (iedit-start-buffering)) + (iedit-lib-start 'iedit-done) + (run-hooks 'iedit-mode-hook) + (add-hook 'before-revert-hook 'iedit-done nil t) + (add-hook 'kbd-macro-termination-hook 'iedit-done nil t) + (add-hook 'change-major-mode-hook 'iedit-done nil t) + (add-hook 'iedit-aborting-hook 'iedit-done nil t) + (message "%d occurrences of \"%s\"" + (seq-length ranges) + (lsp--range-text (lsp-seq-first ranges))))) + +;; iedit + +;;;###autoload +(defun lsp-iedit-highlights () + "Start an `iedit' operation on the documentHighlights at point. +This can be used as a primitive `lsp-rename' replacement if the +language server doesn't support renaming. + +See also `lsp-enable-symbol-highlighting'." + (interactive) + (let ((highlights (lsp-request "textDocument/documentHighlight" + (lsp--text-document-position-params))) + (-compare-fn (-lambda ((&Location :range (&Range :start l-start :end l-end)) + (&Location :range (&Range :start r-start :end r-end))) + (and (lsp--position-equal l-start r-start) + (lsp--position-equal l-end r-end))))) + (lsp-iedit--on-ranges (mapcar #'lsp:document-highlight-range (-distinct highlights))))) + +;;;###autoload +(defun lsp-iedit-linked-ranges () + "Start an `iedit' for `textDocument/linkedEditingRange'" + (interactive) + (unless (lsp-feature? "textDocument/linkedEditingRange") + (user-error "`textDocument/linkedEditingRange' is not supported by current server")) + + (-> (lsp-request "textDocument/linkedEditingRange" (lsp--text-document-position-params)) + (lsp:linked-editing-ranges-ranges) + (or (user-error "No editing ranges found")) + (lsp-iedit--on-ranges))) + + +;; evil-multi-edit + +;;;###autoload +(defun lsp-evil-multiedit-highlights () + "Start an `evil-multiedit' operation on the documentHighlights at point. +This can be used as a primitive `lsp-rename' replacement if the +language server doesn't support renaming. + +See also `lsp-enable-symbol-highlighting'." + (interactive) + (require 'evil-multiedit) + (when (fboundp 'ahs-clear) (ahs-clear)) + (setq evil-multiedit--dont-recall t) + (lsp-iedit-highlights) + (evil-multiedit-mode +1)) + +;;;###autoload +(defun lsp-evil-multiedit-linked-ranges () + "Start an `evil-multiedit' for `textDocument/linkedEditingRange'" + (interactive) + (require 'evil-multiedit) + (when (fboundp 'ahs-clear) (ahs-clear)) + (setq evil-multiedit--dont-recall t) + (lsp-iedit-linked-ranges) + (evil-multiedit-mode +1)) + +;; evil-evil-state + +;;;###autoload +(defun lsp-evil-state-highlights () + "Start `iedit-mode'. for `textDocument/documentHighlight'" + (interactive "P") + (if (fboundp 'ahs-clear) (ahs-clear)) + (lsp-iedit-highlights) + (evil-iedit-state)) + +;;;###autoload +(defun lsp-evil-state-linked-ranges () + "Start `iedit-mode'. for `textDocument/linkedEditingRange'" + (interactive "P") + (if (fboundp 'ahs-clear) (ahs-clear)) + (lsp-iedit-linked-ranges) + (evil-iedit-state)) + + + +(lsp-consistency-check lsp-iedit) + +(provide 'lsp-iedit) +;;; lsp-iedit.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-javascript.el b/code/elpa/lsp-mode-20240319.1043/lsp-javascript.el new file mode 100644 index 0000000..54404d5 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-javascript.el @@ -0,0 +1,1034 @@ +;;; lsp-javascript.el --- description -*- lexical-binding: t; -*- + +;; Copyright (C) 2020 emacs-lsp maintainers + +;; Author: emacs-lsp maintainers +;; Keywords: lsp, + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP Clients for the JavaScript and TypeScript Programming Languages. + +;;; Code: + +(require 'lsp-mode) + +(lsp-dependency 'javascript-typescript-langserver + '(:system "javascript-typescript-stdio") + '(:npm :package "javascript-typescript-langserver" + :path "javascript-typescript-stdio")) + +(defgroup lsp-typescript-javascript nil + "Support for TypeScript/JavaScript, using Sourcegraph's JavaScript/TypeScript language server." + :group 'lsp-mode + :link '(url-link "https://github.com/sourcegraph/javascript-typescript-langserver")) + +;; Original name can be confused with initializationOptions. Preferences is just one option of initializationOptions. +(define-obsolete-variable-alias + 'lsp-clients-typescript-init-opts + 'lsp-clients-typescript-preferences + "lsp-mode 8.0.1") + +(defcustom lsp-clients-typescript-javascript-server-args '() + "Extra arguments for the typescript-language-server language server." + :group 'lsp-typescript-javascript + :risky t + :type '(repeat string)) + +(defun lsp-typescript-javascript-tsx-jsx-activate-p (filename &optional _) + "Check if the js-ts lsp server should be enabled based on FILENAME." + (or (string-match-p "\\.[cm]js\\|\\.[jt]sx?\\'" filename) + (and (derived-mode-p 'js-mode 'js-ts-mode 'typescript-mode 'typescript-ts-mode) + (not (derived-mode-p 'json-mode))))) + +;; Unmaintained sourcegraph server +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection (lambda () + (cons (lsp-package-path 'javascript-typescript-langserver) + lsp-clients-typescript-javascript-server-args))) + :activation-fn 'lsp-typescript-javascript-tsx-jsx-activate-p + :priority -3 + :completion-in-comments? t + :server-id 'jsts-ls + :download-server-fn (lambda (_client callback error-callback _update?) + (lsp-package-ensure + 'javascript-typescript-langserver + callback + error-callback)) + :initialized-fn (lambda (_workspace) + (warn (concat "The javascript-typescript-langserver (jsts-ls) is unmaintained; " + "it is recommended to use ts-ls or deno-ls instead."))))) + +(defgroup lsp-typescript nil + "LSP support for TypeScript, using Theia/Typefox's TypeScript Language Server." + :group 'lsp-mode + :link '(url-link "https://github.com/theia-ide/typescript-language-server")) + +(defcustom lsp-clients-typescript-tls-path "typescript-language-server" + "Path to the typescript-language-server binary." + :group 'lsp-typescript + :risky t + :type 'string) + +(defcustom lsp-clients-typescript-server-args '("--stdio") + "Extra arguments for the typescript-language-server language server." + :group 'lsp-typescript + :risky t + :type '(repeat string)) + +(defcustom lsp-clients-typescript-disable-automatic-typing-acquisition nil + "Disable tsserver from automatically fetching missing type definitions. +\(@types packages) for external modules." + :group 'lsp-typescript + :type 'boolean) + +(defcustom lsp-clients-typescript-log-verbosity "info" + "The verbosity level of the information printed in the log by tsserver." + :group 'lsp-typescript + :type '(choice + (const "off") + (const "terse") + (const "normal") + (const "requesttime") + (const "verbose"))) + +(defcustom lsp-clients-typescript-max-ts-server-memory nil + "The maximum size of the V8's old memory section in megabytes. +\(for example 4096 means 4GB). The default value is dynamically configured +by Node so can differ per system. Increase for very big projects that +exceed allowed memory usage." + :group 'lsp-typescript + :type 'integer) + +(defcustom lsp-clients-typescript-npm-location nil + "Specifies the path to the NPM exec used for Automatic Type Acquisition." + :group 'lsp-typescript + :type 'string) + +(defcustom lsp-clients-typescript-prefer-use-project-ts-server nil + "When set, prefers using the tsserver.js from your project. This +can allow loading plugins configured in your tsconfig.json." + :group 'lsp-typescript + :type 'boolean) + +(defcustom lsp-clients-typescript-plugins (vector) + "The list of plugins to load. +It should be a vector of plist with keys `:location' and `:name' +where `:name' is the name of the package and `:location' is the +directory containing the package. Example: +\(vector + \(list :name \"@vsintellicode/typescript-intellicode-plugin\" + :location \".vscode/extensions/visualstudioexptteam. + vscodeintellicode-1.1.9/\"))" + :group 'lsp-typescript + :type '(restricted-sexp :tag "Vector" + :match-alternatives + (lambda (xs) + (and (vectorp xs) (seq-every-p + (-lambda ((&plist :name :location)) + (and name location)) + xs))))) + +(defcustom lsp-clients-typescript-preferences nil + "Preferences passed to the Typescript (tsserver) process. +See https://github.com/typescript-language-server/typescript-language-server#initializationoptions for the list of preferences available in the latest version of TypeScript." + :group 'lsp-typescript + :type 'plist) + +(defcustom lsp-clients-typescript-tsserver nil + "Options related to the tsserver process. See below for more info. +See https://github.com/typescript-language-server/typescript-language-server#initializationoptions for the list of tsserver available in the latest version of TypeScript." + :group 'lsp-typescript + :type 'plist) + +(defcustom lsp-typescript-tsdk nil + "Specifies the folder path containing tsserver and lib*.d.ts files to use." + :type '(repeat string) + :group 'lsp-vetur + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-disable-automatic-type-acquisition nil + "Disables automatic type acquisition. +Automatic type acquisition fetches `@types` packages from npm to improve +IntelliSense for external libraries." + :type 'boolean + :group 'lsp-vetur + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-npm nil + "Specifies the path to the NPM exec used for Automatic Type Acquisition. +Requires using TypeScript 2.3.4 or newer in the +workspace." + :type '(repeat string) + :group 'lsp-vetur + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-check-npm-is-installed t + "Check if NPM is installed for Automatic Type Acquisition." + :type 'boolean + :group 'lsp-vetur + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-javascript-references-code-lens-enabled nil + "Enable/disable references CodeLens in JavaScript files." + :type 'boolean + :group 'lsp-vetur + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-references-code-lens-enabled nil + "Enable/disable references CodeLens in TypeScript files." + :type 'boolean + :group 'lsp-vetur + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-implementations-code-lens-enabled nil + "Enable/disable implementations CodeLens. +This CodeLens shows the implementers of an interface." + :type 'boolean + :group 'lsp-vetur + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-tsserver-log "off" + "Enables logging of the TS server to a file. +This log can be used to diagnose TS Server issues. The log may contain file +paths, source code, and other potentially sensitive information +from your project." + :type '(choice + (const "off") + (const "terse") + (const "normal") + (const "verbose")) + :group 'lsp-vetur + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-tsserver-plugin-paths nil + "Additional paths to discover Typescript Language Service plugins. +Requires using TypeScript 2.3.0 or newer in the +workspace." + :type '(repeat string) + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-tsserver-trace "off" + "Enables tracing of messages sent to the TS server. +This trace can be used to diagnose TS Server issues. The trace may contain +file paths, source code, and other potentially sensitive +information from your project." + :type '(choice + (const "off") + (const "messages") + (const "verbose")) + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-javascript-suggest-complete-function-calls nil + "Complete functions with their parameter signature." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-suggest-complete-function-calls nil + "Complete functions with their parameter signature." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-report-style-checks-as-warnings t + "Report style checks as warnings." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-validate-enable t + "Enable/disable TypeScript validation." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-format-enable t + "Enable/disable default TypeScript formatter." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-format-insert-space-after-comma-delimiter t + "Defines space handling after a comma delimiter." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-format-insert-space-after-constructor nil + "Defines space handling after the constructor keyword. +Requires using TypeScript 2.3.0 or newer in the workspace." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-format-insert-space-after-semicolon-in-for-statements t + "Defines space handling after a semicolon in a for statement." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-format-insert-space-before-and-after-binary-operators t + "Defines space handling after a binary operator." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-format-insert-space-after-keywords-in-control-flow-statements t + "Defines space handling after keywords in a control flow statement." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-format-insert-space-after-function-keyword-for-anonymous-functions t + "Defines space handling after function keyword for anonymous functions." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-format-insert-space-before-function-parenthesis nil + "Defines space handling before function argument parentheses." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-format-insert-space-after-opening-and-before-closing-empty-braces nil + "Defines space handling after opening/before closing empty braces." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-format-insert-space-after-opening-and-before-closing-nonempty-parenthesis nil + "Defines space handling after opening/before closing non-empty parenthesis." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-format-insert-space-after-opening-and-before-closing-nonempty-brackets nil + "Defines space handling after opening and before closing non-empty brackets." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-format-insert-space-after-opening-and-before-closing-nonempty-braces t + "Defines space handling after opening and before closing non-empty braces. +Requires using TypeScript 2.3.0 or newer in the workspace." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-format-insert-space-after-opening-and-before-closing-template-string-braces nil + "Defines space handling after opening/before closing template string braces." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-format-insert-space-after-opening-and-before-closing-jsx-expression-braces nil + "Defines space handling after opening/before closing JSX expression braces." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-format-insert-space-after-type-assertion nil + "Defines space handling after type assertions in TypeScript. +Requires using TypeScript 2.4 or newer in the workspace." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-format-place-open-brace-on-new-line-for-functions nil + "Defines whether an open brace is put onto a new line for functions or not." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-format-place-open-brace-on-new-line-for-control-blocks nil + "Defines whether an open brace is put onto a newline for control blocks." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-javascript-validate-enable t + "Enable/disable JavaScript validation." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-javascript-format-enable t + "Enable/disable default JavaScript formatter." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-javascript-format-insert-space-after-comma-delimiter t + "Defines space handling after a comma delimiter." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-javascript-format-insert-space-after-constructor nil + "Defines space handling after the constructor keyword. +Requires using TypeScript 2.3.0 or newer in the workspace." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-javascript-format-insert-space-after-semicolon-in-for-statements t + "Defines space handling after a semicolon in a for statement." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-javascript-format-insert-space-before-and-after-binary-operators t + "Defines space handling after a binary operator." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-javascript-format-insert-space-after-keywords-in-control-flow-statements t + "Defines space handling after keywords in a control flow statement." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-javascript-format-insert-space-after-function-keyword-for-anonymous-functions t + "Defines space handling after function keyword for anonymous functions." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-javascript-format-insert-space-before-function-parenthesis nil + "Defines space handling before function argument parentheses." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-javascript-format-insert-space-after-opening-and-before-closing-empty-braces nil + "Defines space handling after opening/before closing empty braces." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-javascript-format-insert-space-after-opening-and-before-closing-nonempty-parenthesis nil + "Defines space handling after opening and before closing non-empty parenthesis." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-javascript-format-insert-space-after-opening-and-before-closing-nonempty-brackets nil + "Defines space handling after opening and before closing non-empty brackets." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-javascript-format-insert-space-after-opening-and-before-closing-nonempty-braces t + "Defines space handling after opening and before closing non-empty braces. +Requires using TypeScript 2.3.0 or newer in the workspace." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-javascript-format-insert-space-after-opening-and-before-closing-template-string-braces nil + "Defines space handling after opening/before closing template string braces." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-javascript-format-insert-space-after-opening-and-before-closing-jsx-expression-braces nil + "Defines space handling after opening/before closing JSX expression braces." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-javascript-format-place-open-brace-on-new-line-for-functions nil + "Defines whether an open brace is put onto a new line for functions or not." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-javascript-format-place-open-brace-on-new-line-for-control-blocks nil + "Defines whether an open brace is put onto a new line for control blocks or not." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-javascript-implicit-project-config-check-js nil + "Enable/disable semantic checking of JavaScript files. +Existing jsconfig.json or tsconfig.json files override this setting. +Requires using TypeScript 2.3.1 or newer in the workspace." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-javascript-implicit-project-config-experimental-decorators nil + nil + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-javascript-suggest-names t + "Enable/disable including unique names from the file in JavaScript suggestions." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-tsc-auto-detect "on" + "Controls auto detection of tsc tasks." + :type '(choice + (const "on") + (const "off") + (const "build") + (const "watch")) + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-javascript-suggest-paths t + "Enable/disable suggestions for paths in import statements and require calls." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-suggest-paths t + "Enable/disable suggestions for paths in import statements and require calls." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-javascript-suggest-auto-imports t + "Enable/disable auto import suggestions. +Requires using TypeScript 2.6.1 or newer in the workspace." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-suggest-auto-imports t + "Enable/disable auto import suggestions. Requires using +TypeScript 2.6.1 or newer in the workspace." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-javascript-suggest-complete-js-docs t + "Enable/disable suggestion to complete JSDoc comments." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-suggest-complete-js-docs t + "Enable/disable suggestion to complete JSDoc comments." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-locale nil + nil + :type '(choice + (const "de") + (const "es") + (const "en") + (const "fr") + (const "it") + (const "ja") + (const "ko") + (const "ru") + (const "zh-CN") + (const "zh-TW") + (const :tag "default" nil)) + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-javascript-suggestion-actions-enabled t + "Enable/disable suggestion diagnostics for JavaScript files in +the editor. Requires using TypeScript 2.8 or newer in the +workspace." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-suggestion-actions-enabled t + "Enable/disable suggestion diagnostics for TypeScript files in +the editor. Requires using TypeScript 2.8 or newer in the +workspace." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-javascript-preferences-quote-style "auto" nil + :type '(choice + (const "auto") + (const "single") + (const "double")) + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-preferences-quote-style "auto" nil + :type '(choice + (const "auto") + (const "single") + (const "double")) + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-javascript-preferences-import-module-specifier "auto" + "Preferred path style for auto imports." + :type '(choice + (const "auto") + (const "relative") + (const "non-relative")) + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-preferences-import-module-specifier "auto" + "Infer the shortest path type." + :type '(choice + (const "auto") + (const "relative") + (const "non-relative")) + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-javascript-preferences-rename-shorthand-properties t + "Enable/disable introducing aliases for object shorthand +properties during renames. Requires using TypeScript 3.4 or newer +in the workspace." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-preferences-rename-shorthand-properties t + "Enable/disable introducing aliases for object shorthand +properties during renames. Requires using TypeScript 3.4 or newer +in the workspace." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-update-imports-on-file-move-enabled "prompt" + "Enable/disable automatic updating of import paths when you +rename or move a file in VS Code. Requires using TypeScript 2.9 +or newer in the workspace." + :type '(choice + (const "prompt") + (const "always") + (const "never")) + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-javascript-update-imports-on-file-move-enabled "prompt" + "Prompt on each rename." + :type '(choice + (const "prompt") + (const "always") + (const "never")) + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-auto-closing-tags t + "Enable/disable automatic closing of JSX tags. Requires using +TypeScript 3.0 or newer in the workspace." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-javascript-auto-closing-tags t + "Enable/disable automatic closing of JSX tags. Requires using +TypeScript 3.0 or newer in the workspace." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-javascript-suggest-enabled t + "Enabled/disable autocomplete suggestions." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-suggest-enabled t + "Enabled/disable autocomplete suggestions." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-typescript-surveys-enabled t + "Enabled/disable occasional surveys that help us improve VS +Code's JavaScript and TypeScript support." + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-javascript-display-enum-member-value-hints nil + "Show inlay hints for enum member values." + :type 'boolean + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-javascript-display-return-type-hints nil + "Show inlay hints for function return types." + :type 'boolean + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-javascript-display-parameter-type-hints nil + "Show inlay hints for function parameters." + :type 'boolean + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-javascript-display-parameter-name-hints "none" + "Level of hinting for parameter types." + :type '(choice (const :tag "none" "none") + (const :tag "literals" "literals") + (const :tag "all" "all")) + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-javascript-display-parameter-name-hints-when-argument-matches-name nil + "Show inlay hints for function parameters even when argument matches +name (e.g. `data' variable passed as `data' parameter)." + :type 'boolean + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-javascript-display-property-declaration-type-hints nil + "Show inlay hints for property declaration types." + :type 'boolean + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-javascript-display-variable-type-hints nil + "Show inlay hints for variable types." + :type 'boolean + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-javascript-completions-complete-function-calls t + "Complete function calls." + :type 'boolean + :package-version '(lsp-mode . "8.0.1")) + +(lsp-register-custom-settings + '(("javascript.autoClosingTags" lsp-javascript-auto-closing-tags t) + ("javascript.implicitProjectConfig.checkJs" lsp-javascript-implicit-project-config-check-js t) + ("javascript.implicitProjectConfig.experimentalDecorators" lsp-javascript-implicit-project-config-experimental-decorators t) + ("javascript.preferences.importModuleSpecifier" lsp-javascript-preferences-import-module-specifier) + ("javascript.preferences.quoteStyle" lsp-javascript-preferences-quote-style) + ("javascript.preferences.renameShorthandProperties" lsp-javascript-preferences-rename-shorthand-properties t) + ("javascript.referencesCodeLens.enabled" lsp-javascript-references-code-lens-enabled t) + ("javascript.suggest.autoImports" lsp-javascript-suggest-auto-imports t) + ("javascript.suggest.completeFunctionCalls" lsp-javascript-suggest-complete-function-calls t) + ("javascript.suggest.completeJSDocs" lsp-javascript-suggest-complete-js-docs t) + ("javascript.suggest.enabled" lsp-javascript-suggest-enabled t) + ("javascript.suggest.names" lsp-javascript-suggest-names t) + ("javascript.suggest.paths" lsp-javascript-suggest-paths t) + ("javascript.suggestionActions.enabled" lsp-javascript-suggestion-actions-enabled t) + ("javascript.updateImportsOnFileMove.enabled" lsp-javascript-update-imports-on-file-move-enabled) + ("javascript.validate.enable" lsp-javascript-validate-enable t) + ("javascript.format.enable" lsp-javascript-format-enable t) + ("javascript.format.insertSpaceAfterCommaDelimiter" lsp-javascript-format-insert-space-after-comma-delimiter t) + ("javascript.format.insertSpaceAfterConstructor" lsp-javascript-format-insert-space-after-constructor t) + ("javascript.format.insertSpaceAfterFunctionKeywordForAnonymousFunctions" lsp-javascript-format-insert-space-after-function-keyword-for-anonymous-functions t) + ("javascript.format.insertSpaceAfterKeywordsInControlFlowStatements" lsp-javascript-format-insert-space-after-keywords-in-control-flow-statements t) + ("javascript.format.insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces" lsp-javascript-format-insert-space-after-opening-and-before-closing-jsx-expression-braces t) + ("javascript.format.insertSpaceAfterOpeningAndBeforeClosingEmptyBraces" lsp-javascript-format-insert-space-after-opening-and-before-closing-empty-braces t) + ("javascript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces" lsp-javascript-format-insert-space-after-opening-and-before-closing-nonempty-braces t) + ("javascript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets" lsp-javascript-format-insert-space-after-opening-and-before-closing-nonempty-brackets t) + ("javascript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis" lsp-javascript-format-insert-space-after-opening-and-before-closing-nonempty-parenthesis t) + ("javascript.format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces" lsp-javascript-format-insert-space-after-opening-and-before-closing-template-string-braces t) + ("javascript.format.insertSpaceAfterSemicolonInForStatements" lsp-javascript-format-insert-space-after-semicolon-in-for-statements t) + ("javascript.format.insertSpaceBeforeAndAfterBinaryOperators" lsp-javascript-format-insert-space-before-and-after-binary-operators t) + ("javascript.format.insertSpaceBeforeFunctionParenthesis" lsp-javascript-format-insert-space-before-function-parenthesis t) + ("javascript.format.placeOpenBraceOnNewLineForControlBlocks" lsp-javascript-format-place-open-brace-on-new-line-for-control-blocks t) + ("javascript.format.placeOpenBraceOnNewLineForFunctions" lsp-javascript-format-place-open-brace-on-new-line-for-functions t) + ("typescript.autoClosingTags" lsp-typescript-auto-closing-tags t) + ("typescript.check.npmIsInstalled" lsp-typescript-check-npm-is-installed t) + ("typescript.disableAutomaticTypeAcquisition" lsp-typescript-disable-automatic-type-acquisition t) + ("typescript.implementationsCodeLens.enabled" lsp-typescript-implementations-code-lens-enabled t) + ("typescript.locale" lsp-typescript-locale) + ("typescript.npm" lsp-typescript-npm) + ("typescript.preferences.importModuleSpecifier" lsp-typescript-preferences-import-module-specifier) + ("typescript.preferences.quoteStyle" lsp-typescript-preferences-quote-style) + ("typescript.preferences.renameShorthandProperties" lsp-typescript-preferences-rename-shorthand-properties t) + ("typescript.referencesCodeLens.enabled" lsp-typescript-references-code-lens-enabled t) + ("typescript.reportStyleChecksAsWarnings" lsp-typescript-report-style-checks-as-warnings t) + ("typescript.suggest.autoImports" lsp-typescript-suggest-auto-imports t) + ("typescript.suggest.completeFunctionCalls" lsp-typescript-suggest-complete-function-calls t) + ("typescript.suggest.completeJSDocs" lsp-typescript-suggest-complete-js-docs t) + ("typescript.suggest.enabled" lsp-typescript-suggest-enabled t) + ("typescript.suggest.paths" lsp-typescript-suggest-paths t) + ("typescript.suggestionActions.enabled" lsp-typescript-suggestion-actions-enabled t) + ("typescript.surveys.enabled" lsp-typescript-surveys-enabled t) + ("typescript.tsc.autoDetect" lsp-typescript-tsc-auto-detect) + ("typescript.tsdk" lsp-typescript-tsdk) + ("typescript.tsserver.log" lsp-typescript-tsserver-log) + ("typescript.tsserver.pluginPaths" lsp-typescript-tsserver-plugin-paths) + ("typescript.tsserver.trace" lsp-typescript-tsserver-trace) + ("typescript.updateImportsOnFileMove.enabled" lsp-typescript-update-imports-on-file-move-enabled) + ("typescript.validate.enable" lsp-typescript-validate-enable t) + ("typescript.format.enable" lsp-typescript-format-enable t) + ("typescript.format.insertSpaceAfterCommaDelimiter" lsp-typescript-format-insert-space-after-comma-delimiter t) + ("typescript.format.insertSpaceAfterConstructor" lsp-typescript-format-insert-space-after-constructor t) + ("typescript.format.insertSpaceAfterFunctionKeywordForAnonymousFunctions" lsp-typescript-format-insert-space-after-function-keyword-for-anonymous-functions t) + ("typescript.format.insertSpaceAfterKeywordsInControlFlowStatements" lsp-typescript-format-insert-space-after-keywords-in-control-flow-statements t) + ("typescript.format.insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces" lsp-typescript-format-insert-space-after-opening-and-before-closing-jsx-expression-braces t) + ("typescript.format.insertSpaceAfterOpeningAndBeforeClosingEmptyBraces" lsp-typescript-format-insert-space-after-opening-and-before-closing-empty-braces t) + ("typescript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces" lsp-typescript-format-insert-space-after-opening-and-before-closing-nonempty-braces t) + ("typescript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets" lsp-typescript-format-insert-space-after-opening-and-before-closing-nonempty-brackets t) + ("typescript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis" lsp-typescript-format-insert-space-after-opening-and-before-closing-nonempty-parenthesis t) + ("typescript.format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces" lsp-typescript-format-insert-space-after-opening-and-before-closing-template-string-braces t) + ("typescript.format.insertSpaceAfterSemicolonInForStatements" lsp-typescript-format-insert-space-after-semicolon-in-for-statements t) + ("typescript.format.insertSpaceAfterTypeAssertion" lsp-typescript-format-insert-space-after-type-assertion t) + ("typescript.format.insertSpaceBeforeAndAfterBinaryOperators" lsp-typescript-format-insert-space-before-and-after-binary-operators t) + ("typescript.format.insertSpaceBeforeFunctionParenthesis" lsp-typescript-format-insert-space-before-function-parenthesis t) + ("typescript.format.placeOpenBraceOnNewLineForControlBlocks" lsp-typescript-format-place-open-brace-on-new-line-for-control-blocks t) + ("typescript.format.placeOpenBraceOnNewLineForFunctions" lsp-typescript-format-place-open-brace-on-new-line-for-functions t) + ("typescript.inlayHints.includeInlayEnumMemberValueHints" lsp-javascript-display-enum-member-value-hints t) + ("typescript.inlayHints.includeInlayFunctionLikeReturnTypeHints" lsp-javascript-display-return-type-hints t) + ("typescript.inlayHints.includeInlayFunctionParameterTypeHints" lsp-javascript-display-parameter-type-hints t) + ("typescript.inlayHints.includeInlayParameterNameHints" lsp-javascript-display-parameter-name-hints nil) + ("typescript.inlayHints.includeInlayParameterNameHintsWhenArgumentMatchesName" lsp-javascript-display-parameter-name-hints-when-argument-matches-name t) + ("typescript.inlayHints.includeInlayPropertyDeclarationTypeHints" lsp-javascript-display-property-declaration-type-hints t) + ("typescript.inlayHints.includeInlayVariableTypeHints" lsp-javascript-display-variable-type-hints t) + ("javascript.inlayHints.includeInlayEnumMemberValueHints" lsp-javascript-display-enum-member-value-hints t) + ("javascript.inlayHints.includeInlayFunctionLikeReturnTypeHints" lsp-javascript-display-return-type-hints t) + ("javascript.inlayHints.includeInlayFunctionParameterTypeHints" lsp-javascript-display-parameter-type-hints t) + ("javascript.inlayHints.includeInlayParameterNameHints" lsp-javascript-display-parameter-name-hints nil) + ("javascript.inlayHints.includeInlayParameterNameHintsWhenArgumentMatchesName" lsp-javascript-display-parameter-name-hints-when-argument-matches-name t) + ("javascript.inlayHints.includeInlayPropertyDeclarationTypeHints" lsp-javascript-display-property-declaration-type-hints t) + ("javascript.inlayHints.includeInlayVariableTypeHints" lsp-javascript-display-variable-type-hints t) + ("completions.completeFunctionCalls" lsp-javascript-completions-complete-function-calls t))) + +(lsp-dependency 'typescript-language-server + '(:system lsp-clients-typescript-tls-path) + '(:npm :package "typescript-language-server" + :path "typescript-language-server")) + +(lsp-dependency 'typescript + '(:system "tsserver") + '(:npm :package "typescript" + :path "tsserver")) + +(defun lsp-javascript--rename (_workspace args) + (let ((path (lsp--uri-to-path (lsp-get (lsp-get args :textDocument) :uri)))) + (if (f-exists? path) + (with-current-buffer (find-file path) + (goto-char (lsp--position-to-point + (lsp-get args :position)))) + (error "There is no file %s" path))) + (call-interactively #'lsp-rename) + nil) + +(defun lsp-javascript-rename-file () + "Rename current file and all it's references in other files." + (interactive) + (let* ((name (buffer-name)) + (old (buffer-file-name)) + (basename (file-name-nondirectory old))) + (unless (and old (file-exists-p old)) + (error "Buffer '%s' is not visiting a file." name)) + (let ((new (read-file-name "New name: " (file-name-directory old) basename nil basename))) + (when (get-file-buffer new) + (error "A buffer named '%s' already exists." new)) + (when (file-exists-p new) + (error "A file named '%s' already exists." new)) + (lsp--send-execute-command + "_typescript.applyRenameFile" + (vector (list :sourceUri (lsp--buffer-uri) + :targetUri (lsp--path-to-uri new)))) + (mkdir (file-name-directory new) t) + (rename-file old new) + (rename-buffer new) + (set-visited-file-name new) + (set-buffer-modified-p nil) + (lsp-disconnect) + (setq-local lsp-buffer-uri nil) + (lsp) + (lsp--info "Renamed '%s' to '%s'." name (file-name-nondirectory new))))) + +(defun lsp-javascript-initialized? () + (when-let ((workspace (lsp-find-workspace 'ts-ls (buffer-file-name)))) + (eq 'initialized (lsp--workspace-status workspace)))) + +(defun lsp-clients-typescript-project-ts-server-path () + (f-join (lsp-workspace-root) "node_modules" "typescript" "lib" "tsserver.js")) + +(defun lsp-clients-typescript-server-path () + (cond + ((and + lsp-clients-typescript-prefer-use-project-ts-server + (f-exists? (lsp-clients-typescript-project-ts-server-path))) + (lsp-clients-typescript-project-ts-server-path)) + (t + (f-join (f-parent (lsp-package-path 'typescript)) "node_modules" "typescript" "lib")))) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection (lambda () + `(,(lsp-package-path 'typescript-language-server) + ,@lsp-clients-typescript-server-args))) + :activation-fn 'lsp-typescript-javascript-tsx-jsx-activate-p + :priority -2 + :completion-in-comments? t + :initialization-options (lambda () + (append + (when lsp-clients-typescript-disable-automatic-typing-acquisition + (list :disableAutomaticTypingAcquisition lsp-clients-typescript-disable-automatic-typing-acquisition)) + (when lsp-clients-typescript-log-verbosity + (list :logVerbosity lsp-clients-typescript-log-verbosity)) + (when lsp-clients-typescript-max-ts-server-memory + (list :maxTsServerMemory lsp-clients-typescript-max-ts-server-memory)) + (when lsp-clients-typescript-npm-location + (list :npmLocation lsp-clients-typescript-npm-location)) + (when lsp-clients-typescript-plugins + (list :plugins lsp-clients-typescript-plugins)) + (when lsp-clients-typescript-preferences + (list :preferences lsp-clients-typescript-preferences)) + `(:tsserver ( :path ,(lsp-clients-typescript-server-path) + ,@lsp-clients-typescript-tsserver)))) + :initialized-fn (lambda (workspace) + (with-lsp-workspace workspace + (lsp--set-configuration + (ht-merge (lsp-configuration-section "javascript") + (lsp-configuration-section "typescript") + (lsp-configuration-section "completions") + (lsp-configuration-section "diagnostics")))) + (let ((caps (lsp--workspace-server-capabilities workspace)) + (format-enable (or lsp-javascript-format-enable lsp-typescript-format-enable))) + (lsp:set-server-capabilities-document-formatting-provider? caps format-enable) + (lsp:set-server-capabilities-document-range-formatting-provider? caps format-enable))) + :ignore-messages '("readFile .*? requested by TypeScript but content not available") + :server-id 'ts-ls + :request-handlers (ht ("_typescript.rename" #'lsp-javascript--rename)) + :download-server-fn (lambda (_client callback error-callback _update?) + (lsp-package-ensure + 'typescript + (-partial #'lsp-package-ensure + 'typescript-language-server + callback + error-callback) + error-callback)))) + + +(defgroup lsp-flow nil + "LSP support for the Flow Javascript type checker." + :group 'lsp-mode + :link '(url-link "https://flow.org")) + +(defcustom lsp-clients-flow-server "flow" + "The Flow executable to use. +Leave as just the executable name to use the default behavior of +finding the executable with variable `exec-path'." + :group 'lsp-flow + :risky t + :type 'file) + +(defcustom lsp-clients-flow-server-args '("lsp") + "Extra arguments for starting the Flow language server." + :group 'lsp-flow + :risky t + :type '(repeat string)) + +(defun lsp-clients-flow-tag-file-present-p (file-name) + "Check if the '// @flow' or `/* @flow */' tag is present in +the contents of FILE-NAME." + (if-let ((buffer (find-buffer-visiting file-name))) + (with-current-buffer buffer + (lsp-clients-flow-tag-string-present-p)) + (with-temp-buffer + (insert-file-contents file-name) + (lsp-clients-flow-tag-string-present-p)))) + +(defun lsp-clients-flow-tag-string-present-p () + "Helper for `lsp-clients-flow-tag-file-present-p' that works +with the file contents." + (save-excursion + (goto-char (point-min)) + (let (stop found) + (while (not stop) + (unless (re-search-forward "[^\n[:space:]]" nil t) + (setq stop t)) + (if (= (point) (point-min)) (setq stop t) (backward-char)) + (cond ((or (looking-at-p "//+[ ]*@flow") + (looking-at-p "/\\**[ ]*@flow") + (looking-at-p "[ ]*\\*[ ]*@flow")) + (setq found t) (setq stop t)) + ((or (looking-at-p "//") (looking-at-p "*")) + (forward-line)) + ((looking-at-p "/\\*") + (save-excursion + (unless (re-search-forward "*/" nil t) (setq stop t))) + (forward-line)) + (t (setq stop t)))) + found))) + +(defun lsp-clients-flow-project-p (file-name) + "Check if FILE-NAME is part of a Flow project, that is, if +there is a .flowconfig file in the folder hierarchy." + (locate-dominating-file file-name ".flowconfig")) + +(defun lsp-clients-flow-activate-p (file-name _mode) + "Check if the Flow language server should be enabled for a +particular FILE-NAME and MODE." + (and (derived-mode-p 'js-mode 'web-mode 'js2-mode 'flow-js2-mode 'rjsx-mode) + (not (derived-mode-p 'json-mode)) + (or (lsp-clients-flow-project-p file-name) + (lsp-clients-flow-tag-file-present-p file-name)))) + +(lsp-register-client + (make-lsp-client :new-connection + (lsp-stdio-connection (lambda () + (cons lsp-clients-flow-server + lsp-clients-flow-server-args))) + :priority -1 + :activation-fn 'lsp-clients-flow-activate-p + :server-id 'flow-ls)) + +(defgroup lsp-deno nil + "LSP support for the Deno language server." + :group 'lsp-mode + :link '(url-link "https://deno.land/")) + +(defcustom lsp-clients-deno-server "deno" + "The Deno executable to use. +Leave as just the executable name to use the default behavior of +finding the executable with variable `exec-path'." + :group 'lsp-deno + :risky t + :type 'file + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-clients-deno-server-args '("lsp") + "Extra arguments for starting the Deno language server." + :group 'lsp-deno + :risky t + :type '(repeat string) + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-clients-deno-enable-lint t + "Controls if linting information will be provided by the Deno Language Server." + :group 'lsp-deno + :risky t + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-clients-deno-enable-code-lens-references t + "Enables or disables the display of code lens information." + :group 'lsp-deno + :risky t + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-clients-deno-enable-code-lens-references-all-functions t + "Enables or disables the display of code lens information for all functions. +Setting this variable to `non-nil' implicitly enables +`lsp-clients-deno-enable-code-lens-references'." + :group 'lsp-deno + :risky t + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-clients-deno-enable-code-lens-implementations t + "Enables or disables the display of code lens information for implementations." + :group 'lsp-deno + :risky t + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-clients-deno-config nil + "The file path to a tsconfig.json file. +The path can be either be relative to the workspace, or an +absolute path. + +Examples: `./tsconfig.json', +`/path/to/tsconfig.json', `C:\\path\\to\\tsconfig.json'" + :group 'lsp-deno + :risky t + :type 'file + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-clients-deno-import-map nil + "The file path to an import map. +Import maps provide a way to relocate modules based on their +specifiers. The path can either be relative to the workspace, or +an absolute path. + +Examples: `./import-map.json', +`/path/to/import-map.json', `C:\\path\\to\\import-map.json'." + :group 'lsp-deno + :risky t + :type 'file + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-clients-deno-enable-unstable nil + "Controls if code will be type checked with Deno's unstable APIs." + :group 'lsp-deno + :risky t + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defun lsp-clients-deno--make-init-options () + "Initialization options for the Deno language server." + `(:enable t + :config ,lsp-clients-deno-config + :importMap ,lsp-clients-deno-import-map + :lint ,(lsp-json-bool lsp-clients-deno-enable-lint) + :unstable ,(lsp-json-bool lsp-clients-deno-enable-unstable) + :codeLens (:implementations ,(lsp-json-bool lsp-clients-deno-enable-code-lens-implementations) + :references ,(lsp-json-bool (or lsp-clients-deno-enable-code-lens-references + lsp-clients-deno-enable-code-lens-references-all-functions)) + :referencesAllFunctions ,(lsp-json-bool lsp-clients-deno-enable-code-lens-references-all-functions)))) + +(lsp-register-client + (make-lsp-client :new-connection + (lsp-stdio-connection (lambda () + (cons lsp-clients-deno-server + lsp-clients-deno-server-args))) + :initialization-options #'lsp-clients-deno--make-init-options + :priority -5 + :activation-fn #'lsp-typescript-javascript-tsx-jsx-activate-p + :server-id 'deno-ls)) + +(lsp-consistency-check lsp-javascript) + +(provide 'lsp-javascript) +;;; lsp-javascript.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-jq.el b/code/elpa/lsp-mode-20240319.1043/lsp-jq.el new file mode 100644 index 0000000..a452744 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-jq.el @@ -0,0 +1,51 @@ +;;; lsp-jq.el --- lsp client for jq -*- lexical-binding: t; -*- + +;; Copyright (C) 2020 emacs-lsp maintainers + +;; Author: emacs-lsp maintainers +;; Keywords: lsp, jq + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: +;; +;; LSP client for jq language. +;; +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-jq nil + "LSP support for Jq." + :group 'lsp-mode + :link '(url-link "https://github.com/wader/jq-lsp")) + +(defcustom lsp-clients-jq-server-executable '("jq-lsp") + "The jq language server executable to use." + :group 'lsp-jq + :risky t + :type '(repeat string)) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection (lambda () lsp-clients-jq-server-executable)) + :activation-fn (lsp-activate-on "jq") + :priority -1 + :major-modes '(jq-mode jq-ts-mode) + :server-id 'jq-lsp)) + +(lsp-consistency-check lsp-jq) + +(provide 'lsp-jq) +;;; lsp-jq.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-json.el b/code/elpa/lsp-mode-20240319.1043/lsp-json.el new file mode 100644 index 0000000..8fb40e8 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-json.el @@ -0,0 +1,134 @@ +;;; lsp-json.el --- vscode-json-languageserver integration -*- lexical-binding: t; -*- + +;; Copyright (C) 2019 Kien Nguyen + +;; Author: kien.n.quang at gmail.com +;; Keywords: lsp + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; + +;;; Code: + +(require 'lsp-mode) +(require 'ht) +(require 'url) +(require 'url-util) + +(defgroup lsp-json nil + "LSP support for JSON, using vscode's built-in language server." + :group 'lsp-mode + :link '(url-link "https://github.com/microsoft/vscode/tree/main/extensions/json-language-features/server") + :package-version '(lsp-mode . "6.3")) + +(defcustom lsp-json-schemas nil + "Associate schemas to JSON files in the current project example can be found +here, https://github.com/emacs-lsp/lsp-mode/issues/3368#issuecomment-1049635155." + :type '(repeat alist) + :group 'lsp-json + :package-version '(lsp-mode . "6.3")) + +(defcustom lsp-http-proxy nil + "The URL of the proxy server to use when fetching schema." + :type 'string + :group 'lsp-json + :package-version '(lsp-mode . "6.3")) + +(defcustom lsp-http-proxyStrictSSL t + "The URL of the proxy server to use when fetching schema." + :type 'boolean + :group 'lsp-json + :package-version '(lsp-mode . "6.3")) + +(lsp-register-custom-settings + '(("json.schemas" lsp-json-schemas) + ("http.proxy" lsp-http-proxy) + ("http.proxyStrictSSL" lsp-http-proxyStrictSSL))) + +(defvar lsp-json--extra-init-params + `( :provideFormatter t + :handledSchemaProtocols ["file" "http" "https"])) + +(defvar lsp-json--schema-associations + `( :/*.css-data.json ["https://raw.githubusercontent.com/Microsoft/vscode-css-languageservice/master/docs/customData.schema.json"] + :/package.json ["http://json.schemastore.org/package"] + :/*.html-data.json ["https://raw.githubusercontent.com/Microsoft/vscode-html-languageservice/master/docs/customData.schema.json"] + :/*.schema.json ["http://json-schema.org/draft-07/schema#"] + :/bower.json ["http://json.schemastore.org/bower"] + :/composer.json ["http://json.schemastore.org/composer"] + :/tsconfig.json ["http://json.schemastore.org/tsconfig"] + :/tsconfig.*.json ["http://json.schemastore.org/tsconfig"] + :/typings.json ["http://json.schemastore.org/typings"] + :/.bowerrc ["http://json.schemastore.org/bowerrc"] + :/.babelrc ["http://json.schemastore.org/babelrc"] + :/.babelrc.json ["http://json.schemastore.org/babelrc"] + :/babel.config.json ["http://json.schemastore.org/babelrc"] + :/jsconfig.json ["http://json.schemastore.org/jsconfig"] + :/jsconfig.*.json ["http://json.schemastore.org/jsconfig"] + :/project.json ["http://json.schemastore.org/project"] + :/omnisharp.json ["http://json.schemastore.org/omnisharp"] + :/.eslintrc.json ["http://json.schemastore.org/eslintrc"] + :/.eslintrc ["http://json.schemastore.org/eslintrc"]) + "Default json schemas.") + +(defun lsp-json--get-content (_workspace uri callback) + "Get content from URI." + (ignore-errors + (url-retrieve uri + (lambda (_status callback) + (goto-char (point-min)) + (re-search-forward "\n\n" nil 'noerror) + (funcall + callback + (decode-coding-string (buffer-substring (point) (point-max)) + 'utf-8-unix))) + (list callback)))) + +(lsp-dependency 'vscode-json-languageserver + '(:system "vscode-json-language-server") + ;; The binary shipped from microsoft/vscode + '(:system "vscode-json-languageserver") + '(:npm :package "vscode-langservers-extracted" + :path "vscode-json-language-server")) + +(lsp-register-client + (make-lsp-client + :new-connection + (lsp-stdio-connection + (lambda () (list (lsp-package-path 'vscode-json-languageserver) "--stdio"))) + :activation-fn (lsp-activate-on "json" "jsonc") + :server-id 'json-ls + :priority 0 + :multi-root t + :completion-in-comments? t + :initialization-options lsp-json--extra-init-params + :async-request-handlers (ht ("vscode/content" #'lsp-json--get-content)) + :initialized-fn + (lambda (w) + (with-lsp-workspace w + (lsp--set-configuration + (ht-merge (lsp-configuration-section "json") + (lsp-configuration-section "http"))) + (lsp-notify "json/schemaAssociations" lsp-json--schema-associations))) + :download-server-fn + (lambda (_client callback error-callback _update?) + (lsp-package-ensure 'vscode-json-languageserver callback error-callback)))) + +(lsp-consistency-check lsp-json) + +(provide 'lsp-json) +;;; lsp-json.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-jsonnet.el b/code/elpa/lsp-mode-20240319.1043/lsp-jsonnet.el new file mode 100644 index 0000000..98f2838 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-jsonnet.el @@ -0,0 +1,51 @@ +;;; lsp-jsonnet.el --- lsp client for jsonnet -*- lexical-binding: t; -*- + +;; Copyright (C) 2023 emacs-lsp maintainers + +;; Author: emacs-lsp maintainers +;; Keywords: lsp, jsonnet + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: +;; +;; LSP client for jsonnet language. +;; +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-jsonnet nil + "LSP support for jsonnet." + :group 'lsp-mode + :link '(url-link "https://github.com/grafana/jsonnet-language-server")) + +(defcustom lsp-clients-jsonnet-server-executable '("jsonnet-language-server") + "The jsonnet language server executable to use." + :group 'lsp-jsonnet + :risky t + :type '(repeat string)) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection (lambda () lsp-clients-jsonnet-server-executable)) + :activation-fn (lsp-activate-on "jsonnet") + :priority -1 + :major-modes '(jsonnet-mode) + :server-id 'jsonnet-lsp)) + +(lsp-consistency-check lsp-jsonnet) + +(provide 'lsp-jsonnet) +;;; lsp-jsonnet.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-kotlin.el b/code/elpa/lsp-mode-20240319.1043/lsp-kotlin.el new file mode 100644 index 0000000..7f8b2ec --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-kotlin.el @@ -0,0 +1,350 @@ +;;; lsp-kotlin.el --- description -*- lexical-binding: t; -*- + +;; Copyright (C) 2020 emacs-lsp maintainers + +;; Author: emacs-lsp maintainers +;; Keywords: lsp, kotlin + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP Clients for the Kotlin Programming Language. + +;;; Code: + +(require 'lsp-mode) +(require 'cl-lib) +(require 'dash) + +(defgroup lsp-kotlin nil + "LSP support for Kotlin, using KotlinLanguageServer." + :group 'lsp-mode + :link '(url-link "https://github.com/fwcd/KotlinLanguageServer")) + +(define-obsolete-variable-alias + 'lsp-kotlin-language-server-path + 'lsp-clients-kotlin-server-executable + "lsp-mode 6.4") + +(defcustom lsp-clients-kotlin-server-executable + (if (eq system-type 'windows-nt) + "kotlin-language-server.bat" + "kotlin-language-server") + "The kotlin-language-server executable to use. +Leave as just the executable name to use the default behavior of finding the +executable with `exec-path'." + :type 'string + :group 'lsp-kotlin) + +(defcustom lsp-kotlin-trace-server "off" + "Traces the communication between VSCode and the Kotlin language server." + :type '(choice (:tag "off" "messages" "verbose")) + :group 'lsp-kotlin + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-kotlin-compiler-jvm-target "1.8" + "Specifies the JVM target, e.g. \"1.6\" or \"1.8\"." + :type 'string + :group 'lsp-kotlin + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-kotlin-linting-debounce-time 250 + "[DEBUG] Specifies the debounce time limit. +Lower to increase responsiveness at the cost of possible stability issues." + :type 'number + :group 'lsp-kotlin + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-kotlin-completion-snippets-enabled t + "Specifies whether code completion should provide snippets (true) or +plain-text items (false)." + :type 'boolean + :group 'lsp-kotlin + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-kotlin-debug-adapter-enabled t + "[Recommended] Specifies whether the debug adapter should be used. +When enabled a debugger for Kotlin will be available." + :type 'boolean) + +(defcustom lsp-kotlin-debug-adapter-path "" + "Optionally a custom path to the debug adapter executable." + :type 'string + :group 'lsp-kotlin + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-kotlin-external-sources-use-kls-scheme t + "[Recommended] Specifies whether URIs inside JARs should be represented +using the `kls'-scheme." + :type 'boolean + :group 'lsp-kotlin + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-kotlin-external-sources-auto-convert-to-kotlin t + "Specifies whether decompiled/external classes should be auto-converted +to Kotlin." + :type 'boolean + :group 'lsp-kotlin + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-kotlin-server-download-url + "https://github.com/fwcd/kotlin-language-server/releases/latest/download/server.zip" + "The URL for the language server download." + :type 'string + :group 'lsp-kotlin + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-kotlin-workspace-dir (expand-file-name (locate-user-emacs-file "workspace/")) + "LSP kotlin workspace directory." + :group 'lsp-kotlin + :risky t + :type 'directory) + +(defcustom lsp-kotlin-workspace-cache-dir (expand-file-name ".cache/" lsp-kotlin-workspace-dir) + "LSP kotlin workspace cache directory." + :group 'lsp-kotlin + :risky t + :type 'directory) + +;; cache in this case is the dependency cache. Given as an initialization option. +(defcustom lsp-kotlin-ondisk-cache-path nil + "Path to the ondisk cache if used. If lsp-kotlin-ondisk-cache-enabled is t, +but path is nil, then the project root is used as a default." + :type 'string + :group 'lsp-kotlin) + +(defcustom lsp-kotlin-ondisk-cache-enabled nil + "Specifies whether to enable ondisk cache or not. If nil, in-memory cache +will be used." + :type 'boolean + :group 'lsp-kotlin) + +(defcustom lsp-kotlin-inlayhints-enable-typehints t + "Specifies whether to enable type hints or not. +Requires lsp-inlay-hints-mode." + :type 'boolean + :group 'lsp-kotlin) + +(defcustom lsp-kotlin-inlayhints-enable-parameterhints t + "Specifies whether to enable parameter hints or not. +Requires lsp-inlay-hints-mode." + :type 'boolean + :group 'lsp-kotlin) + +(defcustom lsp-kotlin-inlayhints-enable-chainedhints t + "Specifies whether to enable chained hints or not. +Requires lsp-inlay-hints-mode." + :type 'boolean + :group 'lsp-kotlin) + +(lsp-register-custom-settings + '(("kotlin.externalSources.autoConvertToKotlin" lsp-kotlin-external-sources-auto-convert-to-kotlin t) + ("kotlin.externalSources.useKlsScheme" lsp-kotlin-external-sources-use-kls-scheme t) + ("kotlin.debugAdapter.path" lsp-kotlin-debug-adapter-path) + ("kotlin.debugAdapter.enabled" lsp-kotlin-debug-adapter-enabled t) + ("kotlin.completion.snippets.enabled" lsp-kotlin-completion-snippets-enabled t) + ("kotlin.linting.debounceTime" lsp-kotlin-linting-debounce-time) + ("kotlin.compiler.jvm.target" lsp-kotlin-compiler-jvm-target) + ("kotlin.trace.server" lsp-kotlin-trace-server) + ("kotlin.languageServer.path" lsp-clients-kotlin-server-executable) + ("kotlin.inlayHints.typeHints" lsp-kotlin-inlayhints-enable-typehints t) + ("kotlin.inlayHints.parameterHints" lsp-kotlin-inlayhints-enable-parameterhints t) + ("kotlin.inlayHints.chainedHints" lsp-kotlin-inlayhints-enable-chainedhints t))) + +(defvar lsp-kotlin--language-server-path + (f-join lsp-server-install-dir + "kotlin" "server" "bin" (if (eq system-type 'windows-nt) + "kotlin-language-server.bat" + "kotlin-language-server")) + "The path to store the language server at if necessary.") + + +;; Debug and running +(declare-function dap-debug "ext:dap-mode" (template) t) + +(defun lsp-kotlin-run-main (main-class project-root debug?) + (require 'dap-kotlin) + (dap-debug (list :type "kotlin" + :request "launch" + :mainClass main-class + :projectRoot project-root + :noDebug (not debug?)))) + +(defun lsp-kotlin-lens-backend (_modified? callback) + (when lsp-kotlin-debug-adapter-enabled + (lsp-request-async + "kotlin/mainClass" + (list :uri (lsp--buffer-uri)) + (lambda (mainInfo) + (let ((main-class (lsp-get mainInfo :mainClass)) + (project-root (lsp-get mainInfo :projectRoot)) + (range (lsp-get mainInfo :range))) + (funcall callback + (list (lsp-make-code-lens :range range + :command + (lsp-make-command + :title "Run" + :command (lambda () + (interactive) + (lsp-kotlin-run-main main-class project-root nil)))) + (lsp-make-code-lens :range range + :command + (lsp-make-command + :title "Debug" + :command (lambda () + (interactive) + (lsp-kotlin-run-main main-class project-root t))))) + lsp--cur-version))) + :mode 'tick))) + +(defvar lsp-lens-backends) +(declare-function lsp-lens-refresh "lsp-lens" (buffer-modified? &optional buffer)) + +(define-minor-mode lsp-kotlin-lens-mode + "Toggle run/debug overlays." + :group 'lsp-kotlin + :global nil + :init-value nil + :lighter nil + (cond + (lsp-kotlin-lens-mode + (require 'lsp-lens) + ;; set lens backends so they are available is lsp-lens-mode is activated + ;; backend does not support lenses, and block our other ones from showing. When backend support lenses again, we can use cl-pushnew to add it to lsp-lens-backends instead of overwriting + (setq-local lsp-lens-backends (list #'lsp-kotlin-lens-backend)) + (lsp-lens-refresh t)) + (t (setq-local lsp-lens-backends (delete #'lsp-kotlin-lens-backend lsp-lens-backends))))) + + +;; Stolen from lsp-java: +;; https://github.com/emacs-lsp/lsp-java/blob/a1aff851bcf4f397f2a968557d213db1fede0c8a/lsp-java.el#L1065 +(declare-function helm-make-source "ext:helm-source") +(defvar lsp-kotlin--helm-result nil) +(defun lsp-kotlin--completing-read-multiple (message items initial-selection) + (if (functionp 'helm) + (progn + (require 'helm-source) + (helm :sources (helm-make-source + message 'helm-source-sync :candidates items + :action '(("Identity" lambda (_) + (setq lsp-kotlin--helm-result (helm-marked-candidates))))) + :buffer "*lsp-kotlin select*" + :prompt message) + lsp-kotlin--helm-result) + (if (functionp 'ivy-read) + (let (result) + (ivy-read message (mapcar #'car items) + :action (lambda (c) (setq result (list (cdr (assoc c items))))) + :multi-action + (lambda (candidates) + (setq result (mapcar (lambda (c) (cdr (assoc c items))) candidates)))) + result) + (let ((deps initial-selection) dep) + (while (setq dep (cl-rest (lsp--completing-read + (if deps + (format "%s (selected %s): " message (length deps)) + (concat message ": ")) + items + (-lambda ((name . id)) + (if (-contains? deps id) + (concat name " ✓") + name))))) + (if (-contains? deps dep) + (setq deps (remove dep deps)) + (cl-pushnew dep deps))) + deps)))) + +(defun lsp-kotlin-implement-member () + (interactive) + (lsp-request-async + "kotlin/overrideMember" + (list :textDocument (list :uri (lsp--buffer-uri)) + :position (lsp--cur-position)) + (lambda (member-options) + (-if-let* ((option-items (-map (lambda (x) + (list (lsp-get x :title) + (lsp-get (lsp-get (lsp-get x :edit) + :changes) + (intern (concat ":" (lsp--buffer-uri)))))) + member-options)) + (selected-members (lsp-kotlin--completing-read-multiple "Select overrides" option-items nil))) + (dolist (edit (-flatten selected-members)) + (lsp--apply-text-edits edit)))))) + +(defun lsp-kotlin--parse-uri (uri) + "Get the path for where we'll store the file, calculating it based on URI." + (or (save-match-data + (when (string-match "kls:file:///\\(.*\\)!/\\(.*\.\\(class\\|java\\|kt\\)\\)?.*" uri) + (let* ((jar-path (match-string 1 uri)) + (file-path (match-string 2 uri)) + (lib-name (string-join (last (split-string jar-path "/") 2) ".")) + (buffer-name (replace-regexp-in-string "/" "." file-path t t)) + (file-location (expand-file-name (concat lsp-kotlin-workspace-cache-dir "/" lib-name "/" buffer-name)))) + file-location))) + (error "Unable to match %s" uri))) + +(defun lsp-kotlin--uri-handler (uri) + "Load a file corresponding to URI executing request to the kotlin server." + (let ((file-location (lsp-kotlin--parse-uri uri))) + (unless (file-readable-p file-location) + (lsp-kotlin--ensure-dir (file-name-directory file-location)) + (with-lsp-workspace (lsp-find-workspace 'kotlin-ls nil) + (let ((content (lsp-send-request (lsp-make-request + "kotlin/jarClassContents" + (list :uri uri))))) + (with-temp-file file-location + (insert content))))) + file-location)) + +(defun lsp-kotlin--ensure-dir (path) + "Ensure that directory PATH exists." + (unless (file-directory-p path) + (make-directory path t))) + +(lsp-dependency + 'kotlin-language-server + `(:system ,lsp-clients-kotlin-server-executable) + `(:download :url lsp-kotlin-server-download-url + :decompress :zip + :store-path ,(f-join lsp-server-install-dir "kotlin" "kotlin-language-server.zip") + :binary-path lsp-clients-kotlin-server-executable + :set-executable? t)) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection (lambda () + `(,(or (when (f-exists? lsp-kotlin--language-server-path) + lsp-kotlin--language-server-path) + (or (executable-find lsp-clients-kotlin-server-executable) + (lsp-package-path 'kotlin-language-server)) + "kotlin-language-server")))) + :major-modes '(kotlin-mode kotlin-ts-mode) + :priority -1 + :server-id 'kotlin-ls + :uri-handlers (lsp-ht ("kls" #'lsp-kotlin--uri-handler)) + :initialized-fn (lambda (workspace) + (with-lsp-workspace workspace + (lsp--set-configuration (lsp-configuration-section "kotlin")))) + :initialization-options (lambda () + (when lsp-kotlin-ondisk-cache-enabled + (list :storagePath (or lsp-kotlin-ondisk-cache-path + (lsp-workspace-root))))) + :download-server-fn (lambda (_client callback error-callback _update?) + (lsp-package-ensure 'kotlin-language-server callback error-callback)))) + +(lsp-consistency-check lsp-kotlin) + +(provide 'lsp-kotlin) +;;; lsp-kotlin.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-lens.el b/code/elpa/lsp-mode-20240319.1043/lsp-lens.el new file mode 100644 index 0000000..60c97ce --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-lens.el @@ -0,0 +1,455 @@ +;;; lsp-lens.el --- LSP lens -*- lexical-binding: t; -*- +;; +;; Copyright (C) 2020 emacs-lsp maintainers +;; +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . +;; +;;; Commentary: +;; +;; LSP lens +;; +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-lens nil + "LSP support for lens" + :prefix "lsp-lens-" + :group 'lsp-mode + :tag "LSP Lens") + +(defcustom lsp-lens-debounce-interval 0.001 + "Debounce interval for loading lenses." + :group 'lsp-lens + :type 'number) + +(defcustom lsp-lens-place-position 'end-of-line + "The position to place lens relative to returned lens position." + :group 'lsp-lens + :type '(choice (const above-line) + (const end-of-line)) + :package-version '(lsp-mode . "8.0.0")) + +(defface lsp-lens-mouse-face + '((t :height 0.8 :inherit link)) + "The face used for code lens overlays." + :group 'lsp-lens) + +(defface lsp-lens-face + '((t :inherit lsp-details-face)) + "The face used for code lens overlays." + :group 'lsp-lens) + +(defvar-local lsp-lens--modified? nil) + +(defvar-local lsp-lens--overlays nil + "Current lenses.") + +(defvar-local lsp-lens--page nil + "Pair of points which holds the last window location the lenses were loaded.") + +(defvar-local lsp-lens--last-count nil + "The number of lenses the last time they were rendered.") + +(defvar lsp-lens-backends '(lsp-lens--backend) + "Backends providing lenses.") + +(defvar-local lsp-lens--refresh-timer nil + "Refresh timer for the lenses.") + +(defvar-local lsp-lens--data nil + "Pair of points which holds the last window location the lenses were loaded.") + +(defvar-local lsp-lens--backend-cache nil) + +(defun lsp-lens--text-width (from to) + "Measure the width of the text between FROM and TO. +Results are meaningful only if FROM and TO are on the same line." + ;; `current-column' takes prettification into account + (- (save-excursion (goto-char to) (current-column)) + (save-excursion (goto-char from) (current-column)))) + +(defun lsp-lens--update (ov) + "Redraw quick-peek overlay OV." + (let* ((offset (lsp-lens--text-width (save-excursion + (beginning-of-visual-line) + (point)) + (save-excursion + (beginning-of-line-text) + (point)))) + (str (if (eq 'end-of-line lsp-lens-place-position) + (overlay-get ov 'lsp--lens-contents) + (concat (make-string offset ?\s) + (overlay-get ov 'lsp--lens-contents))))) + (save-excursion + (goto-char (overlay-start ov)) + (if (eq 'end-of-line lsp-lens-place-position) + (overlay-put ov 'after-string (propertize (concat " " str) 'cursor t)) + (overlay-put ov 'before-string (concat str "\n"))) + (overlay-put ov 'lsp-original str)))) + +(defun lsp-lens--overlay-ensure-at (pos) + "Find or create a lens for the line at POS." + (-doto (save-excursion + (goto-char pos) + (if (eq 'end-of-line lsp-lens-place-position) + (make-overlay (line-end-position) -1 nil t t) + (make-overlay (line-beginning-position) (1+ (line-end-position)) nil t t))) + (overlay-put 'lsp-lens t) + (overlay-put 'lsp-lens-position pos))) + +(defun lsp-lens--show (str pos metadata) + "Show STR in an inline window at POS including METADATA." + (let ((ov (lsp-lens--overlay-ensure-at pos))) + (save-excursion + (goto-char pos) + (setf (overlay-get ov 'lsp--lens-contents) str) + (setf (overlay-get ov 'lsp--metadata) metadata) + (lsp-lens--update ov) + ov))) + +(defun lsp-lens--idle-function (&optional buffer) + "Create idle function for buffer BUFFER." + (when (and (or (not buffer) (eq (current-buffer) buffer)) + (not (equal (cons (window-start) (window-end)) lsp-lens--page))) + (lsp-lens--schedule-refresh nil))) + +(defun lsp-lens--overlay-matches-pos (ov pos) + "Check if OV is a lens covering POS." + (and (overlay-get ov 'lsp-lens) + (overlay-start ov) + (<= (overlay-start ov) pos) + (< pos (overlay-end ov)))) + +(defun lsp-lens--after-save () + "Handler for `after-save-hook' for lens mode." + (lsp-lens--schedule-refresh t)) + +(defun lsp-lens--schedule-refresh (&optional buffer-modified?) + "Call each of the backend. +BUFFER-MODIFIED? determines whether the buffer was modified or +not." + (-some-> lsp-lens--refresh-timer cancel-timer) + + (setq lsp-lens--page (cons (window-start) (window-end))) + (setq lsp-lens--refresh-timer + (run-with-timer lsp-lens-debounce-interval + nil + #'lsp-lens-refresh + (or lsp-lens--modified? buffer-modified?) + (current-buffer)))) + +(defun lsp-lens--schedule-refresh-modified () + "Schedule a lens refresh due to a buffer-modification. +See `lsp-lens--schedule-refresh' for details." + (lsp-lens--schedule-refresh t)) + +(defun lsp-lens--keymap (command) + "Build the lens keymap for COMMAND." + (-doto (make-sparse-keymap) + (define-key [mouse-1] (lsp-lens--create-interactive-command command)))) + +(defun lsp-lens--create-interactive-command (command?) + "Create an interactive COMMAND? for the lens. +COMMAND? shall be an `&Command' (e.g. `&CodeLens' :command?) and +mustn't be nil." + (if (functionp (lsp:command-command command?)) + (lsp:command-command command?) + (lambda () + (interactive) + (lsp--execute-command command?)))) + +(defun lsp-lens--display (lenses) + "Show LENSES." + ;; rerender only if there are lenses which are not processed or if their count + ;; has changed(e. g. delete lens should trigger redisplay). + (let ((scroll-preserve-screen-position t)) + (setq lsp-lens--modified? nil) + (when (or (-any? (-lambda ((&CodeLens :_processed processed)) + (not processed)) + lenses) + (eq (length lenses) lsp-lens--last-count) + (not lenses)) + (setq lsp-lens--last-count (length lenses)) + (mapc #'delete-overlay lsp-lens--overlays) + (setq lsp-lens--overlays + (->> lenses + (-filter #'lsp:code-lens-command?) + (--map (prog1 it (lsp-put it :_processed t))) + (-group-by (-compose #'lsp:position-line #'lsp:range-start #'lsp:code-lens-range)) + (-map + (-lambda ((_ . lenses)) + (let* ((sorted (-sort (-on #'< (-compose #'lsp:position-character + #'lsp:range-start + #'lsp:code-lens-range)) + lenses)) + (data (-map + (-lambda ((lens &as &CodeLens + :command? (command &as + &Command :title :_face face))) + (propertize + title + 'face (or face 'lsp-lens-face) + 'action (lsp-lens--create-interactive-command command) + 'pointer 'hand + 'mouse-face 'lsp-lens-mouse-face + 'local-map (lsp-lens--keymap command))) + sorted))) + (lsp-lens--show + (s-join (propertize "|" 'face 'lsp-lens-face) data) + (-> sorted cl-first lsp:code-lens-range lsp:range-start lsp--position-to-point) + data))))))))) + +(defun lsp-lens-refresh (buffer-modified? &optional buffer) + "Refresh lenses using lenses backend. +BUFFER-MODIFIED? determines whether the BUFFER is modified or not." + (let ((buffer (or buffer (current-buffer)))) + (when (buffer-live-p buffer) + (with-current-buffer buffer + (dolist (backend lsp-lens-backends) + (funcall backend buffer-modified? + (lambda (lenses version) + (when (buffer-live-p buffer) + (with-current-buffer buffer + (lsp-lens--process backend lenses version)))))))))) + +(defun lsp-lens--process (backend lenses version) + "Process LENSES originated from BACKEND. +VERSION is the version of the file. The lenses has to be +refreshed only when all backends have reported for the same +version." + (setq lsp-lens--data (or lsp-lens--data (make-hash-table))) + (puthash backend (cons version (append lenses nil)) lsp-lens--data) + + (-let [backend-data (->> lsp-lens--data ht-values (-filter #'cl-rest))] + (when (and + (= (length lsp-lens-backends) (ht-size lsp-lens--data)) + (seq-every-p (-lambda ((version)) + (or (not version) (eq version lsp--cur-version))) + backend-data)) + ;; display the data only when the backends have reported data for the + ;; current version of the file + (lsp-lens--display (apply #'append (-map #'cl-rest backend-data))))) + version) + +(lsp-defun lsp--lens-backend-not-loaded? ((&CodeLens :range + (&Range :start) + :command? + :_pending pending)) + "Return t if LENS has to be loaded." + (let ((window (get-buffer-window (current-buffer)))) + ;; (window-start/end) does not consider current window buffer if not passed manually + (and (< (window-start window) (lsp--position-to-point start) (window-end window)) + (not command?) + (not pending)))) + +(lsp-defun lsp--lens-backend-present? ((&CodeLens :range (&Range :start) :command?)) + "Return t if LENS has to be loaded." + (or command? + (not (< (window-start) (lsp--position-to-point start) (window-end))))) + +(defun lsp-lens--backend-fetch-missing (lenses callback file-version) + "Fetch LENSES without command in for the current window. + +TICK is the buffer modified tick. If it does not match +`buffer-modified-tick' at the time of receiving the updates the +updates must be discarded.. +CALLBACK - the callback for the lenses. +FILE-VERSION - the version of the file." + (seq-each + (lambda (it) + (with-lsp-workspace (lsp-get it :_workspace) + (lsp-put it :_pending t) + (lsp-put it :_workspace nil) + (lsp-request-async "codeLens/resolve" it + (-lambda ((&CodeLens :command?)) + (lsp-put it :_pending nil) + (lsp-put it :command command?) + (when (seq-every-p #'lsp--lens-backend-present? lenses) + (funcall callback lenses file-version))) + :mode 'tick))) + (seq-filter #'lsp--lens-backend-not-loaded? lenses))) + +(defun lsp-lens--backend (modified? callback) + "Lenses backend using `textDocument/codeLens'. +MODIFIED? - t when buffer is modified since the last invocation. +CALLBACK - callback for the lenses." + (when (lsp--find-workspaces-for "textDocument/codeLens") + (if modified? + (progn + (setq lsp-lens--backend-cache nil) + (lsp-request-async "textDocument/codeLens" + `(:textDocument (:uri ,(lsp--buffer-uri))) + (lambda (lenses) + (setq lsp-lens--backend-cache + (seq-mapcat + (-lambda ((workspace . workspace-lenses)) + ;; preserve the original workspace so we can later use it to resolve the lens + (seq-do (-rpartial #'lsp-put :_workspace workspace) workspace-lenses) + workspace-lenses) + lenses)) + (if (-every? #'lsp:code-lens-command? lsp-lens--backend-cache) + (funcall callback lsp-lens--backend-cache lsp--cur-version) + (lsp-lens--backend-fetch-missing lsp-lens--backend-cache callback lsp--cur-version))) + :error-handler #'ignore + :mode 'tick + :no-merge t + :cancel-token (concat (buffer-name (current-buffer)) "-lenses"))) + (if (-all? #'lsp--lens-backend-present? lsp-lens--backend-cache) + (funcall callback lsp-lens--backend-cache lsp--cur-version) + (lsp-lens--backend-fetch-missing lsp-lens--backend-cache callback lsp--cur-version))))) + +(defun lsp-lens--refresh-buffer () + "Trigger lens refresh on buffer." + (remove-hook 'lsp-on-idle-hook #'lsp-lens--refresh-buffer t) + (when (bound-and-true-p lsp-lens-mode) + (lsp-lens-refresh t))) + +(defun lsp--lens-on-refresh (workspace) + "Clear lens within all buffers of WORKSPACE, refreshing all workspace buffers." + (cl-assert (not (eq nil workspace))) + (->> (lsp--workspace-buffers workspace) + (mapc (lambda (buffer) + (lsp-with-current-buffer buffer + (if (lsp--buffer-visible-p) + (when (bound-and-true-p lsp-lens-mode) + (lsp-lens-refresh t)) + (progn + (add-hook 'lsp-on-idle-hook #'lsp-lens--refresh-buffer nil t) + (lsp--idle-reschedule (current-buffer))))))))) + +;;;###autoload +(defun lsp-lens--enable () + "Enable lens mode." + (when (and lsp-lens-enable + (lsp-feature? "textDocument/codeLens")) + (lsp-lens-mode 1))) + +(defun lsp-lens--disable () + "Disable lens mode." + (lsp-lens-mode -1)) + +;;;###autoload +(defun lsp-lens-show () + "Display lenses in the buffer." + (interactive) + (->> (lsp-request "textDocument/codeLens" + `(:textDocument (:uri + ,(lsp--path-to-uri buffer-file-name)))) + (seq-map (-lambda ((lens &as &CodeAction :command?)) + (if command? + lens + (lsp-request "codeLens/resolve" lens)))) + lsp-lens--display)) + +;;;###autoload +(defun lsp-lens-hide () + "Delete all lenses." + (interactive) + (let ((scroll-preserve-screen-position t)) + (seq-do #'delete-overlay lsp-lens--overlays) + (setq lsp-lens--overlays nil))) + +;;;###autoload +(define-minor-mode lsp-lens-mode + "Toggle code-lens overlays." + :group 'lsp-lens + :global nil + :init-value nil + :lighter " Lens" + (cond + (lsp-lens-mode + (add-hook 'lsp-unconfigure-hook #'lsp-lens--disable nil t) + (add-hook 'lsp-configure-hook #'lsp-lens--enable nil t) + (add-hook 'lsp-on-idle-hook #'lsp-lens--idle-function nil t) + (add-hook 'lsp-on-change-hook #'lsp-lens--schedule-refresh-modified nil t) + (add-hook 'after-save-hook #'lsp-lens--after-save nil t) + (add-hook 'before-revert-hook #'lsp-lens-hide nil t) + (lsp-lens-refresh t)) + (t + (remove-hook 'lsp-on-idle-hook #'lsp-lens--idle-function t) + (remove-hook 'lsp-on-change-hook #'lsp-lens--schedule-refresh-modified t) + (remove-hook 'after-save-hook #'lsp-lens--after-save t) + (remove-hook 'before-revert-hook #'lsp-lens-hide t) + (when lsp-lens--refresh-timer + (cancel-timer lsp-lens--refresh-timer)) + (setq lsp-lens--refresh-timer nil) + (lsp-lens-hide) + (setq lsp-lens--last-count nil) + (setq lsp-lens--backend-cache nil) + (remove-hook 'lsp-configure-hook #'lsp-lens--enable t) + (remove-hook 'lsp-unconfigure-hook #'lsp-lens--disable t)))) + + +;; avy integration + +(declare-function avy-process "ext:avy" (candidates &optional overlay-fn cleanup-fn)) +(declare-function avy--key-to-char "ext:avy" (c)) +(defvar avy-action) +(defvar avy-style) + +;;;###autoload +(defun lsp-avy-lens () + "Click lsp lens using `avy' package." + (interactive) + (unless lsp-lens--overlays + (user-error "No lenses in current buffer")) + (let* ((avy-action 'identity) + (avy-style 'lsp-avy-lens) + (position (if (eq lsp-lens-place-position 'end-of-line) + 'after-string + 'before-string)) + (action (cl-third + (avy-process + (-mapcat + (lambda (overlay) + (-map-indexed + (lambda (index lens-token) + (list overlay index + (get-text-property 0 'action lens-token))) + (overlay-get overlay 'lsp--metadata))) + lsp-lens--overlays) + (-lambda (path ((ov index) . _win)) + (let* ((path (mapcar #'avy--key-to-char path)) + (str (propertize (string (car (last path))) + 'face 'avy-lead-face)) + (old-str (overlay-get ov position)) + (old-str-tokens (s-split "|" old-str)) + (old-token (seq-elt old-str-tokens index)) + (tokens `(,@(-take index old-str-tokens) + ,(-if-let ((_ prefix suffix) + (s-match "\\(^[[:space:]]+\\)\\(.*\\)" old-token)) + (concat prefix str suffix) + (concat str old-token)) + ,@(-drop (1+ index) old-str-tokens))) + (new-str (s-join (propertize "|" 'face 'lsp-lens-face) tokens)) + (new-str (if (or (s-ends-with? "\n" new-str) + (eq lsp-lens-place-position 'end-of-line)) + new-str + (concat new-str "\n")))) + (overlay-put ov position new-str))) + (lambda () + (--map + (let ((original (overlay-get it 'lsp-original))) + (overlay-put it position + (if (eq lsp-lens-place-position 'end-of-line) + (concat " " original) + original))) + lsp-lens--overlays)))))) + (when action (funcall-interactively action)))) + +(lsp-consistency-check lsp-lens) + +(provide 'lsp-lens) +;;; lsp-lens.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-lua.el b/code/elpa/lsp-mode-20240319.1043/lsp-lua.el new file mode 100644 index 0000000..56fc321 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-lua.el @@ -0,0 +1,701 @@ +;;; lsp-lua.el --- description -*- lexical-binding: t; -*- + +;; Copyright (C) 2020 E. Alexander Barbosa + +;; Author: E. Alexander Barbosa +;; Keywords: + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP Clients for the Lua Programming Language + +;;; Code: + +(require 'lsp-mode) +(require 'f) +(require 'files) + +(defgroup lsp-emmy-lua nil + "Lua LSP client, provided by the EmmyLua Language Server." + :group 'lsp-mode + :version "8.0.0" + :link '(url-link "https://github.com/EmmyLua/EmmyLua-LanguageServer")) + +(defcustom lsp-clients-emmy-lua-java-path "java" + "Java Runtime binary location." + :group 'lsp-emmy-lua + :version "8.0.0" + :risky t + :type 'file) + +(defcustom lsp-clients-emmy-lua-jar-path (f-join lsp-server-install-dir "EmmyLua-LS-all.jar") + "Emmy Lua language server jar file." + :group 'lsp-emmy-lua + :version "8.0.0" + :risky t + :type 'file) + +(defcustom lsp-clients-emmy-lua-args '("-jar") + "Arguments to the Lua Language server." + :group 'lsp-emmy-lua + :version "8.0.0" + :risky t + :type '(repeat string)) + +(defcustom lsp-clients-emmy-lua-command nil + "Final command to call the Lua Language server." + :group 'lsp-emmy-lua + :version "8.0.0" + :risky t + :type '(repeat string)) + +(defun lsp-clients-emmy-lua-test () + "Test the Emmy Lua binaries and files." + (and (executable-find lsp-clients-emmy-lua-java-path) + (f-exists? lsp-clients-emmy-lua-jar-path))) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection (lambda () (or lsp-clients-emmy-lua-command + `(,lsp-clients-emmy-lua-java-path + ,@lsp-clients-emmy-lua-args + ,lsp-clients-emmy-lua-jar-path))) + #'lsp-clients-emmy-lua-test) + :activation-fn (lsp-activate-on "lua") + :server-id 'emmy-lua + :priority -1 + :notification-handlers (lsp-ht ("emmy/progressReport" #'ignore)))) + + +;;; lua-language-server +(defgroup lsp-lua-language-server nil + "Lua LSP client, provided by the Lua Language Server." + :group 'lsp-mode + :version "8.0.0" + :link '(url-link "https://github.com/sumneko/lua-language-server")) + +(defcustom lsp-clients-lua-language-server-install-dir (f-join lsp-server-install-dir "lua-language-server/") + "Installation directory for Lua Language Server." + :group 'lsp-lua-language-server + :version "8.0.0" + :risky t + :type 'directory) + +(defcustom lsp-clients-lua-language-server-bin + (f-join lsp-clients-lua-language-server-install-dir + "bin/" + (pcase system-type + ('gnu/linux "lua-language-server") + ('darwin "lua-language-server") + ('windows-nt "lua-language-server.exe") + (_ "lua-language-server"))) + "Location of Lua Language Server." + :group 'lsp-lua-language-server + :version "8.0.0" + :risky t + :type 'file) + +(defcustom lsp-clients-lua-language-server-main-location + (f-join lsp-clients-lua-language-server-install-dir + "main.lua") + "Location of Lua Language Server main.lua." + :group 'lsp-lua-language-server + :version "8.0.0" + :risky t + :type 'file) + +(defcustom lsp-clients-lua-language-server-args '("-E") + "Arguments to run the Lua Language server." + :group 'lsp-lua-language-server + :version "8.0.0" + :risky t + :type '(repeat string)) + +(defcustom lsp-clients-lua-language-server-command nil + "Command to start Lua Language server." + :group 'lsp-lua-language-server + :type '(repeat string)) + + +(defun lsp-clients-lua-language-server-test () + "Test Lua language server binaries and files." + (and (f-exists? lsp-clients-lua-language-server-main-location) + (f-exists? lsp-clients-lua-language-server-bin))) + +(defcustom lsp-lua-color-mode "Semantic" + "Color mode." + :type '(choice (:tag "Grammar" "Semantic")) + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-completion-call-snippet "Disable" + "Shows function call snippets." + :type '(choice (:tag "Disable" "Both" "Replace")) + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-completion-display-context 6 + "Previewing the relevant code snippet of the suggestion may help you +understand the usage of the suggestion. + +The number set indicates the number of intercepted lines in the code +fragment. If it is set to `0`, this feature can be disabled." + :type 'number + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-completion-enable t + "Enable completion." + :type 'boolean + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-completion-keyword-snippet "Replace" + "Shows keyword syntax snippets." + :type '(choice (:tag "Disable" "Both" "Replace")) + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-completion-workspace-word t + "Show words within the workspace." + :type 'boolean + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-develop-debugger-port 11412 + "Listen port of debugger." + :type 'number + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-develop-debugger-wait nil + "Suspend before debugger connects." + :type 'boolean + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-develop-enable nil + "Developer mode. Do not enable, performance will be affected." + :type 'boolean + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-diagnostics-disable nil + "Disabled diagnostic (Use code in hover brackets). +```json +\"Lua.diagnostics.disable\" : [ +\"unused-local\", +\"lowercase-global\" +] +```" + :type 'lsp-string-vector + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-diagnostics-enable t + "Enable diagnostics." + :type 'boolean + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-diagnostics-globals nil + "Defined global variables. +```json +\"Lua.diagnostics.globals\" : [ +\"GLOBAL1\", +\"GLOBAL2\" +] +```" + :type 'lsp-string-vector + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-diagnostics-needed-file-status nil + "If you want to check only opened files, choice Opened; else choice Any. +```json +\"Lua.diagnostics.neededFileStatus\" : { +\"ambiguity-1\" : \"Any\", +\"circle-doc-class\" : \"Opened\" +} +```" + :type 'alist + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-diagnostics-severity nil + "Modified diagnostic severity. +```json +\"Lua.diagnostics.severity\" : { +\"redefined-local\" : \"Warning\", +\"emmy-lua\" : \"Hint\" +} +```" + :type 'alist + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-diagnostics-workspace-delay 0 + "Latency (milliseconds) for workspace diagnostics. When you start the +workspace, or edit any file, the entire workspace will be re-diagnosed in the +background. Set to negative to disable workspace diagnostics." + :type 'number + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-diagnostics-workspace-rate 100 + "Workspace diagnostics run rate (%). Decreasing this value reduces CPU usage, +but also reduces the speed of workspace diagnostics. The diagnosis of the file +you are currently editing is always done at full speed and is not affected by +this setting." + :type 'number + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-hint-enable nil + "Enable hint." + :type 'boolean + :package-version '(lsp-mmode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-hint-param-name t + "Hint parameter name when the parameter called is literal." + :type 'boolean + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-hint-param-type t + "Show type hints at the parameter of the function." + :type 'boolean + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-hint-set-type nil + "Hint type at assignment operation." + :type 'boolean + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-hover-enable t + "Enable hover." + :type 'boolean + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-hover-field-infer 3000 + "When hovering to view a table, type infer will be performed for each field. +When the accumulated time of type infer reaches the set value (MS), the type +infer of subsequent fields will be skipped." + :type 'number + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-hover-preview-fields 100 + "When hovering to view a table, limits the maximum number of previews for +fields." + :type 'number + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-hover-view-number t + "Hover to view numeric content (only if literal is not decimal)." + :type 'boolean + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-hover-view-string t + "Hover to view the contents of a string (only if the literal contains an +escape character)." + :type 'boolean + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-hover-view-string-max 1000 + "The maximum length of a hover to view the contents of a string." + :type 'number + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-intelli-sense-search-depth 0 + "Set the search depth for IntelliSense. Increasing this value increases +accuracy, but decreases performance. Different workspace have different +tolerance for this setting. Please adjust it to the appropriate value." + :type 'number + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-runtime-file-encoding "utf8" + "File encoding. The `ansi' option is only available under the `Windows' +platform." + :type '(choice (:tag "utf8" "ansi")) + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-runtime-nonstandard-symbol nil + "Supports non-standard symbols. Make sure that your runtime environment +supports these symbols." + :type 'lsp-string-vector + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-runtime-path + ["?.lua" "?/init.lua" "?/?.lua"] + "`package.path`." + :type 'lsp-string-vector + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-runtime-plugin nil + "(Proposed) Plugin path. Default is `.vscode/lua/plugin.lua`" + :type 'file + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-runtime-special nil + "The custom global variables are regarded as some special built-in variables, +and the language server will provide special support. +```json +\"Lua.runtime.special\" : { +\"include\" : \"require\" +} +```" + :type 'alist + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-runtime-unicode-name nil + "Allows Unicode characters in name." + :type 'boolean + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-runtime-version "Lua 5.4" + "Lua runtime version." + :type '(choice (:tag "Lua 5.1" "Lua 5.2" "Lua 5.3" "Lua 5.4" "LuaJIT")) + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-signature-help-enable t + "Enable signature help." + :type 'boolean + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-telemetry-enable nil + "Enable telemetry to send your editor information and error logs over the +network." + :type 'boolean + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-window-progress-bar t + "Show progress bar in status bar." + :type 'boolean + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-window-status-bar t + "Show extension status in status bar." + :type 'boolean + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-workspace-ignore-dir + [".vscode"] + "Ignored directories (Use `.gitignore` grammar). +```json +\"Lua.workspace.ignoreDir\" : [ +\"temp/*.*\", +\"!temp/*.lua\" +] +```" + :type 'lsp-string-vector + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-workspace-ignore-submodules t + "Ignore submodules." + :type 'boolean + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-workspace-library nil + "Load external library. + +This feature can load external Lua files, which can be used for definition, +automatic completion and other functions. Note that the language server does +not monitor changes in external files and needs to restart if the external +files are modified. The following example shows loaded files in `C:/lua` +and `../lib` ,exclude `../lib/temp`. + +```json +\"Lua.workspace.library\": { +\"C:/lua\": true, +\"../lib\": [ +\"temp/*\" +] +} +```" + :type 'alist + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-workspace-max-preload 1000 + "Max preloaded files." + :type 'number + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-workspace-preload-file-size 100 + "Skip files larger than this value (KB) when preloading." + :type 'number + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-workspace-use-git-ignore t + "Ignore files list in `.gitignore` ." + :type 'boolean + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-files-associations nil + "Files.associations." + :type 'alist + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-files-exclude nil + "Files.exclude." + :type 'alist + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(defcustom lsp-lua-prefer-musl nil + "Whether or not to download the musl-compiled server." + :type 'boolean + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-lua-language-server) + +(lsp-register-custom-settings + '(("files.associations" lsp-lua-files-associations t) + ("files.exclude" lsp-lua-files-exclude t) + ("Lua.workspace.useGitIgnore" lsp-lua-workspace-use-git-ignore t) + ("Lua.workspace.preloadFileSize" lsp-lua-workspace-preload-file-size) + ("Lua.workspace.maxPreload" lsp-lua-workspace-max-preload) + ("Lua.workspace.library" lsp-lua-workspace-library) + ("Lua.workspace.ignoreSubmodules" lsp-lua-workspace-ignore-submodules t) + ("Lua.workspace.ignoreDir" lsp-lua-workspace-ignore-dir) + ("Lua.window.statusBar" lsp-lua-window-status-bar t) + ("Lua.window.progressBar" lsp-lua-window-progress-bar t) + ("Lua.telemetry.enable" lsp-lua-telemetry-enable t) + ("Lua.signatureHelp.enable" lsp-lua-signature-help-enable t) + ("Lua.runtime.version" lsp-lua-runtime-version) + ("Lua.runtime.unicodeName" lsp-lua-runtime-unicode-name nil) + ("Lua.runtime.special" lsp-lua-runtime-special) + ("Lua.runtime.plugin" lsp-lua-runtime-plugin) + ("Lua.runtime.path" lsp-lua-runtime-path) + ("Lua.runtime.nonstandardSymbol" lsp-lua-runtime-nonstandard-symbol) + ("Lua.runtime.fileEncoding" lsp-lua-runtime-file-encoding) + ("Lua.intelliSense.searchDepth" lsp-lua-intelli-sense-search-depth) + ("Lua.hover.viewStringMax" lsp-lua-hover-view-string-max) + ("Lua.hover.viewString" lsp-lua-hover-view-string t) + ("Lua.hover.viewNumber" lsp-lua-hover-view-number t) + ("Lua.hover.previewFields" lsp-lua-hover-preview-fields) + ("Lua.hover.fieldInfer" lsp-lua-hover-field-infer) + ("Lua.hover.enable" lsp-lua-hover-enable t) + ("Lua.hint.setType" lsp-lua-hint-set-type nil) + ("Lua.hint.paramType" lsp-lua-hint-param-type t) + ("Lua.hint.paramName" lsp-lua-hint-param-name t) + ("Lua.hint.enable" lsp-lua-hint-enable t) + ("Lua.diagnostics.workspaceRate" lsp-lua-diagnostics-workspace-rate) + ("Lua.diagnostics.workspaceDelay" lsp-lua-diagnostics-workspace-delay) + ("Lua.diagnostics.severity" lsp-lua-diagnostics-severity) + ("Lua.diagnostics.neededFileStatus" lsp-lua-diagnostics-needed-file-status) + ("Lua.diagnostics.globals" lsp-lua-diagnostics-globals) + ("Lua.diagnostics.enable" lsp-lua-diagnostics-enable t) + ("Lua.diagnostics.disable" lsp-lua-diagnostics-disable) + ("Lua.develop.enable" lsp-lua-develop-enable t) + ("Lua.develop.debuggerWait" lsp-lua-develop-debugger-wait t) + ("Lua.develop.debuggerPort" lsp-lua-develop-debugger-port) + ("Lua.completion.workspaceWord" lsp-lua-completion-workspace-word t) + ("Lua.completion.keywordSnippet" lsp-lua-completion-keyword-snippet) + ("Lua.completion.enable" lsp-lua-completion-enable t) + ("Lua.completion.displayContext" lsp-lua-completion-display-context) + ("Lua.completion.callSnippet" lsp-lua-completion-call-snippet) + ("Lua.color.mode" lsp-lua-color-mode))) + +(defun lsp-lua-language-server-install-latest (client callback error-callback update?) + "Download the latest version of lua-language-server and extract it to +`lsp-lua-language-server-install-dir'." + (ignore client update?) + (let ((store-path (expand-file-name "lua-language-server-github" lsp-clients-lua-language-server-install-dir))) + (lsp-download-install + (lambda (&rest _) + (set-file-modes lsp-clients-lua-language-server-bin #o0700) + (funcall callback)) + error-callback + :url (lsp--find-latest-gh-release-url + "https://api.github.com/repos/sumneko/lua-language-server/releases/latest" + (format "%s%s.tar.gz" + (pcase system-type + ('gnu/linux + (pcase (lsp-resolve-value lsp--system-arch) + ('x64 "linux-x64"))) + ('darwin + (pcase (lsp-resolve-value lsp--system-arch) + ('x64 "darwin-x64") + ('arm64 "darwin-arm64"))) + ('windows-nt + (pcase (lsp-resolve-value lsp--system-arch) + ('x64 "win32-x64") + ('arm64 "win32-ia32"))) + (_ + (pcase (lsp-resolve-value lsp--system-arch) + ('x64 "linux-x64")))) + (if lsp-lua-prefer-musl "-musl" ""))) + :store-path store-path + :decompress (pcase system-type ('windows-nt :zip) (_ :targz))))) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection (lambda () (or lsp-clients-lua-language-server-command + `(,lsp-clients-lua-language-server-bin + ,@lsp-clients-lua-language-server-args + ,lsp-clients-lua-language-server-main-location))) + #'lsp-clients-lua-language-server-test) + :activation-fn (lsp-activate-on "lua") + :priority -2 + :server-id 'lua-language-server + :download-server-fn #'lsp-lua-language-server-install-latest)) + +;;; lua-lsp +(defgroup lsp-lua-lsp nil + "Lua LSP client, provided by the Lua-Lsp." + :group 'lsp-mode + :version "8.0.0" + :link '(url-link "https://github.com/Alloyed/lua-lsp")) + +(defcustom lsp-clients-luarocks-bin-dir (f-join (getenv "HOME") ".luarocks/bin/") + "LuaRocks bin directory." + :group 'lsp-lua-lsp + :version "8.0.0" + :risky t + :type 'directory) + +(defcustom lsp-clients-lua-lsp-server-install-dir nil + "Installation directory for Lua-Lsp Language Server." + :group 'lsp-lua-lsp + :version "8.0.0" + :risky t + :type 'file) + +(defun lsp-clients-lua-lsp-test () + "Test Lua-lsp language server files." + (and (f-exists? lsp-clients-lua-lsp-server-install-dir))) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection (lambda () + (or lsp-clients-lua-lsp-server-install-dir + (f-join lsp-clients-luarocks-bin-dir "lua-lsp"))) + #'lsp-clients-lua-lsp-test) + :activation-fn (lsp-activate-on "lua") + :priority -3 + :server-id 'lsp-lua-lsp)) + +;;; lua-roblox-language-server +(defgroup lsp-lua-roblox-language-server nil + "Roblox Lua LSP client, provided by the Roblox Lua Language Server." + :group 'lsp-mode + :version "8.0.0" + :link '(url-link "https://github.com/NightrainsRbx/RobloxLsp")) + +(defcustom lsp-lua-roblox-language-server-install-dir (f-join lsp-server-install-dir "lua-roblox-language-server/") + "Installation directory for Lua Language Server." + :group 'lsp-lua-roblox-language-server + :version "8.0.0" + :risky t + :type 'directory) + +(defcustom lsp-lua-roblox-language-server-bin + (f-join lsp-lua-roblox-language-server-install-dir + "extension/server/bin/" + (pcase system-type + ('gnu/linux "Linux/lua-language-server") + ('darwin "macOS/lua-language-server") + ('windows-nt "Windows/lua-language-server.exe") + (_ "Linux/lua-language-server"))) + "Location of Roblox Lua Language Server." + :group 'lsp-lua-roblox-language-server + :version "8.0.0" + :risky t + :type 'file) + +(defcustom lsp-lua-roblox-language-server-main-location + (f-join lsp-lua-roblox-language-server-install-dir + "extension/server/main.lua") + "Location of Roblox Lua Language Server main.lua." + :group 'lsp-lua-roblox-language-server + :version "8.0.0" + :risky t + :type 'file) + +(defcustom lsp-lua-roblox-server-download-url + (lsp-vscode-extension-url "Nightrains" "robloxlsp" "1.5.11") + "Download url for Roblox Lua vscode extension." + :group 'lsp-lua-roblox-language-server + :version "8.0.0" + :type 'string) + +(defcustom lsp-lua-roblox-server-store-path + (expand-file-name "vs-lua-roblox" lsp-lua-roblox-language-server-install-dir) + "Server file name for the vscode extension." + :group 'lsp-lua-roblox-language-server + :version "8.0.0" + :type 'string) + +(defun lsp-lua-roblox-language-server-test () + "Test Lua language server binaries and files." + (and (f-exists? lsp-lua-roblox-language-server-main-location) + (f-exists? lsp-lua-roblox-language-server-bin))) + +(defun lsp-lua-roblox-language-server-install (_client callback error-callback _update?) + "Download the latest version of lua-language-server and extract it to +`lsp-lua-roblox-language-server-download-url'." + (lsp-download-install + (lambda (&rest _) + (set-file-modes lsp-lua-roblox-language-server-bin #o0700) + (funcall callback)) + error-callback + :url lsp-lua-roblox-server-download-url + :store-path lsp-lua-roblox-server-store-path + :decompress :zip)) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection (lambda () (or lsp-clients-lua-language-server-command + `(,lsp-lua-roblox-language-server-bin + ,@lsp-clients-lua-language-server-args + ,lsp-lua-roblox-language-server-main-location))) + #'lsp-lua-roblox-language-server-test) + :activation-fn (lsp-activate-on "lua") + :priority -4 + :server-id 'lua-roblox-language-server + :download-server-fn #'lsp-lua-roblox-language-server-install)) + +(lsp-consistency-check lsp-lua) + +(provide 'lsp-lua) +;;; lsp-lua.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-magik.el b/code/elpa/lsp-mode-20240319.1043/lsp-magik.el new file mode 100644 index 0000000..08e15e2 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-magik.el @@ -0,0 +1,135 @@ +;;; lsp-magik.el --- Language server client for Magik -*- lexical-binding: t; -*- + +;; Copyright (C) 2022 Keronic + +;; Author: +;; Keywords: lsp, magik + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP client for the Magik programming language +;; https://github.com/StevenLooman/magik-tools + +;;; Code: + +(require `lsp-mode) + +(defgroup lsp-magik nil + "LSP support for Magik." + :link '(url-link "https://github.com/StevenLooman/magik-tools") + :group 'lsp-mode + :tag "Lsp Magik" + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-magik-version "0.9.0" + "Version of LSP server." + :type `string + :group `lsp-magik + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-magik-download-url-lsp (format "https://github.com/StevenLooman/magik-tools/releases/download/%s/magik-language-server-%s.jar" lsp-magik-version lsp-magik-version) + "URL of LSP server to download." + :type `string + :group `lsp-magik + :package-version '(lsp-mode . "8.0.1")) + +(lsp-dependency + 'magik-ls + `(:download :url lsp-magik-download-url-lsp + :store-path ,(f-join lsp-server-install-dir "magik-ls" (format "magik-language-server-%s.jar" lsp-magik-version)))) + +(defcustom lsp-magik-ls-path + (f-join lsp-server-install-dir (format "magik-ls/magik-language-server-%s.jar" lsp-magik-version)) + "Path of the language server." + :type 'string + :group `lsp-magik + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-magik-java-home nil + "Path to Java Runtime, Java 11 minimum." + :type `string + :group `lsp-magik + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-magik-smallworld-gis nil + "Path to Smallworld Core." + :type `string + :group `lsp-magik + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-magik-typing-type-database-paths [] + "Paths to type databases." + :type `lsp-string-vector + :group `lsp-magik + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-magik-typing-enable-checks nil + "Enable typing checks." + :type `boolean + :group `lsp-magik + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-magik-trace-server "off" + "Traces the communication between VS Code and the Magik language server." + :type `(choice (const "off") (const "message") (const "verbose")) + :group `lsp-magik + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-magik-java-path (lambda () + (cond ((eq system-type 'windows-nt) + (or (lsp-resolve-value (executable-find (expand-file-name "bin/java" (getenv "JAVA_HOME")))) + (lsp-resolve-value (executable-find "java")))) + (t "java"))) + "Path of the java executable." + :type 'string + :group `lsp-magik + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-magik-lint-override-config-file nil + "Override path to magiklintrc.properties." + :type 'string + :group `lsp-magik + :package-version '(lsp-mode . "8.0.1")) + +(lsp-register-client + (make-lsp-client + :download-server-fn (lambda (_client callback error-callback _update?) + (lsp-package-ensure 'magik-ls callback error-callback)) + :new-connection (lsp-stdio-connection + (lambda () + (list + (substitute-in-file-name (lsp-resolve-value lsp-magik-java-path)) + "-jar" + (substitute-in-file-name lsp-magik-ls-path) + "--debug"))) + :activation-fn (lsp-activate-on "magik") + :initialized-fn (lambda (workspace) + (with-lsp-workspace workspace + (lsp--set-configuration (lsp-configuration-section "magik")))) + :server-id 'magik)) + +(lsp-register-custom-settings + `(("magik.javaHome" lsp-magik-java-home) + ("magik.smallworldGis" lsp-magik-smallworld-gis) + ("magik.typing.typeDatabasePaths" lsp-magik-typing-type-database-paths) + ("magik.typing.enableChecks" lsp-magik-typing-enable-checks) + ("magik.trace.server" lsp-magik-trace-server) + ("magik.lint.overrideConfigFile" lsp-magik-lint-override-config-file))) + +(lsp-consistency-check lsp-magik) + +(provide 'lsp-magik) +;;; lsp-magik.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-markdown.el b/code/elpa/lsp-mode-20240319.1043/lsp-markdown.el new file mode 100644 index 0000000..08f1b20 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-markdown.el @@ -0,0 +1,103 @@ +;;; lsp-markdown.el --- lsp-mode markdown integration -*- lexical-binding: t; -*- + +;; Copyright (C) 2021 lsp-mode maintainers + +;; Author: lsp-mode maintainers +;; Keywords: languages + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP client for unified-language-server + +;;; Code: + +(require 'lsp-mode) + +;;; Markdown +(defgroup lsp-markdown nil + "Settings for the markdown language server client." + :group 'lsp-mode + :link '(url-link "https://github.com/unifiedjs/unified-language-server") + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-markdown-server-command "unified-language-server" + "The binary (or full path to binary) which executes the server." + :type 'string + :group 'lsp-markdown + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-markdown-server-command-args '("--parser=remark-parse" "--stdio") + "Command-line arguments for the markdown lsp server." + :type '(repeat 'string) + :group 'lsp-markdown + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-markdown-remark-plugins [["#remark-preset-lint-markdown-style-guide"]] + "The JSON configuration object for plugins. + +For a complete list of plugins, check: + https://github.com/unifiedjs/unified-language-server/blob/main/CONFIGURATION.md#re-using-settings" + :type 'lsp-string-vector + :group 'lsp-markdown + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-markdown-remark-check-text-with-setting "retext-english" + "Configure `checkTextWith' subproperty. + +For a complete list of plugins, check: + https://github.com/unifiedjs/unified-language-server/blob/main/CONFIGURATION.md#re-using-settings" + :type '(choice ( + (const "retext-english") + (const "remark-parse"))) + :group 'lsp-markdown + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-markdown-remark-check-text-with-mutator ["#remark-retext" "#parse-latin"] + "Vector of additional mutators. + +For a complete list of plugins, check: + https://github.com/unifiedjs/unified-language-server/blob/main/CONFIGURATION.md#re-using-settings" + :type 'lsp-string-vector + :group 'lsp-markdown + :package-version '(lsp-mode . "8.0.0")) + +(lsp-dependency 'unified-language-server + '(:system "unified-language-server") + '(:npm :package "unified-language-server" + :path "unified-language-server")) + +(lsp-register-custom-settings + `(("unified-language-server.remark-parse.plugins" lsp-markdown-remark-plugins) + ("unified-language-server.remark-parse.checkTextWith.setting" lsp-markdown-remark-check-text-with-setting) + ("unified-language-server.remark-parse.checkTextWith.mutator" lsp-markdown-remark-check-text-with-mutator))) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection + (lambda () + (cons (or (executable-find lsp-markdown-server-command) + (lsp-package-path 'unified-language-server)) + lsp-markdown-server-command-args))) + :activation-fn (lsp-activate-on "markdown") + :initialized-fn (lambda (workspace) + (with-lsp-workspace workspace + (lsp--set-configuration (lsp-configuration-section "unified-language-server")))) + :priority -1 + :server-id 'unified)) + +(lsp-consistency-check lsp-markdown) + +(provide 'lsp-markdown) +;;; lsp-markdown.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-marksman.el b/code/elpa/lsp-mode-20240319.1043/lsp-marksman.el new file mode 100644 index 0000000..0dd5d7a --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-marksman.el @@ -0,0 +1,97 @@ +;;; lsp-marksman.el --- lsp-mode marksman integration -*- lexical-binding: t; -*- + +;; Copyright (C) 2021 lsp-mode maintainers + +;; Author: lsp-mode maintainers +;; Keywords: languages + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP client for marksman + +;;; Code: + +(require 'lsp-mode) + +;;; Marksman +(defgroup lsp-marksman nil + "Settings for the marksman language server client." + :group 'lsp-mode + :link '(url-link "https://github.com/artempyanykh/marksman") + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-marksman-server-command "marksman" + "The binary (or full path to binary) which executes the server." + :type 'string + :group 'lsp-marksman + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-marksman-server-command-args '() + "Command-line arguments for the marksman lsp server. Not normally Needed." + :type '(repeat 'string) + :group 'lsp-marksman + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-marksman-download-url + (format "https://github.com/artempyanykh/marksman/releases/latest/download/%s" + (pcase system-type + ('gnu/linux + (if (string-match "^aarch64-.*" system-configuration) + "marksman-linux-arm64" + "marksman-linux-x64")) + ('darwin "marksman-macos") + ('windows-nt "marksman.exe"))) + "Automatic download url for Marksman." + :type 'string + :group 'lsp-marksman + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-marksman-store-path (f-join lsp-server-install-dir + "marksman" + (if (eq system-type 'windows-nt) + "marksman.exe" + "marksman")) + "The path to the file in which `marksman' will be stored." + :type 'file + :group 'lsp-marksman + :package-version '(lsp-mode . "8.0.0")) + +(lsp-dependency 'marksman + '(:system "marksman") + `(:download :url lsp-marksman-download-url + :store-path lsp-marksman-store-path + :set-executable? t)) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection + (lambda () + (cons (or (executable-find lsp-marksman-server-command) + (lsp-package-path 'marksman) + "marksman") + lsp-marksman-server-command-args))) + :activation-fn (lsp-activate-on "markdown") + :initialized-fn (lambda (workspace) + (with-lsp-workspace workspace + (lsp--set-configuration (lsp-configuration-section "marksman")))) + :priority -1 + :server-id 'marksman + :download-server-fn (lambda (_client callback error-callback _update?) + (lsp-package-ensure 'marksman callback error-callback)))) + +(lsp-consistency-check lsp-marksman) + +(provide 'lsp-marksman) +;;; lsp-marksman.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-mdx.el b/code/elpa/lsp-mode-20240319.1043/lsp-mdx.el new file mode 100644 index 0000000..435318d --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-mdx.el @@ -0,0 +1,66 @@ +;;; lsp-mdx.el --- lsp-mode mdx integration -*- lexical-binding: t; -*- + +;; Copyright (C) 2023 lsp-mode maintainers + +;; Author: lsp-mode maintainers +;; Keywords: languages + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP client for mdx-analyzer language-server + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-mdx nil + "Settings for the mdx language server client." + :group 'lsp-mode + :link '(url-link "https://github.com/mdx-js/mdx-analyzer/tree/main/packages/language-server") + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-mdx-server-command "mdx-language-server" + "The binary (or full path to binary) which executes the server." + :type 'string + :group 'lsp-mdx + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-mdx-server-command-args '("--stdio") + "Command-line arguments for the mdx lsp server." + :type '(repeat 'string) + :group 'lsp-mdx + :package-version '(lsp-mode . "8.0.0")) + +(lsp-dependency 'mdx-language-server + '(:system "mdx-language-server") + '(:npm :package "@mdx-js/language-server" + :path "mdx-language-server")) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection + (lambda () + (cons (or (executable-find lsp-mdx-server-command) + (lsp-package-path 'mdx-language-server)) + lsp-mdx-server-command-args))) + :activation-fn (lambda (&rest _args) + (string-match-p "\\.mdx\\'" (buffer-file-name))) + :priority -2 + :server-id 'mdx-analyzer + :download-server-fn (lambda (_client callback error-callback _update?) + (lsp-package-ensure 'mdx-language-server callback error-callback)))) + +(provide 'lsp-mdx) +;;; lsp-mdx.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-mint.el b/code/elpa/lsp-mode-20240319.1043/lsp-mint.el new file mode 100644 index 0000000..46195ba --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-mint.el @@ -0,0 +1,48 @@ +;;; lsp-mint.el --- Mint Language Server configuration -*- lexical-binding: t; -*- + +;; Copyright (C) 2019 Ivan Yonchovski + +;; Author: Ivan Yonchovski +;; Keywords: + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-mint nil + "LSP support for mint-lang." + :group 'lsp-mode + :link '(url-link "https://github.com/mint-lang/mint") + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-clients-mint-executable '("mint" "ls") + "Command to start the mint language server." + :group 'lsp-mint + :risky t + :type 'file) + +;; Mint +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection lsp-clients-mint-executable) + :major-modes '(mint-mode) + :server-id 'mint-ls)) + +(provide 'lsp-mint) +;;; lsp-mint.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-mode-autoloads.el b/code/elpa/lsp-mode-20240319.1043/lsp-mode-autoloads.el new file mode 100644 index 0000000..45d18ec --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-mode-autoloads.el @@ -0,0 +1,947 @@ +;;; lsp-mode-autoloads.el --- automatically extracted autoloads (do not edit) -*- lexical-binding: t -*- +;; Generated by the `loaddefs-generate' function. + +;; This file is part of GNU Emacs. + +;;; Code: + +(add-to-list 'load-path (or (and load-file-name (directory-file-name (file-name-directory load-file-name))) (car load-path))) + + + +;;; Generated autoloads from lsp-actionscript.el + +(register-definition-prefixes "lsp-actionscript" '("lsp-actionscript-")) + + +;;; Generated autoloads from lsp-ada.el + +(register-definition-prefixes "lsp-ada" '("lsp-ada-")) + + +;;; Generated autoloads from lsp-angular.el + +(register-definition-prefixes "lsp-angular" '("lsp-client")) + + +;;; Generated autoloads from lsp-ansible.el + +(register-definition-prefixes "lsp-ansible" '("lsp-ansible-")) + + +;;; Generated autoloads from lsp-asm.el + +(register-definition-prefixes "lsp-asm" '("lsp-asm-")) + + +;;; Generated autoloads from lsp-astro.el + +(register-definition-prefixes "lsp-astro" '("lsp-astro--get-initialization-options")) + + +;;; Generated autoloads from lsp-autotools.el + +(register-definition-prefixes "lsp-autotools" '("lsp-autotools-")) + + +;;; Generated autoloads from lsp-awk.el + +(register-definition-prefixes "lsp-awk" '("lsp-awk-executable")) + + +;;; Generated autoloads from lsp-bash.el + +(register-definition-prefixes "lsp-bash" '("lsp-bash-")) + + +;;; Generated autoloads from lsp-beancount.el + +(register-definition-prefixes "lsp-beancount" '("lsp-beancount-")) + + +;;; Generated autoloads from lsp-bufls.el + +(register-definition-prefixes "lsp-bufls" '("lsp-bufls-")) + + +;;; Generated autoloads from lsp-camel.el + +(register-definition-prefixes "lsp-camel" '("lsp-camel-")) + + +;;; Generated autoloads from lsp-clangd.el + +(autoload 'lsp-cpp-flycheck-clang-tidy-error-explainer "lsp-clangd" "\ +Explain a clang-tidy ERROR by scraping documentation from llvm.org. + +(fn ERROR)") +(register-definition-prefixes "lsp-clangd" '("lsp-c")) + + +;;; Generated autoloads from lsp-clojure.el + +(autoload 'lsp-clojure-show-test-tree "lsp-clojure" "\ +Show a test tree and focus on it if IGNORE-FOCUS? is nil. + +(fn IGNORE-FOCUS?)" t) +(autoload 'lsp-clojure-show-project-tree "lsp-clojure" "\ +Show a project tree with source-paths and dependencies. +Focus on it if IGNORE-FOCUS? is nil. + +(fn IGNORE-FOCUS?)" t) +(register-definition-prefixes "lsp-clojure" '("lsp-clojure-")) + + +;;; Generated autoloads from lsp-cmake.el + +(register-definition-prefixes "lsp-cmake" '("lsp-cmake-")) + + +;;; Generated autoloads from lsp-cobol.el + +(add-hook 'cobol-mode-hook #'lsp-cobol-start-ls) +(autoload 'lsp-cobol-start-ls "lsp-cobol" "\ +Start the COBOL language service." t) +(register-definition-prefixes "lsp-cobol" '("lsp-cobol-")) + + +;;; Generated autoloads from lsp-completion.el + +(define-obsolete-variable-alias 'lsp-prefer-capf 'lsp-completion-provider "\ +lsp-mode 7.0.1") +(define-obsolete-variable-alias 'lsp-enable-completion-at-point 'lsp-completion-enable "\ +lsp-mode 7.0.1") +(autoload 'lsp-completion-at-point "lsp-completion" "\ +Get lsp completions.") +(autoload 'lsp-completion--enable "lsp-completion" "\ +Enable LSP completion support.") +(autoload 'lsp-completion-mode "lsp-completion" "\ +Toggle LSP completion support. + +This is a minor mode. If called interactively, toggle the +`Lsp-Completion mode' mode. If the prefix argument is positive, +enable the mode, and if it is zero or negative, disable the mode. + +If called from Lisp, toggle the mode if ARG is `toggle'. Enable +the mode if ARG is nil, omitted, or is a positive number. +Disable the mode if ARG is a negative number. + +To check whether the minor mode is enabled in the current buffer, +evaluate `lsp-completion-mode'. + +The mode's hook is called both when the mode is enabled and when +it is disabled. + +(fn &optional ARG)" t) +(add-hook 'lsp-configure-hook (lambda nil (when (and lsp-auto-configure lsp-completion-enable) (lsp-completion--enable)))) +(register-definition-prefixes "lsp-completion" '("lsp-")) + + +;;; Generated autoloads from lsp-credo.el + +(register-definition-prefixes "lsp-credo" '("lsp-credo-")) + + +;;; Generated autoloads from lsp-crystal.el + +(register-definition-prefixes "lsp-crystal" '("lsp-clients-crystal-executable")) + + +;;; Generated autoloads from lsp-csharp.el + +(register-definition-prefixes "lsp-csharp" '("lsp-csharp-")) + + +;;; Generated autoloads from lsp-css.el + +(register-definition-prefixes "lsp-css" '("lsp-css-")) + + +;;; Generated autoloads from lsp-cucumber.el + +(register-definition-prefixes "lsp-cucumber" '("lsp-cucumber-")) + + +;;; Generated autoloads from lsp-cypher.el + +(register-definition-prefixes "lsp-cypher" '("lsp-client--cypher-ls-server-command")) + + +;;; Generated autoloads from lsp-diagnostics.el + +(define-obsolete-variable-alias 'lsp-diagnostic-package 'lsp-diagnostics-provider "\ +lsp-mode 7.0.1") +(define-obsolete-variable-alias 'lsp-flycheck-default-level 'lsp-diagnostics-flycheck-default-level "\ +lsp-mode 7.0.1") +(autoload 'lsp-diagnostics-lsp-checker-if-needed "lsp-diagnostics") +(autoload 'lsp-diagnostics--enable "lsp-diagnostics" "\ +Enable LSP checker support.") +(autoload 'lsp-diagnostics-mode "lsp-diagnostics" "\ +Toggle LSP diagnostics integration. + +This is a minor mode. If called interactively, toggle the +`Lsp-Diagnostics mode' mode. If the prefix argument is positive, +enable the mode, and if it is zero or negative, disable the mode. + +If called from Lisp, toggle the mode if ARG is `toggle'. Enable +the mode if ARG is nil, omitted, or is a positive number. +Disable the mode if ARG is a negative number. + +To check whether the minor mode is enabled in the current buffer, +evaluate `lsp-diagnostics-mode'. + +The mode's hook is called both when the mode is enabled and when +it is disabled. + +(fn &optional ARG)" t) +(add-hook 'lsp-configure-hook (lambda nil (when lsp-auto-configure (lsp-diagnostics--enable)))) +(register-definition-prefixes "lsp-diagnostics" '("lsp-diagnostics-")) + + +;;; Generated autoloads from lsp-dired.el + +(defvar lsp-dired-mode nil "\ +Non-nil if Lsp-Dired mode is enabled. +See the `lsp-dired-mode' command +for a description of this minor mode. +Setting this variable directly does not take effect; +either customize it (see the info node `Easy Customization') +or call the function `lsp-dired-mode'.") +(custom-autoload 'lsp-dired-mode "lsp-dired" nil) +(autoload 'lsp-dired-mode "lsp-dired" "\ +Display `lsp-mode' icons for each file in a dired buffer. + +This is a global minor mode. If called interactively, toggle the +`Lsp-Dired mode' mode. If the prefix argument is positive, +enable the mode, and if it is zero or negative, disable the mode. + +If called from Lisp, toggle the mode if ARG is `toggle'. Enable +the mode if ARG is nil, omitted, or is a positive number. +Disable the mode if ARG is a negative number. + +To check whether the minor mode is enabled in the current buffer, +evaluate `(default-value \\='lsp-dired-mode)'. + +The mode's hook is called both when the mode is enabled and when +it is disabled. + +(fn &optional ARG)" t) +(register-definition-prefixes "lsp-dired" '("lsp-dired-")) + + +;;; Generated autoloads from lsp-dockerfile.el + +(register-definition-prefixes "lsp-dockerfile" '("lsp-dockerfile-language-server-command")) + + +;;; Generated autoloads from lsp-dot.el + +(register-definition-prefixes "lsp-dot" '("lsp-dot--dot-ls-server-command")) + + +;;; Generated autoloads from lsp-elixir.el + +(register-definition-prefixes "lsp-elixir" '("lsp-elixir-")) + + +;;; Generated autoloads from lsp-elm.el + +(register-definition-prefixes "lsp-elm" '("lsp-")) + + +;;; Generated autoloads from lsp-emmet.el + +(register-definition-prefixes "lsp-emmet" '("lsp-emmet-ls-command")) + + +;;; Generated autoloads from lsp-erlang.el + +(register-definition-prefixes "lsp-erlang" '("lsp-erlang-")) + + +;;; Generated autoloads from lsp-eslint.el + +(register-definition-prefixes "lsp-eslint" '("lsp-")) + + +;;; Generated autoloads from lsp-fortran.el + +(register-definition-prefixes "lsp-fortran" '("lsp-clients-")) + + +;;; Generated autoloads from lsp-fsharp.el + +(autoload 'lsp-fsharp--workspace-load "lsp-fsharp" "\ +Load all of the provided PROJECTS. + +(fn PROJECTS)") +(register-definition-prefixes "lsp-fsharp" '("lsp-fsharp-")) + + +;;; Generated autoloads from lsp-gdscript.el + +(register-definition-prefixes "lsp-gdscript" '("lsp-gdscript-")) + + +;;; Generated autoloads from lsp-gleam.el + +(register-definition-prefixes "lsp-gleam" '("lsp-gleam-executable")) + + +;;; Generated autoloads from lsp-glsl.el + +(register-definition-prefixes "lsp-glsl" '("lsp-glsl-executable")) + + +;;; Generated autoloads from lsp-go.el + +(register-definition-prefixes "lsp-go" '("lsp-go-")) + + +;;; Generated autoloads from lsp-golangci-lint.el + +(register-definition-prefixes "lsp-golangci-lint" '("lsp-golangci-lint-")) + + +;;; Generated autoloads from lsp-graphql.el + +(register-definition-prefixes "lsp-graphql" '("lsp-")) + + +;;; Generated autoloads from lsp-groovy.el + +(register-definition-prefixes "lsp-groovy" '("lsp-groovy-")) + + +;;; Generated autoloads from lsp-hack.el + +(register-definition-prefixes "lsp-hack" '("lsp-clients-hack-command")) + + +;;; Generated autoloads from lsp-haxe.el + +(register-definition-prefixes "lsp-haxe" '("lsp-")) + + +;;; Generated autoloads from lsp-headerline.el + +(autoload 'lsp-headerline-breadcrumb-mode "lsp-headerline" "\ +Toggle breadcrumb on headerline. + +This is a minor mode. If called interactively, toggle the +`Lsp-Headerline-Breadcrumb mode' mode. If the prefix argument is +positive, enable the mode, and if it is zero or negative, disable +the mode. + +If called from Lisp, toggle the mode if ARG is `toggle'. Enable +the mode if ARG is nil, omitted, or is a positive number. +Disable the mode if ARG is a negative number. + +To check whether the minor mode is enabled in the current buffer, +evaluate `lsp-headerline-breadcrumb-mode'. + +The mode's hook is called both when the mode is enabled and when +it is disabled. + +(fn &optional ARG)" t) +(autoload 'lsp-breadcrumb-go-to-symbol "lsp-headerline" "\ +Go to the symbol on breadcrumb at SYMBOL-POSITION. + +(fn SYMBOL-POSITION)" t) +(autoload 'lsp-breadcrumb-narrow-to-symbol "lsp-headerline" "\ +Narrow to the symbol range on breadcrumb at SYMBOL-POSITION. + +(fn SYMBOL-POSITION)" t) +(register-definition-prefixes "lsp-headerline" '("lsp-headerline-")) + + +;;; Generated autoloads from lsp-html.el + +(register-definition-prefixes "lsp-html" '("lsp-html-")) + + +;;; Generated autoloads from lsp-hy.el + +(register-definition-prefixes "lsp-hy" '("lsp-clients-hy-server-executable")) + + +;;; Generated autoloads from lsp-icons.el + +(register-definition-prefixes "lsp-icons" '("lsp-")) + + +;;; Generated autoloads from lsp-ido.el + +(autoload 'lsp-ido-workspace-symbol "lsp-ido" "\ +`ido' for lsp workspace/symbol. +When called with prefix ARG the default selection will be symbol at point. + +(fn ARG)" t) +(register-definition-prefixes "lsp-ido" '("lsp-ido-")) + + +;;; Generated autoloads from lsp-idris.el + +(register-definition-prefixes "lsp-idris" '("lsp-idris2-lsp-")) + + +;;; Generated autoloads from lsp-iedit.el + +(autoload 'lsp-iedit-highlights "lsp-iedit" "\ +Start an `iedit' operation on the documentHighlights at point. +This can be used as a primitive `lsp-rename' replacement if the +language server doesn't support renaming. + +See also `lsp-enable-symbol-highlighting'." t) +(autoload 'lsp-iedit-linked-ranges "lsp-iedit" "\ +Start an `iedit' for `textDocument/linkedEditingRange'" t) +(autoload 'lsp-evil-multiedit-highlights "lsp-iedit" "\ +Start an `evil-multiedit' operation on the documentHighlights at point. +This can be used as a primitive `lsp-rename' replacement if the +language server doesn't support renaming. + +See also `lsp-enable-symbol-highlighting'." t) +(autoload 'lsp-evil-multiedit-linked-ranges "lsp-iedit" "\ +Start an `evil-multiedit' for `textDocument/linkedEditingRange'" t) +(autoload 'lsp-evil-state-highlights "lsp-iedit" "\ +Start `iedit-mode'. for `textDocument/documentHighlight'" t) +(autoload 'lsp-evil-state-linked-ranges "lsp-iedit" "\ +Start `iedit-mode'. for `textDocument/linkedEditingRange'" t) +(register-definition-prefixes "lsp-iedit" '("lsp-iedit--on-ranges")) + + +;;; Generated autoloads from lsp-javascript.el + +(register-definition-prefixes "lsp-javascript" '("lsp-")) + + +;;; Generated autoloads from lsp-jq.el + +(register-definition-prefixes "lsp-jq" '("lsp-clients-jq-server-executable")) + + +;;; Generated autoloads from lsp-json.el + +(register-definition-prefixes "lsp-json" '("lsp-")) + + +;;; Generated autoloads from lsp-jsonnet.el + +(register-definition-prefixes "lsp-jsonnet" '("lsp-clients-jsonnet-server-executable")) + + +;;; Generated autoloads from lsp-kotlin.el + +(register-definition-prefixes "lsp-kotlin" '("lsp-")) + + +;;; Generated autoloads from lsp-lens.el + +(autoload 'lsp-lens--enable "lsp-lens" "\ +Enable lens mode.") +(autoload 'lsp-lens-show "lsp-lens" "\ +Display lenses in the buffer." t) +(autoload 'lsp-lens-hide "lsp-lens" "\ +Delete all lenses." t) +(autoload 'lsp-lens-mode "lsp-lens" "\ +Toggle code-lens overlays. + +This is a minor mode. If called interactively, toggle the +`Lsp-Lens mode' mode. If the prefix argument is positive, enable +the mode, and if it is zero or negative, disable the mode. + +If called from Lisp, toggle the mode if ARG is `toggle'. Enable +the mode if ARG is nil, omitted, or is a positive number. +Disable the mode if ARG is a negative number. + +To check whether the minor mode is enabled in the current buffer, +evaluate `lsp-lens-mode'. + +The mode's hook is called both when the mode is enabled and when +it is disabled. + +(fn &optional ARG)" t) +(autoload 'lsp-avy-lens "lsp-lens" "\ +Click lsp lens using `avy' package." t) +(register-definition-prefixes "lsp-lens" '("lsp-")) + + +;;; Generated autoloads from lsp-lua.el + +(register-definition-prefixes "lsp-lua" '("lsp-")) + + +;;; Generated autoloads from lsp-magik.el + +(register-definition-prefixes "lsp-magik" '("lsp-magik-")) + + +;;; Generated autoloads from lsp-markdown.el + +(register-definition-prefixes "lsp-markdown" '("lsp-markdown-")) + + +;;; Generated autoloads from lsp-marksman.el + +(register-definition-prefixes "lsp-marksman" '("lsp-marksman-")) + + +;;; Generated autoloads from lsp-mdx.el + +(register-definition-prefixes "lsp-mdx" '("lsp-mdx-server-command")) + + +;;; Generated autoloads from lsp-mint.el + +(register-definition-prefixes "lsp-mint" '("lsp-clients-mint-executable")) + + +;;; Generated autoloads from lsp-mode.el + +(put 'lsp-enable-file-watchers 'safe-local-variable #'booleanp) +(put 'lsp-file-watch-ignored-directories 'safe-local-variable 'lsp--string-listp) +(put 'lsp-file-watch-ignored-files 'safe-local-variable 'lsp--string-listp) +(put 'lsp-file-watch-threshold 'safe-local-variable (lambda (i) (or (numberp i) (not i)))) +(autoload 'lsp--string-listp "lsp-mode" "\ +Return t if all elements of SEQUENCE are strings, else nil. + +(fn SEQUENCE)") +(autoload 'lsp-load-vscode-workspace "lsp-mode" "\ +Load vscode workspace from FILE + +(fn FILE)" t) +(autoload 'lsp-save-vscode-workspace "lsp-mode" "\ +Save vscode workspace to FILE + +(fn FILE)" t) +(autoload 'lsp-install-server "lsp-mode" "\ +Interactively install or re-install server. +When prefix UPDATE? is t force installation even if the server is present. + +(fn UPDATE? &optional SERVER-ID)" t) +(autoload 'lsp-uninstall-server "lsp-mode" "\ +Delete a LSP server from `lsp-server-install-dir'. + +(fn DIR)" t) +(autoload 'lsp-uninstall-servers "lsp-mode" "\ +Uninstall all installed servers." t) +(autoload 'lsp-update-server "lsp-mode" "\ +Interactively update (reinstall) a server. + +(fn &optional SERVER-ID)" t) +(autoload 'lsp-update-servers "lsp-mode" "\ +Update (reinstall) all installed servers." t) +(autoload 'lsp-ensure-server "lsp-mode" "\ +Ensure server SERVER-ID + +(fn SERVER-ID)") +(autoload 'lsp "lsp-mode" "\ +Entry point for the server startup. +When ARG is t the lsp mode will start new language server even if +there is language server which can handle current language. When +ARG is nil current file will be opened in multi folder language +server if there is such. When `lsp' is called with prefix +argument ask the user to select which language server to start. + +(fn &optional ARG)" t) +(autoload 'lsp-deferred "lsp-mode" "\ +Entry point that defers server startup until buffer is visible. +`lsp-deferred' will wait until the buffer is visible before invoking `lsp'. +This avoids overloading the server with many files when starting Emacs.") +(autoload 'lsp-start-plain "lsp-mode" "\ +Start `lsp-mode' using minimal configuration using the latest `melpa' version +of the packages. + +In case the major-mode that you are using for " t) +(register-definition-prefixes "lsp-mode" '("defcustom-lsp" "lsp-" "make-lsp-client" "when-lsp-workspace" "with-lsp-workspace")) + + +;;; Generated autoloads from lsp-modeline.el + +(define-obsolete-variable-alias 'lsp-diagnostics-modeline-scope 'lsp-modeline-diagnostics-scope "\ +lsp-mode 7.0.1") +(autoload 'lsp-modeline-code-actions-mode "lsp-modeline" "\ +Toggle code actions on modeline. + +This is a minor mode. If called interactively, toggle the +`Lsp-Modeline-Code-Actions mode' mode. If the prefix argument is +positive, enable the mode, and if it is zero or negative, disable +the mode. + +If called from Lisp, toggle the mode if ARG is `toggle'. Enable +the mode if ARG is nil, omitted, or is a positive number. +Disable the mode if ARG is a negative number. + +To check whether the minor mode is enabled in the current buffer, +evaluate `lsp-modeline-code-actions-mode'. + +The mode's hook is called both when the mode is enabled and when +it is disabled. + +(fn &optional ARG)" t) +(define-obsolete-function-alias 'lsp-diagnostics-modeline-mode 'lsp-modeline-diagnostics-mode "lsp-mode 7.0.1") +(autoload 'lsp-modeline-diagnostics-mode "lsp-modeline" "\ +Toggle diagnostics modeline. + +This is a minor mode. If called interactively, toggle the +`Lsp-Modeline-Diagnostics mode' mode. If the prefix argument is +positive, enable the mode, and if it is zero or negative, disable +the mode. + +If called from Lisp, toggle the mode if ARG is `toggle'. Enable +the mode if ARG is nil, omitted, or is a positive number. +Disable the mode if ARG is a negative number. + +To check whether the minor mode is enabled in the current buffer, +evaluate `lsp-modeline-diagnostics-mode'. + +The mode's hook is called both when the mode is enabled and when +it is disabled. + +(fn &optional ARG)" t) +(autoload 'lsp-modeline-workspace-status-mode "lsp-modeline" "\ +Toggle workspace status on modeline. + +This is a minor mode. If called interactively, toggle the +`Lsp-Modeline-Workspace-Status mode' mode. If the prefix +argument is positive, enable the mode, and if it is zero or +negative, disable the mode. + +If called from Lisp, toggle the mode if ARG is `toggle'. Enable +the mode if ARG is nil, omitted, or is a positive number. +Disable the mode if ARG is a negative number. + +To check whether the minor mode is enabled in the current buffer, +evaluate `lsp-modeline-workspace-status-mode'. + +The mode's hook is called both when the mode is enabled and when +it is disabled. + +(fn &optional ARG)" t) +(register-definition-prefixes "lsp-modeline" '("lsp-")) + + +;;; Generated autoloads from lsp-mojo.el + +(register-definition-prefixes "lsp-mojo" '("lsp-mojo-executable")) + + +;;; Generated autoloads from lsp-move.el + +(register-definition-prefixes "lsp-move" '("lsp-clients-")) + + +;;; Generated autoloads from lsp-nginx.el + +(register-definition-prefixes "lsp-nginx" '("lsp-nginx-")) + + +;;; Generated autoloads from lsp-nim.el + +(register-definition-prefixes "lsp-nim" '("lsp-nim-l")) + + +;;; Generated autoloads from lsp-nix.el + +(register-definition-prefixes "lsp-nix" '("lsp-nix-")) + + +;;; Generated autoloads from lsp-nushell.el + +(register-definition-prefixes "lsp-nushell" '("lsp-nushell-language-server-command")) + + +;;; Generated autoloads from lsp-ocaml.el + +(register-definition-prefixes "lsp-ocaml" '("lsp-")) + + +;;; Generated autoloads from lsp-openscad.el + +(register-definition-prefixes "lsp-openscad" '("lsp-openscad-")) + + +;;; Generated autoloads from lsp-perl.el + +(register-definition-prefixes "lsp-perl" '("lsp-perl-")) + + +;;; Generated autoloads from lsp-perlnavigator.el + +(register-definition-prefixes "lsp-perlnavigator" '("lsp-perlnavigator-")) + + +;;; Generated autoloads from lsp-php.el + +(register-definition-prefixes "lsp-php" '("lsp-")) + + +;;; Generated autoloads from lsp-pls.el + +(register-definition-prefixes "lsp-pls" '("lsp-pls-")) + + +;;; Generated autoloads from lsp-prolog.el + +(register-definition-prefixes "lsp-prolog" '("lsp-prolog-server-command")) + + +;;; Generated autoloads from lsp-protocol.el + +(register-definition-prefixes "lsp-protocol" '("dash-expand:&RangeToPoint" "lsp")) + + +;;; Generated autoloads from lsp-purescript.el + +(register-definition-prefixes "lsp-purescript" '("lsp-purescript-")) + + +;;; Generated autoloads from lsp-pwsh.el + +(register-definition-prefixes "lsp-pwsh" '("lsp-pwsh-")) + + +;;; Generated autoloads from lsp-pyls.el + +(register-definition-prefixes "lsp-pyls" '("lsp-")) + + +;;; Generated autoloads from lsp-pylsp.el + +(register-definition-prefixes "lsp-pylsp" '("lsp-")) + + +;;; Generated autoloads from lsp-r.el + +(register-definition-prefixes "lsp-r" '("lsp-clients-r-server-command")) + + +;;; Generated autoloads from lsp-racket.el + +(register-definition-prefixes "lsp-racket" '("lsp-racket-lang")) + + +;;; Generated autoloads from lsp-remark.el + +(register-definition-prefixes "lsp-remark" '("lsp-remark-server-command")) + + +;;; Generated autoloads from lsp-rf.el + +(register-definition-prefixes "lsp-rf" '("expand-start-command" "lsp-rf-language-server-" "parse-rf-language-server-")) + + +;;; Generated autoloads from lsp-rpm-spec.el + +(register-definition-prefixes "lsp-rpm-spec" '("lsp-rpm-spec-")) + + +;;; Generated autoloads from lsp-rubocop.el + +(register-definition-prefixes "lsp-rubocop" '("lsp-rubocop-")) + + +;;; Generated autoloads from lsp-ruby-lsp.el + +(register-definition-prefixes "lsp-ruby-lsp" '("lsp-ruby-lsp-")) + + +;;; Generated autoloads from lsp-ruby-syntax-tree.el + +(register-definition-prefixes "lsp-ruby-syntax-tree" '("lsp-ruby-syntax-tree-")) + + +;;; Generated autoloads from lsp-ruff-lsp.el + +(register-definition-prefixes "lsp-ruff-lsp" '("lsp-ruff-lsp-")) + + +;;; Generated autoloads from lsp-rust.el + +(register-definition-prefixes "lsp-rust" '("lsp-")) + + +;;; Generated autoloads from lsp-semantic-tokens.el + +(defvar-local semantic-token-modifier-cache (make-hash-table) "\ +A cache of modifier values to the selected fonts. +This allows whole-bitmap lookup instead of checking each bit. The +expectation is that usage of modifiers will tend to cluster, so +we will not have the full range of possible usages, hence a +tractable hash map. + +This is set as buffer-local. It should probably be shared in a +given workspace/language-server combination. + +This cache should be flushed every time any modifier +configuration changes.") +(autoload 'lsp--semantic-tokens-initialize-buffer "lsp-semantic-tokens" "\ +Initialize the buffer for semantic tokens. +IS-RANGE-PROVIDER is non-nil when server supports range requests.") +(autoload 'lsp--semantic-tokens-initialize-workspace "lsp-semantic-tokens" "\ +Initialize semantic tokens for WORKSPACE. + +(fn WORKSPACE)") +(autoload 'lsp-semantic-tokens--warn-about-deprecated-setting "lsp-semantic-tokens" "\ +Warn about deprecated semantic highlighting variable.") +(autoload 'lsp-semantic-tokens--enable "lsp-semantic-tokens" "\ +Enable semantic tokens mode.") +(autoload 'lsp-semantic-tokens-mode "lsp-semantic-tokens" "\ +Toggle semantic-tokens support. + +This is a minor mode. If called interactively, toggle the +`Lsp-Semantic-Tokens mode' mode. If the prefix argument is +positive, enable the mode, and if it is zero or negative, disable +the mode. + +If called from Lisp, toggle the mode if ARG is `toggle'. Enable +the mode if ARG is nil, omitted, or is a positive number. +Disable the mode if ARG is a negative number. + +To check whether the minor mode is enabled in the current buffer, +evaluate `lsp-semantic-tokens-mode'. + +The mode's hook is called both when the mode is enabled and when +it is disabled. + +(fn &optional ARG)" t) +(register-definition-prefixes "lsp-semantic-tokens" '("lsp-")) + + +;;; Generated autoloads from lsp-semgrep.el + +(register-definition-prefixes "lsp-semgrep" '("lsp-semgrep-" "semgrep-")) + + +;;; Generated autoloads from lsp-sml.el + +(register-definition-prefixes "lsp-sml" '("lsp-sml-millet-")) + + +;;; Generated autoloads from lsp-solargraph.el + +(register-definition-prefixes "lsp-solargraph" '("lsp-solargraph-")) + + +;;; Generated autoloads from lsp-solidity.el + +(register-definition-prefixes "lsp-solidity" '("lsp-client--solidity-")) + + +;;; Generated autoloads from lsp-sorbet.el + +(register-definition-prefixes "lsp-sorbet" '("lsp-sorbet-")) + + +;;; Generated autoloads from lsp-sqls.el + +(register-definition-prefixes "lsp-sqls" '("lsp-sql")) + + +;;; Generated autoloads from lsp-steep.el + +(register-definition-prefixes "lsp-steep" '("lsp-steep-")) + + +;;; Generated autoloads from lsp-svelte.el + +(register-definition-prefixes "lsp-svelte" '("lsp-svelte-plugin-")) + + +;;; Generated autoloads from lsp-terraform.el + +(register-definition-prefixes "lsp-terraform" '("construct-tf-package" "lsp-t")) + + +;;; Generated autoloads from lsp-tex.el + +(register-definition-prefixes "lsp-tex" '("lsp-")) + + +;;; Generated autoloads from lsp-toml.el + +(register-definition-prefixes "lsp-toml" '("lsp-toml-")) + + +;;; Generated autoloads from lsp-trunk.el + +(register-definition-prefixes "lsp-trunk" '("lsp-trunk-")) + + +;;; Generated autoloads from lsp-ttcn3.el + +(register-definition-prefixes "lsp-ttcn3" '("lsp-ttcn3-lsp-server-command")) + + +;;; Generated autoloads from lsp-typeprof.el + +(register-definition-prefixes "lsp-typeprof" '("lsp-typeprof-")) + + +;;; Generated autoloads from lsp-v.el + +(register-definition-prefixes "lsp-v" '("lsp-v-vls-executable")) + + +;;; Generated autoloads from lsp-vala.el + +(register-definition-prefixes "lsp-vala" '("lsp-clients-vala-ls-executable")) + + +;;; Generated autoloads from lsp-verilog.el + +(register-definition-prefixes "lsp-verilog" '("lsp-clients-")) + + +;;; Generated autoloads from lsp-vetur.el + +(register-definition-prefixes "lsp-vetur" '("lsp-vetur-")) + + +;;; Generated autoloads from lsp-vhdl.el + +(register-definition-prefixes "lsp-vhdl" '("ghdl-ls-bin-name" "hdl-checker-bin-name" "lsp-vhdl-" "vhdl-")) + + +;;; Generated autoloads from lsp-vimscript.el + +(register-definition-prefixes "lsp-vimscript" '("lsp-clients-vim-")) + + +;;; Generated autoloads from lsp-volar.el + +(register-definition-prefixes "lsp-volar" '("lsp-volar-")) + + +;;; Generated autoloads from lsp-wgsl.el + +(register-definition-prefixes "lsp-wgsl" '("lsp-wgsl-")) + + +;;; Generated autoloads from lsp-xml.el + +(register-definition-prefixes "lsp-xml" '("lsp-xml-")) + + +;;; Generated autoloads from lsp-yaml.el + +(register-definition-prefixes "lsp-yaml" '("lsp-yaml-")) + + +;;; Generated autoloads from lsp-zig.el + +(register-definition-prefixes "lsp-zig" '("lsp-z")) + +;;; End of scraped data + +(provide 'lsp-mode-autoloads) + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; no-native-compile: t +;; coding: utf-8-emacs-unix +;; End: + +;;; lsp-mode-autoloads.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-mode-pkg.el b/code/elpa/lsp-mode-20240319.1043/lsp-mode-pkg.el new file mode 100644 index 0000000..d2b67e9 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-mode-pkg.el @@ -0,0 +1,21 @@ +(define-package "lsp-mode" "20240319.1043" "LSP mode" + '((emacs "27.1") + (dash "2.18.0") + (f "0.20.0") + (ht "2.3") + (spinner "1.7.3") + (markdown-mode "2.3") + (lv "0") + (eldoc "1.11")) + :commit "8903da305bccaabe6e8fb2665b0d1c6f8861e024" :authors + '(("Vibhav Pant, Fangrui Song, Ivan Yonchovski")) + :maintainers + '(("Vibhav Pant, Fangrui Song, Ivan Yonchovski")) + :maintainer + '("Vibhav Pant, Fangrui Song, Ivan Yonchovski") + :keywords + '("languages") + :url "https://github.com/emacs-lsp/lsp-mode") +;; Local Variables: +;; no-byte-compile: t +;; End: diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-mode.el b/code/elpa/lsp-mode-20240319.1043/lsp-mode.el new file mode 100644 index 0000000..649259d --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-mode.el @@ -0,0 +1,9771 @@ +;;; lsp-mode.el --- LSP mode -*- lexical-binding: t; -*- + +;; Copyright (C) 2020 emacs-lsp maintainers + +;; Author: Vibhav Pant, Fangrui Song, Ivan Yonchovski +;; Keywords: languages +;; Package-Requires: ((emacs "27.1") (dash "2.18.0") (f "0.20.0") (ht "2.3") (spinner "1.7.3") (markdown-mode "2.3") (lv "0") (eldoc "1.11")) +;; Version: 8.0.1 + +;; URL: https://github.com/emacs-lsp/lsp-mode +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; Emacs client/library for the Language Server Protocol + +;;; Code: + +(require 'cl-generic) +(require 'cl-lib) +(require 'compile) +(require 'dash) +(require 'epg) +(require 'ewoc) +(require 'f) +(require 'filenotify) +(require 'files) +(require 'ht) +(require 'imenu) +(require 'inline) +(require 'json) +(require 'lv) +(require 'markdown-mode) +(require 'network-stream) +(require 'pcase) +(require 'rx) +(require 's) +(require 'seq) +(require 'spinner) +(require 'subr-x) +(require 'tree-widget) +(require 'url-parse) +(require 'url-util) +(require 'widget) +(require 'xref) +(require 'minibuffer) +(require 'help-mode) +(require 'yasnippet nil t) +(require 'lsp-protocol) + +(defgroup lsp-mode nil + "Language Server Protocol client." + :group 'tools + :tag "Language Server (lsp-mode)") + +(declare-function evil-set-command-property "ext:evil-common") +(declare-function projectile-project-root "ext:projectile") +(declare-function yas-expand-snippet "ext:yasnippet") +(declare-function dap-mode "ext:dap-mode") +(declare-function dap-auto-configure-mode "ext:dap-mode") + +(defvar yas-inhibit-overlay-modification-protection) +(defvar yas-indent-line) +(defvar yas-wrap-around-region) +(defvar yas-also-auto-indent-first-line) +(defvar dap-auto-configure-mode) +(defvar dap-ui-menu-items) +(defvar company-minimum-prefix-length) + +(defconst lsp--message-type-face + `((1 . ,compilation-error-face) + (2 . ,compilation-warning-face) + (3 . ,compilation-message-face) + (4 . ,compilation-info-face))) + +(defconst lsp--errors + '((-32700 "Parse Error") + (-32600 "Invalid Request") + (-32601 "Method not Found") + (-32602 "Invalid Parameters") + (-32603 "Internal Error") + (-32099 "Server Start Error") + (-32000 "Server End Error") + (-32002 "Server Not Initialized") + (-32001 "Unknown Error Code") + (-32800 "Request Cancelled")) + "Alist of error codes to user friendly strings.") + +(defconst lsp--empty-ht (make-hash-table)) + +(eval-and-compile + (defun dash-expand:&lsp-wks (key source) + `(,(intern-soft (format "lsp--workspace-%s" (eval key))) ,source)) + + (defun dash-expand:&lsp-cln (key source) + `(,(intern-soft (format "lsp--client-%s" (eval key))) ,source))) + +(define-obsolete-variable-alias 'lsp-print-io 'lsp-log-io "lsp-mode 6.1") + +(defcustom lsp-log-io nil + "If non-nil, log all messages from the language server to a *lsp-log* buffer." + :group 'lsp-mode + :type 'boolean) + +(defcustom lsp-log-io-allowlist-methods '() + "The methods to filter before print to lsp-log-io." + :group 'lsp-mode + :type '(repeat string) + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-log-max message-log-max + "Maximum number of lines to keep in the log buffer. +If nil, disable message logging. If t, log messages but don’t truncate +the buffer when it becomes large." + :group 'lsp-mode + :type '(choice (const :tag "Disable" nil) + (integer :tag "lines") + (const :tag "Unlimited" t)) + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-io-messages-max t + "Maximum number of messages that can be locked in a `lsp-io' buffer." + :group 'lsp-mode + :type '(choice (const :tag "Unlimited" t) + (integer :tag "Messages")) + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-keep-workspace-alive t + "If non nil keep workspace alive when the last workspace buffer is closed." + :group 'lsp-mode + :type 'boolean) + +(defcustom lsp-enable-snippet t + "Enable/disable snippet completion support." + :group 'lsp-completion + :type 'boolean) + +(defcustom lsp-enable-folding t + "Enable/disable code folding support." + :group 'lsp-mode + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(define-obsolete-variable-alias 'lsp-enable-semantic-highlighting 'lsp-semantic-tokens-enable "lsp-mode 8.0.0") + +(defcustom lsp-semantic-tokens-enable nil + "Enable/disable support for semantic tokens. +As defined by the Language Server Protocol 3.16." + :group 'lsp-semantic-tokens + :type 'boolean) + +(defcustom lsp-folding-range-limit nil + "The maximum number of folding ranges to receive from the language server." + :group 'lsp-mode + :type '(choice (const :tag "No limit." nil) + (integer :tag "Number of lines.")) + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-folding-line-folding-only nil + "If non-nil, only fold complete lines." + :group 'lsp-mode + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-client-packages + '( ccls lsp-actionscript lsp-ada lsp-angular lsp-ansible lsp-autotools lsp-awk + lsp-asm lsp-astro lsp-bash lsp-beancount lsp-bufls lsp-clangd lsp-clojure + lsp-cmake lsp-cobol lsp-credo lsp-crystal lsp-csharp lsp-css lsp-cucumber + lsp-cypher lsp-d lsp-dart lsp-dhall lsp-docker lsp-dockerfile lsp-elm lsp-elixir + lsp-emmet lsp-erlang lsp-eslint lsp-fortran lsp-fsharp lsp-gdscript lsp-go + lsp-golangci-lint lsp-gleam lsp-glsl lsp-graphql lsp-hack lsp-grammarly + lsp-groovy lsp-haskell lsp-haxe lsp-idris lsp-java lsp-javascript lsp-json + lsp-kotlin lsp-latex lsp-ltex lsp-lua lsp-markdown lsp-marksman lsp-mdx + lsp-mint lsp-move lsp-nginx lsp-nim lsp-nix lsp-magik lsp-mojo lsp-metals + lsp-mssql lsp-nushell lsp-ocaml lsp-openscad lsp-pascal lsp-perl lsp-perlnavigator + lsp-pls lsp-php lsp-pwsh lsp-pyls lsp-pylsp lsp-pyright lsp-python-ms + lsp-purescript lsp-r lsp-racket lsp-remark lsp-ruff-lsp lsp-rf lsp-rubocop + lsp-rust lsp-semgrep lsp-shader lsp-solargraph lsp-sorbet lsp-sourcekit + lsp-sonarlint lsp-tailwindcss lsp-tex lsp-terraform lsp-toml lsp-ttcn3 + lsp-typeprof lsp-v lsp-vala lsp-verilog lsp-vetur lsp-volar lsp-vhdl + lsp-vimscript lsp-wgsl lsp-xml lsp-yaml lsp-ruby-lsp lsp-ruby-syntax-tree + lsp-solidity lsp-sqls lsp-svelte lsp-steep lsp-tilt lsp-trunk lsp-zig lsp-jq) + "List of the clients to be automatically required." + :group 'lsp-mode + :type '(repeat symbol)) + +(defcustom lsp-progress-via-spinner t + "If non-nil, display LSP $/progress reports via a spinner in the modeline." + :group 'lsp-mode + :type 'boolean) + +(defcustom lsp-progress-spinner-type 'progress-bar + "Holds the type of spinner to be used in the mode-line. +Takes a value accepted by `spinner-start'." + :group 'lsp-mode + :type `(choice :tag "Choose a spinner by name" + ,@(mapcar (lambda (c) (list 'const (car c))) + spinner-types))) + +(defvar-local lsp-use-workspace-root-for-server-default-directory nil + "Use `lsp-workspace-root' for `default-directory' when starting LSP process.") + +(defvar-local lsp--cur-workspace nil) + +(defvar-local lsp--cur-version 0) +(defvar-local lsp--virtual-buffer-connections nil) +(defvar-local lsp--virtual-buffer nil) +(defvar lsp--virtual-buffer-mappings (ht)) + +(defvar lsp--uri-file-prefix (pcase system-type + (`windows-nt "file:///") + (_ "file://")) + "Prefix for a file-uri.") + +(defvar-local lsp-buffer-uri nil + "If set, return it instead of calculating it using `buffer-file-name'.") + +(define-error 'lsp-error "Unknown lsp-mode error") +(define-error 'lsp-empty-response-error + "Empty response from the language server" 'lsp-error) +(define-error 'lsp-timed-out-error + "Timed out while waiting for a response from the language server" 'lsp-error) +(define-error 'lsp-capability-not-supported + "Capability not supported by the language server" 'lsp-error) +(define-error 'lsp-file-scheme-not-supported + "Unsupported file scheme" 'lsp-error) +(define-error 'lsp-client-already-exists-error + "A client with this server-id already exists" 'lsp-error) +(define-error 'lsp-no-code-actions + "No code actions" 'lsp-error) + +(defcustom lsp-auto-guess-root nil + "Automatically guess the project root using projectile/project. +Do *not* use this setting unless you are familiar with `lsp-mode' +internals and you are sure that all of your projects are +following `projectile'/`project.el' conventions." + :group 'lsp-mode + :type 'boolean) + +(defcustom lsp-guess-root-without-session nil + "Ignore the session file when calculating the project root. +You almost always want to set lsp-auto-guess-root too. +Do *not* use this setting unless you are familiar with `lsp-mode' +internals and you are sure that all of your projects are +following `projectile'/`project.el' conventions." + :group 'lsp-mode + :type 'boolean) + +(defcustom lsp-restart 'interactive + "Defines how server-exited events must be handled." + :group 'lsp-mode + :type '(choice (const interactive) + (const auto-restart) + (const ignore))) + +(defcustom lsp-session-file (expand-file-name (locate-user-emacs-file ".lsp-session-v1")) + "File where session information is stored." + :group 'lsp-mode + :type 'file) + +(defcustom lsp-auto-configure t + "Auto configure `lsp-mode' main features. +When set to t `lsp-mode' will auto-configure completion, +code-actions, breadcrumb, `flycheck', `flymake', `imenu', symbol highlighting, +lenses, links, and so on. + +For finer granularity you may use `lsp-enable-*' properties." + :group 'lsp-mode + :type 'boolean + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-disabled-clients nil + "A list of disabled/blocklisted clients. +Each entry in the list can be either: +a symbol, the server-id for the LSP client, or +a cons pair (MAJOR-MODE . CLIENTS), where MAJOR-MODE is the major-mode, +and CLIENTS is either a client or a list of clients. + +This option can also be used as a file- or directory-local variable to +disable a language server for individual files or directories/projects +respectively." + :group 'lsp-mode + :type '(repeat (symbol)) + :safe 'listp + :package-version '(lsp-mode . "6.1")) + +(defvar lsp-clients (make-hash-table :test 'eql) + "Hash table server-id -> client. +It contains all of the clients that are currently registered.") + +(defvar lsp-enabled-clients nil + "List of clients allowed to be used for projects. +When nil, all registered clients are considered candidates.") + +(defvar lsp-last-id 0 + "Last request id.") + +(defcustom lsp-before-initialize-hook nil + "List of functions to be called before a Language Server has been initialized +for a new workspace." + :type 'hook + :group 'lsp-mode) + +(defcustom lsp-after-initialize-hook nil + "List of functions to be called after a Language Server has been initialized +for a new workspace." + :type 'hook + :group 'lsp-mode) + +(defcustom lsp-before-open-hook nil + "List of functions to be called before a new file with LSP support is opened." + :type 'hook + :group 'lsp-mode) + +(defcustom lsp-after-open-hook nil + "List of functions to be called after a new file with LSP support is opened." + :type 'hook + :group 'lsp-mode) + +(defcustom lsp-enable-file-watchers t + "If non-nil lsp-mode will watch the files in the workspace if +the server has requested that." + :type 'boolean + :group 'lsp-mode + :package-version '(lsp-mode . "6.1")) +;;;###autoload(put 'lsp-enable-file-watchers 'safe-local-variable #'booleanp) + +(define-obsolete-variable-alias 'lsp-file-watch-ignored 'lsp-file-watch-ignored-directories "8.0.0") + +(defcustom lsp-file-watch-ignored-directories + '(; SCM tools + "[/\\\\]\\.git\\'" + "[/\\\\]\\.github\\'" + "[/\\\\]\\.gitlab\\'" + "[/\\\\]\\.circleci\\'" + "[/\\\\]\\.hg\\'" + "[/\\\\]\\.bzr\\'" + "[/\\\\]_darcs\\'" + "[/\\\\]\\.svn\\'" + "[/\\\\]_FOSSIL_\\'" + ;; IDE or build tools + "[/\\\\]\\.idea\\'" + "[/\\\\]\\.ensime_cache\\'" + "[/\\\\]\\.eunit\\'" + "[/\\\\]node_modules" + "[/\\\\]\\.yarn\\'" + "[/\\\\]\\.fslckout\\'" + "[/\\\\]\\.tox\\'" + "[/\\\\]\\.nox\\'" + "[/\\\\]dist\\'" + "[/\\\\]dist-newstyle\\'" + "[/\\\\]\\.stack-work\\'" + "[/\\\\]\\.bloop\\'" + "[/\\\\]\\.metals\\'" + "[/\\\\]target\\'" + "[/\\\\]\\.ccls-cache\\'" + "[/\\\\]\\.vscode\\'" + "[/\\\\]\\.venv\\'" + "[/\\\\]\\.mypy_cache\\'" + "[/\\\\]\\.pytest_cache\\'" + ;; Swift Package Manager + "[/\\\\]\\.build\\'" + ;; Python + "[/\\\\]__pycache__\\'" + ;; Autotools output + "[/\\\\]\\.deps\\'" + "[/\\\\]build-aux\\'" + "[/\\\\]autom4te.cache\\'" + "[/\\\\]\\.reference\\'" + ;; Bazel + "[/\\\\]bazel-[^/\\\\]+\\'" + ;; CSharp + "[/\\\\]\\.meta\\'" + ;; Unity + "[/\\\\]Library\\'" + ;; Clojure + "[/\\\\]\\.lsp\\'" + "[/\\\\]\\.clj-kondo\\'" + "[/\\\\]\\.shadow-cljs\\'" + "[/\\\\]\\.babel_cache\\'" + "[/\\\\]\\.cpcache\\'" + "[/\\\\]\\checkouts\\'" + ;; Gradle + "[/\\\\]\\.gradle\\'" + ;; Maven + "[/\\\\]\\.m2\\'" + ;; .Net Core build-output + "[/\\\\]bin/Debug\\'" + "[/\\\\]obj\\'" + ;; OCaml and Dune + "[/\\\\]_opam\\'" + "[/\\\\]_build\\'" + ;; Elixir + "[/\\\\]\\.elixir_ls\\'" + ;; Elixir Credo + "[/\\\\]\\.elixir-tools\\'" + ;; terraform and terragrunt + "[/\\\\]\\.terraform\\'" + "[/\\\\]\\.terragrunt-cache\\'" + ;; nix-direnv + "[/\\\\]\\result" + "[/\\\\]\\result-bin" + "[/\\\\]\\.direnv\\'") + "List of regexps matching directory paths which won't be monitored when +creating file watches. Customization of this variable is only honored at +the global level or at a root of an lsp workspace." + :group 'lsp-mode + :type '(repeat string) + :package-version '(lsp-mode . "8.0.0")) + +(define-obsolete-function-alias 'lsp-file-watch-ignored 'lsp-file-watch-ignored-directories "7.0.1") + +(defun lsp-file-watch-ignored-directories () + lsp-file-watch-ignored-directories) + +;; Allow lsp-file-watch-ignored-directories as a file or directory-local variable +;;;###autoload(put 'lsp-file-watch-ignored-directories 'safe-local-variable 'lsp--string-listp) + +(defcustom lsp-file-watch-ignored-files + '( + ;; Flycheck tempfiles + "[/\\\\]flycheck_[^/\\\\]+\\'" + ;; lockfiles + "[/\\\\]\\.#[^/\\\\]+\\'" + ;; backup files + "[/\\\\][^/\\\\]+~\\'" ) + "List of regexps matching files for which change events will +not be sent to the server. + +This setting has no impact on whether a file-watch is created for +a directory; it merely prevents notifications pertaining to +matched files from being sent to the server. To prevent a +file-watch from being created for a directory, customize +`lsp-file-watch-ignored-directories' + +Customization of this variable is only honored at the global +level or at a root of an lsp workspace." + :group 'lsp-mode + :type '(repeat string) + :package-version '(lsp-mode . "8.0.0")) + +;; Allow lsp-file-watch-ignored-files as a file or directory-local variable +;;;###autoload(put 'lsp-file-watch-ignored-files 'safe-local-variable 'lsp--string-listp) + +(defcustom lsp-after-uninitialized-functions nil + "List of functions to be called after a Language Server has been uninitialized." + :type 'hook + :group 'lsp-mode + :package-version '(lsp-mode . "6.3")) + +(defconst lsp--sync-full 1) +(defconst lsp--sync-incremental 2) + +(defcustom lsp-debounce-full-sync-notifications t + "If non-nil debounce full sync events. +This flag affects only servers which do not support incremental updates." + :type 'boolean + :group 'lsp-mode + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-debounce-full-sync-notifications-interval 1.0 + "Time to wait before sending full sync synchronization after buffer modification." + :type 'float + :group 'lsp-mode + :package-version '(lsp-mode . "6.1")) + +(defvar lsp--stderr-index 0) + +(defvar lsp--delayed-requests nil) +(defvar lsp--delay-timer nil) + +(defcustom lsp-document-sync-method nil + "How to sync the document with the language server." + :type '(choice (const :tag "Documents are synced by always sending the full content of the document." lsp--sync-full) + (const :tag "Documents are synced by always sending incremental changes to the document." lsp--sync-incremental) + (const :tag "Use the method recommended by the language server." nil)) + :group 'lsp-mode) + +(defcustom lsp-auto-execute-action t + "Auto-execute single action." + :type 'boolean + :group 'lsp-mode) + +(defcustom lsp-enable-links t + "If non-nil, all references to links in a file will be made clickable, if +supported by the language server." + :type 'boolean + :group 'lsp-mode + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-enable-imenu t + "If non-nil, automatically enable `imenu' integration when server provides +`textDocument/documentSymbol'." + :type 'boolean + :group 'lsp-mode + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-enable-dap-auto-configure t + "If non-nil, enable `dap-auto-configure-mode`." + :type 'boolean + :group 'lsp-mode + :package-version '(lsp-mode . "7.0")) + +(defcustom lsp-eldoc-enable-hover t + "If non-nil, `eldoc' will display hover info when it is present." + :type 'boolean + :group 'lsp-mode) + +(defcustom lsp-eldoc-render-all nil + "Display all of the info returned by document/onHover. +If this is set to nil, `eldoc' will show only the symbol information." + :type 'boolean + :group 'lsp-mode) + +(define-obsolete-variable-alias 'lsp-enable-completion-at-point + 'lsp-completion-enable "lsp-mode 7.0.1") + +(defcustom lsp-completion-enable t + "Enable `completion-at-point' integration." + :type 'boolean + :group 'lsp-completion) + +(defcustom lsp-enable-symbol-highlighting t + "Highlight references of the symbol at point." + :type 'boolean + :group 'lsp-mode) + +(defcustom lsp-enable-xref t + "Enable xref integration." + :type 'boolean + :group 'lsp-mode) + +(defcustom lsp-references-exclude-definition nil + "If non-nil, exclude declarations when finding references." + :type 'boolean + :group 'lsp-mode) + +(defcustom lsp-enable-indentation t + "Indent regions using the file formatting functionality provided by the +language server." + :type 'boolean + :group 'lsp-mode) + +(defcustom lsp-enable-on-type-formatting t + "Enable `textDocument/onTypeFormatting' integration." + :type 'boolean + :group 'lsp-mode) + +(defcustom lsp-enable-text-document-color t + "Enable `textDocument/documentColor' integration." + :type 'boolean + :group 'lsp-mode) + +(defcustom lsp-before-save-edits t + "If non-nil, `lsp-mode' will apply edits suggested by the language server +before saving a document." + :type 'boolean + :group 'lsp-mode) + +(defcustom lsp-after-apply-edits-hook nil + "Hooks to run when text edit is applied. +It contains the operation source." + :type 'hook + :group 'lsp-mode + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-apply-edits-after-file-operations t + "Whether to apply edits returned by server after file operations if any. +Applicable only if server supports workspace.fileOperations for operations: +`workspace/willRenameFiles', `workspace/willCreateFiles' and +`workspace/willDeleteFiles'." + :group 'lsp-mode + :type 'boolean) + +(defcustom lsp-modeline-code-actions-enable t + "Whether to show code actions on modeline." + :type 'boolean + :group 'lsp-modeline) + +(defcustom lsp-modeline-diagnostics-enable t + "Whether to show diagnostics on modeline." + :type 'boolean + :group 'lsp-modeline) + +(defcustom lsp-modeline-workspace-status-enable t + "Whether to show workspace status on modeline." + :type 'boolean + :group 'lsp-modeline + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-headerline-breadcrumb-enable t + "Whether to enable breadcrumb on headerline." + :type 'boolean + :group 'lsp-headerline) + +(defcustom lsp-configure-hook nil + "Hooks to run when `lsp-configure-buffer' is called." + :type 'hook + :group 'lsp-mode) + +(defcustom lsp-unconfigure-hook nil + "Hooks to run when `lsp-unconfig-buffer' is called." + :type 'hook + :group 'lsp-mode) + +(defcustom lsp-after-diagnostics-hook nil + "Hooks to run after diagnostics are received. +Note: it runs only if the receiving buffer is open. Use +`lsp-diagnostics-updated-hook'if you want to be notified when +diagnostics have changed." + :type 'hook + :group 'lsp-mode) + +(define-obsolete-variable-alias 'lsp-after-diagnostics-hook + 'lsp-diagnostics-updated-hook "lsp-mode 6.4") + +(defcustom lsp-diagnostics-updated-hook nil + "Hooks to run after diagnostics are received." + :type 'hook + :group 'lsp-mode) + +(define-obsolete-variable-alias 'lsp-workspace-folders-changed-hook + 'lsp-workspace-folders-changed-functions "lsp-mode 6.3") + +(defcustom lsp-workspace-folders-changed-functions nil + "Hooks to run after the folders has changed. +The hook will receive two parameters list of added and removed folders." + :type 'hook + :group 'lsp-mode) + +(define-obsolete-variable-alias 'lsp-eldoc-hook 'eldoc-documentation-functions "lsp-mode 8.0.1") + +(defcustom lsp-before-apply-edits-hook nil + "Hooks to run before applying edits." + :type 'hook + :group 'lsp-mode) + +(defgroup lsp-imenu nil + "LSP Imenu." + :group 'lsp-mode + :tag "LSP Imenu") + +(defcustom lsp-imenu-show-container-name t + "Display the symbol's container name in an imenu entry." + :type 'boolean + :group 'lsp-imenu) + +(defcustom lsp-imenu-container-name-separator "/" + "Separator string to use to separate the container name from the symbol while +displaying imenu entries." + :type 'string + :group 'lsp-imenu) + +(defcustom lsp-imenu-sort-methods '(kind name) + "How to sort the imenu items. + +The value is a list of `kind' `name' or `position'. Priorities +are determined by the index of the element." + :type '(repeat (choice (const name) + (const position) + (const kind))) + :group 'lsp-imenu) + +(defcustom lsp-imenu-index-symbol-kinds nil + "Which symbol kinds to show in imenu." + :type '(repeat (choice (const :tag "Miscellaneous" nil) + (const :tag "File" File) + (const :tag "Module" Module) + (const :tag "Namespace" Namespace) + (const :tag "Package" Package) + (const :tag "Class" Class) + (const :tag "Method" Method) + (const :tag "Property" Property) + (const :tag "Field" Field) + (const :tag "Constructor" Constructor) + (const :tag "Enum" Enum) + (const :tag "Interface" Interface) + (const :tag "Function" Function) + (const :tag "Variable" Variable) + (const :tag "Constant" Constant) + (const :tag "String" String) + (const :tag "Number" Number) + (const :tag "Boolean" Boolean) + (const :tag "Array" Array) + (const :tag "Object" Object) + (const :tag "Key" Key) + (const :tag "Null" Null) + (const :tag "Enum Member" EnumMember) + (const :tag "Struct" Struct) + (const :tag "Event" Event) + (const :tag "Operator" Operator) + (const :tag "Type Parameter" TypeParameter))) + :group 'lsp-imenu) + +;; vibhavp: Should we use a lower value (5)? +(defcustom lsp-response-timeout 10 + "Number of seconds to wait for a response from the language server before +timing out. Nil if no timeout." + :type '(choice + (number :tag "Seconds") + (const :tag "No timeout" nil)) + :group 'lsp-mode) + +(defcustom lsp-tcp-connection-timeout 2 + "The timeout for tcp connection in seconds." + :type 'number + :group 'lsp-mode + :package-version '(lsp-mode . "6.2")) + +(defconst lsp--imenu-compare-function-alist + (list (cons 'name #'lsp--imenu-compare-name) + (cons 'kind #'lsp--imenu-compare-kind) + (cons 'position #'lsp--imenu-compare-line-col)) + "An alist of (METHOD . FUNCTION). +METHOD is one of the symbols accepted by +`lsp-imenu-sort-methods'. + +FUNCTION takes two hash tables representing DocumentSymbol. It +returns a negative number, 0, or a positive number indicating +whether the first parameter is less than, equal to, or greater +than the second parameter.") + +(defcustom lsp-diagnostic-clean-after-change nil + "When non-nil, clean the diagnostics on change. + +Note that when that setting is nil, `lsp-mode' will show stale +diagnostics until server publishes the new set of diagnostics" + :type 'boolean + :group 'lsp-diagnostics + :package-version '(lsp-mode . "7.0.1")) + +(defcustom lsp-server-trace nil + "Request tracing on the server side. +The actual trace output at each level depends on the language server in use. +Changes take effect only when a new session is started." + :type '(choice (const :tag "Disabled" "off") + (const :tag "Messages only" "messages") + (const :tag "Verbose" "verbose") + (const :tag "Default (disabled)" nil)) + :group 'lsp-mode + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-auto-touch-files t + "If non-nil ensure the files exist before sending +`textDocument/didOpen' notification." + :type 'boolean + :group 'lsp-mode + :package-version '(lsp-mode . "8.0.1")) + +(defvar lsp-language-id-configuration + '(("\\(^CMakeLists\\.txt\\|\\.cmake\\)\\'" . "cmake") + ("\\(^Dockerfile\\(?:\\..*\\)?\\|\\.[Dd]ockerfile\\)\\'" . "dockerfile") + ("\\.astro$" . "astro") + ("\\.cs\\'" . "csharp") + ("\\.css$" . "css") + ("\\.ebuild$" . "shellscript") + ("\\.go\\'" . "go") + ("\\.html$" . "html") + ("\\.hx$" . "haxe") + ("\\.hy$" . "hy") + ("\\.java\\'" . "java") + ("\\.js$" . "javascript") + ("\\.json$" . "json") + ("\\.jsonnet$" . "jsonnet") + ("\\.jsonc$" . "jsonc") + ("\\.jsx$" . "javascriptreact") + ("\\.jq$" . "jq") + ("\\.lua$" . "lua") + ("\\.mdx\\'" . "mdx") + ("\\.nu$" . "nushell") + ("\\.php$" . "php") + ("\\.rs\\'" . "rust") + ("\\.spec\\'" . "rpm-spec") + ("\\.sql$" . "sql") + ("\\.cypher$" . "cypher") + ("\\.svelte$" . "svelte") + ("\\.toml\\'" . "toml") + ("\\.ts$" . "typescript") + ("\\.tsx$" . "typescriptreact") + ("\\.ttcn3$" . "ttcn3") + ("\\.vue$" . "vue") + ("\\.xml$" . "xml") + ("\\ya?ml$" . "yaml") + ("^PKGBUILD$" . "shellscript") + ("^go\\.mod\\'" . "go.mod") + ("^settings.json$" . "jsonc") + (ada-mode . "ada") + (ada-ts-mode . "ada") + (awk-mode . "awk") + (awk-ts-mode . "awk") + (nxml-mode . "xml") + (sql-mode . "sql") + (vimrc-mode . "vim") + (vimscript-ts-mode . "vim") + (sh-mode . "shellscript") + (bash-ts-mode . "shellscript") + (ebuild-mode . "shellscript") + (pkgbuild-mode . "shellscript") + (envrc-file-mode . "shellscript") + (scala-mode . "scala") + (scala-ts-mode . "scala") + (julia-mode . "julia") + (julia-ts-mode . "julia") + (clojure-mode . "clojure") + (clojurec-mode . "clojure") + (clojurescript-mode . "clojurescript") + (clojure-ts-mode . "clojure") + (clojure-ts-clojurec-mode . "clojure") + (clojure-ts-clojurescript-mode . "clojurescript") + (java-mode . "java") + (java-ts-mode . "java") + (jdee-mode . "java") + (groovy-mode . "groovy") + (python-mode . "python") + (python-ts-mode . "python") + (cython-mode . "python") + ("\\(\\.mojo\\|\\.🔥\\)\\'" . "mojo") + (lsp--render-markdown . "markdown") + (move-mode . "move") + (rust-mode . "rust") + (rust-ts-mode . "rust") + (rustic-mode . "rust") + (kotlin-mode . "kotlin") + (kotlin-ts-mode . "kotlin") + (css-mode . "css") + (css-ts-mode . "css") + (less-mode . "less") + (less-css-mode . "less") + (lua-mode . "lua") + (lua-ts-mode . "lua") + (sass-mode . "sass") + (ssass-mode . "sass") + (scss-mode . "scss") + (scad-mode . "openscad") + (xml-mode . "xml") + (c-mode . "c") + (c-ts-mode . "c") + (c++-mode . "cpp") + (c++-ts-mode . "cpp") + (cuda-mode . "cuda") + (objc-mode . "objective-c") + (html-mode . "html") + (html-ts-mode . "html") + (sgml-mode . "html") + (mhtml-mode . "html") + (mint-mode . "mint") + (go-dot-mod-mode . "go.mod") + (go-mod-ts-mode . "go.mod") + (go-mode . "go") + (go-ts-mode . "go") + (graphql-mode . "graphql") + (haskell-mode . "haskell") + (hack-mode . "hack") + (php-mode . "php") + (php-ts-mode . "php") + (powershell-mode . "powershell") + (powershell-mode . "PowerShell") + (json-mode . "json") + (json-ts-mode . "json") + (jsonc-mode . "jsonc") + (rjsx-mode . "javascript") + (js2-mode . "javascript") + (js-mode . "javascript") + (js-ts-mode . "javascript") + (typescript-mode . "typescript") + (typescript-ts-mode . "typescript") + (tsx-ts-mode . "typescriptreact") + (fsharp-mode . "fsharp") + (reason-mode . "reason") + (caml-mode . "ocaml") + (tuareg-mode . "ocaml") + (swift-mode . "swift") + (elixir-mode . "elixir") + (elixir-ts-mode . "elixir") + (heex-ts-mode . "elixir") + (conf-javaprop-mode . "spring-boot-properties") + (yaml-mode . "yaml") + (yaml-ts-mode . "yaml") + (ruby-mode . "ruby") + (enh-ruby-mode . "ruby") + (ruby-ts-mode . "ruby") + (fortran-mode . "fortran") + (f90-mode . "fortran") + (elm-mode . "elm") + (dart-mode . "dart") + (erlang-mode . "erlang") + (dockerfile-mode . "dockerfile") + (dockerfile-ts-mode . "dockerfile") + (csharp-mode . "csharp") + (csharp-tree-sitter-mode . "csharp") + (csharp-ts-mode . "csharp") + (plain-tex-mode . "plaintex") + (context-mode . "context") + (cypher-mode . "cypher") + (latex-mode . "latex") + (v-mode . "v") + (vhdl-mode . "vhdl") + (vhdl-ts-mode . "vhdl") + (verilog-mode . "verilog") + (terraform-mode . "terraform") + (ess-julia-mode . "julia") + (ess-r-mode . "r") + (crystal-mode . "crystal") + (nim-mode . "nim") + (dhall-mode . "dhall") + (cmake-mode . "cmake") + (cmake-ts-mode . "cmake") + (purescript-mode . "purescript") + (gdscript-mode . "gdscript") + (gdscript-ts-mode . "gdscript") + (perl-mode . "perl") + (cperl-mode . "perl") + (robot-mode . "robot") + (racket-mode . "racket") + (nix-mode . "nix") + (nix-ts-mode . "Nix") + (prolog-mode . "prolog") + (vala-mode . "vala") + (actionscript-mode . "actionscript") + (d-mode . "d") + (zig-mode . "zig") + (text-mode . "plaintext") + (markdown-mode . "markdown") + (gfm-mode . "markdown") + (beancount-mode . "beancount") + (conf-toml-mode . "toml") + (toml-ts-mode . "toml") + (org-mode . "org") + (org-journal-mode . "org") + (nginx-mode . "nginx") + (magik-mode . "magik") + (magik-ts-mode . "magik") + (idris-mode . "idris") + (idris2-mode . "idris2") + (gleam-mode . "gleam") + (graphviz-dot-mode . "dot") + (tiltfile-mode . "tiltfile") + (solidity-mode . "solidity") + (bibtex-mode . "bibtex") + (rst-mode . "restructuredtext") + (glsl-mode . "glsl") + (shader-mode . "shaderlab") + (wgsl-mode . "wgsl") + (jq-mode . "jq") + (jq-ts-mode . "jq") + (protobuf-mode . "protobuf") + (nushell-mode . "nushell") + (nushell-ts-mode . "nushell")) + "Language id configuration.") + +(defvar lsp--last-active-workspaces nil + "Keep track of last active workspace. +We want to try the last workspace first when jumping into a library +directory") + +(defvar lsp-method-requirements + '(("textDocument/callHierarchy" :capability :callHierarchyProvider) + ("textDocument/codeAction" :capability :codeActionProvider) + ("codeAction/resolve" + :check-command (lambda (workspace) + (with-lsp-workspace workspace + (lsp:code-action-options-resolve-provider? + (lsp--capability-for-method "textDocument/codeAction"))))) + ("textDocument/codeLens" :capability :codeLensProvider) + ("textDocument/completion" :capability :completionProvider) + ("completionItem/resolve" + :check-command (lambda (wk) + (with-lsp-workspace wk + (lsp:completion-options-resolve-provider? + (lsp--capability-for-method "textDocument/completion"))))) + ("textDocument/declaration" :capability :declarationProvider) + ("textDocument/definition" :capability :definitionProvider) + ("textDocument/documentColor" :capability :colorProvider) + ("textDocument/documentLink" :capability :documentLinkProvider) + ("textDocument/inlayHint" :capability :inlayHintProvider) + ("textDocument/documentHighlight" :capability :documentHighlightProvider) + ("textDocument/documentSymbol" :capability :documentSymbolProvider) + ("textDocument/foldingRange" :capability :foldingRangeProvider) + ("textDocument/formatting" :capability :documentFormattingProvider) + ("textDocument/hover" :capability :hoverProvider) + ("textDocument/implementation" :capability :implementationProvider) + ("textDocument/linkedEditingRange" :capability :linkedEditingRangeProvider) + ("textDocument/onTypeFormatting" :capability :documentOnTypeFormattingProvider) + ("textDocument/prepareRename" + :check-command (lambda (workspace) + (with-lsp-workspace workspace + (lsp:rename-options-prepare-provider? + (lsp--capability-for-method "textDocument/rename"))))) + ("textDocument/rangeFormatting" :capability :documentRangeFormattingProvider) + ("textDocument/references" :capability :referencesProvider) + ("textDocument/rename" :capability :renameProvider) + ("textDocument/selectionRange" :capability :selectionRangeProvider) + ("textDocument/semanticTokens" :capability :semanticTokensProvider) + ("textDocument/semanticTokensFull" + :check-command (lambda (workspace) + (with-lsp-workspace workspace + (lsp-get (lsp--capability :semanticTokensProvider) :full)))) + ("textDocument/semanticTokensFull/Delta" + :check-command (lambda (workspace) + (with-lsp-workspace workspace + (let ((capFull (lsp-get (lsp--capability :semanticTokensProvider) :full))) + (and (not (booleanp capFull)) (lsp-get capFull :delta)))))) + ("textDocument/semanticTokensRangeProvider" + :check-command (lambda (workspace) + (with-lsp-workspace workspace + (lsp-get (lsp--capability :semanticTokensProvider) :range)))) + ("textDocument/signatureHelp" :capability :signatureHelpProvider) + ("textDocument/typeDefinition" :capability :typeDefinitionProvider) + ("textDocument/typeHierarchy" :capability :typeHierarchyProvider) + ("workspace/executeCommand" :capability :executeCommandProvider) + ("workspace/symbol" :capability :workspaceSymbolProvider)) + + "Map methods to requirements. +It is used by request-sending functions to determine which server +must be used for handling a particular message.") + +(defconst lsp--file-change-type + `((created . 1) + (changed . 2) + (deleted . 3))) + +(defconst lsp--watch-kind + `((create . 1) + (change . 2) + (delete . 4))) + +(defvar lsp-window-body-width 40 + "Window body width when rendering doc.") + +(defface lsp-face-highlight-textual + '((t :inherit highlight)) + "Face used for textual occurrences of symbols." + :group 'lsp-mode) + +(defface lsp-face-highlight-read + '((t :inherit highlight :underline t)) + "Face used for highlighting symbols being read." + :group 'lsp-mode) + +(defface lsp-face-highlight-write + '((t :inherit highlight :weight bold)) + "Face used for highlighting symbols being written to." + :group 'lsp-mode) + +(define-obsolete-variable-alias 'lsp-lens-auto-enable + 'lsp-lens-enable "lsp-mode 7.0.1") + +(defcustom lsp-lens-enable t + "Auto enable lenses if server supports." + :group 'lsp-lens + :type 'boolean + :package-version '(lsp-mode . "6.3")) + +(defcustom lsp-symbol-highlighting-skip-current nil + "If non-nil skip current symbol when setting symbol highlights." + :group 'lsp-mode + :type 'boolean) + +(defcustom lsp-file-watch-threshold 1000 + "Show warning if the files to watch are more than. +Set to nil to disable the warning." + :type 'number + :group 'lsp-mode) +;;;###autoload(put 'lsp-file-watch-threshold 'safe-local-variable (lambda (i) (or (numberp i) (not i)))) + +(defvar lsp-custom-markup-modes + '((rust-mode "no_run" "rust,no_run" "rust,ignore" "rust,should_panic")) + "Mode to uses with markdown code blocks. +They are added to `markdown-code-lang-modes'") + +(defcustom lsp-signature-render-documentation t + "Display signature documentation in `eldoc'." + :type 'boolean + :group 'lsp-mode + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-signature-auto-activate '(:on-trigger-char :on-server-request) + "Auto activate signature conditions." + :type '(repeat (choice (const :tag "On trigger chars pressed." :on-trigger-char) + (const :tag "After selected completion." :after-completion) + (const :tag "When the server has sent show signature help." :on-server-request))) + :group 'lsp-mode + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-signature-doc-lines 20 + "If number, limit the number of lines to show in the docs." + :type 'number + :group 'lsp-mode + :package-version '(lsp-mode . "6.3")) + +(defcustom lsp-signature-function 'lsp-lv-message + "The function used for displaying signature info. +It will be called with one param - the signature info. When +called with nil the signature info must be cleared." + :type 'function + :group 'lsp-mode + :package-version '(lsp-mode . "6.3")) + +(defcustom lsp-keymap-prefix "s-l" + "LSP-mode keymap prefix." + :group 'lsp-mode + :type 'string + :package-version '(lsp-mode . "6.3")) + +(defvar-local lsp--buffer-workspaces () + "List of the buffer workspaces.") + +(defvar lsp--session nil + "Contain the `lsp-session' for the current Emacs instance.") + +(defvar lsp--tcp-port 10000) + +(defvar lsp--client-packages-required nil + "If nil, `lsp-client-packages' are yet to be required.") + +(defvar lsp--tcp-server-port 0 + "The server socket which is opened when using `lsp-tcp-server' (a server +socket is opened in Emacs and the language server connects to it). The +default value of 0 ensures that a random high port is used. Set it to a positive +integer to use a specific port.") + +(defvar lsp--tcp-server-wait-seconds 10 + "Wait this amount of time for the client to connect to our server socket +when using `lsp-tcp-server'.") + +(defvar-local lsp--document-symbols nil + "The latest document symbols.") + +(defvar-local lsp--document-selection-range-cache nil + "The document selection cache.") + +(defvar-local lsp--document-symbols-request-async nil + "If non-nil, request document symbols asynchronously.") + +(defvar-local lsp--document-symbols-tick -1 + "The value of `buffer-chars-modified-tick' when document + symbols were last retrieved.") + +(defvar-local lsp--have-document-highlights nil + "Set to `t' on symbol highlighting, cleared on +`lsp--cleanup-highlights-if-needed'. Checking a separately +defined flag is substantially faster than unconditionally +calling `remove-overlays'.") + +;; Buffer local variable for storing number of lines. +(defvar lsp--log-lines) + +(defvar-local lsp--eldoc-saved-message nil) + +(defvar lsp--on-change-timer nil) +(defvar lsp--on-idle-timer nil) + +(defvar-local lsp--signature-last nil) +(defvar-local lsp--signature-last-index nil) +(defvar lsp--signature-last-buffer nil) + +(defvar-local lsp--virtual-buffer-point-max nil) + +(cl-defmethod lsp-execute-command (_server _command _arguments) + "Ask SERVER to execute COMMAND with ARGUMENTS.") + +(defun lsp-elt (sequence n) + "Return Nth element of SEQUENCE or nil if N is out of range." + (cond + ((listp sequence) (elt sequence n)) + ((arrayp sequence) + (and (> (length sequence) n) (aref sequence n))) + (t (and (> (length sequence) n) (elt sequence n))))) + +;; define seq-first and seq-rest for older emacs +(defun lsp-seq-first (sequence) + "Return the first element of SEQUENCE." + (lsp-elt sequence 0)) + +(defun lsp-seq-rest (sequence) + "Return a sequence of the elements of SEQUENCE except the first one." + (seq-drop sequence 1)) + +;;;###autoload +(defun lsp--string-listp (sequence) + "Return t if all elements of SEQUENCE are strings, else nil." + (not (seq-find (lambda (x) (not (stringp x))) sequence))) + +(defun lsp--string-vector-p (candidate) + "Returns true if CANDIDATE is a vector data structure and +every element of it is of type string, else nil." + (and + (vectorp candidate) + (seq-every-p #'stringp candidate))) + +(make-obsolete 'lsp--string-vector-p nil "lsp-mode 8.0.0") + +(defun lsp--editable-vector-match (widget value) + "Function for `lsp-editable-vector' :match." + ;; Value must be a list or a vector and all the members must match the type. + (and (or (listp value) (vectorp value)) + (length (cdr (lsp--editable-vector-match-inline widget value))))) + +(defun lsp--editable-vector-match-inline (widget value) + "Value for `lsp-editable-vector' :match-inline." + (let ((type (nth 0 (widget-get widget :args))) + (ok t) + found) + (while (and value ok) + (let ((answer (widget-match-inline type value))) + (if answer + (let ((head (if (vectorp answer) (aref answer 0) (car answer))) + (tail (if (vectorp answer) (seq-drop 1 answer) (cdr answer)))) + (setq found (append found head) + value tail)) + (setq ok nil)))) + (cons found value))) + +(defun lsp--editable-vector-value-to-external (_widget internal-value) + "Convert the internal list value to a vector." + (if (listp internal-value) + (apply 'vector internal-value) + internal-value)) + +(defun lsp--editable-vector-value-to-internal (_widget external-value) + "Convert the external vector value to a list." + (if (vectorp external-value) + (append external-value nil) + external-value)) + +(define-widget 'lsp--editable-vector 'editable-list + "A subclass of `editable-list' that accepts and returns a +vector instead of a list." + :value-to-external 'lsp--editable-vector-value-to-external + :value-to-internal 'lsp--editable-vector-value-to-internal + :match 'lsp--editable-vector-match + :match-inline 'lsp--editable-vector-match-inline) + +(define-widget 'lsp-repeatable-vector 'lsp--editable-vector + "A variable length homogeneous vector." + :tag "Repeat" + :format "%{%t%}:\n%v%i\n") + +(define-widget 'lsp-string-vector 'lazy + "A vector of zero or more elements, every element of which is a string. +Appropriate for any language-specific `defcustom' that needs to +serialize as a JSON array of strings. + +Deprecated. Use `lsp-repeatable-vector' instead. " + :offset 4 + :tag "Vector" + :type '(lsp-repeatable-vector string)) + +(make-obsolete 'lsp-string-vector nil "lsp-mode 8.0.0") + +(defvar lsp--show-message t + "If non-nil, show debug message from `lsp-mode'.") + +(defun lsp--message (format &rest args) + "Wrapper for `message' + +We `inhibit-message' the message when the cursor is in the +minibuffer and when emacs version is before emacs 27 due to the +fact that we often use `lsp--info', `lsp--warn' and `lsp--error' +in async context and the call to these function is removing the +minibuffer prompt. The issue with async messages is already fixed +in emacs 27. + +See #2049" + (when lsp--show-message + (let ((inhibit-message (or inhibit-message + (and (minibufferp) + (version< emacs-version "27.0"))))) + (apply #'message format args)))) + +(defun lsp--info (format &rest args) + "Display lsp info message with FORMAT with ARGS." + (lsp--message "%s :: %s" (propertize "LSP" 'face 'success) (apply #'format format args))) + +(defun lsp--warn (format &rest args) + "Display lsp warn message with FORMAT with ARGS." + (lsp--message "%s :: %s" (propertize "LSP" 'face 'warning) (apply #'format format args))) + +(defun lsp--error (format &rest args) + "Display lsp error message with FORMAT with ARGS." + (lsp--message "%s :: %s" (propertize "LSP" 'face 'error) (apply #'format format args))) + +(defun lsp-log (format &rest args) + "Log message to the ’*lsp-log*’ buffer. + +FORMAT and ARGS i the same as for `message'." + (when lsp-log-max + (let ((log-buffer (get-buffer "*lsp-log*")) + (inhibit-read-only t)) + (unless log-buffer + (setq log-buffer (get-buffer-create "*lsp-log*")) + (with-current-buffer log-buffer + (buffer-disable-undo) + (view-mode 1) + (set (make-local-variable 'lsp--log-lines) 0))) + (with-current-buffer log-buffer + (save-excursion + (let* ((message (apply 'format format args)) + ;; Count newlines in message. + (newlines (1+ (cl-loop with start = 0 + for count from 0 + while (string-match "\n" message start) + do (setq start (match-end 0)) + finally return count)))) + (goto-char (point-max)) + + ;; in case the buffer is not empty insert before last \n to preserve + ;; the point position(in case it is in the end) + (if (eq (point) (point-min)) + (progn + (insert "\n") + (backward-char)) + (backward-char) + (insert "\n")) + (insert message) + + (setq lsp--log-lines (+ lsp--log-lines newlines)) + + (when (and (integerp lsp-log-max) (> lsp--log-lines lsp-log-max)) + (let ((to-delete (- lsp--log-lines lsp-log-max))) + (goto-char (point-min)) + (forward-line to-delete) + (delete-region (point-min) (point)) + (setq lsp--log-lines lsp-log-max))))))))) + +(defalias 'lsp-message 'lsp-log) + +(defalias 'lsp-ht 'ht) + +(defalias 'lsp-file-local-name 'file-local-name) + +(defun lsp-f-canonical (file-name) + "Return the canonical FILE-NAME, without a trailing slash." + (directory-file-name (expand-file-name file-name))) + +(defalias 'lsp-canonical-file-name 'lsp-f-canonical) + +(defun lsp-f-same? (path-a path-b) + "Return t if PATH-A and PATH-B are references to the same file. +Symlinks are not followed." + (when (and (f-exists? path-a) + (f-exists? path-b)) + (equal + (lsp-f-canonical (directory-file-name (f-expand path-a))) + (lsp-f-canonical (directory-file-name (f-expand path-b)))))) + +(defun lsp-f-parent (path) + "Return the parent directory to PATH. +Symlinks are not followed." + (let ((parent (file-name-directory + (directory-file-name (f-expand path default-directory))))) + (unless (lsp-f-same? path parent) + (if (f-relative? path) + (f-relative parent) + (directory-file-name parent))))) + +(defun lsp-f-ancestor-of? (path-a path-b) + "Return t if PATH-A is an ancestor of PATH-B. +Symlinks are not followed." + (unless (lsp-f-same? path-a path-b) + (s-prefix? (concat (lsp-f-canonical path-a) (f-path-separator)) + (lsp-f-canonical path-b)))) + +(defun lsp--merge-results (results method) + "Merge RESULTS by filtering the empty hash-tables and merging +the lists according to METHOD." + (pcase (--map (if (vectorp it) + (append it nil) it) + (-filter #'identity results)) + (`() ()) + ;; only one result - simply return it + (`(,fst) fst) + ;; multiple results merge it based on strategy + (results + (pcase method + ("textDocument/hover" (pcase (seq-filter + (-compose #'not #'lsp-empty?) + results) + (`(,hover) hover) + (hovers (lsp-make-hover + :contents + (-mapcat + (-lambda ((&Hover :contents)) + (if (and (sequencep contents) + (not (stringp contents))) + (append contents ()) + (list contents))) + hovers))))) + ("textDocument/completion" + (lsp-make-completion-list + :is-incomplete (seq-some + #'lsp:completion-list-is-incomplete + results) + :items (cl-mapcan (lambda (it) (append (if (lsp-completion-list? it) + (lsp:completion-list-items it) + it) + nil)) + results))) + ("completionItem/resolve" + (let ((item (cl-first results))) + (when-let ((details (seq-filter #'identity + (seq-map #'lsp:completion-item-detail? results)))) + (lsp:set-completion-item-detail? + item + (string-join details " "))) + (when-let ((docs (seq-filter #'identity + (seq-map #'lsp:completion-item-documentation? results)))) + (lsp:set-completion-item-documentation? + item + (lsp-make-markup-content + :kind (or (seq-some (lambda (it) + (when (equal (lsp:markup-content-kind it) + lsp/markup-kind-markdown) + lsp/markup-kind-markdown)) + docs) + lsp/markup-kind-plain-text) + :value (string-join (seq-map (lambda (doc) + (or (lsp:markup-content-value doc) + (and (stringp doc) doc))) + docs) + "\n")))) + (when-let ((edits (seq-filter #'identity + (seq-map #'lsp:completion-item-additional-text-edits? results)))) + (lsp:set-completion-item-additional-text-edits? + item + (cl-mapcan (lambda (it) (if (seqp it) it (list it))) edits))) + item)) + (_ (cl-mapcan (lambda (it) (if (seqp it) it (list it))) results)))))) + +(defun lsp--spinner-start () + "Start spinner indication." + (condition-case _err (spinner-start (lsp-progress-spinner-type)) (error))) + +(defun lsp--propertize (str type) + "Propertize STR as per TYPE." + (propertize str 'face (alist-get type lsp--message-type-face))) + +(defun lsp-workspaces () + "Return the lsp workspaces associated with the current project." + (if lsp--cur-workspace (list lsp--cur-workspace) lsp--buffer-workspaces)) + +(defun lsp--completing-read (prompt collection transform-fn &optional predicate + require-match initial-input + hist def inherit-input-method) + "Wrap `completing-read' to provide transformation function and disable sort. + +TRANSFORM-FN will be used to transform each of the items before displaying. + +PROMPT COLLECTION PREDICATE REQUIRE-MATCH INITIAL-INPUT HIST DEF +INHERIT-INPUT-METHOD will be proxied to `completing-read' without changes." + (let* ((col (--map (cons (funcall transform-fn it) it) collection)) + (completion (completing-read prompt + (lambda (string pred action) + (if (eq action 'metadata) + `(metadata (display-sort-function . identity)) + (complete-with-action action col string pred))) + predicate require-match initial-input hist + def inherit-input-method))) + (cdr (assoc completion col)))) + +(defconst lsp--system-arch (lambda () + (setq lsp--system-arch + (pcase system-type + ('windows-nt + (pcase system-configuration + ((rx bol "x86_64-") 'x64) + (_ 'x86))) + ('darwin + (pcase system-configuration + ((rx "aarch64-") 'arm64) + (_ 'x64))) + ('gnu/linux + (pcase system-configuration + ((rx bol "x86_64") 'x64) + ((rx bol (| "i386" "i886")) 'x32))) + (_ + (pcase system-configuration + ((rx bol "x86_64") 'x64) + ((rx bol (| "i386" "i886")) 'x32)))))) + "Return the system architecture of `Emacs'. +Special values: + `x64' 64bit + `x32' 32bit + `arm64' ARM 64bit") + +(defmacro lsp-with-current-buffer (buffer-id &rest body) + (declare (indent 1) (debug t)) + `(if-let ((wcb (plist-get ,buffer-id :with-current-buffer))) + (with-lsp-workspaces (plist-get ,buffer-id :workspaces) + (funcall wcb (lambda () ,@body))) + (with-current-buffer ,buffer-id + ,@body))) + +(defvar lsp--throw-on-input nil + "Make `lsp-*-while-no-input' throws `input' on interrupted.") + +(defmacro lsp--catch (tag bodyform &rest handlers) + "Catch TAG thrown in BODYFORM. +The return value from TAG will be handled in HANDLERS by `pcase'." + (declare (debug (form form &rest (pcase-PAT body))) (indent 2)) + (let ((re-sym (make-symbol "re"))) + `(let ((,re-sym (catch ,tag ,bodyform))) + (pcase ,re-sym + ,@handlers)))) + +(defmacro lsp--while-no-input (&rest body) + "Wrap BODY in `while-no-input' and respecting `non-essential'. +If `lsp--throw-on-input' is set, will throw if input is pending, else +return value of `body' or nil if interrupted." + (declare (debug t) (indent 0)) + `(if non-essential + (let ((res (while-no-input ,@body))) + (cond + ((and lsp--throw-on-input (equal res t)) + (throw 'input :interrupted)) + ((booleanp res) nil) + (t res))) + ,@body)) + +;; A ‘lsp--client’ object describes the client-side behavior of a language +;; server. It is used to start individual server processes, each of which is +;; represented by a ‘lsp--workspace’ object. Client objects are normally +;; created using ‘lsp-define-stdio-client’ or ‘lsp-define-tcp-client’. Each +;; workspace refers to exactly one client, but there can be multiple workspaces +;; for a single client. +(cl-defstruct lsp--client + ;; ‘language-id’ is a function that receives a buffer as a single argument + ;; and should return the language identifier for that buffer. See + ;; https://microsoft.github.io/language-server-protocol/specification#textdocumentitem + ;; for a list of language identifiers. Also consult the documentation for + ;; the language server represented by this client to find out what language + ;; identifiers it supports or expects. + (language-id nil) + + ;; ‘add-on?’ when set to t the server will be started no matter whether there + ;; is another server handling the same mode. + (add-on? nil) + ;; ‘new-connection’ is a function that should start a language server process + ;; and return a cons (COMMAND-PROCESS . COMMUNICATION-PROCESS). + ;; COMMAND-PROCESS must be a process object representing the server process + ;; just started. COMMUNICATION-PROCESS must be a process (including pipe and + ;; network processes) that ‘lsp-mode’ uses to communicate with the language + ;; server using the language server protocol. COMMAND-PROCESS and + ;; COMMUNICATION-PROCESS may be the same process; in that case + ;; ‘new-connection’ may also return that process as a single + ;; object. ‘new-connection’ is called with two arguments, FILTER and + ;; SENTINEL. FILTER should be used as process filter for + ;; COMMUNICATION-PROCESS, and SENTINEL should be used as process sentinel for + ;; COMMAND-PROCESS. + (new-connection nil) + + ;; ‘ignore-regexps’ is a list of regexps. When a data packet from the + ;; language server matches any of these regexps, it will be ignored. This is + ;; intended for dealing with language servers that output non-protocol data. + (ignore-regexps nil) + + ;; ‘ignore-messages’ is a list of regexps. When a message from the language + ;; server matches any of these regexps, it will be ignored. This is useful + ;; for filtering out unwanted messages; such as servers that send nonstandard + ;; message types, or extraneous log messages. + (ignore-messages nil) + + ;; ‘notification-handlers’ is a hash table mapping notification method names + ;; (strings) to functions handling the respective notifications. Upon + ;; receiving a notification, ‘lsp-mode’ will call the associated handler + ;; function passing two arguments, the ‘lsp--workspace’ object and the + ;; deserialized notification parameters. + (notification-handlers (make-hash-table :test 'equal)) + + ;; ‘request-handlers’ is a hash table mapping request method names + ;; (strings) to functions handling the respective notifications. Upon + ;; receiving a request, ‘lsp-mode’ will call the associated handler function + ;; passing two arguments, the ‘lsp--workspace’ object and the deserialized + ;; request parameters. + (request-handlers (make-hash-table :test 'equal)) + + ;; ‘response-handlers’ is a hash table mapping integral JSON-RPC request + ;; identifiers for pending asynchronous requests to functions handling the + ;; respective responses. Upon receiving a response from the language server, + ;; ‘lsp-mode’ will call the associated response handler function with a + ;; single argument, the deserialized response parameters. + (response-handlers (make-hash-table :test 'eql)) + + ;; ‘prefix-function’ is called for getting the prefix for completion. + ;; The function takes no parameter and returns a cons (start . end) representing + ;; the start and end bounds of the prefix. If it's not set, the client uses a + ;; default prefix function." + (prefix-function nil) + + ;; Contains mapping of scheme to the function that is going to be used to load + ;; the file. + (uri-handlers (make-hash-table :test #'equal)) + + ;; ‘action-handlers’ is a hash table mapping action to a handler function. It + ;; can be used in `lsp-execute-code-action' to determine whether the action + ;; current client is interested in executing the action instead of sending it + ;; to the server. + (action-handlers (make-hash-table :test 'equal)) + + ;; major modes supported by the client. + major-modes + ;; Function that will be called to decide if this language client + ;; should manage a particular buffer. The function will be passed + ;; the file name and major mode to inform the decision. Setting + ;; `activation-fn' will override `major-modes', if + ;; present. + activation-fn + ;; Break the tie when major-mode is supported by multiple clients. + (priority 0) + ;; Unique identifier for representing the client object. + server-id + ;; defines whether the client supports multi root workspaces. + multi-root + ;; Initialization options or a function that returns initialization options. + initialization-options + ;; `semantic-tokens-faces-overrides’ is a plist that can be used to extend, or + ;; completely replace, the faces used for semantic highlighting on a + ;; client-by-client basis. + ;; + ;; It recognizes four members, all of which are optional: `:types’ and + ;; `:modifiers’, respectively, should be face definition lists akin to + ;; `:lsp-semantic-token-faces’. If specified, each of these face lists will be + ;; merged with the default face definition list. + ;; + ;; Alternatively, if the plist members `:discard-default-types’ or + ;; `:discard-default-modifiers' are non-nil, the default `:type' or `:modifiers' + ;; face definitions will be replaced entirely by their respective overrides. + ;; + ;; For example, setting `:semantic-tokens-faces-overrides' to + ;; `(:types (("macro" . font-lock-keyword-face)))' will remap "macro" tokens from + ;; their default face `lsp-face-semhl-macro' to `font-lock-keyword-face'. + ;; + ;; `(:types (("macro" . font-lock-keyword-face) ("not-quite-a-macro" . some-face)))' + ;; will also remap "macro", but on top of that associate the fictional token type + ;; "not-quite-a-macro" with the face named `some-face'. + ;; + ;; `(:types (("macro" . font-lock-keyword-face)) + ;; :modifiers (("declaration" . lsp-face-semhl-interface)) + ;; :discard-default-types t + ;; :discard-default-modifiers t)' + ;; will discard all default face definitions, hence leaving the client with + ;; only one token type "macro", mapped to `font-lock-keyword-face', and one + ;; modifier type "declaration", mapped to `lsp-face-semhl-interface'. + semantic-tokens-faces-overrides + ;; Provides support for registering LSP Server specific capabilities. + custom-capabilities + ;; Function which returns the folders that are considered to be not projects but library files. + ;; The function accepts one parameter currently active workspace. + ;; See: https://github.com/emacs-lsp/lsp-mode/issues/225. + library-folders-fn + ;; function which will be called when opening file in the workspace to perform + ;; client specific initialization. The function accepts one parameter + ;; currently active workspace. + before-file-open-fn + ;; Function which will be called right after a workspace has been initialized. + initialized-fn + ;; ‘remote?’ indicate whether the client can be used for LSP server over TRAMP. + (remote? nil) + + ;; ‘completion-in-comments?’ t if the client supports completion in comments. + (completion-in-comments? nil) + + ;; ‘path->uri-fn’ the function to use for path->uri conversion for the client. + (path->uri-fn nil) + + ;; ‘uri->path-fn’ the function to use for uri->path conversion for the client. + (uri->path-fn nil) + ;; Function that returns an environment structure that will be used + ;; to set some environment variables when starting the language + ;; server process. These environment variables enable some + ;; additional features in the language server. The environment + ;; structure is an alist of the form (KEY . VALUE), where KEY is a + ;; string (regularly in all caps), and VALUE may be a string, a + ;; boolean, or a sequence of strings. + environment-fn + + ;; ‘after-open-fn’ workspace after open specific hooks. + (after-open-fn nil) + + ;; ‘async-request-handlers’ is a hash table mapping request method names + ;; (strings) to functions handling the respective requests that may take + ;; time to finish. Upon receiving a request, ‘lsp-mode’ will call the + ;; associated handler function passing three arguments, the ‘lsp--workspace’ + ;; object, the deserialized request parameters and the callback which accept + ;; result as its parameter. + (async-request-handlers (make-hash-table :test 'equal)) + download-server-fn + download-in-progress? + buffers + synchronize-sections) + +(defun lsp-clients-executable-find (find-command &rest args) + "Finds an executable by invoking a search command. + +FIND-COMMAND is the executable finder that searches for the +actual language server executable. ARGS is a list of arguments to +give to FIND-COMMAND to find the language server. Returns the +output of FIND-COMMAND if it exits successfully, nil otherwise. + +Typical uses include finding an executable by invoking `find' in +a project, finding LLVM commands on macOS with `xcrun', or +looking up project-specific language servers for projects written +in the various dynamic languages, e.g. `nvm', `pyenv' and `rbenv' +etc." + (when-let* ((find-command-path (executable-find find-command)) + (executable-path + (with-temp-buffer + (when (zerop (apply 'call-process find-command-path nil t nil args)) + (buffer-substring-no-properties (point-min) (point-max)))))) + (string-trim executable-path))) + +(defvar lsp--already-widened nil) + +(defmacro lsp-save-restriction-and-excursion (&rest form) + (declare (indent 0) (debug t)) + `(if lsp--already-widened + (save-excursion ,@form) + (-let [lsp--already-widened t] + (save-restriction + (widen) + (save-excursion ,@form))))) + +;; from http://emacs.stackexchange.com/questions/8082/how-to-get-buffer-position-given-line-number-and-column-number +(defun lsp--line-character-to-point (line character) + "Return the point for character CHARACTER on line LINE." + (or (lsp-virtual-buffer-call :line/character->point line character) + (let ((inhibit-field-text-motion t)) + (lsp-save-restriction-and-excursion + (goto-char (point-min)) + (forward-line line) + ;; server may send character position beyond the current line and we + ;; should fallback to line end. + (-let [line-end (line-end-position)] + (if (> character (- line-end (point))) + line-end + (forward-char character) + (point))))))) + +(lsp-defun lsp--position-to-point ((&Position :line :character)) + "Convert `Position' object in PARAMS to a point." + (lsp--line-character-to-point line character)) + +(lsp-defun lsp--range-to-region ((&RangeToPoint :start :end)) + (cons start end)) + +(lsp-defun lsp--range-text ((&RangeToPoint :start :end)) + (buffer-substring start end)) + +(lsp-defun lsp--find-wrapping-range ((&SelectionRange :parent? :range (&RangeToPoint :start :end))) + (cond + ((and + (region-active-p) + (<= start (region-beginning) end) + (<= start (region-end) end) + (or (not (= start (region-beginning))) + (not (= end (region-end))))) + (cons start end)) + ((and (<= start (point) end) + (not (region-active-p))) + (cons start end)) + (parent? (lsp--find-wrapping-range parent?)))) + +(defun lsp--get-selection-range () + (or + (-when-let ((cache . cache-tick) lsp--document-selection-range-cache) + (when (= cache-tick (buffer-modified-tick)) cache)) + (let ((response (cl-first + (lsp-request + "textDocument/selectionRange" + (list :textDocument (lsp--text-document-identifier) + :positions (vector (lsp--cur-position))))))) + (setq lsp--document-selection-range-cache + (cons response (buffer-modified-tick))) + response))) + +(defun lsp-extend-selection () + "Extend selection." + (interactive) + (unless (lsp-feature? "textDocument/selectionRange") + (signal 'lsp-capability-not-supported (list "selectionRangeProvider"))) + (-when-let ((start . end) (lsp--find-wrapping-range (lsp--get-selection-range))) + (goto-char start) + (set-mark (point)) + (goto-char end) + (exchange-point-and-mark))) + +(defun lsp-warn (message &rest args) + "Display a warning message made from (`format-message' MESSAGE ARGS...). +This is equivalent to `display-warning', using `lsp-mode' as the type and +`:warning' as the level." + (display-warning 'lsp-mode (apply #'format-message message args))) + +(defun lsp--get-uri-handler (scheme) + "Get uri handler for SCHEME in the current workspace." + (--some (gethash scheme (lsp--client-uri-handlers (lsp--workspace-client it))) + (or (lsp-workspaces) (lsp--session-workspaces (lsp-session))))) + +(defun lsp--fix-path-casing (path) + "On windows, downcases path because the windows file system is +case-insensitive. + +On other systems, returns path without change." + (if (eq system-type 'windows-nt) (downcase path) path)) + +(defun lsp--uri-to-path (uri) + "Convert URI to a file path." + (if-let ((fn (->> (lsp-workspaces) + (-keep (-compose #'lsp--client-uri->path-fn #'lsp--workspace-client)) + (cl-first)))) + (funcall fn uri) + (lsp--uri-to-path-1 uri))) + +(defun lsp-remap-path-if-needed (file-name) + (-if-let ((virtual-buffer &as &plist :buffer) (gethash file-name lsp--virtual-buffer-mappings)) + (propertize (buffer-local-value 'buffer-file-name buffer) + 'lsp-virtual-buffer virtual-buffer) + file-name)) + +(defun lsp--uri-to-path-1 (uri) + "Convert URI to a file path." + (let* ((url (url-generic-parse-url (url-unhex-string uri))) + (type (url-type url)) + (target (url-target url)) + (file + (concat (decode-coding-string (url-filename url) + (or locale-coding-system 'utf-8)) + (when (and target + (not (s-match + (rx "#" (group (1+ num)) (or "," "#") + (group (1+ num)) + string-end) + uri))) + (concat "#" target)))) + (file-name (if (and type (not (string= type "file"))) + (if-let ((handler (lsp--get-uri-handler type))) + (funcall handler uri) + uri) + ;; `url-generic-parse-url' is buggy on windows: + ;; https://github.com/emacs-lsp/lsp-mode/pull/265 + (or (and (eq system-type 'windows-nt) + (eq (elt file 0) ?\/) + (substring file 1)) + file)))) + (->> file-name + (concat (-some #'lsp--workspace-host-root (lsp-workspaces))) + (lsp-remap-path-if-needed)))) + +(defun lsp--buffer-uri () + "Return URI of the current buffer." + (or lsp-buffer-uri + (plist-get lsp--virtual-buffer :buffer-uri) + (lsp--path-to-uri + (or (buffer-file-name) (buffer-file-name (buffer-base-buffer)))))) + +(defun lsp-register-client-capabilities (&rest _args) + "Implemented only to make `company-lsp' happy. +DELETE when `lsp-mode.el' is deleted.") + +(defconst lsp--url-path-allowed-chars + (url--allowed-chars (append '(?/) url-unreserved-chars)) + "`url-unreserved-chars' with additional delim ?/. +This set of allowed chars is enough for hexifying local file paths.") + +(defun lsp--path-to-uri-1 (path) + (concat lsp--uri-file-prefix + (--> path + (expand-file-name it) + (or (file-remote-p it 'localname t) it) + (url-hexify-string it lsp--url-path-allowed-chars)))) + +(defun lsp--path-to-uri (path) + "Convert PATH to a uri." + (if-let ((uri-fn (->> (lsp-workspaces) + (-keep (-compose #'lsp--client-path->uri-fn #'lsp--workspace-client)) + (cl-first)))) + (funcall uri-fn path) + (lsp--path-to-uri-1 path))) + +(defun lsp--string-match-any (regex-list str) + "Return the first regex, if any, within REGEX-LIST matching STR." + (--first (string-match it str) regex-list)) + +(cl-defstruct lsp-watch + (descriptors (make-hash-table :test 'equal)) + root-directory) + +(defun lsp--folder-watch-callback (event callback watch ignored-files ignored-directories) + (let ((file-name (cl-third event)) + (event-type (cl-second event))) + (cond + ((and (file-directory-p file-name) + (equal 'created event-type) + (not (lsp--string-match-any ignored-directories file-name))) + + (lsp-watch-root-folder (file-truename file-name) callback ignored-files ignored-directories watch) + + ;; process the files that are already present in + ;; the directory. + (->> (directory-files-recursively file-name ".*" t) + (seq-do (lambda (f) + (unless (file-directory-p f) + (funcall callback (list nil 'created f))))))) + ((and (memq event-type '(created deleted changed)) + (not (file-directory-p file-name)) + (not (lsp--string-match-any ignored-files file-name))) + (funcall callback event)) + ((and (memq event-type '(renamed)) + (not (file-directory-p file-name)) + (not (lsp--string-match-any ignored-files file-name))) + (funcall callback `(,(cl-first event) deleted ,(cl-third event))) + (funcall callback `(,(cl-first event) created ,(cl-fourth event))))))) + +(defun lsp--ask-about-watching-big-repo (number-of-directories dir) + "Ask the user if they want to watch NUMBER-OF-DIRECTORIES from a repository DIR. +This is useful when there is a lot of files in a repository, as +that may slow Emacs down. Returns t if the user wants to watch +the entire repository, nil otherwise." + (prog1 + (yes-or-no-p + (format + "Watching all the files in %s would require adding watches to %s directories, so watching the repo may slow Emacs down. +Do you want to watch all files in %s? " + dir + number-of-directories + dir)) + (lsp--info + (concat "You can configure this warning with the `lsp-enable-file-watchers' " + "and `lsp-file-watch-threshold' variables")))) + + +(defun lsp--path-is-watchable-directory (path dir ignored-directories) + "Figure out whether PATH (inside of DIR) is meant to have a file watcher set. +IGNORED-DIRECTORIES is a list of regexes to filter out directories we don't +want to watch." + (let + ((full-path (f-join dir path))) + (and (file-accessible-directory-p full-path) + (not (equal path ".")) + (not (equal path "..")) + (not (lsp--string-match-any ignored-directories full-path))))) + + +(defun lsp--all-watchable-directories (dir ignored-directories) + "Traverse DIR recursively returning a list of paths that should have watchers. +IGNORED-DIRECTORIES will be used for exclusions" + (let* ((dir (if (f-symlink? dir) + (file-truename dir) + dir))) + (apply #'nconc + ;; the directory itself is assumed to be part of the set + (list dir) + ;; collect all subdirectories that are watchable + (-map + (lambda (path) (lsp--all-watchable-directories (f-join dir path) ignored-directories)) + ;; but only look at subdirectories that are watchable + (-filter (lambda (path) (lsp--path-is-watchable-directory path dir ignored-directories)) + (directory-files dir)))))) + +(defun lsp-watch-root-folder (dir callback ignored-files ignored-directories &optional watch warn-big-repo?) + "Create recursive file notification watch in DIR. +CALLBACK will be called when there are changes in any of +the monitored files. WATCHES is a hash table directory->file +notification handle which contains all of the watch that +already have been created. Watches will not be created for +any directory that matches any regex in IGNORED-DIRECTORIES. +Watches will not be created for any file that matches any +regex in IGNORED-FILES." + (let* ((dir (if (f-symlink? dir) + (file-truename dir) + dir)) + (watch (or watch (make-lsp-watch :root-directory dir))) + (dirs-to-watch (lsp--all-watchable-directories dir ignored-directories))) + (lsp-log "Creating watchers for following %s folders:\n %s" + (length dirs-to-watch) + (s-join "\n " dirs-to-watch)) + (when (or + (not warn-big-repo?) + (not lsp-file-watch-threshold) + (let ((number-of-directories (length dirs-to-watch))) + (or + (< number-of-directories lsp-file-watch-threshold) + (condition-case nil + (lsp--ask-about-watching-big-repo number-of-directories dir) + (quit))))) + (dolist (current-dir dirs-to-watch) + (condition-case err + (progn + (puthash + current-dir + (file-notify-add-watch current-dir + '(change) + (lambda (event) + (lsp--folder-watch-callback event callback watch ignored-files ignored-directories))) + (lsp-watch-descriptors watch))) + (error (lsp-log "Failed to create a watch for %s: message" (error-message-string err))) + (file-missing (lsp-log "Failed to create a watch for %s: message" (error-message-string err)))))) + watch)) + +(defun lsp-kill-watch (watch) + "Delete WATCH." + (-> watch lsp-watch-descriptors hash-table-values (-each #'file-notify-rm-watch)) + (ht-clear! (lsp-watch-descriptors watch))) + +(defun lsp-json-bool (val) + "Convert VAL to JSON boolean." + (if val t :json-false)) + +(defmacro with-lsp-workspace (workspace &rest body) + "Helper macro for invoking BODY in WORKSPACE context." + (declare (debug (form body)) + (indent 1)) + `(let ((lsp--cur-workspace ,workspace)) ,@body)) + +(defmacro with-lsp-workspaces (workspaces &rest body) + "Helper macro for invoking BODY against multiple WORKSPACES." + (declare (debug (form body)) + (indent 1)) + `(let ((lsp--buffer-workspaces ,workspaces)) ,@body)) + + + +(defmacro lsp-consistency-check (package) + `(defconst ,(intern (concat (symbol-name package) + "-plist-value-when-compiled")) + (eval-when-compile lsp-use-plists))) + + +;; loading code-workspace files + +;;;###autoload +(defun lsp-load-vscode-workspace (file) + "Load vscode workspace from FILE" + (interactive "fSelect file to import: ") + (mapc #'lsp-workspace-folders-remove (lsp-session-folders (lsp-session))) + + (let ((dir (f-dirname file))) + (->> file + (json-read-file) + (alist-get 'folders) + (-map (-lambda ((&alist 'path)) + (lsp-workspace-folders-add (expand-file-name path dir))))))) + +;;;###autoload +(defun lsp-save-vscode-workspace (file) + "Save vscode workspace to FILE" + (interactive "FSelect file to save to: ") + + (let ((json-encoding-pretty-print t)) + (f-write-text (json-encode + `((folders . ,(->> (lsp-session) + (lsp-session-folders) + (--map `((path . ,it))))))) + 'utf-8 + file))) + + +(defmacro lsp-foreach-workspace (&rest body) + "Execute BODY for each of the current workspaces." + (declare (debug (form body))) + `(--map (with-lsp-workspace it ,@body) (lsp-workspaces))) + +(defmacro when-lsp-workspace (workspace &rest body) + "Helper macro for invoking BODY in WORKSPACE context if present." + (declare (debug (form body)) + (indent 1)) + `(when-let ((lsp--cur-workspace ,workspace)) ,@body)) + +(lsp-defun lsp--window-show-quick-pick (_workspace (&ShowQuickPickParams :place-holder :can-pick-many :items)) + (if-let* ((selectfunc (if can-pick-many #'completing-read-multiple #'completing-read)) + (itemLabels (seq-map (-lambda ((item &as &QuickPickItem :label)) (format "%s" label)) + items)) + (result (funcall-interactively + selectfunc + (format "%s%s " place-holder (if can-pick-many " (* for all)" "")) itemLabels)) + (choices (if (listp result) + (if (equal result '("*")) + itemLabels + result) + (list result)))) + (vconcat (seq-filter #'identity (seq-map (-lambda ((item &as &QuickPickItem :label :user-data)) + (if (member label choices) + (lsp-make-quick-pick-item :label label :picked t :user-data user-data) + nil)) + items))))) + +(lsp-defun lsp--window-show-input-box (_workspace (&ShowInputBoxParams :prompt :value?)) + (read-string (format "%s: " prompt) (or value? ""))) + +(lsp-defun lsp--window-show-message (_workspace (&ShowMessageRequestParams :message :type)) + "Send the server's messages to log. +PARAMS - the data sent from _WORKSPACE." + (funcall (cl-case type + (1 'lsp--error) + (2 'lsp--warn) + (t 'lsp--info)) + "%s" + message)) + +(lsp-defun lsp--window-log-message (workspace (&ShowMessageRequestParams :message :type)) + "Send the server's messages to log. +PARAMS - the data sent from WORKSPACE." + (ignore + (let ((client (lsp--workspace-client workspace))) + (when (or (not client) + (cl-notany (-rpartial #'string-match-p message) + (lsp--client-ignore-messages client))) + (lsp-log "%s" (lsp--propertize message type)))))) + +(lsp-defun lsp--window-log-message-request ((&ShowMessageRequestParams :message :type :actions?)) + "Display a message request to user sending the user selection back to server." + (let* ((message (lsp--propertize message type)) + (choices (seq-map #'lsp:message-action-item-title actions?))) + (if choices + (completing-read (concat message " ") (seq-into choices 'list) nil t) + (lsp-log message)))) + +(lsp-defun lsp--window-show-document ((&ShowDocumentParams :uri :selection?)) + "Show document URI in a buffer and go to SELECTION if any." + (let ((path (lsp--uri-to-path uri))) + (when (f-exists? path) + (with-current-buffer (find-file path) + (when selection? + (goto-char (lsp--position-to-point (lsp:range-start selection?)))) + t)))) + +(defcustom lsp-progress-prefix " ⌛ " + "Progress prefix." + :group 'lsp-mode + :type 'string + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-progress-function #'lsp-on-progress-modeline + "Function for handling the progress notifications." + :group 'lsp-mode + :type '(choice + (const :tag "Use modeline" lsp-on-progress-modeline) + (const :tag "Legacy(uses either `progress-reporter' or `spinner' based on `lsp-progress-via-spinner')" + lsp-on-progress-legacy) + (const :tag "Ignore" ignore) + (function :tag "Other function")) + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-request-while-no-input-may-block nil + "Have `lsp-request-while-no-input` block unless `non-essential` is t." + :group 'lsp-mode + :type 'boolean) + +(defun lsp--progress-status () + "Returns the status of the progress for the current workspaces." + (-let ((progress-status + (s-join + "|" + (-keep + (lambda (workspace) + (let ((tokens (lsp--workspace-work-done-tokens workspace))) + (unless (ht-empty? tokens) + (mapconcat + (-lambda ((&WorkDoneProgressBegin :message? :title :percentage?)) + (concat (if percentage? + (if (numberp percentage?) + (format "%.0f%%%% " percentage?) + (format "%s%%%% " percentage?)) + "") + (or message? title))) + (ht-values tokens) + "|")))) + (lsp-workspaces))))) + (unless (s-blank? progress-status) + (concat lsp-progress-prefix progress-status)))) + +(lsp-defun lsp-on-progress-modeline (workspace (&ProgressParams :token :value + (value &as &WorkDoneProgress :kind))) + "PARAMS contains the progress data. +WORKSPACE is the workspace that contains the progress token." + (add-to-list 'global-mode-string '(t (:eval (lsp--progress-status)))) + (pcase kind + ("begin" (lsp-workspace-set-work-done-token token value workspace)) + ("report" (lsp-workspace-set-work-done-token token value workspace)) + ("end" (lsp-workspace-rem-work-done-token token workspace))) + (force-mode-line-update)) + +(lsp-defun lsp-on-progress-legacy (workspace (&ProgressParams :token :value + (value &as &WorkDoneProgress :kind))) + "PARAMS contains the progress data. +WORKSPACE is the workspace that contains the progress token." + (pcase kind + ("begin" + (-let* (((&WorkDoneProgressBegin :title :percentage?) value) + (reporter + (if lsp-progress-via-spinner + (let* ((spinner-strings (alist-get (lsp-progress-spinner-type) spinner-types)) + ;; Set message as a tooltip for the spinner strings + (propertized-strings + (seq-map (lambda (string) (propertize string 'help-echo title)) + spinner-strings)) + (spinner-type (vconcat propertized-strings))) + ;; The progress relates to the server as a whole, + ;; display it on all buffers. + (mapcar (lambda (buffer) + (lsp-with-current-buffer buffer + (spinner-start spinner-type)) + buffer) + (lsp--workspace-buffers workspace))) + (if percentage? + (make-progress-reporter title 0 100 percentage?) + ;; No percentage, just progress + (make-progress-reporter title nil nil))))) + (lsp-workspace-set-work-done-token token reporter workspace))) + ("report" + (when-let ((reporter (lsp-workspace-get-work-done-token token workspace))) + (unless lsp-progress-via-spinner + (progress-reporter-update reporter (lsp:work-done-progress-report-percentage? value))))) + + ("end" + (when-let ((reporter (lsp-workspace-get-work-done-token token workspace))) + (if lsp-progress-via-spinner + (mapc (lambda (buffer) + (when (lsp-buffer-live-p buffer) + (lsp-with-current-buffer buffer + (spinner-stop)))) + reporter) + (progress-reporter-done reporter)) + (lsp-workspace-rem-work-done-token token workspace))))) + + +;; diagnostics + +(defvar lsp-diagnostic-filter nil + "A a function which will be called with + `&PublishDiagnosticsParams' and `workspace' which can be used + to filter out the diagnostics. The function should return + `&PublishDiagnosticsParams'. + +Common usecase are: +1. Filter the diagnostics for a particular language server. +2. Filter out the diagnostics under specific level.") + +(defvar lsp-diagnostic-stats (ht)) + +(defun lsp-diagnostics (&optional current-workspace?) + "Return the diagnostics from all workspaces." + (or (pcase (if current-workspace? + (lsp-workspaces) + (lsp--session-workspaces (lsp-session))) + (`() ()) + (`(,workspace) (lsp--workspace-diagnostics workspace)) + (`,workspaces (let ((result (make-hash-table :test 'equal))) + (mapc (lambda (workspace) + (->> workspace + (lsp--workspace-diagnostics) + (maphash (lambda (file-name diagnostics) + (puthash file-name + (append (gethash file-name result) diagnostics) + result))))) + workspaces) + result))) + (ht))) + +(defun lsp-diagnostics-stats-for (path) + "Get diagnostics statistics for PATH. +The result format is vector [_ errors warnings infos hints] or nil." + (gethash (lsp--fix-path-casing path) lsp-diagnostic-stats)) + +(defun lsp-diagnostics--update-path (path new-stats) + (let ((new-stats (copy-sequence new-stats)) + (path (lsp--fix-path-casing (directory-file-name path)))) + (if-let ((old-data (gethash path lsp-diagnostic-stats))) + (dotimes (idx 5) + (cl-callf + (aref old-data idx) + (aref new-stats idx))) + (puthash path new-stats lsp-diagnostic-stats)))) + +(lsp-defun lsp--on-diagnostics-update-stats (workspace + (&PublishDiagnosticsParams :uri :diagnostics)) + (let ((path (lsp--fix-path-casing (lsp--uri-to-path uri))) + (new-stats (make-vector 5 0))) + (mapc (-lambda ((&Diagnostic :severity?)) + (cl-incf (aref new-stats (or severity? 1)))) + diagnostics) + (when-let ((old-diags (gethash path (lsp--workspace-diagnostics workspace)))) + (mapc (-lambda ((&Diagnostic :severity?)) + (cl-decf (aref new-stats (or severity? 1)))) + old-diags)) + (lsp-diagnostics--update-path path new-stats) + (while (not (string= path (setf path (file-name-directory + (directory-file-name path))))) + (lsp-diagnostics--update-path path new-stats)))) + +(defun lsp--on-diagnostics (workspace params) + "Callback for textDocument/publishDiagnostics. +interface PublishDiagnosticsParams { + uri: string; + diagnostics: Diagnostic[]; +} +PARAMS contains the diagnostics data. +WORKSPACE is the workspace that contains the diagnostics." + (when lsp-diagnostic-filter + (setf params (funcall lsp-diagnostic-filter params workspace))) + + (lsp--on-diagnostics-update-stats workspace params) + + (-let* (((&PublishDiagnosticsParams :uri :diagnostics) params) + (lsp--virtual-buffer-mappings (ht)) + (file (lsp--fix-path-casing (lsp--uri-to-path uri))) + (workspace-diagnostics (lsp--workspace-diagnostics workspace))) + + (if (seq-empty-p diagnostics) + (remhash file workspace-diagnostics) + (puthash file (append diagnostics nil) workspace-diagnostics)) + + (run-hooks 'lsp-diagnostics-updated-hook))) + +(defun lsp-diagnostics--workspace-cleanup (workspace) + (->> workspace + (lsp--workspace-diagnostics) + (maphash (lambda (key _) + (lsp--on-diagnostics-update-stats + workspace + (lsp-make-publish-diagnostics-params + :uri (lsp--path-to-uri key) + :diagnostics []))))) + (clrhash (lsp--workspace-diagnostics workspace))) + + + +;; textDocument/foldingRange support + +(cl-defstruct lsp--folding-range beg end kind children) + +(defvar-local lsp--cached-folding-ranges nil) +(defvar-local lsp--cached-nested-folding-ranges nil) + +(defun lsp--folding-range-width (range) + (- (lsp--folding-range-end range) + (lsp--folding-range-beg range))) + +(defun lsp--get-folding-ranges () + "Get the folding ranges for the current buffer." + (unless (eq (buffer-chars-modified-tick) (car lsp--cached-folding-ranges)) + (let* ((ranges (lsp-request "textDocument/foldingRange" + `(:textDocument ,(lsp--text-document-identifier)))) + (sorted-line-col-pairs (->> ranges + (cl-mapcan (-lambda ((&FoldingRange :start-line + :start-character? + :end-line + :end-character?)) + (list (cons start-line start-character?) + (cons end-line end-character?)))) + (-sort #'lsp--line-col-comparator))) + (line-col-to-point-map (lsp--convert-line-col-to-points-batch + sorted-line-col-pairs))) + (setq lsp--cached-folding-ranges + (cons (buffer-chars-modified-tick) + (--> ranges + (seq-map (-lambda ((range &as + &FoldingRange :start-line + :start-character? + :end-line + :end-character? + :kind?)) + (make-lsp--folding-range + :beg (ht-get line-col-to-point-map + (cons start-line start-character?)) + :end (ht-get line-col-to-point-map + (cons end-line end-character?)) + :kind kind?)) + it) + (seq-filter (lambda (folding-range) + (< (lsp--folding-range-beg folding-range) + (lsp--folding-range-end folding-range))) + it) + (seq-into it 'list) + (delete-dups it)))))) + (cdr lsp--cached-folding-ranges)) + +(defun lsp--get-nested-folding-ranges () + "Get a list of nested folding ranges for the current buffer." + (-let [(tick . _) lsp--cached-folding-ranges] + (if (and (eq tick (buffer-chars-modified-tick)) + lsp--cached-nested-folding-ranges) + lsp--cached-nested-folding-ranges + (setq lsp--cached-nested-folding-ranges + (lsp--folding-range-build-trees (lsp--get-folding-ranges)))))) + +(defun lsp--folding-range-build-trees (ranges) + (setq ranges (seq-sort #'lsp--range-before-p ranges)) + (let* ((dummy-node (make-lsp--folding-range + :beg most-negative-fixnum + :end most-positive-fixnum)) + (stack (list dummy-node))) + (dolist (range ranges) + (while (not (lsp--range-inside-p range (car stack))) + (pop stack)) + (push range (lsp--folding-range-children (car stack))) + (push range stack)) + (lsp--folding-range-children dummy-node))) + +(defun lsp--range-inside-p (r1 r2) + "Return non-nil if folding range R1 lies inside R2" + (and (>= (lsp--folding-range-beg r1) (lsp--folding-range-beg r2)) + (<= (lsp--folding-range-end r1) (lsp--folding-range-end r2)))) + +(defun lsp--range-before-p (r1 r2) + "Return non-nil if folding range R1 ends before R2" + ;; Ensure r1 comes before r2 + (or (< (lsp--folding-range-beg r1) + (lsp--folding-range-beg r2)) + ;; If beg(r1) == beg(r2) make sure r2 ends first + (and (= (lsp--folding-range-beg r1) + (lsp--folding-range-beg r2)) + (< (lsp--folding-range-end r2) + (lsp--folding-range-end r1))))) + +(defun lsp--point-inside-range-p (point range) + "Return non-nil if POINT lies inside folding range RANGE." + (and (>= point (lsp--folding-range-beg range)) + (<= point (lsp--folding-range-end range)))) + +(cl-defun lsp--get-current-innermost-folding-range (&optional (point (point))) + "Return the innermost folding range POINT lies in." + (seq-reduce (lambda (innermost-range curr-range) + (if (and (lsp--point-inside-range-p point curr-range) + (or (null innermost-range) + (lsp--range-inside-p curr-range innermost-range))) + curr-range + innermost-range)) + (lsp--get-folding-ranges) + nil)) + +(cl-defun lsp--get-current-outermost-folding-range (&optional (point (point))) + "Return the outermost folding range POINT lies in." + (cdr (seq-reduce (-lambda ((best-pair &as outermost-width . _) curr-range) + (let ((curr-width (lsp--folding-range-width curr-range))) + (if (and (lsp--point-inside-range-p point curr-range) + (or (null best-pair) + (> curr-width outermost-width))) + (cons curr-width curr-range) + best-pair))) + (lsp--get-folding-ranges) + nil))) + +(defun lsp--folding-range-at-point-bounds () + (when (and lsp-enable-folding + (lsp-feature? "textDocument/foldingRange")) + (if-let ((range (lsp--get-current-innermost-folding-range))) + (cons (lsp--folding-range-beg range) + (lsp--folding-range-end range))))) +(put 'lsp--folding-range 'bounds-of-thing-at-point + #'lsp--folding-range-at-point-bounds) + +(defun lsp--get-nearest-folding-range (&optional backward) + (let ((point (point)) + (found nil)) + (while (not + (or found + (if backward + (<= point (point-min)) + (>= point (point-max))))) + (if backward (cl-decf point) (cl-incf point)) + (setq found (lsp--get-current-innermost-folding-range point))) + found)) + +(defun lsp--folding-range-at-point-forward-op (n) + (when (and lsp-enable-folding + (not (zerop n)) + (lsp-feature? "textDocument/foldingRange")) + (cl-block break + (dotimes (_ (abs n)) + (if-let ((range (lsp--get-nearest-folding-range (< n 0)))) + (goto-char (if (< n 0) + (lsp--folding-range-beg range) + (lsp--folding-range-end range))) + (cl-return-from break)))))) +(put 'lsp--folding-range 'forward-op + #'lsp--folding-range-at-point-forward-op) + +(defun lsp--folding-range-at-point-beginning-op () + (goto-char (car (lsp--folding-range-at-point-bounds)))) +(put 'lsp--folding-range 'beginning-op + #'lsp--folding-range-at-point-beginning-op) + +(defun lsp--folding-range-at-point-end-op () + (goto-char (cdr (lsp--folding-range-at-point-bounds)))) +(put 'lsp--folding-range 'end-op + #'lsp--folding-range-at-point-end-op) + +(defun lsp--range-at-point-bounds () + (or (lsp--folding-range-at-point-bounds) + (when-let ((range (and + (lsp-feature? "textDocument/hover") + (->> (lsp--text-document-position-params) + (lsp-request "textDocument/hover") + (lsp:hover-range?))))) + (lsp--range-to-region range)))) + +;; A more general purpose "thing", useful for applications like focus.el +(put 'lsp--range 'bounds-of-thing-at-point + #'lsp--range-at-point-bounds) + +(defun lsp--log-io-p (method) + "Return non nil if should log for METHOD." + (and lsp-log-io + (or (not lsp-log-io-allowlist-methods) + (member method lsp-log-io-allowlist-methods)))) + + +;; toggles + +(defun lsp-toggle-trace-io () + "Toggle client-server protocol logging." + (interactive) + (setq lsp-log-io (not lsp-log-io)) + (lsp--info "Server logging %s." (if lsp-log-io "enabled" "disabled"))) + +(defun lsp-toggle-signature-auto-activate () + "Toggle signature auto activate." + (interactive) + (setq lsp-signature-auto-activate + (unless lsp-signature-auto-activate '(:on-trigger-char))) + (lsp--info "Signature autoactivate %s." (if lsp-signature-auto-activate "enabled" "disabled")) + (lsp--update-signature-help-hook)) + +(defun lsp-toggle-on-type-formatting () + "Toggle on type formatting." + (interactive) + (setq lsp-enable-on-type-formatting (not lsp-enable-on-type-formatting)) + (lsp--info "On type formatting is %s." (if lsp-enable-on-type-formatting "enabled" "disabled")) + (lsp--update-on-type-formatting-hook)) + +(defun lsp-toggle-symbol-highlight () + "Toggle symbol highlighting." + (interactive) + (setq lsp-enable-symbol-highlighting (not lsp-enable-symbol-highlighting)) + + (cond + ((and lsp-enable-symbol-highlighting + (lsp-feature? "textDocument/documentHighlight")) + (add-hook 'lsp-on-idle-hook #'lsp--document-highlight nil t) + (lsp--info "Symbol highlighting enabled in current buffer.")) + ((not lsp-enable-symbol-highlighting) + (remove-hook 'lsp-on-idle-hook #'lsp--document-highlight t) + (lsp--remove-overlays 'lsp-highlight) + (lsp--info "Symbol highlighting disabled in current buffer.")))) + + +;; keybindings +(defvar lsp--binding-descriptions nil + "List of key binding/short description pair.") + +(defmacro lsp-define-conditional-key (keymap key def desc cond &rest bindings) + "In KEYMAP, define key sequence KEY as DEF conditionally. +This is like `define-key', except the definition disappears +whenever COND evaluates to nil. +DESC is the short-description for the binding. +BINDINGS is a list of (key def desc cond)." + (declare (indent defun) + (debug (form form form form form &rest sexp))) + (->> (cl-list* key def desc cond bindings) + (-partition 4) + (-mapcat (-lambda ((key def desc cond)) + `((define-key ,keymap ,key + '(menu-item + ,(format "maybe-%s" def) + ,def + :filter + (lambda (item) + (when (with-current-buffer (or (when (buffer-live-p lsp--describe-buffer) + lsp--describe-buffer) + (current-buffer)) + ,cond) + item)))) + (when (stringp ,key) + (setq lsp--binding-descriptions + (append lsp--binding-descriptions '(,key ,desc))))))) + macroexp-progn)) + +(defvar lsp--describe-buffer nil) + +(defun lsp-describe-buffer-bindings-advice (fn buffer &optional prefix menus) + (let ((lsp--describe-buffer buffer)) + (funcall fn buffer prefix menus))) + +(advice-add 'describe-buffer-bindings + :around + #'lsp-describe-buffer-bindings-advice) + +(defun lsp--prepend-prefix (mappings) + (->> mappings + (-partition 2) + (-mapcat (-lambda ((key description)) + (list (concat lsp-keymap-prefix " " key) + description))))) + +(defvar lsp-command-map + (-doto (make-sparse-keymap) + (lsp-define-conditional-key + ;; workspaces + "wD" lsp-disconnect "disconnect" (lsp-workspaces) + "wd" lsp-describe-session "describe session" t + "wq" lsp-workspace-shutdown "shutdown server" (lsp-workspaces) + "wr" lsp-workspace-restart "restart server" (lsp-workspaces) + "ws" lsp "start server" t + + ;; formatting + "==" lsp-format-buffer "format buffer" (or (lsp-feature? "textDocument/rangeFormatting") + (lsp-feature? "textDocument/formatting")) + "=r" lsp-format-region "format region" (lsp-feature? "textDocument/rangeFormatting") + + ;; folders + "Fa" lsp-workspace-folders-add "add folder" t + "Fb" lsp-workspace-blocklist-remove "un-blocklist folder" t + "Fr" lsp-workspace-folders-remove "remove folder" t + + ;; toggles + "TD" lsp-modeline-diagnostics-mode "toggle modeline diagnostics" (lsp-feature? + "textDocument/publishDiagnostics") + "TL" lsp-toggle-trace-io "toggle log io" t + "TS" lsp-ui-sideline-mode "toggle sideline" (featurep 'lsp-ui-sideline) + "TT" lsp-treemacs-sync-mode "toggle treemacs integration" (featurep 'lsp-treemacs) + "Ta" lsp-modeline-code-actions-mode "toggle modeline code actions" (lsp-feature? + "textDocument/codeAction") + "Tb" lsp-headerline-breadcrumb-mode "toggle breadcrumb" (lsp-feature? + "textDocument/documentSymbol") + "Td" lsp-ui-doc-mode "toggle documentation popup" (featurep 'lsp-ui-doc) + "Tf" lsp-toggle-on-type-formatting "toggle on type formatting" (lsp-feature? + "textDocument/onTypeFormatting") + "Th" lsp-toggle-symbol-highlight "toggle highlighting" (lsp-feature? "textDocument/documentHighlight") + "Tl" lsp-lens-mode "toggle lenses" (lsp-feature? "textDocument/codeLens") + "Ts" lsp-toggle-signature-auto-activate "toggle signature" (lsp-feature? "textDocument/signatureHelp") + + ;; goto + "ga" xref-find-apropos "find symbol in workspace" (lsp-feature? "workspace/symbol") + "gd" lsp-find-declaration "find declarations" (lsp-feature? "textDocument/declaration") + "ge" lsp-treemacs-errors-list "show errors" (fboundp 'lsp-treemacs-errors-list) + "gg" lsp-find-definition "find definitions" (lsp-feature? "textDocument/definition") + "gh" lsp-treemacs-call-hierarchy "call hierarchy" (and (lsp-feature? "callHierarchy/incomingCalls") + (fboundp 'lsp-treemacs-call-hierarchy)) + "gi" lsp-find-implementation "find implementations" (lsp-feature? "textDocument/implementation") + "gr" lsp-find-references "find references" (lsp-feature? "textDocument/references") + "gt" lsp-find-type-definition "find type definition" (lsp-feature? "textDocument/typeDefinition") + + ;; help + "hg" lsp-ui-doc-glance "glance symbol" (and (featurep 'lsp-ui-doc) + (lsp-feature? "textDocument/hover")) + "hh" lsp-describe-thing-at-point "describe symbol at point" (lsp-feature? "textDocument/hover") + "hs" lsp-signature-activate "signature help" (lsp-feature? "textDocument/signatureHelp") + + ;; refactoring + "ro" lsp-organize-imports "organize imports" (lsp-feature? "textDocument/codeAction") + "rr" lsp-rename "rename" (lsp-feature? "textDocument/rename") + + ;; actions + "aa" lsp-execute-code-action "code actions" (lsp-feature? "textDocument/codeAction") + "ah" lsp-document-highlight "highlight symbol" (lsp-feature? "textDocument/documentHighlight") + "al" lsp-avy-lens "lens" (and (bound-and-true-p lsp-lens-mode) (featurep 'avy)) + + ;; peeks + "Gg" lsp-ui-peek-find-definitions "peek definitions" (and (lsp-feature? "textDocument/definition") + (fboundp 'lsp-ui-peek-find-definitions)) + "Gi" lsp-ui-peek-find-implementation "peek implementations" (and + (fboundp 'lsp-ui-peek-find-implementation) + (lsp-feature? "textDocument/implementation")) + "Gr" lsp-ui-peek-find-references "peek references" (and (fboundp 'lsp-ui-peek-find-references) + (lsp-feature? "textDocument/references")) + "Gs" lsp-ui-peek-find-workspace-symbol "peek workspace symbol" (and (fboundp + 'lsp-ui-peek-find-workspace-symbol) + (lsp-feature? "workspace/symbol"))))) + + +;; which-key integration + +(declare-function which-key-add-major-mode-key-based-replacements "ext:which-key") +(declare-function which-key-add-key-based-replacements "ext:which-key") + +(defun lsp-enable-which-key-integration (&optional all-modes) + "Adds descriptions for `lsp-mode-map' to `which-key-mode' for the current +active `major-mode', or for all major modes when ALL-MODES is t." + (cl-flet ((which-key-fn (if all-modes + 'which-key-add-key-based-replacements + (apply-partially 'which-key-add-major-mode-key-based-replacements major-mode)))) + (apply + #'which-key-fn + (lsp--prepend-prefix + (cl-list* + "" "lsp" + "w" "workspaces" + "F" "folders" + "=" "formatting" + "T" "toggle" + "g" "goto" + "h" "help" + "r" "refactor" + "a" "code actions" + "G" "peek" + lsp--binding-descriptions))))) + + +;; Globbing syntax + +;; We port VSCode's glob-to-regexp code +;; (https://github.com/Microsoft/vscode/blob/466da1c9013c624140f6d1473b23a870abc82d44/src/vs/base/common/glob.ts) +;; since the LSP globbing syntax seems to be the same as that of +;; VSCode. + +(defconst lsp-globstar "**" + "Globstar pattern.") + +(defconst lsp-glob-split ?/ + "The character by which we split path components in a glob +pattern.") + +(defconst lsp-path-regexp "[/\\\\]" + "Forward or backslash to be used as a path separator in +computed regexps.") + +(defconst lsp-non-path-regexp "[^/\\\\]" + "A regexp matching anything other than a slash.") + +(defconst lsp-globstar-regexp + (format "\\(?:%s\\|%s+%s\\|%s%s+\\)*?" + lsp-path-regexp + lsp-non-path-regexp lsp-path-regexp + lsp-path-regexp lsp-non-path-regexp) + "Globstar in regexp form.") + +(defun lsp-split-glob-pattern (pattern split-char) + "Split PATTERN at SPLIT-CHAR while respecting braces and brackets." + (when pattern + (let ((segments nil) + (in-braces nil) + (in-brackets nil) + (current-segment "")) + (dolist (char (string-to-list pattern)) + (cl-block 'exit-point + (if (eq char split-char) + (when (and (null in-braces) + (null in-brackets)) + (push current-segment segments) + (setq current-segment "") + (cl-return-from 'exit-point)) + (pcase char + (?{ + (setq in-braces t)) + (?} + (setq in-braces nil)) + (?\[ + (setq in-brackets t)) + (?\] + (setq in-brackets nil)))) + (setq current-segment (concat current-segment + (char-to-string char))))) + (unless (string-empty-p current-segment) + (push current-segment segments)) + (nreverse segments)))) + +(defun lsp--glob-to-regexp (pattern) + "Helper function to convert a PATTERN from LSP's glob syntax to +an Elisp regexp." + (if (string-empty-p pattern) + "" + (let ((current-regexp "") + (glob-segments (lsp-split-glob-pattern pattern lsp-glob-split))) + (if (-all? (lambda (segment) (eq segment lsp-globstar)) + glob-segments) + ".*" + (let ((prev-segment-was-globstar nil)) + (seq-do-indexed + (lambda (segment index) + (if (string-equal segment lsp-globstar) + (unless prev-segment-was-globstar + (setq current-regexp (concat current-regexp + lsp-globstar-regexp)) + (setq prev-segment-was-globstar t)) + (let ((in-braces nil) + (brace-val "") + (in-brackets nil) + (bracket-val "")) + (dolist (char (string-to-list segment)) + (cond + ((and (not (char-equal char ?\})) + in-braces) + (setq brace-val (concat brace-val + (char-to-string char)))) + ((and in-brackets + (or (not (char-equal char ?\])) + (string-empty-p bracket-val))) + (let ((curr (cond + ((char-equal char ?-) + "-") + ;; NOTE: ?\^ and ?^ are different characters + ((and (memq char '(?^ ?!)) + (string-empty-p bracket-val)) + "^") + ((char-equal char lsp-glob-split) + "") + (t + (regexp-quote (char-to-string char)))))) + (setq bracket-val (concat bracket-val curr)))) + (t + (cl-case char + (?{ + (setq in-braces t)) + (?\[ + (setq in-brackets t)) + (?} + (let* ((choices (lsp-split-glob-pattern brace-val ?\,)) + (brace-regexp (concat "\\(?:" + (mapconcat #'lsp--glob-to-regexp choices "\\|") + "\\)"))) + (setq current-regexp (concat current-regexp + brace-regexp)) + (setq in-braces nil) + (setq brace-val ""))) + (?\] + (setq current-regexp + (concat current-regexp + "[" bracket-val "]")) + (setq in-brackets nil) + (setq bracket-val "")) + (?? + (setq current-regexp + (concat current-regexp + lsp-non-path-regexp))) + (?* + (setq current-regexp + (concat current-regexp + lsp-non-path-regexp "*?"))) + (t + (setq current-regexp + (concat current-regexp + (regexp-quote (char-to-string char))))))))) + (when (and (< index (1- (length glob-segments))) + (or (not (string-equal (nth (1+ index) glob-segments) + lsp-globstar)) + (< (+ index 2) + (length glob-segments)))) + (setq current-regexp + (concat current-regexp + lsp-path-regexp))) + (setq prev-segment-was-globstar nil)))) + glob-segments) + current-regexp))))) + +;; See https://github.com/emacs-lsp/lsp-mode/issues/2365 +(defun lsp-glob-unbrace-at-top-level (glob-pattern) + "If GLOB-PATTERN does not start with a brace, return a singleton list +containing GLOB-PATTERN. + +If GLOB-PATTERN does start with a brace, return a list of the +comma-separated globs within the top-level braces." + (if (not (string-prefix-p "{" glob-pattern)) + (list glob-pattern) + (lsp-split-glob-pattern (substring glob-pattern 1 -1) ?\,))) + +(defun lsp-glob-convert-to-wrapped-regexp (glob-pattern) + "Convert GLOB-PATTERN to a regexp wrapped with the beginning- +and end-of-string meta-characters." + (concat "\\`" (lsp--glob-to-regexp (string-trim glob-pattern)) "\\'")) + +(defun lsp-glob-to-regexps (glob-pattern) + "Convert a GLOB-PATTERN to a list of Elisp regexps." + (let* ((trimmed-pattern (string-trim glob-pattern)) + (top-level-unbraced-patterns (lsp-glob-unbrace-at-top-level trimmed-pattern))) + (seq-map #'lsp-glob-convert-to-wrapped-regexp + top-level-unbraced-patterns))) + + + +(defvar lsp-mode-menu) + +(defun lsp-mouse-click (event) + (interactive "e") + (let* ((ec (event-start event)) + (choice (x-popup-menu event lsp-mode-menu)) + (action (lookup-key lsp-mode-menu (apply 'vector choice)))) + + (select-window (posn-window ec)) + + (unless (and (region-active-p) (eq action 'lsp-execute-code-action)) + (goto-char (posn-point ec))) + (run-with-idle-timer + 0.001 nil + (lambda () + (cl-labels ((check (value) (not (null value)))) + (when choice + (call-interactively action))))))) + +(defvar lsp-mode-map + (let ((map (make-sparse-keymap))) + (define-key map (kbd "C-") #'lsp-find-definition-mouse) + (define-key map (kbd "C-") #'ignore) + (define-key map (kbd "") #'lsp-mouse-click) + (define-key map (kbd "C-S-SPC") #'lsp-signature-activate) + (when lsp-keymap-prefix + (define-key map (kbd lsp-keymap-prefix) lsp-command-map)) + map) + "Keymap for `lsp-mode'.") + +(define-minor-mode lsp-mode "Mode for LSP interaction." + :keymap lsp-mode-map + :lighter + (" LSP[" + (lsp--buffer-workspaces + (:eval (mapconcat #'lsp--workspace-print lsp--buffer-workspaces "][")) + (:propertize "Disconnected" face warning)) + "]") + :group 'lsp-mode + (when (and lsp-mode (not lsp--buffer-workspaces)) + ;; fire up `lsp' when someone calls `lsp-mode' instead of `lsp' + (lsp))) + +(defvar lsp-mode-menu + (easy-menu-create-menu + nil + `(["Go to definition" lsp-find-definition + :active (lsp-feature? "textDocument/definition")] + ["Find references" lsp-find-references + :active (lsp-feature? "textDocument/references")] + ["Find implementations" lsp-find-implementation + :active (lsp-feature? "textDocument/implementation")] + ["Find declarations" lsp-find-declaration + :active (lsp-feature? "textDocument/declaration")] + ["Go to type declaration" lsp-find-type-definition + :active (lsp-feature? "textDocument/typeDefinition")] + "--" + ["Describe" lsp-describe-thing-at-point] + ["Code action" lsp-execute-code-action] + ["Format" lsp-format-buffer] + ["Highlight references" lsp-document-highlight] + ["Type Hierarchy" lsp-java-type-hierarchy + :visible (lsp-can-execute-command? "java.navigate.resolveTypeHierarchy")] + ["Type Hierarchy" lsp-treemacs-type-hierarchy + :visible (and (not (lsp-can-execute-command? "java.navigate.resolveTypeHierarchy")) + (functionp 'lsp-treemacs-type-hierarchy) + (lsp-feature? "textDocument/typeHierarchy"))] + ["Call Hierarchy" lsp-treemacs-call-hierarchy + :visible (and (functionp 'lsp-treemacs-call-hierarchy) + (lsp-feature? "textDocument/callHierarchy"))] + ["Rename" lsp-rename + :active (lsp-feature? "textDocument/rename")] + "--" + ("Session" + ["View logs" lsp-workspace-show-log] + ["Describe" lsp-describe-session] + ["Shutdown" lsp-shutdown-workspace] + ["Restart" lsp-restart-workspace]) + ("Workspace Folders" + ["Add" lsp-workspace-folders-add] + ["Remove" lsp-workspace-folders-remove] + ["Open" lsp-workspace-folders-open]) + ("Toggle features" + ["Lenses" lsp-lens-mode] + ["Headerline breadcrumb" lsp-headerline-breadcrumb-mode] + ["Modeline code actions" lsp-modeline-code-actions-mode] + ["Modeline diagnostics" lsp-modeline-diagnostics-mode]) + "---" + ("Debug" + :active (bound-and-true-p dap-ui-mode) + :filter ,(lambda (_) + (and (boundp 'dap-ui-menu-items) + (nthcdr 3 dap-ui-menu-items)))))) + "Menu for lsp-mode.") + +(defalias 'make-lsp-client 'make-lsp--client) + +(cl-defstruct lsp--registered-capability + (id "") + (method " ") + (options nil)) + +;; A ‘lsp--workspace’ object represents exactly one language server process. +(cl-defstruct lsp--workspace + ;; the `ewoc' object for displaying I/O to and from the server + (ewoc nil) + + ;; ‘server-capabilities’ is a hash table of the language server capabilities. + ;; It is the hash table representation of a LSP ServerCapabilities structure; + ;; cf. https://microsoft.github.io/language-server-protocol/specification#initialize. + (server-capabilities nil) + + ;; ‘registered-server-capabilities’ is a list of hash tables that represent + ;; dynamically-registered Registration objects. See + ;; https://microsoft.github.io/language-server-protocol/specification#client_registerCapability. + (registered-server-capabilities nil) + + ;; ‘root’ is a directory name or a directory file name for the workspace + ;; root. ‘lsp-mode’ passes this directory to the ‘initialize’ method of the + ;; language server; see + ;; https://microsoft.github.io/language-server-protocol/specification#initialize. + (root nil) + + ;; ‘client’ is the ‘lsp--client’ object associated with this workspace. + (client nil) + + ;; ‘host-root’ contains the host root info as derived from `file-remote-p'. It + ;; used to derive the file path in `lsp--uri-to-path' when using tramp + ;; connection. + (host-root nil) + + ;; ‘proc’ is a process object; it may represent a regular process, a pipe, or + ;; a network connection. ‘lsp-mode’ communicates with ‘proc’ using the + ;; language server protocol. ‘proc’ corresponds to the COMMUNICATION-PROCESS + ;; element of the return value of the client’s ‘get-root’ field, which see. + (proc nil) + + ;; ‘proc’ is a process object; it must represent a regular process, not a + ;; pipe or network process. It represents the actual server process that + ;; corresponds to this workspace. ‘cmd-proc’ corresponds to the + ;; COMMAND-PROCESS element of the return value of the client’s ‘get-root’ + ;; field, which see. + (cmd-proc nil) + + ;; ‘buffers’ is a list of buffers associated with this workspace. + (buffers nil) + + ;; if semantic tokens is enabled, `semantic-tokens-faces' contains + ;; one face (or nil) for each token type supported by the language server. + (semantic-tokens-faces nil) + + ;; If semantic highlighting is enabled, `semantic-tokens-modifier-faces' + ;; contains one face (or nil) for each modifier type supported by the language + ;; server + (semantic-tokens-modifier-faces nil) + + ;; Extra client capabilities provided by third-party packages using + ;; `lsp-register-client-capabilities'. It's value is an alist of (PACKAGE-NAME + ;; . CAPS), where PACKAGE-NAME is a symbol of the third-party package name, + ;; and CAPS is either a plist of the client capabilities, or a function that + ;; takes no argument and returns a plist of the client capabilities or nil. + (extra-client-capabilities nil) + + ;; Workspace status + (status nil) + + ;; ‘metadata’ is a generic storage for workspace specific data. It is + ;; accessed via `lsp-workspace-set-metadata' and `lsp-workspace-set-metadata' + (metadata (make-hash-table :test 'equal)) + + ;; contains all the file notification watches that have been created for the + ;; current workspace in format filePath->file notification handle. + (watches (make-hash-table :test 'equal)) + + ;; list of workspace folders + (workspace-folders nil) + + ;; ‘last-id’ the last request id for the current workspace. + (last-id 0) + + ;; ‘status-string’ allows extensions to specify custom status string based on + ;; the Language Server specific messages. + (status-string nil) + + ;; ‘shutdown-action’ flag used to mark that workspace should not be restarted (e.g. it + ;; was stopped). + shutdown-action + + ;; ‘diagnostics’ a hashmap with workspace diagnostics. + (diagnostics (make-hash-table :test 'equal)) + + ;; contains all the workDone progress tokens that have been created + ;; for the current workspace. + (work-done-tokens (make-hash-table :test 'equal))) + + +(cl-defstruct lsp-session + ;; contains the folders that are part of the current session + folders + ;; contains the folders that must not be imported in the current workspace. + folders-blocklist + ;; contains the list of folders that must be imported in a project in case of + ;; multi root LSP server. + (server-id->folders (make-hash-table :test 'equal)) + ;; folder to list of the servers that are associated with the folder. + (folder->servers (make-hash-table :test 'equal)) + ;; ‘metadata’ is a generic storage for workspace specific data. It is + ;; accessed via `lsp-workspace-set-metadata' and `lsp-workspace-set-metadata' + (metadata (make-hash-table :test 'equal))) + +(defun lsp-workspace-status (status-string &optional workspace) + "Set current workspace status to STATUS-STRING. +If WORKSPACE is not specified defaults to lsp--cur-workspace." + (let ((status-string (when status-string (replace-regexp-in-string "%" "%%" status-string)))) + (setf (lsp--workspace-status-string (or workspace lsp--cur-workspace)) status-string))) + +(defun lsp-session-set-metadata (key value &optional _workspace) + "Associate KEY with VALUE in the WORKSPACE metadata. +If WORKSPACE is not provided current workspace will be used." + (puthash key value (lsp-session-metadata (lsp-session)))) + +(defalias 'lsp-workspace-set-metadata 'lsp-session-set-metadata) + +(defun lsp-session-get-metadata (key &optional _workspace) + "Lookup KEY in WORKSPACE metadata. +If WORKSPACE is not provided current workspace will be used." + (gethash key (lsp-session-metadata (lsp-session)))) + +(defalias 'lsp-workspace-get-metadata 'lsp-session-get-metadata) + +(defun lsp-workspace-set-work-done-token (token value workspace) + "Associate TOKEN with VALUE in the WORKSPACE work-done-tokens." + (puthash token value (lsp--workspace-work-done-tokens workspace))) + +(defun lsp-workspace-get-work-done-token (token workspace) + "Lookup TOKEN in the WORKSPACE work-done-tokens." + (gethash token (lsp--workspace-work-done-tokens workspace))) + +(defun lsp-workspace-rem-work-done-token (token workspace) + "Remove TOKEN from the WORKSPACE work-done-tokens." + (remhash token (lsp--workspace-work-done-tokens workspace))) + + +(defun lsp--make-notification (method &optional params) + "Create notification body for method METHOD and parameters PARAMS." + (list :jsonrpc "2.0" :method method :params params)) + +(defalias 'lsp--make-request 'lsp--make-notification) +(defalias 'lsp-make-request 'lsp--make-notification) + +(defun lsp--make-response (id result) + "Create response for REQUEST with RESULT." + `(:jsonrpc "2.0" :id ,id :result ,result)) + +(defun lsp-make-notification (method &optional params) + "Create notification body for method METHOD and parameters PARAMS." + (lsp--make-notification method params)) + +(defmacro lsp--json-serialize (params) + (if (progn + (require 'json) + (fboundp 'json-serialize)) + `(json-serialize ,params + :null-object nil + :false-object :json-false) + `(let ((json-false :json-false)) + (json-encode ,params)))) + +(defun lsp--make-message (params) + "Create a LSP message from PARAMS, after encoding it to a JSON string." + (let ((body (lsp--json-serialize params))) + (concat "Content-Length: " + (number-to-string (1+ (string-bytes body))) + "\r\n\r\n" + body + "\n"))) + +(cl-defstruct lsp--log-entry timestamp process-time type method id body) + +(defun lsp--make-log-entry (method id body type &optional process-time) + "Create an outgoing log object from BODY with method METHOD and id ID. +If ID is non-nil, then the body is assumed to be a notification. +TYPE can either be `incoming' or `outgoing'" + (cl-assert (memq type '(incoming-req outgoing-req incoming-notif + outgoing-notif incoming-resp + outgoing-resp))) + (make-lsp--log-entry + :timestamp (format-time-string "%I:%M:%S %p") + :process-time process-time + :method method + :id id + :type type + :body body)) + +(defun lsp--log-font-lock-json (body) + "Font lock JSON BODY." + (with-temp-buffer + (insert body) + ;; We set the temp buffer file-name extension to .json and call `set-auto-mode' + ;; so the users configured json mode is used which could be + ;; `json-mode', `json-ts-mode', `jsonian-mode', etc. + (let ((buffer-file-name "lsp-log.json")) + (delay-mode-hooks + (set-auto-mode) + (if (fboundp 'font-lock-ensure) + (font-lock-ensure) + (with-no-warnings + (font-lock-fontify-buffer))))) + (buffer-string))) + +(defun lsp--log-entry-pp (entry) + (cl-assert (lsp--log-entry-p entry)) + (pcase-let (((cl-struct lsp--log-entry timestamp method id type process-time + body) + entry) + (json-false :json-false) + (json-encoding-pretty-print t) + (str nil)) + (setq str + (concat (format "[Trace - %s] " timestamp) + (pcase type + ('incoming-req (format "Received request '%s - (%s)." method id)) + ('outgoing-req (format "Sending request '%s - (%s)'." method id)) + + ('incoming-notif (format "Received notification '%s'." method)) + ('outgoing-notif (format "Sending notification '%s'." method)) + + ('incoming-resp (format "Received response '%s - (%s)' in %dms." + method id process-time)) + ('outgoing-resp + (format + "Sending response '%s - (%s)'. Processing request took %dms" + method id process-time))) + "\n" + (if (memq type '(incoming-resp ougoing-resp)) + "Result: " + "Params: ") + (lsp--log-font-lock-json (json-encode body)) + "\n\n\n")) + (setq str (propertize str 'mouse-face 'highlight 'read-only t)) + (insert str))) + +(defvar-local lsp--log-io-ewoc nil) + +(defun lsp--get-create-io-ewoc (workspace) + (if (and (lsp--workspace-ewoc workspace) + (buffer-live-p (ewoc-buffer (lsp--workspace-ewoc workspace)))) + (lsp--workspace-ewoc workspace) + (with-current-buffer (lsp--get-log-buffer-create workspace) + (unless (eq 'lsp-log-io-mode major-mode) (lsp-log-io-mode)) + (setq-local window-point-insertion-type t) + (setq lsp--log-io-ewoc (ewoc-create #'lsp--log-entry-pp nil nil t)) + (setf (lsp--workspace-ewoc workspace) lsp--log-io-ewoc)) + (lsp--workspace-ewoc workspace))) + +(defun lsp--ewoc-count (ewoc) + (let* ((count 0) + (count-fn (lambda (_) (setq count (1+ count))))) + (ewoc-map count-fn ewoc) + count)) + +(defun lsp--log-entry-new (entry workspace) + (let* ((ewoc (lsp--get-create-io-ewoc workspace)) + (count (and (not (eq lsp-io-messages-max t)) (lsp--ewoc-count ewoc))) + (node (if (or (eq lsp-io-messages-max t) + (>= lsp-io-messages-max count)) + nil + (ewoc-nth ewoc (1- lsp-io-messages-max)))) + (prev nil) + (inhibit-read-only t)) + (while node + (setq prev (ewoc-prev ewoc node)) + (ewoc-delete ewoc node) + (setq node prev)) + (ewoc-enter-last ewoc entry))) + +(defun lsp--send-notification (body) + "Send BODY as a notification to the language server." + (lsp-foreach-workspace + (when (lsp--log-io-p (plist-get body :method)) + (lsp--log-entry-new (lsp--make-log-entry + (plist-get body :method) + nil (plist-get body :params) 'outgoing-notif) + lsp--cur-workspace)) + (lsp--send-no-wait body + (lsp--workspace-proc lsp--cur-workspace)))) + +(defalias 'lsp-send-notification 'lsp--send-notification) + +(defun lsp-notify (method params) + "Send notification METHOD with PARAMS." + (lsp--send-notification (lsp--make-notification method params))) + +(defun lsp--cur-workspace-check () + "Check whether buffer lsp workspace(s) are set." + (cl-assert (lsp-workspaces) nil + "No language server(s) is associated with this buffer.")) + +(defun lsp--send-request (body &optional no-wait no-merge) + "Send BODY as a request to the language server, get the response. +If NO-WAIT is non-nil, don't synchronously wait for a response. +If NO-MERGE is non-nil, don't merge the results but return an +alist mapping workspace->result." + (lsp-request (plist-get body :method) + (plist-get body :params) + :no-wait no-wait + :no-merge no-merge)) + +(defalias 'lsp-send-request 'lsp--send-request + "Send BODY as a request to the language server and return the response +synchronously. +\n(fn BODY)") + +(cl-defun lsp-request (method params &key no-wait no-merge) + "Send request METHOD with PARAMS. +If NO-MERGE is non-nil, don't merge the results but return alist +workspace->result. +If NO-WAIT is non-nil send the request as notification." + (if no-wait + (lsp-notify method params) + (let* ((send-time (float-time)) + ;; max time by which we must get a response + (expected-time + (and + lsp-response-timeout + (+ send-time lsp-response-timeout))) + resp-result resp-error done?) + (unwind-protect + (progn + (lsp-request-async method params + (lambda (res) (setf resp-result (or res :finished)) (throw 'lsp-done '_)) + :error-handler (lambda (err) (setf resp-error err) (throw 'lsp-done '_)) + :no-merge no-merge + :mode 'detached + :cancel-token :sync-request) + (while (not (or resp-error resp-result)) + (if (functionp 'json-rpc-connection) + (catch 'lsp-done (sit-for 0.01)) + (catch 'lsp-done + (accept-process-output + nil + (if expected-time (- expected-time send-time) 1)))) + (setq send-time (float-time)) + (when (and expected-time (< expected-time send-time)) + (error "Timeout while waiting for response. Method: %s" method))) + (setq done? t) + (cond + ((eq resp-result :finished) nil) + (resp-result resp-result) + ((lsp-json-error? resp-error) (error (lsp:json-error-message resp-error))) + ((lsp-json-error? (cl-first resp-error)) + (error (lsp:json-error-message (cl-first resp-error)))))) + (unless done? + (lsp-cancel-request-by-token :sync-request)))))) + +(cl-defun lsp-request-while-no-input (method params) + "Send request METHOD with PARAMS and waits until there is no input. +Return same value as `lsp--while-no-input' and respecting `non-essential'." + (if (or non-essential (not lsp-request-while-no-input-may-block)) + (let* ((send-time (float-time)) + ;; max time by which we must get a response + (expected-time + (and + lsp-response-timeout + (+ send-time lsp-response-timeout))) + resp-result resp-error done?) + (unwind-protect + (progn + (lsp-request-async method params + (lambda (res) (setf resp-result (or res :finished)) (throw 'lsp-done '_)) + :error-handler (lambda (err) (setf resp-error err) (throw 'lsp-done '_)) + :mode 'detached + :cancel-token :sync-request) + (while (not (or resp-error resp-result (input-pending-p))) + (catch 'lsp-done + (sit-for + (if expected-time (- expected-time send-time) 1))) + (setq send-time (float-time)) + (when (and expected-time (< expected-time send-time)) + (error "Timeout while waiting for response. Method: %s" method))) + (setq done? (or resp-error resp-result)) + (cond + ((eq resp-result :finished) nil) + (resp-result resp-result) + ((lsp-json-error? resp-error) (error (lsp:json-error-message resp-error))) + ((lsp-json-error? (cl-first resp-error)) + (error (lsp:json-error-message (cl-first resp-error)))))) + (unless done? + (lsp-cancel-request-by-token :sync-request)) + (when (and (input-pending-p) lsp--throw-on-input) + (throw 'input :interrupted)))) + (lsp-request method params))) + +(defvar lsp--cancelable-requests (ht)) + +(cl-defun lsp-request-async (method params callback + &key mode error-handler cancel-handler no-merge cancel-token) + "Send METHOD with PARAMS as a request to the language server. +Call CALLBACK with the response received from the server +asynchronously. +MODE determines when the callback will be called depending on the +condition of the original buffer. It could be: +- `detached' which means that the callback will be executed no +matter what has happened to the buffer. +- `alive' - the callback will be executed only if the buffer from +which the call was executed is still alive. +- `current' the callback will be executed only if the original buffer +is still selected. +- `tick' - the callback will be executed only if the buffer was not modified. +- `unchanged' - the callback will be executed only if the buffer hasn't +changed and if the buffer is not modified. + +ERROR-HANDLER will be called in case the request has failed. +CANCEL-HANDLER will be called in case the request is being canceled. +If NO-MERGE is non-nil, don't merge the results but return alist +workspace->result. +CANCEL-TOKEN is the token that can be used to cancel request." + (lsp--send-request-async `(:jsonrpc "2.0" :method ,method :params ,params) + callback mode error-handler cancel-handler no-merge cancel-token)) + +(defun lsp--create-request-cancel (id workspaces hook buf method cancel-callback) + (lambda (&rest _) + (unless (and (equal 'post-command-hook hook) + (equal (current-buffer) buf)) + (lsp--request-cleanup-hooks id) + (with-lsp-workspaces workspaces + (lsp--cancel-request id) + (when cancel-callback (funcall cancel-callback))) + (lsp-log "Cancelling %s(%s) in hook %s" method id hook)))) + +(defun lsp--create-async-callback + (callback method no-merge workspaces) + "Create async handler expecting COUNT results, merge them and call CALLBACK. +MODE determines when the callback will be called depending on the +condition of the original buffer. METHOD is the invoked method. +If NO-MERGE is non-nil, don't merge the results but return alist +workspace->result. ID is the request id." + (let (results errors) + (lambda (result) + (push (cons lsp--cur-workspace result) + (if (eq result :error) errors results)) + (when (and (not (eq (length errors) (length workspaces))) + (eq (+ (length errors) (length results)) (length workspaces))) + (funcall callback + (if no-merge + results + (lsp--merge-results (-map #'cl-rest results) method))))))) + +(defcustom lsp-default-create-error-handler-fn nil + "Default error handler customization. +Handler should give METHOD as argument and return function of one argument +ERROR." + :type 'function + :group 'lsp-mode + :package-version '(lsp-mode . "8.0.1")) + +(defun lsp--create-default-error-handler (method) + "Default error handler. +METHOD is the executed method." + (if lsp-default-create-error-handler-fn + (funcall lsp-default-create-error-handler-fn method) + (lambda (error) + (lsp--warn "%s" (or (lsp--error-string error) + (format "%s Request has failed" method)))))) + +(defvar lsp--request-cleanup-hooks (ht)) + +(defun lsp--request-cleanup-hooks (request-id) + (when-let ((cleanup-function (gethash request-id lsp--request-cleanup-hooks))) + (funcall cleanup-function) + (remhash request-id lsp--request-cleanup-hooks))) + +(defun lsp-cancel-request-by-token (cancel-token) + "Cancel request using CANCEL-TOKEN." + (-when-let ((request-id . workspaces) (gethash cancel-token lsp--cancelable-requests)) + (with-lsp-workspaces workspaces + (lsp--cancel-request request-id)) + (remhash cancel-token lsp--cancelable-requests) + (lsp--request-cleanup-hooks request-id))) + +(defun lsp--send-request-async (body callback + &optional mode error-callback cancel-callback + no-merge cancel-token) + "Send BODY as a request to the language server. +Call CALLBACK with the response received from the server +asynchronously. +MODE determines when the callback will be called depending on the +condition of the original buffer. It could be: +- `detached' which means that the callback will be executed no +matter what has happened to the buffer. +- `alive' - the callback will be executed only if the buffer from +which the call was executed is still alive. +- `current' the callback will be executed only if the original buffer +is still selected. +- `tick' - the callback will be executed only if the buffer was not modified. +- `unchanged' - the callback will be executed only if the buffer hasn't +changed and if the buffer is not modified. + +ERROR-CALLBACK will be called in case the request has failed. +CANCEL-CALLBACK will be called in case the request is being canceled. +If NO-MERGE is non-nil, don't merge the results but return alist +workspace->result. +CANCEL-TOKEN is the token that can be used to cancel request." + (when cancel-token + (lsp-cancel-request-by-token cancel-token)) + + (if-let ((target-workspaces (lsp--find-workspaces-for body))) + (let* ((start-time (current-time)) + (method (plist-get body :method)) + (id (cl-incf lsp-last-id)) + (buf (current-buffer)) + (cancel-callback (when cancel-callback + (pcase mode + ((or 'alive 'tick 'unchanged) + (lambda () + (with-current-buffer buf + (funcall cancel-callback)))) + (_ cancel-callback)))) + ;; calculate what are the (hook . local) pairs which will cancel + ;; the request + (hooks (pcase mode + ('alive '((kill-buffer-hook . t))) + ('tick '((kill-buffer-hook . t) (after-change-functions . t))) + ('unchanged '((after-change-functions . t) (post-command-hook . nil))) + ('current '((post-command-hook . nil))))) + ;; note: lambdas in emacs can be compared but we should make sure + ;; that all of the captured arguments are the same - in our case + ;; `lsp--create-request-cancel' will return the same lambda when + ;; called with the same params. + (cleanup-hooks + (lambda () (mapc + (-lambda ((hook . local)) + (if local + (when (buffer-live-p buf) + (with-current-buffer buf + (remove-hook hook + (lsp--create-request-cancel + id target-workspaces hook buf method cancel-callback) + t))) + (remove-hook hook (lsp--create-request-cancel + id target-workspaces hook buf method cancel-callback)))) + hooks) + (remhash cancel-token lsp--cancelable-requests))) + (callback (pcase mode + ((or 'alive 'tick 'unchanged) (lambda (&rest args) + (with-current-buffer buf + (apply callback args)))) + (_ callback))) + (callback (lsp--create-async-callback callback + method + no-merge + target-workspaces)) + (callback (lambda (result) + (lsp--request-cleanup-hooks id) + (funcall callback result))) + (error-callback (lsp--create-async-callback + (or error-callback + (lsp--create-default-error-handler method)) + method + nil + target-workspaces)) + (error-callback (lambda (error) + (funcall callback :error) + (lsp--request-cleanup-hooks id) + (funcall error-callback error))) + (body (plist-put body :id id))) + + ;; cancel request in any of the hooks + (mapc (-lambda ((hook . local)) + (add-hook hook + (lsp--create-request-cancel + id target-workspaces hook buf method cancel-callback) + nil local)) + hooks) + (puthash id cleanup-hooks lsp--request-cleanup-hooks) + + (setq lsp--last-active-workspaces target-workspaces) + + (when cancel-token + (puthash cancel-token (cons id target-workspaces) lsp--cancelable-requests)) + + (seq-doseq (workspace target-workspaces) + (when (lsp--log-io-p method) + (lsp--log-entry-new (lsp--make-log-entry method id + (plist-get body :params) + 'outgoing-req) + workspace)) + (puthash id + (list callback error-callback method start-time (current-time)) + (-> workspace + (lsp--workspace-client) + (lsp--client-response-handlers))) + (lsp--send-no-wait body (lsp--workspace-proc workspace))) + body) + (error "The connected server(s) does not support method %s. +To find out what capabilities support your server use `M-x lsp-describe-session' +and expand the capabilities section" + (plist-get body :method)))) + +;; deprecated, use lsp-request-async. +(defalias 'lsp-send-request-async 'lsp--send-request-async) +(make-obsolete 'lsp-send-request-async 'lsp-request-async "lsp-mode 7.0.1") + +;; Clean up the entire state of lsp mode when Emacs is killed, to get rid of any +;; pending language servers. +(add-hook 'kill-emacs-hook #'lsp--global-teardown) + +(defun lsp--global-teardown () + "Unload working workspaces." + (lsp-foreach-workspace (lsp--shutdown-workspace))) + +(defun lsp--shutdown-workspace (&optional restart) + "Shut down the language server process for ‘lsp--cur-workspace’." + (with-demoted-errors "LSP error: %S" + (let ((lsp-response-timeout 0.5)) + (condition-case err + (lsp-request "shutdown" nil) + (error (lsp--error "%s" err)))) + (lsp-notify "exit" nil)) + (setf (lsp--workspace-shutdown-action lsp--cur-workspace) (or (and restart 'restart) 'shutdown)) + (lsp--uninitialize-workspace)) + +(defcustom lsp-inlay-hint-enable nil + "If non-nil it will enable inlay hints." + :type 'boolean + :group 'lsp-mode + :package-version '(lsp-mode . "8.0.1")) + +(defun lsp--uninitialize-workspace () + "Cleanup buffer state. +When a workspace is shut down, by request or from just +disappearing, unset all the variables related to it." + (-let [(&lsp-wks 'cmd-proc 'buffers) lsp--cur-workspace] + (lsp-process-kill cmd-proc) + (mapc (lambda (buf) + (when (lsp-buffer-live-p buf) + (lsp-with-current-buffer buf + (lsp-managed-mode -1)))) + buffers) + (lsp-diagnostics--workspace-cleanup lsp--cur-workspace))) + +(defun lsp--client-capabilities (&optional custom-capabilities) + "Return the client capabilities appending CUSTOM-CAPABILITIES." + (append + `((general . ((positionEncodings . ["utf-32", "utf-16"]))) + (workspace . ((workspaceEdit . ((documentChanges . t) + (resourceOperations . ["create" "rename" "delete"]))) + (applyEdit . t) + (symbol . ((symbolKind . ((valueSet . ,(apply 'vector (number-sequence 1 26))))))) + (executeCommand . ((dynamicRegistration . :json-false))) + ,@(when lsp-enable-file-watchers '((didChangeWatchedFiles . ((dynamicRegistration . t))))) + (workspaceFolders . t) + (configuration . t) + ,@(when lsp-semantic-tokens-enable + `((semanticTokens . ((refreshSupport . ,(or (and (boundp 'lsp-semantic-tokens-honor-refresh-requests) + lsp-semantic-tokens-honor-refresh-requests) + :json-false)))))) + ,@(when lsp-lens-enable '((codeLens . ((refreshSupport . t))))) + ,@(when lsp-inlay-hint-enable '((inlayHint . ((refreshSupport . :json-false))))) + (fileOperations . ((didCreate . :json-false) + (willCreate . :json-false) + (didRename . t) + (willRename . t) + (didDelete . :json-false) + (willDelete . :json-false))))) + (textDocument . ((declaration . ((dynamicRegistration . t) + (linkSupport . t))) + (definition . ((dynamicRegistration . t) + (linkSupport . t))) + (references . ((dynamicRegistration . t))) + (implementation . ((dynamicRegistration . t) + (linkSupport . t))) + (typeDefinition . ((dynamicRegistration . t) + (linkSupport . t))) + (synchronization . ((willSave . t) (didSave . t) (willSaveWaitUntil . t))) + (documentSymbol . ((symbolKind . ((valueSet . ,(apply 'vector (number-sequence 1 26))))) + (hierarchicalDocumentSymbolSupport . t))) + (formatting . ((dynamicRegistration . t))) + (rangeFormatting . ((dynamicRegistration . t))) + (onTypeFormatting . ((dynamicRegistration . t))) + ,@(when (and lsp-semantic-tokens-enable + (functionp 'lsp--semantic-tokens-capabilities)) + (lsp--semantic-tokens-capabilities)) + (rename . ((dynamicRegistration . t) (prepareSupport . t))) + (codeAction . ((dynamicRegistration . t) + (isPreferredSupport . t) + (codeActionLiteralSupport . ((codeActionKind . ((valueSet . ["" + "quickfix" + "refactor" + "refactor.extract" + "refactor.inline" + "refactor.rewrite" + "source" + "source.organizeImports"]))))) + (resolveSupport . ((properties . ["edit" "command"]))) + (dataSupport . t))) + (completion . ((completionItem . ((snippetSupport . ,(cond + ((and lsp-enable-snippet (not (featurep 'yasnippet)) t) + (lsp--warn (concat + "Yasnippet is not installed, but `lsp-enable-snippet' is set to `t'. " + "You must either install yasnippet, or disable snippet support.")) + :json-false) + (lsp-enable-snippet t) + (t :json-false))) + (documentationFormat . ["markdown" "plaintext"]) + ;; Remove this after jdtls support resolveSupport + (resolveAdditionalTextEditsSupport . t) + (insertReplaceSupport . t) + (deprecatedSupport . t) + (resolveSupport + . ((properties . ["documentation" + "detail" + "additionalTextEdits" + "command"]))) + (insertTextModeSupport . ((valueSet . [1 2]))))) + (contextSupport . t) + (dynamicRegistration . t))) + (signatureHelp . ((signatureInformation . ((parameterInformation . ((labelOffsetSupport . t))))) + (dynamicRegistration . t))) + (documentLink . ((dynamicRegistration . t) + (tooltipSupport . t))) + (hover . ((contentFormat . ["markdown" "plaintext"]) + (dynamicRegistration . t))) + ,@(when lsp-enable-folding + `((foldingRange . ((dynamicRegistration . t) + ,@(when lsp-folding-range-limit + `((rangeLimit . ,lsp-folding-range-limit))) + ,@(when lsp-folding-line-folding-only + `((lineFoldingOnly . t))))))) + (selectionRange . ((dynamicRegistration . t))) + (callHierarchy . ((dynamicRegistration . :json-false))) + (typeHierarchy . ((dynamicRegistration . t))) + (publishDiagnostics . ((relatedInformation . t) + (tagSupport . ((valueSet . [1 2]))) + (versionSupport . t))) + (linkedEditingRange . ((dynamicRegistration . t))))) + (window . ((workDoneProgress . t) + (showDocument . ((support . t)))))) + custom-capabilities)) + +(defun lsp-find-roots-for-workspace (workspace session) + "Get all roots for the WORKSPACE." + (-filter #'identity (ht-map (lambda (folder workspaces) + (when (-contains? workspaces workspace) + folder)) + (lsp-session-folder->servers session)))) + +(defun lsp-session-watches (&optional session) + "Get watches created for SESSION." + (or (gethash "__watches" (lsp-session-metadata (or session (lsp-session)))) + (-let [res (make-hash-table :test 'equal)] + (puthash "__watches" res (lsp-session-metadata (or session (lsp-session)))) + res))) + +(defun lsp--file-process-event (session root-folder event) + "Process file event." + (let* ((changed-file (cl-third event)) + (rel-changed-file (f-relative changed-file root-folder)) + (event-numeric-kind (alist-get (cl-second event) lsp--file-change-type)) + (bit-position (1- event-numeric-kind)) + (watch-bit (ash 1 bit-position))) + (->> + session + lsp-session-folder->servers + (gethash root-folder) + (seq-do (lambda (workspace) + (when (->> + workspace + lsp--workspace-registered-server-capabilities + (-any? + (lambda (capability) + (and + (equal (lsp--registered-capability-method capability) + "workspace/didChangeWatchedFiles") + (->> + capability + lsp--registered-capability-options + (lsp:did-change-watched-files-registration-options-watchers) + (seq-find + (-lambda ((fs-watcher &as &FileSystemWatcher :glob-pattern :kind? :_cachedRegexp cached-regexp)) + (when (or (null kind?) + (> (logand kind? watch-bit) 0)) + (-let [regexes (or cached-regexp + (let ((regexp (lsp-glob-to-regexps glob-pattern))) + (lsp-put fs-watcher :_cachedRegexp regexp) + regexp))] + (-any? (lambda (re) + (or (string-match re changed-file) + (string-match re rel-changed-file))) + regexes)))))))))) + (with-lsp-workspace workspace + (lsp-notify + "workspace/didChangeWatchedFiles" + `((changes . [((type . ,event-numeric-kind) + (uri . ,(lsp--path-to-uri changed-file)))])))))))))) + +(lsp-defun lsp--server-register-capability ((&Registration :method :id :register-options?)) + "Register capability REG." + (when (and lsp-enable-file-watchers + (equal method "workspace/didChangeWatchedFiles")) + (-let* ((created-watches (lsp-session-watches (lsp-session))) + (root-folders (cl-set-difference + (lsp-find-roots-for-workspace lsp--cur-workspace (lsp-session)) + (ht-keys created-watches)))) + ;; create watch for each root folder without such + (dolist (folder root-folders) + (let* ((watch (make-lsp-watch :root-directory folder)) + (ignored-things (lsp--get-ignored-regexes-for-workspace-root folder)) + (ignored-files-regex-list (car ignored-things)) + (ignored-directories-regex-list (cadr ignored-things))) + (puthash folder watch created-watches) + (lsp-watch-root-folder (file-truename folder) + (-partial #'lsp--file-process-event (lsp-session) folder) + ignored-files-regex-list + ignored-directories-regex-list + watch + t))))) + + (push + (make-lsp--registered-capability :id id :method method :options register-options?) + (lsp--workspace-registered-server-capabilities lsp--cur-workspace))) + +(defmacro lsp--with-workspace-temp-buffer (workspace-root &rest body) + "With a temp-buffer under `WORKSPACE-ROOT' and evaluate `BODY', useful to +access dir-local variables." + (declare (indent 1) (debug t)) + `(with-temp-buffer + ;; Set the buffer's name to something under the root so that we can hack the local variables + ;; This file doesn't need to exist and will not be created due to this. + (setq-local buffer-file-name (expand-file-name "lsp-mode-temp" (expand-file-name ,workspace-root))) + (hack-local-variables) + (prog1 ,@body + (setq-local buffer-file-name nil)))) + +(defun lsp--get-ignored-regexes-for-workspace-root (workspace-root) + "Return a list of the form +(lsp-file-watch-ignored-files lsp-file-watch-ignored-directories) for the given +WORKSPACE-ROOT." + ;; The intent of this function is to provide per-root workspace-level customization of the + ;; lsp-file-watch-ignored-directories and lsp-file-watch-ignored-files variables. + (lsp--with-workspace-temp-buffer workspace-root + (list lsp-file-watch-ignored-files (lsp-file-watch-ignored-directories)))) + + +(defun lsp--cleanup-hanging-watches () + "Cleanup watches in case there are no more workspaces that are interested +in that particular folder." + (let* ((session (lsp-session)) + (watches (lsp-session-watches session))) + (dolist (watched-folder (ht-keys watches)) + (when (-none? (lambda (workspace) + (with-lsp-workspace workspace + (lsp--registered-capability "workspace/didChangeWatchedFiles"))) + (gethash watched-folder (lsp-session-folder->servers (lsp-session)))) + (lsp-log "Cleaning up watches for folder %s. There is no workspace watching this folder..." watched-folder) + (lsp-kill-watch (gethash watched-folder watches)) + (remhash watched-folder watches))))) + +(lsp-defun lsp--server-unregister-capability ((&Unregistration :id :method)) + "Unregister capability UNREG." + (setf (lsp--workspace-registered-server-capabilities lsp--cur-workspace) + (seq-remove (lambda (e) (equal (lsp--registered-capability-id e) id)) + (lsp--workspace-registered-server-capabilities lsp--cur-workspace))) + (when (equal method "workspace/didChangeWatchedFiles") + (lsp--cleanup-hanging-watches))) + +(defun lsp--server-capabilities () + "Return the capabilities of the language server associated with the buffer." + (->> (lsp-workspaces) + (-keep #'lsp--workspace-server-capabilities) + (apply #'lsp-merge))) + +(defun lsp--send-open-close-p () + "Return whether open and close notifications should be sent to the server." + (let ((sync (lsp:server-capabilities-text-document-sync? (lsp--server-capabilities)))) + (or (memq sync '(1 2)) + (lsp:text-document-sync-options-open-close? sync)))) + +(defun lsp--send-will-save-p () + "Return whether willSave notifications should be sent to the server." + (-> (lsp--server-capabilities) + (lsp:server-capabilities-text-document-sync?) + (lsp:text-document-sync-options-will-save?))) + +(defun lsp--send-will-save-wait-until-p () + "Return whether willSaveWaitUntil notifications should be sent to the server." + (-> (lsp--server-capabilities) + (lsp:server-capabilities-text-document-sync?) + (lsp:text-document-sync-options-will-save-wait-until?))) + +(defun lsp--send-did-save-p () + "Return whether didSave notifications should be sent to the server." + (let ((sync (lsp:server-capabilities-text-document-sync? (lsp--server-capabilities)))) + (or (memq sync '(1 2)) + (lsp:text-document-sync-options-save? sync)))) + +(defun lsp--save-include-text-p () + "Return whether save notifications should include the text document's contents." + (->> (lsp--server-capabilities) + (lsp:server-capabilities-text-document-sync?) + (lsp:text-document-sync-options-save?) + (lsp:text-document-save-registration-options-include-text?))) + +(defun lsp--send-will-rename-files-p (path) + "Return whether willRenameFiles request should be sent to the server. +If any filters, checks if it applies for PATH." + (let* ((will-rename (-> (lsp--server-capabilities) + (lsp:server-capabilities-workspace?) + (lsp:workspace-server-capabilities-file-operations?) + (lsp:workspace-file-operations-will-rename?))) + (filters (seq-into (lsp:file-operation-registration-options-filters will-rename) 'list))) + (and will-rename + (or (seq-empty-p filters) + (-any? (-lambda ((&FileOperationFilter :scheme? :pattern (&FileOperationPattern :glob))) + (-let [regexes (lsp-glob-to-regexps glob)] + (and (or (not scheme?) + (string-prefix-p scheme? (lsp--path-to-uri path))) + (-any? (lambda (re) + (string-match re path)) + regexes)))) + filters))))) + +(defun lsp--send-did-rename-files-p () + "Return whether didRenameFiles notification should be sent to the server." + (-> (lsp--server-capabilities) + (lsp:server-capabilities-workspace?) + (lsp:workspace-server-capabilities-file-operations?) + (lsp:workspace-file-operations-did-rename?))) + +(declare-function project-roots "ext:project" (project) t) +(declare-function project-root "ext:project" (project) t) + +(defun lsp--suggest-project-root () + "Get project root." + (or + (when (featurep 'projectile) (condition-case nil + (projectile-project-root) + (error nil))) + (when (featurep 'project) + (when-let ((project (project-current))) + (if (fboundp 'project-root) + (project-root project) + (car (with-no-warnings + (project-roots project)))))) + default-directory)) + +(defun lsp--read-from-file (file) + "Read FILE content." + (when (file-exists-p file) + (cl-first (read-from-string (f-read-text file 'utf-8))))) + +(defun lsp--persist (file-name to-persist) + "Persist TO-PERSIST in FILE-NAME. + +This function creates the parent directories if they don't exist +yet." + (let ((print-length nil) + (print-level nil)) + ;; Create all parent directories: + (make-directory (f-parent file-name) t) + (f-write-text (prin1-to-string to-persist) 'utf-8 file-name))) + +(defun lsp-workspace-folders-add (project-root) + "Add PROJECT-ROOT to the list of workspace folders." + (interactive + (list (read-directory-name "Select folder to add: " + (or (lsp--suggest-project-root) default-directory) nil t))) + (cl-pushnew (lsp-f-canonical project-root) + (lsp-session-folders (lsp-session)) :test 'equal) + (lsp--persist-session (lsp-session)) + + (run-hook-with-args 'lsp-workspace-folders-changed-functions (list project-root) nil)) + +(defun lsp-workspace-folders-remove (project-root) + "Remove PROJECT-ROOT from the list of workspace folders." + (interactive (list (completing-read "Select folder to remove: " + (lsp-session-folders (lsp-session)) + nil t nil nil + (lsp-find-session-folder (lsp-session) default-directory)))) + + (setq project-root (lsp-f-canonical project-root)) + + ;; send remove folder to each multiroot workspace associated with the folder + (dolist (wks (->> (lsp-session) + (lsp-session-folder->servers) + (gethash project-root) + (--filter (lsp--client-multi-root (lsp--workspace-client it))))) + (with-lsp-workspace wks + (lsp-notify "workspace/didChangeWorkspaceFolders" + (lsp-make-did-change-workspace-folders-params + :event (lsp-make-workspace-folders-change-event + :removed (vector (lsp-make-workspace-folder + :uri (lsp--path-to-uri project-root) + :name (f-filename project-root))) + :added []))))) + + ;; turn off servers in the removed directory + (let* ((session (lsp-session)) + (folder->servers (lsp-session-folder->servers session)) + (server-id->folders (lsp-session-server-id->folders session)) + (workspaces (gethash project-root folder->servers))) + + (remhash project-root folder->servers) + + ;; turn off the servers without root folders + (dolist (workspace workspaces) + (when (--none? (-contains? it workspace) (ht-values folder->servers)) + (lsp--info "Shutdown %s since folder %s is removed..." + (lsp--workspace-print workspace) project-root) + (with-lsp-workspace workspace (lsp--shutdown-workspace)))) + + (setf (lsp-session-folders session) + (-remove-item project-root (lsp-session-folders session))) + + (ht-aeach (puthash key + (-remove-item project-root value) + server-id->folders) + server-id->folders) + (lsp--persist-session (lsp-session))) + + (run-hook-with-args 'lsp-workspace-folders-changed-functions nil (list project-root))) + +(defun lsp-workspace-blocklist-remove (project-root) + "Remove PROJECT-ROOT from the workspace blocklist." + (interactive (list (completing-read "Select folder to remove:" + (lsp-session-folders-blocklist (lsp-session)) + nil t))) + (setf (lsp-session-folders-blocklist (lsp-session)) + (delete project-root + (lsp-session-folders-blocklist (lsp-session)))) + (lsp--persist-session (lsp-session))) + +(define-obsolete-function-alias 'lsp-workspace-folders-switch + 'lsp-workspace-folders-open "lsp-mode 6.1") + +(defun lsp-workspace-folders-open (project-root) + "Open the directory located at PROJECT-ROOT" + (interactive (list (completing-read "Open folder: " + (lsp-session-folders (lsp-session)) + nil t))) + (find-file project-root)) + +(defun lsp--maybe-enable-signature-help (trigger-characters) + (let ((ch last-command-event)) + (when (cl-find ch trigger-characters :key #'string-to-char) + (lsp-signature-activate)))) + +(defun lsp--on-type-formatting-handler-create () + (when-let ((provider (lsp--capability-for-method "textDocument/onTypeFormatting" ))) + (-let [(&DocumentOnTypeFormattingOptions :more-trigger-character? + :first-trigger-character) provider] + (lambda () + (lsp--on-type-formatting first-trigger-character + more-trigger-character?))))) + +(defun lsp--update-on-type-formatting-hook (&optional cleanup?) + (let ((on-type-formatting-handler (lsp--on-type-formatting-handler-create))) + (cond + ((and lsp-enable-on-type-formatting on-type-formatting-handler (not cleanup?)) + (add-hook 'post-self-insert-hook on-type-formatting-handler nil t)) + ((or cleanup? + (not lsp-enable-on-type-formatting)) + (remove-hook 'post-self-insert-hook on-type-formatting-handler t))))) + +(defun lsp--signature-help-handler-create () + (-when-let ((&SignatureHelpOptions? :trigger-characters?) + (lsp--capability-for-method "textDocument/signatureHelp")) + (lambda () + (lsp--maybe-enable-signature-help trigger-characters?)))) + +(defun lsp--update-signature-help-hook (&optional cleanup?) + (let ((signature-help-handler (lsp--signature-help-handler-create))) + (cond + ((and (or (equal lsp-signature-auto-activate t) + (memq :on-trigger-char lsp-signature-auto-activate)) + signature-help-handler) + (add-hook 'post-self-insert-hook signature-help-handler nil t)) + + ((or cleanup? + (not (or (equal lsp-signature-auto-activate t) + (memq :on-trigger-char lsp-signature-auto-activate)))) + (remove-hook 'post-self-insert-hook signature-help-handler t))))) + +(defun lsp--after-set-visited-file-name () + (lsp-disconnect) + (lsp)) + +;; TODO remove those eldoc workarounds when dropping support for Emacs 27 +;; https://github.com/emacs-lsp/lsp-mode/issues/3295#issuecomment-1308994099 +(defvar eldoc-documentation-default) ; CI +(when (< emacs-major-version 28) + (unless (boundp 'eldoc-documentation-functions) + (load "eldoc")) + (when (memq (default-value 'eldoc-documentation-function) '(nil ignore)) + ;; actually `eldoc-documentation-strategy', but CI was failing + (setq-default eldoc-documentation-function 'eldoc-documentation-default))) + +(define-minor-mode lsp-managed-mode + "Mode for source buffers managed by lsp-mode." + :lighter nil + (cond + (lsp-managed-mode + (when (lsp-feature? "textDocument/hover") + (add-hook 'eldoc-documentation-functions #'lsp-eldoc-function nil t) + (eldoc-mode 1)) + + (add-hook 'after-change-functions #'lsp-on-change nil t) + (add-hook 'after-revert-hook #'lsp-on-revert nil t) + (add-hook 'after-save-hook #'lsp-on-save nil t) + (add-hook 'auto-save-hook #'lsp--on-auto-save nil t) + (add-hook 'before-change-functions #'lsp-before-change nil t) + (add-hook 'before-save-hook #'lsp--before-save nil t) + (add-hook 'kill-buffer-hook #'lsp--text-document-did-close nil t) + (add-hook 'post-command-hook #'lsp--post-command nil t) + + (lsp--update-on-type-formatting-hook) + (lsp--update-signature-help-hook) + + (when lsp-enable-xref + (add-hook 'xref-backend-functions #'lsp--xref-backend nil t)) + + (lsp-configure-buffer) + + ;; make sure we turn off lsp-mode in case major mode changes, because major + ;; mode change will wipe the buffer locals. + (add-hook 'change-major-mode-hook #'lsp-disconnect nil t) + (add-hook 'after-set-visited-file-name-hook #'lsp--after-set-visited-file-name nil t) + + (let ((buffer (lsp-current-buffer))) + (run-with-idle-timer + 0.0 nil + (lambda () + (when (lsp-buffer-live-p buffer) + (lsp-with-current-buffer buffer + (lsp--on-change-debounce buffer) + (lsp--on-idle buffer))))))) + (t + (lsp-unconfig-buffer) + + (remove-hook 'eldoc-documentation-functions #'lsp-eldoc-function t) + (remove-hook 'post-command-hook #'lsp--post-command t) + (remove-hook 'after-change-functions #'lsp-on-change t) + (remove-hook 'after-revert-hook #'lsp-on-revert t) + (remove-hook 'after-save-hook #'lsp-on-save t) + (remove-hook 'auto-save-hook #'lsp--on-auto-save t) + (remove-hook 'before-change-functions #'lsp-before-change t) + (remove-hook 'before-save-hook #'lsp--before-save t) + (remove-hook 'kill-buffer-hook #'lsp--text-document-did-close t) + + (lsp--update-on-type-formatting-hook :cleanup) + (lsp--update-signature-help-hook :cleanup) + + (when lsp--on-idle-timer + (cancel-timer lsp--on-idle-timer) + (setq lsp--on-idle-timer nil)) + + (remove-hook 'lsp-on-idle-hook #'lsp--document-links t) + (remove-hook 'lsp-on-idle-hook #'lsp--document-highlight t) + + (lsp--remove-overlays 'lsp-highlight) + (lsp--remove-overlays 'lsp-links) + + (remove-hook 'xref-backend-functions #'lsp--xref-backend t) + (remove-hook 'change-major-mode-hook #'lsp-disconnect t) + (remove-hook 'after-set-visited-file-name-hook #'lsp--after-set-visited-file-name t) + (setq-local lsp-buffer-uri nil)))) + +(defun lsp-configure-buffer () + "Configure LSP features for current buffer." + ;; make sure the core is running in the context of all available workspaces + ;; to avoid misconfiguration in case we are running in `with-lsp-workspace' context + (let ((lsp--buffer-workspaces (cond + (lsp--buffer-workspaces) + (lsp--cur-workspace (list lsp--cur-workspace)))) + lsp--cur-workspace) + (when lsp-auto-configure + (lsp--auto-configure) + + (when (and lsp-enable-text-document-color + (lsp-feature? "textDocument/documentColor")) + (add-hook 'lsp-on-change-hook #'lsp--document-color nil t)) + + (when (and lsp-enable-imenu + (lsp-feature? "textDocument/documentSymbol")) + (lsp-enable-imenu)) + + (when (and lsp-enable-indentation + (lsp-feature? "textDocument/rangeFormatting")) + (add-function :override (local 'indent-region-function) #'lsp-format-region)) + + (when (and lsp-enable-symbol-highlighting + (lsp-feature? "textDocument/documentHighlight")) + (add-hook 'lsp-on-idle-hook #'lsp--document-highlight nil t)) + + (when (and lsp-enable-links + (lsp-feature? "textDocument/documentLink")) + (add-hook 'lsp-on-idle-hook #'lsp--document-links nil t)) + + (when (and lsp-inlay-hint-enable + (lsp-feature? "textDocument/inlayHint")) + (lsp-inlay-hints-mode)) + + (when (and lsp-enable-dap-auto-configure + (functionp 'dap-mode)) + (dap-auto-configure-mode 1))) + (run-hooks 'lsp-configure-hook))) + +(defun lsp-unconfig-buffer () + "Unconfigure LSP features for buffer." + (lsp--remove-overlays 'lsp-color) + + (when (advice-function-member-p 'lsp--imenu-create-index imenu-create-index-function) + (remove-function (local 'imenu-create-index-function) #'lsp--imenu-create-index) + (setq-local imenu-menubar-modified-tick 0) + (setq-local imenu--index-alist nil) + (imenu--cleanup)) + + (remove-function (local 'indent-region-function) #'lsp-format-region) + + (remove-hook 'lsp-on-change-hook #'lsp--document-color t) + (remove-hook 'lsp-on-idle-hook #'lsp--document-highlight t) + (remove-hook 'lsp-on-idle-hook #'lsp--document-links t) + + (when (and lsp-enable-dap-auto-configure + (functionp 'dap-mode)) + (dap-auto-configure-mode -1)) + + (run-hooks 'lsp-unconfigure-hook)) + +(defun lsp--buffer-content () + (lsp-save-restriction-and-excursion + (or (lsp-virtual-buffer-call :buffer-string) + (buffer-substring-no-properties (point-min) + (point-max))))) + +(defun lsp--text-document-did-open () + "`document/didOpen' event." + (run-hooks 'lsp-before-open-hook) + (when (and lsp-auto-touch-files + (not (f-exists? (lsp--uri-to-path (lsp--buffer-uri))))) + (lsp--info "Saving file '%s' because it is not present on the disk." (lsp--buffer-uri)) + (save-buffer)) + + (setq lsp--cur-version (or lsp--cur-version 0)) + (cl-pushnew (lsp-current-buffer) (lsp--workspace-buffers lsp--cur-workspace)) + (lsp-notify + "textDocument/didOpen" + (list :textDocument + (list :uri (lsp--buffer-uri) + :languageId (lsp-buffer-language) + :version lsp--cur-version + :text (lsp--buffer-content)))) + + (lsp-managed-mode 1) + + (run-hooks 'lsp-after-open-hook) + (when-let ((client (-some-> lsp--cur-workspace (lsp--workspace-client)))) + (-some-> (lsp--client-after-open-fn client) + (funcall)) + (-some-> (format "lsp-%s-after-open-hook" (lsp--client-server-id client)) + (intern-soft) + (run-hooks)))) + +(defun lsp--text-document-identifier () + "Make TextDocumentIdentifier." + (list :uri (lsp--buffer-uri))) + +(defun lsp--versioned-text-document-identifier () + "Make VersionedTextDocumentIdentifier." + (plist-put (lsp--text-document-identifier) :version lsp--cur-version)) + +(defun lsp--cur-line (&optional point) + (1- (line-number-at-pos point))) + +(defun lsp--cur-position () + "Make a Position object for the current point." + (or (lsp-virtual-buffer-call :cur-position) + (lsp-save-restriction-and-excursion + (list :line (lsp--cur-line) + :character (- (point) (line-beginning-position)))))) + +(defun lsp--point-to-position (point) + "Convert POINT to Position." + (lsp-save-restriction-and-excursion + (goto-char point) + (lsp--cur-position))) + +(defun lsp--range (start end) + "Make Range body from START and END." + ;; make sure start and end are Position objects + (list :start start :end end)) + +(defun lsp--region-to-range (start end) + "Make Range object for the current region." + (lsp--range (lsp--point-to-position start) + (lsp--point-to-position end))) + +(defun lsp--region-or-line () + "The active region or the current line." + (if (use-region-p) + (lsp--region-to-range (region-beginning) (region-end)) + (lsp--region-to-range (line-beginning-position) (line-end-position)))) + +(defun lsp--check-document-changes-version (document-changes) + "Verify that DOCUMENT-CHANGES have the proper version." + (unless (seq-every-p + (-lambda ((&TextDocumentEdit :text-document)) + (or + (not text-document) + (let* ((filename (-> text-document + lsp:versioned-text-document-identifier-uri + lsp--uri-to-path)) + (version (lsp:versioned-text-document-identifier-version? text-document))) + (with-current-buffer (find-file-noselect filename) + (or (null version) (zerop version) (= -1 version) + (equal version lsp--cur-version)))))) + document-changes) + (error "Document changes cannot be applied due to different document version"))) + +(defun lsp--apply-workspace-edit (workspace-edit &optional operation) + "Apply the WorkspaceEdit object WORKSPACE-EDIT. +OPERATION is symbol representing the source of this text edit." + (-let (((&WorkspaceEdit :document-changes? :changes?) workspace-edit)) + (if-let ((document-changes (seq-reverse document-changes?))) + (progn + (lsp--check-document-changes-version document-changes) + (->> document-changes + (seq-filter (-lambda ((&CreateFile :kind)) (equal kind "create"))) + (seq-do (lambda (change) (lsp--apply-text-document-edit change operation)))) + (->> document-changes + (seq-filter (-lambda ((&CreateFile :kind)) + (and (or (not kind) (equal kind "edit")) + (not (equal kind "create"))))) + (seq-do (lambda (change) (lsp--apply-text-document-edit change operation)))) + (->> document-changes + (seq-filter (-lambda ((&CreateFile :kind)) + (and (not (or (not kind) (equal kind "edit"))) + (not (equal kind "create"))))) + (seq-do (lambda (change) (lsp--apply-text-document-edit change operation))))) + (lsp-map + (lambda (uri text-edits) + (with-current-buffer (-> uri lsp--uri-to-path find-file-noselect) + (lsp--apply-text-edits text-edits operation))) + changes?)))) + +(defmacro lsp-with-filename (file &rest body) + "Execute BODY with FILE as a context. +Need to handle the case when FILE indicates virtual buffer." + (declare (indent 1) (debug t)) + `(if-let ((lsp--virtual-buffer (get-text-property 0 'lsp-virtual-buffer ,file))) + (lsp-with-current-buffer lsp--virtual-buffer + ,@body) + ,@body)) + +(defun lsp--apply-text-document-edit (edit &optional operation) + "Apply the TextDocumentEdit object EDIT. +OPERATION is symbol representing the source of this text edit. +If the file is not being visited by any buffer, it is opened with +`find-file-noselect'. +Because lsp-mode does not store previous document versions, the edit is only +applied if the version of the textDocument matches the version of the +corresponding file. + +interface TextDocumentEdit { + textDocument: VersionedTextDocumentIdentifier; + edits: TextEdit[]; +}" + (pcase (lsp:edit-kind edit) + ("create" (-let* (((&CreateFile :uri :options?) edit) + (file-name (lsp--uri-to-path uri))) + (mkdir (f-dirname file-name) t) + (f-touch file-name) + (when (lsp:create-file-options-overwrite? options?) + (f-write-text "" nil file-name)) + (find-file-noselect file-name))) + ("delete" (-let (((&DeleteFile :uri :options? (&DeleteFileOptions? :recursive?)) edit)) + (f-delete (lsp--uri-to-path uri) recursive?))) + ("rename" (-let* (((&RenameFile :old-uri :new-uri :options? (&RenameFileOptions? :overwrite?)) edit) + (old-file-name (lsp--uri-to-path old-uri)) + (new-file-name (lsp--uri-to-path new-uri)) + (buf (find-buffer-visiting old-file-name))) + (when buf + (lsp-with-current-buffer buf + (save-buffer) + (lsp--text-document-did-close))) + (mkdir (f-dirname new-file-name) t) + (rename-file old-file-name new-file-name overwrite?) + (when buf + (lsp-with-current-buffer buf + (set-buffer-modified-p nil) + (setq lsp-buffer-uri nil) + (set-visited-file-name new-file-name) + (lsp))))) + (_ (let ((file-name (->> edit + (lsp:text-document-edit-text-document) + (lsp:versioned-text-document-identifier-uri) + (lsp--uri-to-path)))) + (lsp-with-current-buffer (find-buffer-visiting file-name) + (lsp-with-filename file-name + (lsp--apply-text-edits (lsp:text-document-edit-edits edit) operation))))))) + +(lsp-defun lsp--position-compare ((&Position :line left-line + :character left-character) + (&Position :line right-line + :character right-character)) + "Return t if position LEFT is greater than RIGHT." + (if (= left-line right-line) + (> left-character right-character) + (> left-line right-line))) + +(lsp-defun lsp-point-in-range? (position (&Range :start :end)) + "Returns if POINT is in RANGE." + (not (or (lsp--position-compare start position) + (lsp--position-compare position end)))) + +(lsp-defun lsp--position-equal ((&Position :line left-line + :character left-character) + (&Position :line right-line + :character right-character)) + "Return whether LEFT and RIGHT positions are equal." + (and (= left-line right-line) + (= left-character right-character))) + +(lsp-defun lsp--text-edit-sort-predicate ((&TextEdit :range (&Range :start left-start :end left-end)) + (&TextEdit :range (&Range :start right-start :end right-end))) + (if (lsp--position-equal left-start right-start) + (lsp--position-compare left-end right-end) + (lsp--position-compare left-start right-start))) + +(lsp-defun lsp--apply-text-edit ((edit &as &TextEdit :range (&RangeToPoint :start :end) :new-text)) + "Apply the edits described in the TextEdit object in TEXT-EDIT." + (setq new-text (s-replace "\r" "" (or new-text ""))) + (lsp:set-text-edit-new-text edit new-text) + (goto-char start) + (delete-region start end) + (insert new-text)) + +;; WORKAROUND: typescript-language might send -1 when applying code actions. +;; see https://github.com/emacs-lsp/lsp-mode/issues/1582 +(lsp-defun lsp--fix-point ((point &as &Position :character :line)) + (-doto point + (lsp:set-position-line (max 0 line)) + (lsp:set-position-character (max 0 character)))) + +(lsp-defun lsp--apply-text-edit-replace-buffer-contents ((edit &as + &TextEdit + :range (&Range :start :end) + :new-text)) + "Apply the edits described in the TextEdit object in TEXT-EDIT. +The method uses `replace-buffer-contents'." + (setq new-text (s-replace "\r" "" (or new-text ""))) + (lsp:set-text-edit-new-text edit new-text) + (-let* ((source (current-buffer)) + ((beg . end) (lsp--range-to-region (lsp-make-range :start (lsp--fix-point start) + :end (lsp--fix-point end))))) + (with-temp-buffer + (insert new-text) + (let ((temp (current-buffer))) + (with-current-buffer source + (save-excursion + (save-restriction + (narrow-to-region beg end) + + ;; On emacs versions < 26.2, + ;; `replace-buffer-contents' is buggy - it calls + ;; change functions with invalid arguments - so we + ;; manually call the change functions here. + ;; + ;; See emacs bugs #32237, #32278: + ;; https://debbugs.gnu.org/cgi/bugreport.cgi?bug=32237 + ;; https://debbugs.gnu.org/cgi/bugreport.cgi?bug=32278 + (let ((inhibit-modification-hooks t) + (length (- end beg))) + (run-hook-with-args 'before-change-functions + beg end) + (replace-buffer-contents temp) + (run-hook-with-args 'after-change-functions + beg (+ beg (length new-text)) + length))))))))) + +(defun lsp--to-yasnippet-snippet (snippet) + "Convert LSP SNIPPET to yasnippet snippet." + ;; LSP snippet doesn't escape "{" and "`", but yasnippet requires escaping it. + (replace-regexp-in-string (rx (or bos (not (any "$" "\\"))) (group (or "{" "`"))) + (rx "\\" (backref 1)) + snippet + nil nil 1)) + +(defvar-local lsp-enable-relative-indentation nil + "Enable relative indentation when insert texts, snippets ... +from language server.") + +(defun lsp--expand-snippet (snippet &optional start end expand-env) + "Wrapper of `yas-expand-snippet' with all of it arguments. +The snippet will be convert to LSP style and indent according to +LSP server result." + (let* ((inhibit-field-text-motion t) + (yas-wrap-around-region nil) + (yas-indent-line 'none) + (yas-also-auto-indent-first-line nil)) + (yas-expand-snippet + (lsp--to-yasnippet-snippet snippet) + start end expand-env))) + +(defun lsp--indent-lines (start end &optional insert-text-mode?) + "Indent from START to END based on INSERT-TEXT-MODE? value. +- When INSERT-TEXT-MODE? is provided + - if it's `lsp/insert-text-mode-as-it', do no editor indentation. + - if it's `lsp/insert-text-mode-adjust-indentation', adjust leading + whitespaces to match the line where text is inserted. +- When it's not provided, using `indent-line-function' for each line." + (save-excursion + (goto-char end) + (let* ((end-line (line-number-at-pos)) + (offset (save-excursion + (goto-char start) + (current-indentation))) + (indent-line-function + (cond ((equal insert-text-mode? lsp/insert-text-mode-as-it) + #'ignore) + ((or (equal insert-text-mode? lsp/insert-text-mode-adjust-indentation) + lsp-enable-relative-indentation + ;; Indenting snippets is extremely slow in `org-mode' buffers + ;; since it has to calculate indentation based on SRC block + ;; position. Thus we use relative indentation as default. + (derived-mode-p 'org-mode)) + (lambda () (save-excursion + (beginning-of-line) + (indent-to-column offset)))) + (t indent-line-function)))) + (goto-char start) + (forward-line) + (while (and (not (eobp)) + (<= (line-number-at-pos) end-line)) + (funcall indent-line-function) + (forward-line))))) + +(defun lsp--apply-text-edits (edits &optional operation) + "Apply the EDITS described in the TextEdit[] object. +OPERATION is symbol representing the source of this text edit." + (unless (seq-empty-p edits) + (atomic-change-group + (run-hooks 'lsp-before-apply-edits-hook) + (let* ((change-group (prepare-change-group)) + (howmany (length edits)) + (message (format "Applying %s edits to `%s' ..." howmany (current-buffer))) + (_ (lsp--info message)) + (reporter (make-progress-reporter message 0 howmany)) + (done 0) + (apply-edit (if (not lsp--virtual-buffer) + #'lsp--apply-text-edit-replace-buffer-contents + #'lsp--apply-text-edit))) + (unwind-protect + (->> edits + ;; We sort text edits so as to apply edits that modify latter + ;; parts of the document first. Furthermore, because the LSP + ;; spec dictates that: "If multiple inserts have the same + ;; position, the order in the array defines which edit to + ;; apply first." We reverse the initial list and sort stably + ;; to make sure the order among edits with the same position + ;; is preserved. + (nreverse) + (seq-sort #'lsp--text-edit-sort-predicate) + (mapc (lambda (edit) + (progress-reporter-update reporter (cl-incf done)) + (funcall apply-edit edit) + (when (lsp:snippet-text-edit-insert-text-format? edit) + (-when-let ((&SnippetTextEdit :range (&RangeToPoint :start) + :insert-text-format? :new-text) edit) + (when (eq insert-text-format? lsp/insert-text-format-snippet) + ;; No `save-excursion' needed since expand snippet will change point anyway + (goto-char (+ start (length new-text))) + (lsp--indent-lines start (point)) + (lsp--expand-snippet new-text start (point))))) + (run-hook-with-args 'lsp-after-apply-edits-hook operation)))) + (undo-amalgamate-change-group change-group) + (progress-reporter-done reporter)))))) + +(defun lsp--create-apply-text-edits-handlers () + "Create (handler cleanup-fn) for applying text edits in async request. +Only works when mode is `tick or `alive." + (let* (first-edited + (func (lambda (start &rest _) + (setq first-edited (if first-edited + (min start first-edited) + start))))) + (add-hook 'before-change-functions func nil t) + (list + (lambda (edits) + (if (and first-edited + (seq-find (-lambda ((&TextEdit :range (&RangeToPoint :end))) + ;; Text edit region is overlapped + (> end first-edited)) + edits)) + (lsp--warn "TextEdits will not be applied since document has been modified before of them.") + (lsp--apply-text-edits edits 'completion-cleanup))) + (lambda () + (remove-hook 'before-change-functions func t))))) + +(defun lsp--capability (cap &optional capabilities) + "Get the value of capability CAP. If CAPABILITIES is non-nil, use them instead." + (when (stringp cap) + (setq cap (intern (concat ":" cap)))) + + (lsp-get (or capabilities + (lsp--server-capabilities)) + cap)) + +(defun lsp--registered-capability (method) + "Check whether there is workspace providing METHOD." + (->> (lsp-workspaces) + (--keep (seq-find (lambda (reg) + (equal (lsp--registered-capability-method reg) method)) + (lsp--workspace-registered-server-capabilities it))) + cl-first)) + +(defun lsp--capability-for-method (method) + "Get the value of capability for METHOD." + (-let* ((reqs (cdr (assoc method lsp-method-requirements))) + ((&plist :capability) reqs)) + (or (and capability (lsp--capability capability)) + (-some-> (lsp--registered-capability method) + (lsp--registered-capability-options))))) + +(defvar-local lsp--before-change-vals nil + "Store the positions from the `lsp-before-change' function call, for +validation and use in the `lsp-on-change' function.") + +(defun lsp--text-document-content-change-event (start end length) + "Make a TextDocumentContentChangeEvent body for START to END, of length LENGTH." + ;; So (47 54 0) means add 7 chars starting at pos 47 + ;; must become + ;; {"range":{"start":{"line":5,"character":6} + ;; ,"end" :{"line":5,"character":6}} + ;; ,"rangeLength":0 + ;; ,"text":"\nbb = 5"} + ;; + ;; And (47 47 7) means delete 7 chars starting at pos 47 + ;; must become + ;; {"range":{"start":{"line":6,"character":0} + ;; ,"end" :{"line":7,"character":0}} + ;; ,"rangeLength":7 + ;; ,"text":""} + ;; + ;; (208 221 3) means delete 3 chars starting at pos 208, and replace them with + ;; 13 chars. So it must become + ;; {"range":{"start":{"line":5,"character":8} + ;; ,"end" :{"line":5,"character":11}} + ;; ,"rangeLength":3 + ;; ,"text":"new-chars-xxx"} + ;; + + ;; Adding text: + ;; lsp-before-change:(start,end)=(33,33) + ;; lsp-on-change:(start,end,length)=(33,34,0) + ;; + ;; Changing text: + ;; lsp-before-change:(start,end)=(208,211) + ;; lsp-on-change:(start,end,length)=(208,221,3) + ;; + ;; Deleting text: + ;; lsp-before-change:(start,end)=(19,27) + ;; lsp-on-change:(start,end,length)=(19,19,8) + (if (zerop length) + ;; Adding something only, work from start only + `( :range ,(lsp--range + (lsp--point-to-position start) + (lsp--point-to-position start)) + :rangeLength 0 + :text ,(buffer-substring-no-properties start end)) + + (if (eq start end) + ;; Deleting something only + (if (lsp--bracketed-change-p start length) + ;; The before-change value is bracketed, use it + `( :range ,(lsp--range + (lsp--point-to-position start) + (plist-get lsp--before-change-vals :end-pos)) + :rangeLength ,length + :text "") + ;; If the change is not bracketed, send a full change event instead. + (lsp--full-change-event)) + + ;; Deleting some things, adding others + (if (lsp--bracketed-change-p start length) + ;; The before-change value is valid, use it + `( :range ,(lsp--range + (lsp--point-to-position start) + (plist-get lsp--before-change-vals :end-pos)) + :rangeLength ,length + :text ,(buffer-substring-no-properties start end)) + (lsp--full-change-event))))) + +(defun lsp--bracketed-change-p (start length) + "If the before and after positions are the same, and the length +is the size of the start range, we are probably good." + (-let [(&plist :end before-end :start before-start) lsp--before-change-vals] + (and (eq start before-start) + (eq length (- before-end before-start))))) + +(defun lsp--full-change-event () + `(:text ,(lsp--buffer-content))) + +(defun lsp-before-change (start end) + "Executed before a file is changed. +Added to `before-change-functions'." + ;; Note: + ;; + ;; This variable holds a list of functions to call when Emacs is about to + ;; modify a buffer. Each function gets two arguments, the beginning and end of + ;; the region that is about to change, represented as integers. The buffer + ;; that is about to change is always the current buffer when the function is + ;; called. + ;; + ;; WARNING: + ;; + ;; Do not expect the before-change hooks and the after-change hooks be called + ;; in balanced pairs around each buffer change. Also don't expect the + ;; before-change hooks to be called for every chunk of text Emacs is about to + ;; delete. These hooks are provided on the assumption that Lisp programs will + ;; use either before- or the after-change hooks, but not both, and the + ;; boundaries of the region where the changes happen might include more than + ;; just the actual changed text, or even lump together several changes done + ;; piecemeal. + (save-match-data + (lsp-save-restriction-and-excursion + (setq lsp--before-change-vals + (list :start start + :end end + :end-pos (lsp--point-to-position end)))))) + +(defun lsp--flush-delayed-changes () + (let ((inhibit-quit t)) + (when lsp--delay-timer + (cancel-timer lsp--delay-timer)) + (mapc (-lambda ((workspace buffer document change)) + (with-current-buffer buffer + (with-lsp-workspace workspace + (lsp-notify "textDocument/didChange" + (list :textDocument document + :contentChanges (vector change)))))) + (prog1 (nreverse lsp--delayed-requests) + (setq lsp--delayed-requests nil))))) + +(defun lsp--workspace-sync-method (workspace) + (let ((sync (-> workspace + (lsp--workspace-server-capabilities) + (lsp:server-capabilities-text-document-sync?)))) + (if (lsp-text-document-sync-options? sync) + (lsp:text-document-sync-options-change? sync) + sync))) + +(defun lsp-on-change (start end length &optional content-change-event-fn) + "Executed when a file is changed. +Added to `after-change-functions'." + ;; Note: + ;; + ;; Each function receives three arguments: the beginning and end of the region + ;; just changed, and the length of the text that existed before the change. + ;; All three arguments are integers. The buffer that has been changed is + ;; always the current buffer when the function is called. + ;; + ;; The length of the old text is the difference between the buffer positions + ;; before and after that text as it was before the change. As for the + ;; changed text, its length is simply the difference between the first two + ;; arguments. + ;; + ;; So (47 54 0) means add 7 chars starting at pos 47 + ;; So (47 47 7) means delete 7 chars starting at pos 47 + (save-match-data + (let ((inhibit-quit t) + ;; make sure that `lsp-on-change' is called in multi-workspace context + ;; see #2901 + lsp--cur-workspace) + ;; A (revert-buffer) call with the 'preserve-modes parameter (eg, as done + ;; by auto-revert-mode) will cause this handler to get called with a nil + ;; buffer-file-name. We need the buffer-file-name to send notifications; + ;; so we skip handling revert-buffer-caused changes and instead handle + ;; reverts separately in lsp-on-revert + (when (not revert-buffer-in-progress-p) + (cl-incf lsp--cur-version) + (mapc + (lambda (workspace) + (pcase (or lsp-document-sync-method + (lsp--workspace-sync-method workspace)) + (1 + (if lsp-debounce-full-sync-notifications + (setq lsp--delayed-requests + (->> lsp--delayed-requests + (-remove (-lambda ((_ buffer)) + (equal (current-buffer) buffer))) + (cons (list workspace + (current-buffer) + (lsp--versioned-text-document-identifier) + (lsp--full-change-event))))) + (with-lsp-workspace workspace + (lsp-notify "textDocument/didChange" + (list :contentChanges (vector (lsp--full-change-event)) + :textDocument (lsp--versioned-text-document-identifier)))))) + (2 + (with-lsp-workspace workspace + (lsp-notify + "textDocument/didChange" + (list :textDocument (lsp--versioned-text-document-identifier) + :contentChanges (vector + (if content-change-event-fn + (funcall content-change-event-fn start end length) + (lsp--text-document-content-change-event + start end length))))))))) + (lsp-workspaces)) + (when lsp--delay-timer (cancel-timer lsp--delay-timer)) + (setq lsp--delay-timer (run-with-idle-timer + lsp-debounce-full-sync-notifications-interval + nil + #'lsp--flush-delayed-changes)) + ;; force cleanup overlays after each change + (lsp--remove-overlays 'lsp-highlight) + (lsp--after-change (current-buffer)) + (setq lsp--signature-last-index nil + lsp--signature-last nil) + ;; cleanup diagnostics + (when lsp-diagnostic-clean-after-change + (lsp-foreach-workspace + (-let [diagnostics (lsp--workspace-diagnostics lsp--cur-workspace)] + (remhash (lsp--fix-path-casing (buffer-file-name)) diagnostics)))))))) + + + +;; facilities for on change hooks. We do not want to make lsp calls on each +;; change event so we add debounce to avoid flooding the server with events. +;; Additionally, we want to have a mechanism for stopping the server calls in +;; particular cases like, e. g. when performing completion. + +(defvar lsp-inhibit-lsp-hooks nil + "Flag to control.") + +(defcustom lsp-on-change-hook nil + "Hooks to run when buffer has changed." + :type 'hook + :group 'lsp-mode) + +(defcustom lsp-idle-delay 0.500 + "Debounce interval for `after-change-functions'." + :type 'number + :group 'lsp-mode) + +(defcustom lsp-on-idle-hook nil + "Hooks to run after `lsp-idle-delay'." + :type 'hook + :group 'lsp-mode) + +(defun lsp--idle-reschedule (buffer) + (when lsp--on-idle-timer + (cancel-timer lsp--on-idle-timer)) + + (setq lsp--on-idle-timer (run-with-idle-timer + lsp-idle-delay + nil + #'lsp--on-idle + buffer))) + +(defun lsp--post-command () + (lsp--cleanup-highlights-if-needed) + (lsp--idle-reschedule (current-buffer))) + +(defun lsp--on-idle (buffer) + "Start post command loop." + (when (and (buffer-live-p buffer) + (equal buffer (current-buffer)) + (not lsp-inhibit-lsp-hooks) + lsp-managed-mode) + (run-hooks 'lsp-on-idle-hook))) + +(defun lsp--on-change-debounce (buffer) + (when (and (buffer-live-p buffer) + (equal buffer (current-buffer)) + (not lsp-inhibit-lsp-hooks) + lsp-managed-mode) + (run-hooks 'lsp-on-change-hook))) + +(defun lsp--after-change (buffer) + (when (fboundp 'lsp--semantic-tokens-refresh-if-enabled) + (lsp--semantic-tokens-refresh-if-enabled buffer)) + (when lsp--on-change-timer + (cancel-timer lsp--on-change-timer)) + (setq lsp--on-change-timer (run-with-idle-timer + lsp-idle-delay + nil + #'lsp--on-change-debounce + buffer)) + (lsp--idle-reschedule buffer)) + + +(defcustom lsp-trim-trailing-whitespace t + "Trim trailing whitespace on a line." + :group 'lsp-mode + :type 'boolean) + +(defcustom lsp-insert-final-newline t + "Insert a newline character at the end of the file if one does not exist." + :group 'lsp-mode + :type 'boolean) + +(defcustom lsp-trim-final-newlines t + "Trim all newlines after the final newline at the end of the file." + :group 'lsp-mode + :type 'boolean) + + +(defun lsp--on-type-formatting (first-trigger-characters more-trigger-characters) + "Self insert handling. +Applies on type formatting." + (let ((ch last-command-event)) + (when (or (eq (string-to-char first-trigger-characters) ch) + (cl-find ch more-trigger-characters :key #'string-to-char)) + (lsp-request-async "textDocument/onTypeFormatting" + (lsp-make-document-on-type-formatting-params + :text-document (lsp--text-document-identifier) + :options (lsp-make-formatting-options + :tab-size (symbol-value (lsp--get-indent-width major-mode)) + :insert-spaces (lsp-json-bool (not indent-tabs-mode)) + :trim-trailing-whitespace? (lsp-json-bool lsp-trim-trailing-whitespace) + :insert-final-newline? (lsp-json-bool lsp-insert-final-newline) + :trim-final-newlines? (lsp-json-bool lsp-trim-final-newlines)) + :ch (char-to-string ch) + :position (lsp--cur-position)) + (lambda (data) (lsp--apply-text-edits data 'format)) + :mode 'tick)))) + + +;; links +(defun lsp--document-links () + (when (lsp-feature? "textDocument/documentLink") + (lsp-request-async + "textDocument/documentLink" + `(:textDocument ,(lsp--text-document-identifier)) + (lambda (links) + (lsp--remove-overlays 'lsp-link) + (seq-do + (-lambda ((link &as &DocumentLink :range (&Range :start :end))) + (-doto (make-button (lsp--position-to-point start) + (lsp--position-to-point end) + 'action (lsp--document-link-keymap link) + 'keymap (let ((map (make-sparse-keymap))) + (define-key map [M-return] 'push-button) + (define-key map [mouse-2] 'push-button) + map) + 'help-echo "mouse-2, M-RET: Visit this link") + (overlay-put 'lsp-link t))) + links)) + :mode 'unchanged))) + +(defun lsp--document-link-handle-target (url) + (let* ((parsed-url (url-generic-parse-url (url-unhex-string url))) + (type (url-type parsed-url))) + (pcase type + ("file" + (xref-push-marker-stack) + (find-file (lsp--uri-to-path url)) + (-when-let ((_ line column) (s-match (rx "#" (group (1+ num)) (or "," "#") (group (1+ num))) url)) + (goto-char (lsp--position-to-point + (lsp-make-position :character (1- (string-to-number column)) + :line (1- (string-to-number line))))))) + ((or "http" "https") (browse-url url)) + (type (if-let ((handler (lsp--get-uri-handler type))) + (funcall handler url) + (signal 'lsp-file-scheme-not-supported (list url))))))) + +(lsp-defun lsp--document-link-keymap ((link &as &DocumentLink :target?)) + (if target? + (lambda (_) + (interactive) + (lsp--document-link-handle-target target?)) + (lambda (_) + (interactive) + (when (lsp:document-link-registration-options-resolve-provider? + (lsp--capability-for-method "textDocument/documentLink")) + (lsp-request-async + "documentLink/resolve" + link + (-lambda ((&DocumentLink :target?)) + (lsp--document-link-handle-target target?))))))) + + + +(defcustom lsp-warn-no-matched-clients t + "Whether to show messages when there are no supported clients." + :group 'lsp-mode + :type 'boolean) + +(defun lsp-buffer-language--configured-id () + "Return nil when not registered." + (->> lsp-language-id-configuration + (-first + (-lambda ((mode-or-pattern . language)) + (cond + ((and (stringp mode-or-pattern) + (s-matches? mode-or-pattern (buffer-file-name))) + language) + ((eq mode-or-pattern major-mode) language)))) + cl-rest)) + +(defvar-local lsp--buffer-language nil + "Locally cached returned value of `lsp-buffer-language'.") + +(defun lsp-buffer-language () + "Get language corresponding current buffer." + (or lsp--buffer-language + (let* ((configured-language (lsp-buffer-language--configured-id))) + (setq lsp--buffer-language + (or configured-language + ;; ensure non-nil + (string-remove-suffix "-mode" (symbol-name major-mode)))) + (when (and lsp-warn-no-matched-clients + (null configured-language)) + (lsp-warn "Unable to calculate the languageId for buffer `%s'. \ +Take a look at `lsp-language-id-configuration'. The `major-mode' is %s" + (buffer-name) + major-mode)) + lsp--buffer-language))) + +(defun lsp-activate-on (&rest languages) + "Returns language activation function. +The function will return t when the `lsp-buffer-language' returns +one of the LANGUAGES." + (lambda (_file-name _mode) + (-contains? languages (lsp-buffer-language)))) + +(defun lsp-workspace-root (&optional path) + "Find the workspace root for the current file or PATH." + (-when-let* ((file-name (or path (buffer-file-name))) + (file-name (lsp-f-canonical file-name))) + (->> (lsp-session) + (lsp-session-folders) + (--filter (and (lsp--files-same-host it file-name) + (or (lsp-f-ancestor-of? it file-name) + (equal it file-name)))) + (--max-by (> (length it) (length other)))))) + +(defun lsp-on-revert () + "Executed when a file is reverted. +Added to `after-revert-hook'." + (let ((n (buffer-size)) + (revert-buffer-in-progress-p nil)) + (lsp-on-change 0 n n))) + +(defun lsp--text-document-did-close (&optional keep-workspace-alive) + "Executed when the file is closed, added to `kill-buffer-hook'. + +If KEEP-WORKSPACE-ALIVE is non-nil, do not shutdown the workspace +if it's closing the last buffer in the workspace." + (lsp-foreach-workspace + (cl-callf2 delq (lsp-current-buffer) (lsp--workspace-buffers lsp--cur-workspace)) + (with-demoted-errors "Error sending didClose notification in ‘lsp--text-document-did-close’: %S" + (lsp-notify "textDocument/didClose" + `(:textDocument ,(lsp--text-document-identifier)))) + (when (and (not lsp-keep-workspace-alive) + (not keep-workspace-alive) + (not (lsp--workspace-buffers lsp--cur-workspace))) + (lsp--shutdown-workspace)))) + +(defun lsp--will-save-text-document-params (reason) + (list :textDocument (lsp--text-document-identifier) + :reason reason)) + +(defun lsp--before-save () + "Before save handler." + (with-demoted-errors "Error in ‘lsp--before-save’: %S" + (let ((params (lsp--will-save-text-document-params 1))) + (when (lsp--send-will-save-p) + (lsp-notify "textDocument/willSave" params)) + (when (and (lsp--send-will-save-wait-until-p) lsp-before-save-edits) + (let ((lsp-response-timeout 0.1)) + (condition-case nil + (lsp--apply-text-edits + (lsp-request "textDocument/willSaveWaitUntil" + params) + 'before-save) + (error))))))) + +(defun lsp--on-auto-save () + "Handler for auto-save." + (when (lsp--send-will-save-p) + (with-demoted-errors "Error in ‘lsp--on-auto-save’: %S" + (lsp-notify "textDocument/willSave" (lsp--will-save-text-document-params 2))))) + +(defun lsp--text-document-did-save () + "Executed when the file is closed, added to `after-save-hook''." + (when (lsp--send-did-save-p) + (with-demoted-errors "Error on ‘lsp--text-document-did-save: %S’" + (lsp-notify "textDocument/didSave" + `( :textDocument ,(lsp--versioned-text-document-identifier) + ,@(when (lsp--save-include-text-p) + (list :text (lsp--buffer-content)))))))) + +(defun lsp--text-document-position-params (&optional identifier position) + "Make TextDocumentPositionParams for the current point in the current document. +If IDENTIFIER and POSITION are non-nil, they will be used as the document +identifier and the position respectively." + (list :textDocument (or identifier (lsp--text-document-identifier)) + :position (or position (lsp--cur-position)))) + +(defun lsp--get-buffer-diagnostics () + "Return buffer diagnostics." + (gethash (or + (plist-get lsp--virtual-buffer :buffer-file-name) + (lsp--fix-path-casing (buffer-file-name))) + (lsp-diagnostics t))) + +(defun lsp-cur-line-diagnostics () + "Return any diagnostics that apply to the current line." + (-let [(&plist :start (&plist :line start) :end (&plist :line end)) (lsp--region-or-line)] + (cl-coerce (-filter + (-lambda ((&Diagnostic :range (&Range :start (&Position :line)))) + (and (>= line start) (<= line end))) + (lsp--get-buffer-diagnostics)) + 'vector))) + +(lsp-defun lsp-range-overlapping?((left &as &Range :start left-start :end left-end) + (right &as &Range :start right-start :end right-end)) + (or (lsp-point-in-range? right-start left) + (lsp-point-in-range? right-end left) + (lsp-point-in-range? left-start right) + (lsp-point-in-range? left-end right))) + +(defun lsp-make-position-1 (position) + (lsp-make-position :line (plist-get position :line) + :character (plist-get position :character))) + +(defun lsp-cur-possition-diagnostics () + "Return any diagnostics that apply to the current line." + (-let* ((start (if (use-region-p) (region-beginning) (point))) + (end (if (use-region-p) (region-end) (point))) + (current-range (lsp-make-range :start (lsp-make-position-1 (lsp-point-to-position start)) + :end (lsp-make-position-1 (lsp-point-to-position end))))) + (->> (lsp--get-buffer-diagnostics) + (-filter + (-lambda ((&Diagnostic :range)) + (lsp-range-overlapping? range current-range))) + (apply 'vector)))) + +(defalias 'lsp--cur-line-diagnotics 'lsp-cur-line-diagnostics) + +(defun lsp--extract-line-from-buffer (pos) + "Return the line pointed to by POS (a Position object) in the current buffer." + (let* ((point (lsp--position-to-point pos)) + (inhibit-field-text-motion t)) + (save-excursion + (goto-char point) + (buffer-substring (line-beginning-position) (line-end-position))))) + +(lsp-defun lsp--xref-make-item (filename (&Range :start (start &as &Position :character start-char :line start-line) + :end (end &as &Position :character end-char))) + "Return a xref-item from a RANGE in FILENAME." + (let* ((line (lsp--extract-line-from-buffer start)) + (len (length line))) + (add-face-text-property (max (min start-char len) 0) + (max (min end-char len) 0) + 'xref-match t line) + ;; LINE is nil when FILENAME is not being current visited by any buffer. + (xref-make (or line filename) + (xref-make-file-location + filename + (lsp-translate-line (1+ start-line)) + (lsp-translate-column start-char))))) + +(defun lsp--location-uri (loc) + (if (lsp-location? loc) + (lsp:location-uri loc) + (lsp:location-link-target-uri loc))) + +(lsp-defun lsp-goto-location ((loc &as &Location :uri :range (&Range :start))) + "Go to location." + (let ((path (lsp--uri-to-path uri))) + (if (f-exists? path) + (with-current-buffer (find-file path) + (goto-char (lsp--position-to-point start))) + (error "There is no file %s" path)))) + +(defun lsp--location-range (loc) + (if (lsp-location? loc) + (lsp:location-range loc) + (lsp:location-link-target-selection-range loc))) + +(defun lsp--locations-to-xref-items (locations) + "Return a list of `xref-item' given LOCATIONS, which can be of +type Location, LocationLink, Location[] or LocationLink[]." + (setq locations + (pcase locations + ((seq (or (Location) + (LocationLink))) + (append locations nil)) + ((or (Location) + (LocationLink)) + (list locations)))) + + (cl-labels ((get-xrefs-in-file + (file-locs) + (-let [(filename . matches) file-locs] + (condition-case err + (let ((visiting (find-buffer-visiting filename)) + (fn (lambda (loc) + (lsp-with-filename filename + (lsp--xref-make-item filename + (lsp--location-range loc)))))) + (if visiting + (with-current-buffer visiting + (seq-map fn matches)) + (when (file-readable-p filename) + (with-temp-buffer + (insert-file-contents-literally filename) + (seq-map fn matches))))) + (error (lsp-warn "Failed to process xref entry for filename '%s': %s" + filename (error-message-string err))) + (file-error (lsp-warn "Failed to process xref entry, file-error, '%s': %s" + filename (error-message-string err))))))) + + (->> locations + (seq-sort #'lsp--location-before-p) + (seq-group-by (-compose #'lsp--uri-to-path #'lsp--location-uri)) + (seq-map #'get-xrefs-in-file) + (apply #'nconc)))) + +(defun lsp--location-before-p (left right) + "Sort first by file, then by line, then by column." + (let ((left-uri (lsp--location-uri left)) + (right-uri (lsp--location-uri right))) + (if (not (string= left-uri right-uri)) + (string< left-uri right-uri) + (-let (((&Range :start left-start) (lsp--location-range left)) + ((&Range :start right-start) (lsp--location-range right))) + (lsp--position-compare right-start left-start))))) + +(defun lsp--make-reference-params (&optional td-position exclude-declaration) + "Make a ReferenceParam object. +If TD-POSITION is non-nil, use it as TextDocumentPositionParams object instead. +If EXCLUDE-DECLARATION is non-nil, request the server to include declarations." + (let ((json-false :json-false)) + (plist-put (or td-position (lsp--text-document-position-params)) + :context `(:includeDeclaration ,(lsp-json-bool (not exclude-declaration)))))) + +(defun lsp--cancel-request (id) + "Cancel request with ID in all workspaces." + (lsp-foreach-workspace + (->> lsp--cur-workspace lsp--workspace-client lsp--client-response-handlers (remhash id)) + (lsp-notify "$/cancelRequest" `(:id ,id)))) + +(defvar-local lsp--hover-saved-bounds nil) + +(defun lsp-eldoc-function (cb &rest _ignored) + "`lsp-mode' eldoc function to display hover info (based on `textDocument/hover')." + (if (and lsp--hover-saved-bounds + (lsp--point-in-bounds-p lsp--hover-saved-bounds)) + lsp--eldoc-saved-message + (setq lsp--hover-saved-bounds nil + lsp--eldoc-saved-message nil) + (if (looking-at-p "[[:space:]\n]") + (setq lsp--eldoc-saved-message nil) ; And returns nil. + (when (and lsp-eldoc-enable-hover (lsp--capability :hoverProvider)) + (lsp-request-async + "textDocument/hover" + (lsp--text-document-position-params) + (-lambda ((hover &as &Hover? :range? :contents)) + (setq lsp--hover-saved-bounds (when range? + (lsp--range-to-region range?))) + (funcall cb (setq lsp--eldoc-saved-message + (when contents + (lsp--render-on-hover-content + contents + lsp-eldoc-render-all))))) + :error-handler #'ignore + :mode 'tick + :cancel-token :eldoc-hover))))) + +(defun lsp--point-on-highlight? () + (-some? (lambda (overlay) + (overlay-get overlay 'lsp-highlight)) + (overlays-at (point)))) + +(defun lsp--cleanup-highlights-if-needed () + (when (and lsp-enable-symbol-highlighting + lsp--have-document-highlights + (not (lsp--point-on-highlight?))) + (lsp--remove-overlays 'lsp-highlight) + (setq lsp--have-document-highlights nil) + (lsp-cancel-request-by-token :highlights))) + +(defvar-local lsp--symbol-bounds-of-last-highlight-invocation nil + "The bounds of the symbol from which `lsp--document-highlight' + most recently requested highlights.") + +(defun lsp--document-highlight () + (when (lsp-feature? "textDocument/documentHighlight") + (let ((curr-sym-bounds (bounds-of-thing-at-point 'symbol))) + (unless (or (looking-at-p "[[:space:]\n]") + (not lsp-enable-symbol-highlighting) + (and lsp--have-document-highlights + curr-sym-bounds + (equal curr-sym-bounds + lsp--symbol-bounds-of-last-highlight-invocation))) + (setq lsp--symbol-bounds-of-last-highlight-invocation + curr-sym-bounds) + (lsp-request-async "textDocument/documentHighlight" + (lsp--text-document-position-params) + #'lsp--document-highlight-callback + :mode 'tick + :cancel-token :highlights))))) + +(defun lsp--help-open-link (&rest _) + "Open markdown link at point via mouse or keyboard." + (interactive "P") + (let ((buffer-list-update-hook nil)) + (-let [(buffer point) (if-let* ((valid (and (listp last-input-event) + (eq (car last-input-event) 'mouse-2))) + (event (cadr last-input-event)) + (win (posn-window event)) + (buffer (window-buffer win))) + `(,buffer ,(posn-point event)) + `(,(current-buffer) ,(point)))] + (with-current-buffer buffer + (when-let* ((face (get-text-property point 'face)) + (url (or (and (eq face 'markdown-link-face) + (get-text-property point 'help-echo)) + (and (memq face '(markdown-url-face markdown-plain-url-face)) + (nth 3 (markdown-link-at-pos point)))))) + (lsp--document-link-handle-target url)))))) + +(defvar lsp-help-mode-map + (-doto (make-sparse-keymap) + (define-key [remap markdown-follow-link-at-point] #'lsp--help-open-link)) + "Keymap for `lsp-help-mode'.") + +(define-derived-mode lsp-help-mode help-mode "LspHelp" + "Major mode for displaying lsp help.") + +(defun lsp-describe-thing-at-point () + "Display the type signature and documentation of the thing at point." + (interactive) + (let ((contents (-some->> (lsp--text-document-position-params) + (lsp--make-request "textDocument/hover") + (lsp--send-request) + (lsp:hover-contents)))) + (if (and contents (not (equal contents ""))) + (let ((lsp-help-buf-name "*lsp-help*")) + (with-current-buffer (get-buffer-create lsp-help-buf-name) + (let ((delay-mode-hooks t)) + (lsp-help-mode) + (with-help-window lsp-help-buf-name + (insert (string-trim-right (lsp--render-on-hover-content contents t))))) + (run-mode-hooks))) + (lsp--info "No content at point.")))) + +(defun lsp--point-in-bounds-p (bounds) + "Return whether the current point is within BOUNDS." + (and (<= (car bounds) (point)) (< (point) (cdr bounds)))) + +(defun lsp-get-renderer (language) + "Get renderer for LANGUAGE." + (lambda (str) + (lsp--render-string str language))) + +(defun lsp--setup-markdown (mode) + "Setup the ‘markdown-mode’ in the frame. +MODE is the mode used in the parent frame." + (make-local-variable 'markdown-code-lang-modes) + (dolist (mark (alist-get mode lsp-custom-markup-modes)) + (add-to-list 'markdown-code-lang-modes (cons mark mode))) + (setq-local markdown-fontify-code-blocks-natively t) + (setq-local markdown-fontify-code-block-default-mode mode) + (setq-local markdown-hide-markup t) + + ;; Render some common HTML entities. + ;; This should really happen in markdown-mode instead, + ;; but it doesn't, so we do it here for now. + (setq prettify-symbols-alist + (cl-loop for i from 0 to 255 + collect (cons (format "&#x%02X;" i) i))) + (push '("<" . ?<) prettify-symbols-alist) + (push '(">" . ?>) prettify-symbols-alist) + (push '("&" . ?&) prettify-symbols-alist) + (push '(" " . ? ) prettify-symbols-alist) + (setq prettify-symbols-compose-predicate + (lambda (_start _end _match) t)) + (prettify-symbols-mode 1)) + +(defvar lsp-help-link-keymap + (let ((map (make-sparse-keymap))) + (define-key map [mouse-2] #'lsp--help-open-link) + (define-key map "\r" #'lsp--help-open-link) + map) + "Keymap active on links in *lsp-help* mode.") + +(defun lsp--fix-markdown-links () + (let ((inhibit-read-only t) + (inhibit-modification-hooks t) + (prop)) + (save-restriction + (goto-char (point-min)) + (while (setq prop (markdown-find-next-prop 'face)) + (let ((end (or (next-single-property-change (car prop) 'face) + (point-max)))) + (when (memq (get-text-property (car prop) 'face) + '(markdown-link-face + markdown-url-face + markdown-plain-url-face)) + (add-text-properties (car prop) end + (list 'button t + 'category 'lsp-help-link + 'follow-link t + 'keymap lsp-help-link-keymap))) + (goto-char end)))))) + +(defun lsp--buffer-string-visible () + "Return visible buffer string. +Stolen from `org-copy-visible'." + (let ((temp (generate-new-buffer " *temp*")) + (beg (point-min)) + (end (point-max))) + (while (/= beg end) + (when (get-char-property beg 'invisible) + (setq beg (next-single-char-property-change beg 'invisible nil end))) + (let* ((next (next-single-char-property-change beg 'invisible nil end)) + (substring (buffer-substring beg next))) + (with-current-buffer temp (insert substring)) + ;; (setq result (concat result substring)) + (setq beg next))) + (setq deactivate-mark t) + (prog1 (with-current-buffer temp + (s-chop-suffix "\n" (buffer-string))) + (kill-buffer temp)))) + +(defvar lsp-buffer-major-mode nil + "Holds the major mode when fontification function is running. +See #2588") + +(defvar view-inhibit-help-message) + +(defun lsp--render-markdown () + "Render markdown." + + (let ((markdown-enable-math nil)) + (goto-char (point-min)) + (while (re-search-forward + (rx (and "\\" (group (or "\\" "`" "*" "_" ":" "/" + "{" "}" "[" "]" "(" ")" + "#" "+" "-" "." "!" "|")))) + nil t) + (replace-match (rx (backref 1)))) + + ;; markdown-mode v2.3 does not yet provide gfm-view-mode + (if (fboundp 'gfm-view-mode) + (let ((view-inhibit-help-message t)) + (gfm-view-mode)) + (gfm-mode)) + + (lsp--setup-markdown lsp-buffer-major-mode))) + +(defvar lsp--display-inline-image-alist + '((lsp--render-markdown + (:regexp + "!\\[.*?\\](data:image/[a-zA-Z]+;base64,\\([A-Za-z0-9+/\n]+?=*?\\)\\(|[^)]+\\)?)" + :sexp + (create-image + (base64-decode-string + (buffer-substring-no-properties (match-beginning 1) (match-end 1))) + nil t)))) + "Replaced string regexp and function returning image. +Each element should have the form (MODE . (PROPERTY-LIST...)). +MODE (car) is function which is defined in `lsp-language-id-configuration'. +Cdr should be list of PROPERTY-LIST. + +Each PROPERTY-LIST should have properties: +:regexp Regexp which determines what string is relpaced to image. + You should also get information of image, by parenthesis constructs. + By default, all matched string is replaced to image, but you can + change index of replaced string by keyword :replaced-index. + +:sexp Return image when evaluated. You can use information of regexp + by using (match-beggining N), (match-end N) or (match-substring N). + +In addition, each can have property: +:replaced-index Determine index which is used to replace regexp to image. + The value means first argument of `match-beginning' and + `match-end'. If omitted, interpreted as index 0.") + +(defcustom lsp-display-inline-image t + "Showing inline image or not." + :group 'lsp-mode + :type 'boolean) + +(defcustom lsp-enable-suggest-server-download t + "When non-nil enable server downloading suggestions." + :group 'lsp-mode + :type 'boolean + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-auto-register-remote-clients t + "When non-nil register remote when registering the local one." + :group 'lsp-mode + :type 'boolean + :package-version '(lsp-mode . "8.0.1")) + +(defun lsp--display-inline-image (mode) + "Add image property if available." + (let ((plist-list (cdr (assq mode lsp--display-inline-image-alist)))) + (when (and (display-images-p) lsp-display-inline-image) + (cl-loop + for plist in plist-list + with regexp with replaced-index + do + (setq regexp (plist-get plist :regexp)) + (setq replaced-index (or (plist-get plist :replaced-index) 0)) + + (font-lock-remove-keywords nil (list regexp replaced-index)) + (let ((inhibit-read-only t)) + (save-excursion + (goto-char (point-min)) + (while (re-search-forward regexp nil t) + (set-text-properties + (match-beginning replaced-index) (match-end replaced-index) + nil) + (add-text-properties + (match-beginning replaced-index) (match-end replaced-index) + `(display ,(eval (plist-get plist :sexp))))))))))) + +(defun lsp--fontlock-with-mode (str mode) + "Fontlock STR with MODE." + (let ((lsp-buffer-major-mode major-mode)) + (with-temp-buffer + (with-demoted-errors "Error during doc rendering: %s" + (insert str) + (delay-mode-hooks (funcall mode)) + (cl-flet ((window-body-width () lsp-window-body-width)) + ;; This can go wrong in some cases, and the fontification would + ;; not work as expected. + ;; + ;; See #2984 + (ignore-errors (font-lock-ensure)) + (lsp--display-inline-image mode) + (when (eq mode 'lsp--render-markdown) + (lsp--fix-markdown-links)))) + (lsp--buffer-string-visible)))) + +(defun lsp--render-string (str language) + "Render STR using `major-mode' corresponding to LANGUAGE. +When language is nil render as markup if `markdown-mode' is loaded." + (setq str (s-replace "\r" "" (or str ""))) + (if-let* ((modes (-keep (-lambda ((mode . lang)) + (when (and (equal lang language) (functionp mode)) + mode)) + lsp-language-id-configuration)) + (mode (car (or (member major-mode modes) modes)))) + (lsp--fontlock-with-mode str mode) + str)) + +(defun lsp--render-element (content) + "Render CONTENT element." + (let ((inhibit-message t)) + (or + (pcase content + ((MarkedString :value :language) + (lsp--render-string value language)) + ((MarkupContent :value :kind) + (lsp--render-string value kind)) + ;; plain string + ((pred stringp) (lsp--render-string content "markdown")) + ((pred null) "") + (_ (error "Failed to handle %s" content))) + ""))) + +(defun lsp--create-unique-string-fn () + (let (elements) + (lambda (element) + (let ((count (cl-count element elements :test #'string=))) + (prog1 (if (zerop count) + element + (format "%s (%s)" element count)) + (push element elements)))))) + +(defun lsp--select-action (actions) + "Select an action to execute from ACTIONS." + (cond + ((seq-empty-p actions) (signal 'lsp-no-code-actions nil)) + ((and (eq (seq-length actions) 1) lsp-auto-execute-action) + (lsp-seq-first actions)) + (t (let ((completion-ignore-case t)) + (lsp--completing-read "Select code action: " + (seq-into actions 'list) + (-compose (lsp--create-unique-string-fn) + #'lsp:code-action-title) + nil t))))) + +(defun lsp--workspace-server-id (workspace) + "Return the server ID of WORKSPACE." + (-> workspace lsp--workspace-client lsp--client-server-id)) + +(defun lsp--handle-rendered-for-echo-area (contents) + "Return a single line from RENDERED, appropriate for display in the echo area." + (pcase (lsp-workspaces) + (`(,workspace) + (lsp-clients-extract-signature-on-hover contents (lsp--workspace-server-id workspace))) + ;; For projects with multiple active workspaces we also default to + ;; render the first line. + (_ (lsp-clients-extract-signature-on-hover contents nil)))) + +(cl-defmethod lsp-clients-extract-signature-on-hover (contents _server-id) + "Extract a representative line from CONTENTS, to show in the echo area." + (car (s-lines (s-trim (lsp--render-element contents))))) + +(defun lsp--render-on-hover-content (contents render-all) + "Render the content received from `document/onHover' request. +CONTENTS - MarkedString | MarkedString[] | MarkupContent +RENDER-ALL - nil if only the signature should be rendered." + (cond + ((lsp-markup-content? contents) + ;; MarkupContent. + ;; It tends to be long and is not suitable to display fully in the echo area. + ;; Just display the first line which is typically the signature. + (if render-all + (lsp--render-element contents) + (lsp--handle-rendered-for-echo-area contents))) + ((and (stringp contents) (not (string-match-p "\n" contents))) + ;; If the contents is a single string containing a single line, + ;; render it always. + (lsp--render-element contents)) + (t + ;; MarkedString -> MarkedString[] + (when (or (lsp-marked-string? contents) (stringp contents)) + (setq contents (list contents))) + ;; Consider the signature consisting of the elements who have a renderable + ;; "language" property. When render-all is nil, ignore other elements. + (string-join + (seq-map + #'lsp--render-element + (if render-all + contents + ;; Only render contents that have an available renderer. + (seq-take + (seq-filter + (-andfn #'lsp-marked-string? + (-compose #'lsp-get-renderer #'lsp:marked-string-language)) + contents) + 1))) + (if (bound-and-true-p page-break-lines-mode) + "\n \n" + "\n"))))) + + + +(defvar lsp-signature-mode-map + (-doto (make-sparse-keymap) + (define-key (kbd "M-n") #'lsp-signature-next) + (define-key (kbd "M-p") #'lsp-signature-previous) + (define-key (kbd "M-a") #'lsp-signature-toggle-full-docs) + (define-key (kbd "C-c C-k") #'lsp-signature-stop) + (define-key (kbd "C-g") #'lsp-signature-stop)) + "Keymap for `lsp-signature-mode'.") + +(define-minor-mode lsp-signature-mode + "Mode used to show signature popup." + :keymap lsp-signature-mode-map + :lighter "" + :group 'lsp-mode) + +(defun lsp-signature-stop () + "Stop showing current signature help." + (interactive) + (lsp-cancel-request-by-token :signature) + (remove-hook 'post-command-hook #'lsp-signature) + (funcall lsp-signature-function nil) + (lsp-signature-mode -1)) + +(declare-function page-break-lines--update-display-tables "ext:page-break-lines") + +(defun lsp--setup-page-break-mode-if-present () + "Enable `page-break-lines-mode' in current buffer." + (when (fboundp 'page-break-lines-mode) + (page-break-lines-mode) + ;; force page-break-lines-mode to update the display tables. + (page-break-lines--update-display-tables))) + +(defun lsp-lv-message (message) + (add-hook 'lv-window-hook #'lsp--setup-page-break-mode-if-present) + (if message + (progn + (setq lsp--signature-last-buffer (current-buffer)) + (let ((lv-force-update t)) + (lv-message "%s" message))) + (lv-delete-window) + (remove-hook 'lv-window-hook #'lsp--setup-page-break-mode-if-present))) + +(declare-function posframe-show "ext:posframe") +(declare-function posframe-hide "ext:posframe") +(declare-function posframe-poshandler-point-bottom-left-corner-upward "ext:posframe") + +(defface lsp-signature-posframe + '((t :inherit tooltip)) + "Background and foreground for `lsp-signature-posframe'." + :group 'lsp-mode) + +(defvar lsp-signature-posframe-params + (list :poshandler #'posframe-poshandler-point-bottom-left-corner-upward + :height 10 + :width 60 + :border-width 1 + :min-width 60) + "Params for signature and `posframe-show'.") + +(defun lsp-signature-posframe (str) + "Use posframe to show the STR signatureHelp string." + (if str + (apply #'posframe-show + (with-current-buffer (get-buffer-create " *lsp-signature*") + (erase-buffer) + (insert str) + (visual-line-mode 1) + (lsp--setup-page-break-mode-if-present) + (current-buffer)) + (append + lsp-signature-posframe-params + (list :position (point) + :background-color (face-attribute 'lsp-signature-posframe :background nil t) + :foreground-color (face-attribute 'lsp-signature-posframe :foreground nil t) + :border-color (face-attribute 'font-lock-comment-face :foreground nil t)))) + (posframe-hide " *lsp-signature*"))) + +(defun lsp--handle-signature-update (signature) + (let ((message + (if (lsp-signature-help? signature) + (lsp--signature->message signature) + (mapconcat #'lsp--signature->message signature "\n")))) + (if (s-present? message) + (funcall lsp-signature-function message) + (lsp-signature-stop)))) + +(defun lsp-signature-activate () + "Activate signature help. +It will show up only if current point has signature help." + (interactive) + (setq lsp--signature-last nil + lsp--signature-last-index nil + lsp--signature-last-buffer (current-buffer)) + (add-hook 'post-command-hook #'lsp-signature) + (lsp-signature-mode t)) + +(defcustom lsp-signature-cycle t + "Whether `lsp-signature-next' and prev should cycle." + :type 'boolean + :group 'lsp-mode) + +(defun lsp-signature-next () + "Show next signature." + (interactive) + (let ((nsigs (length (lsp:signature-help-signatures lsp--signature-last)))) + (when (and lsp--signature-last-index + lsp--signature-last + (or lsp-signature-cycle (< (1+ lsp--signature-last-index) nsigs))) + (setq lsp--signature-last-index (% (1+ lsp--signature-last-index) nsigs)) + (funcall lsp-signature-function (lsp--signature->message lsp--signature-last))))) + +(defun lsp-signature-previous () + "Next signature." + (interactive) + (when (and lsp--signature-last-index + lsp--signature-last + (or lsp-signature-cycle (not (zerop lsp--signature-last-index)))) + (setq lsp--signature-last-index (1- (if (zerop lsp--signature-last-index) + (length (lsp:signature-help-signatures lsp--signature-last)) + lsp--signature-last-index))) + (funcall lsp-signature-function (lsp--signature->message lsp--signature-last)))) + +(defun lsp-signature-toggle-full-docs () + "Toggle full/partial signature documentation." + (interactive) + (let ((all? (not (numberp lsp-signature-doc-lines)))) + (setq lsp-signature-doc-lines (if all? + (or (car-safe lsp-signature-doc-lines) + 20) + (list lsp-signature-doc-lines)))) + (lsp-signature-activate)) + +(defun lsp--signature->message (signature-help) + "Generate eldoc message from SIGNATURE-HELP response." + (setq lsp--signature-last signature-help) + + (when (and signature-help (not (seq-empty-p (lsp:signature-help-signatures signature-help)))) + (-let* (((&SignatureHelp :active-signature? + :active-parameter? + :signatures) signature-help) + (active-signature? (or lsp--signature-last-index active-signature? 0)) + (_ (setq lsp--signature-last-index active-signature?)) + ((signature &as &SignatureInformation? :label :parameters?) (seq-elt signatures active-signature?)) + (prefix (if (= (length signatures) 1) + "" + (concat (propertize (format " %s/%s" + (1+ active-signature?) + (length signatures)) + 'face 'success) + " "))) + (method-docs (when + (and lsp-signature-render-documentation + (or (not (numberp lsp-signature-doc-lines)) (< 0 lsp-signature-doc-lines))) + (let ((docs (lsp--render-element + (lsp:parameter-information-documentation? signature)))) + (when (s-present? docs) + (concat + "\n" + (if (fboundp 'page-break-lines-mode) + " \n" + "") + (if (and (numberp lsp-signature-doc-lines) + (> (length (s-lines docs)) lsp-signature-doc-lines)) + (concat (s-join "\n" (-take lsp-signature-doc-lines (s-lines docs))) + (propertize "\nTruncated..." 'face 'highlight)) + docs))))))) + (when (and active-parameter? (not (seq-empty-p parameters?))) + (-when-let* ((param (when (and (< -1 active-parameter? (length parameters?))) + (seq-elt parameters? active-parameter?))) + (selected-param-label (let ((label (lsp:parameter-information-label param))) + (if (stringp label) label (append label nil)))) + (start (if (stringp selected-param-label) + (s-index-of selected-param-label label) + (cl-first selected-param-label))) + (end (if (stringp selected-param-label) + (+ start (length selected-param-label)) + (cl-second selected-param-label)))) + (add-face-text-property start end 'eldoc-highlight-function-argument nil label))) + (concat prefix label method-docs)))) + +(defun lsp-signature () + "Display signature info (based on `textDocument/signatureHelp')" + (if (and lsp--signature-last-buffer + (not (equal (current-buffer) lsp--signature-last-buffer))) + (lsp-signature-stop) + (lsp-request-async "textDocument/signatureHelp" + (lsp--text-document-position-params) + #'lsp--handle-signature-update + :cancel-token :signature))) + + +(defcustom lsp-overlay-document-color-char "■" + "Display the char represent the document color in overlay" + :type 'string + :group 'lsp-mode) + +;; color presentation +(defun lsp--color-create-interactive-command (color range) + (lambda () + (interactive) + (-let [(&ColorPresentation? :text-edit? + :additional-text-edits?) + (lsp--completing-read + "Select color presentation: " + (lsp-request + "textDocument/colorPresentation" + `( :textDocument ,(lsp--text-document-identifier) + :color ,color + :range ,range)) + #'lsp:color-presentation-label + nil + t)] + (when text-edit? + (lsp--apply-text-edit text-edit?)) + (when additional-text-edits? + (lsp--apply-text-edits additional-text-edits? 'color-presentation))))) + +(defun lsp--number->color (number) + (let ((result (format "%x" + (round (* (or number 0) 255.0))))) + (if (= 1 (length result)) + (concat "0" result) + result))) + +(defun lsp--document-color () + "Document color handler." + (when (lsp-feature? "textDocument/documentColor") + (lsp-request-async + "textDocument/documentColor" + `(:textDocument ,(lsp--text-document-identifier)) + (lambda (result) + (lsp--remove-overlays 'lsp-color) + (seq-do + (-lambda ((&ColorInformation :color (color &as &Color :red :green :blue) + :range)) + (-let* (((beg . end) (lsp--range-to-region range)) + (overlay (make-overlay beg end)) + (command (lsp--color-create-interactive-command color range))) + (overlay-put overlay 'lsp-color t) + (overlay-put overlay 'evaporate t) + (overlay-put overlay + 'before-string + (propertize + lsp-overlay-document-color-char + 'face `((:foreground ,(format + "#%s%s%s" + (lsp--number->color red) + (lsp--number->color green) + (lsp--number->color blue)))) + 'action command + 'mouse-face 'lsp-lens-mouse-face + 'local-map (-doto (make-sparse-keymap) + (define-key [mouse-1] command)))))) + result)) + :mode 'unchanged + :cancel-token :document-color-token))) + + + +(defun lsp--action-trigger-parameter-hints (_command) + "Handler for editor.action.triggerParameterHints." + (when (member :on-server-request lsp-signature-auto-activate) + (lsp-signature-activate))) + +(defun lsp--action-trigger-suggest (_command) + "Handler for editor.action.triggerSuggest." + (cond + ((and (bound-and-true-p company-mode) + (fboundp 'company-auto-begin) + (fboundp 'company-post-command)) + (run-at-time 0 nil + (lambda () + (let ((this-command 'company-idle-begin) + (company-minimum-prefix-length 0)) + (company-auto-begin) + (company-post-command))))) + (t + (completion-at-point)))) + +(defconst lsp--default-action-handlers + (ht ("editor.action.triggerParameterHints" #'lsp--action-trigger-parameter-hints) + ("editor.action.triggerSuggest" #'lsp--action-trigger-suggest)) + "Default action handlers.") + +(defun lsp--find-action-handler (command) + "Find action handler for particular COMMAND." + (or + (--some (-some->> it + (lsp--workspace-client) + (lsp--client-action-handlers) + (gethash command)) + (lsp-workspaces)) + (gethash command lsp--default-action-handlers))) + +(defun lsp--text-document-code-action-params (&optional kind) + "Code action params." + (list :textDocument (lsp--text-document-identifier) + :range (if (use-region-p) + (lsp--region-to-range (region-beginning) (region-end)) + (lsp--region-to-range (point) (point))) + :context `( :diagnostics ,(lsp-cur-possition-diagnostics) + ,@(when kind (list :only (vector kind)))))) + +(defun lsp-code-actions-at-point (&optional kind) + "Retrieve the code actions for the active region or the current line. +It will filter by KIND if non nil." + (lsp-request "textDocument/codeAction" (lsp--text-document-code-action-params kind))) + +(defun lsp-execute-code-action-by-kind (command-kind) + "Execute code action by COMMAND-KIND." + (if-let ((action (->> (lsp-get-or-calculate-code-actions command-kind) + (-filter (-lambda ((&CodeAction :kind?)) + (and kind? (s-prefix? command-kind kind?)))) + lsp--select-action))) + (lsp-execute-code-action action) + (signal 'lsp-no-code-actions '(command-kind)))) + +(defalias 'lsp-get-or-calculate-code-actions 'lsp-code-actions-at-point) + +(lsp-defun lsp--execute-command ((action &as &Command :command :arguments?)) + "Parse and execute a code ACTION represented as a Command LSP type." + (let ((server-id (->> (lsp-workspaces) + (cl-first) + (or lsp--cur-workspace) + (lsp--workspace-client) + (lsp--client-server-id)))) + (condition-case nil + (with-no-warnings + (lsp-execute-command server-id (intern command) arguments?)) + (cl-no-applicable-method + (if-let ((action-handler (lsp--find-action-handler command))) + (funcall action-handler action) + (lsp-send-execute-command command arguments?)))))) + +(lsp-defun lsp-execute-code-action ((action &as &CodeAction :command? :edit?)) + "Execute code action ACTION. For example, when text under the +caret has a suggestion to apply a fix from an lsp-server, calling +this function will do so. +If ACTION is not set it will be selected from `lsp-code-actions-at-point'. +Request codeAction/resolve for more info if server supports." + (interactive (list (lsp--select-action (lsp-code-actions-at-point)))) + (if (and (lsp-feature? "codeAction/resolve") + (not command?) + (not edit?)) + (lsp--execute-code-action (lsp-request "codeAction/resolve" action)) + (lsp--execute-code-action action))) + +(lsp-defun lsp--execute-code-action ((action &as &CodeAction :command? :edit?)) + "Execute code action ACTION." + (when edit? + (lsp--apply-workspace-edit edit? 'code-action)) + + (cond + ((stringp command?) (lsp--execute-command action)) + ((lsp-command? command?) (lsp--execute-command command?)))) + +(defvar lsp--formatting-indent-alist + ;; Taken from `dtrt-indent-mode' + '( + (ada-mode . ada-indent) ; Ada + (ada-ts-mode . ada-ts-mode-indent-offset) + (c++-mode . c-basic-offset) ; C++ + (c++-ts-mode . c-ts-mode-indent-offset) + (c-mode . c-basic-offset) ; C + (c-ts-mode . c-ts-mode-indent-offset) + (cperl-mode . cperl-indent-level) ; Perl + (crystal-mode . crystal-indent-level) ; Crystal (Ruby) + (csharp-mode . c-basic-offset) ; C# + (csharp-tree-sitter-mode . csharp-tree-sitter-indent-offset) ; C# + (csharp-ts-mode . csharp-ts-mode-indent-offset) ; C# (tree-sitter, Emacs29) + (css-mode . css-indent-offset) ; CSS + (d-mode . c-basic-offset) ; D + (enh-ruby-mode . enh-ruby-indent-level) ; Ruby + (erlang-mode . erlang-indent-level) ; Erlang + (ess-mode . ess-indent-offset) ; ESS (R) + (go-ts-mode . go-ts-mode-indent-offset) + (hack-mode . hack-indent-offset) ; Hack + (java-mode . c-basic-offset) ; Java + (java-ts-mode . java-ts-mode-indent-offset) + (jde-mode . c-basic-offset) ; Java (JDE) + (js-mode . js-indent-level) ; JavaScript + (js-ts-mode . js-indent-level) + (js2-mode . js2-basic-offset) ; JavaScript-IDE + (js3-mode . js3-indent-level) ; JavaScript-IDE + (json-mode . js-indent-level) ; JSON + (json-ts-mode . json-ts-mode-indent-offset) + (lua-mode . lua-indent-level) ; Lua + (lua-ts-mode . lua-ts-indent-offset) + (nxml-mode . nxml-child-indent) ; XML + (objc-mode . c-basic-offset) ; Objective C + (pascal-mode . pascal-indent-level) ; Pascal + (perl-mode . perl-indent-level) ; Perl + (php-mode . c-basic-offset) ; PHP + (php-ts-mode . php-ts-mode-indent-offset) ; PHP + (powershell-mode . powershell-indent) ; PowerShell + (raku-mode . raku-indent-offset) ; Perl6/Raku + (ruby-mode . ruby-indent-level) ; Ruby + (rust-mode . rust-indent-offset) ; Rust + (rust-ts-mode . rust-ts-mode-indent-offset) + (rustic-mode . rustic-indent-offset) ; Rust + (scala-mode . scala-indent:step) ; Scala + (sgml-mode . sgml-basic-offset) ; SGML + (sh-mode . sh-basic-offset) ; Shell Script + (toml-ts-mode . toml-ts-mode-indent-offset) + (typescript-mode . typescript-indent-level) ; Typescript + (typescript-ts-mode . typescript-ts-mode-indent-offset) ; Typescript (tree-sitter, Emacs29) + (yaml-mode . yaml-indent-offset) ; YAML + + (default . standard-indent)) ; default fallback + "A mapping from `major-mode' to its indent variable.") + +(defun lsp--get-indent-width (mode) + "Get indentation offset for MODE." + (or (alist-get mode lsp--formatting-indent-alist) + (lsp--get-indent-width (or (get mode 'derived-mode-parent) 'default)))) + +(defun lsp--make-document-formatting-params () + "Create document formatting params." + (lsp-make-document-formatting-params + :text-document (lsp--text-document-identifier) + :options (lsp-make-formatting-options + :tab-size (symbol-value (lsp--get-indent-width major-mode)) + :insert-spaces (lsp-json-bool (not indent-tabs-mode)) + :trim-trailing-whitespace? (lsp-json-bool lsp-trim-trailing-whitespace) + :insert-final-newline? (lsp-json-bool lsp-insert-final-newline) + :trim-final-newlines? (lsp-json-bool lsp-trim-final-newlines)))) + +(defun lsp-format-buffer () + "Ask the server to format this document." + (interactive "*") + (cond ((lsp-feature? "textDocument/formatting") + (let ((edits (lsp-request "textDocument/formatting" + (lsp--make-document-formatting-params)))) + (if (seq-empty-p edits) + (lsp--info "No formatting changes provided") + (lsp--apply-text-edits edits 'format)))) + ((lsp-feature? "textDocument/rangeFormatting") + (save-restriction + (widen) + (lsp-format-region (point-min) (point-max)))) + (t (signal 'lsp-capability-not-supported (list "documentFormattingProvider"))))) + +(defun lsp-format-region (s e) + "Ask the server to format the region, or if none is selected, the current line." + (interactive "r") + (let ((edits (lsp-request + "textDocument/rangeFormatting" + (lsp--make-document-range-formatting-params s e)))) + (if (seq-empty-p edits) + (lsp--info "No formatting changes provided") + (lsp--apply-text-edits edits 'format)))) + +(defmacro lsp-make-interactive-code-action (func-name code-action-kind) + "Define an interactive function FUNC-NAME that attempts to +execute a CODE-ACTION-KIND action." + `(defun ,(intern (concat "lsp-" (symbol-name func-name))) () + ,(format "Perform the %s code action, if available." code-action-kind) + (interactive) + ;; Even when `lsp-auto-execute-action' is nil, it still makes sense to + ;; auto-execute here: the user has specified exactly what they want. + (let ((lsp-auto-execute-action t)) + (condition-case nil + (lsp-execute-code-action-by-kind ,code-action-kind) + (lsp-no-code-actions + (when (called-interactively-p 'any) + (lsp--info ,(format "%s action not available" code-action-kind)))))))) + +(lsp-make-interactive-code-action organize-imports "source.organizeImports") + +(defun lsp--make-document-range-formatting-params (start end) + "Make DocumentRangeFormattingParams for selected region." + (lsp:set-document-range-formatting-params-range (lsp--make-document-formatting-params) + (lsp--region-to-range start end))) + +(defconst lsp--highlight-kind-face + '((1 . lsp-face-highlight-textual) + (2 . lsp-face-highlight-read) + (3 . lsp-face-highlight-write))) + +(defun lsp--remove-overlays (name) + (save-restriction + (widen) + (remove-overlays (point-min) (point-max) name t))) + +(defun lsp-document-highlight () + "Highlight all relevant references to the symbol under point." + (interactive) + (lsp--remove-overlays 'lsp-highlight) ;; clear any previous highlights + (setq lsp--have-document-highlights nil + lsp--symbol-bounds-of-last-highlight-invocation nil) + (let ((lsp-enable-symbol-highlighting t)) + (lsp--document-highlight))) + +(defun lsp--document-highlight-callback (highlights) + "Create a callback to process the reply of a +`textDocument/documentHighlight' message for the buffer BUF. +A reference is highlighted only if it is visible in a window." + (lsp--remove-overlays 'lsp-highlight) + + (let* ((wins-visible-pos (-map (lambda (win) + (cons (1- (line-number-at-pos (window-start win) t)) + (1+ (line-number-at-pos (window-end win) t)))) + (get-buffer-window-list nil nil 'visible)))) + (setq lsp--have-document-highlights t) + (-map + (-lambda ((&DocumentHighlight :range (&Range :start (start &as &Position :line start-line) + :end (end &as &Position :line end-line)) + :kind?)) + (-map + (-lambda ((start-window . end-window)) + ;; Make the overlay only if the reference is visible + (let ((start-point (lsp--position-to-point start)) + (end-point (lsp--position-to-point end))) + (when (and (> (1+ start-line) start-window) + (< (1+ end-line) end-window) + (not (and lsp-symbol-highlighting-skip-current + (<= start-point (point) end-point)))) + (-doto (make-overlay start-point end-point) + (overlay-put 'face (cdr (assq (or kind? 1) lsp--highlight-kind-face))) + (overlay-put 'lsp-highlight t))))) + wins-visible-pos)) + highlights))) + +(defcustom lsp-symbol-kinds + '((1 . "File") + (2 . "Module") + (3 . "Namespace") + (4 . "Package") + (5 . "Class") + (6 . "Method") + (7 . "Property") + (8 . "Field") + (9 . "Constructor") + (10 . "Enum") + (11 . "Interface") + (12 . "Function") + (13 . "Variable") + (14 . "Constant") + (15 . "String") + (16 . "Number") + (17 . "Boolean") + (18 . "Array") + (19 . "Object") + (20 . "Key") + (21 . "Null") + (22 . "Enum Member") + (23 . "Struct") + (24 . "Event") + (25 . "Operator") + (26 . "Type Parameter")) + "Alist mapping SymbolKinds to human-readable strings. +Various Symbol objects in the LSP protocol have an integral type, +specifying what they are. This alist maps such type integrals to +readable representations of them. See +`https://microsoft.github.io/language-server-protocol/specifications/specification-current/', +namespace SymbolKind." + :group 'lsp-mode + :type '(alist :key-type integer :value-type string)) +(defalias 'lsp--symbol-kind 'lsp-symbol-kinds) + +(lsp-defun lsp--symbol-information-to-xref + ((&SymbolInformation :kind :name + :location (&Location :uri :range (&Range :start + (&Position :line :character))))) + "Return a `xref-item' from SYMBOL information." + (xref-make (format "[%s] %s" (alist-get kind lsp-symbol-kinds) name) + (xref-make-file-location (lsp--uri-to-path uri) + line + character))) + +(defun lsp--get-document-symbols () + "Get document symbols. + +If the buffer has not been modified since symbols were last +retrieved, simply return the latest result. + +Else, if the request was initiated by Imenu updating its menu-bar +entry, perform it asynchronously; i.e., give Imenu the latest +result and then force a refresh when a new one is available. + +Else (e.g., due to interactive use of `imenu' or `xref'), +perform the request synchronously." + (if (= (buffer-chars-modified-tick) lsp--document-symbols-tick) + lsp--document-symbols + (let ((method "textDocument/documentSymbol") + (params `(:textDocument ,(lsp--text-document-identifier))) + (tick (buffer-chars-modified-tick))) + (if (not lsp--document-symbols-request-async) + (prog1 + (setq lsp--document-symbols (lsp-request method params)) + (setq lsp--document-symbols-tick tick)) + (lsp-request-async method params + (lambda (document-symbols) + (setq lsp--document-symbols document-symbols + lsp--document-symbols-tick tick) + (lsp--imenu-refresh)) + :mode 'alive + :cancel-token :document-symbols) + lsp--document-symbols)))) + +(advice-add 'imenu-update-menubar :around + (lambda (oldfun &rest r) + (let ((lsp--document-symbols-request-async t)) + (apply oldfun r)))) + +(defun lsp--document-symbols->document-symbols-hierarchy (document-symbols current-position) + "Convert DOCUMENT-SYMBOLS to symbols hierarchy on CURRENT-POSITION." + (-let (((symbol &as &DocumentSymbol? :children?) + (seq-find (-lambda ((&DocumentSymbol :range)) + (lsp-point-in-range? current-position range)) + document-symbols))) + (if children? + (cons symbol (lsp--document-symbols->document-symbols-hierarchy children? current-position)) + (when symbol + (list symbol))))) + +(lsp-defun lsp--symbol-information->document-symbol ((&SymbolInformation :name :kind :location :container-name? :deprecated?)) + "Convert a SymbolInformation to a DocumentInformation" + (lsp-make-document-symbol :name name + :kind kind + :range (lsp:location-range location) + :children? nil + :deprecated? deprecated? + :selection-range (lsp:location-range location) + :detail? container-name?)) + +(defun lsp--symbols-informations->document-symbols-hierarchy (symbols-informations current-position) + "Convert SYMBOLS-INFORMATIONS to symbols hierarchy on CURRENT-POSITION." + (--> symbols-informations + (-keep (-lambda ((symbol &as &SymbolInformation :location (&Location :range))) + (when (lsp-point-in-range? current-position range) + (lsp--symbol-information->document-symbol symbol))) + it) + (sort it (-lambda ((&DocumentSymbol :range (&Range :start a-start-position :end a-end-position)) + (&DocumentSymbol :range (&Range :start b-start-position :end b-end-position))) + (and (lsp--position-compare b-start-position a-start-position) + (lsp--position-compare a-end-position b-end-position)))))) + +(defun lsp--symbols->document-symbols-hierarchy (symbols) + "Convert SYMBOLS to symbols-hierarchy." + (when-let ((first-symbol (lsp-seq-first symbols))) + (let ((cur-position (lsp-make-position :line (plist-get (lsp--cur-position) :line) + :character (plist-get (lsp--cur-position) :character)))) + (if (lsp-symbol-information? first-symbol) + (lsp--symbols-informations->document-symbols-hierarchy symbols cur-position) + (lsp--document-symbols->document-symbols-hierarchy symbols cur-position))))) + +(defun lsp--xref-backend () 'xref-lsp) + +(cl-defmethod xref-backend-identifier-at-point ((_backend (eql xref-lsp))) + (propertize (or (thing-at-point 'symbol) "") + 'identifier-at-point t)) + +(defun lsp--xref-elements-index (symbols path) + (-mapcat + (-lambda (sym) + (pcase-exhaustive sym + ((DocumentSymbol :name :children? :selection-range (Range :start)) + (cons (cons (concat path name) + (lsp--position-to-point start)) + (lsp--xref-elements-index children? (concat path name " / ")))) + ((SymbolInformation :name :location (Location :range (Range :start))) + (list (cons (concat path name) + (lsp--position-to-point start)))))) + symbols)) + +(defvar-local lsp--symbols-cache nil) + +(cl-defmethod xref-backend-identifier-completion-table ((_backend (eql xref-lsp))) + (if (lsp--find-workspaces-for "textDocument/documentSymbol") + (progn + (setq lsp--symbols-cache (lsp--xref-elements-index + (lsp--get-document-symbols) nil)) + lsp--symbols-cache) + (list (propertize (or (thing-at-point 'symbol) "") + 'identifier-at-point t)))) + +(cl-defmethod xref-backend-definitions ((_backend (eql xref-lsp)) identifier) + (save-excursion + (unless (get-text-property 0 'identifier-at-point identifier) + (goto-char (cl-rest (or (assoc identifier lsp--symbols-cache) + (user-error "Unable to find symbol %s in current document" identifier))))) + (lsp--locations-to-xref-items (lsp-request "textDocument/definition" + (lsp--text-document-position-params))))) + +(cl-defmethod xref-backend-references ((_backend (eql xref-lsp)) identifier) + (save-excursion + (unless (get-text-property 0 'identifier-at-point identifier) + (goto-char (cl-rest (or (assoc identifier lsp--symbols-cache) + (user-error "Unable to find symbol %s" identifier))))) + (lsp--locations-to-xref-items (lsp-request "textDocument/references" + (lsp--make-reference-params nil lsp-references-exclude-definition))))) + +(cl-defmethod xref-backend-apropos ((_backend (eql xref-lsp)) pattern) + (seq-map #'lsp--symbol-information-to-xref + (lsp-request "workspace/symbol" `(:query ,pattern)))) + +(defcustom lsp-rename-use-prepare t + "Whether `lsp-rename' should do a prepareRename first. +For some language servers, textDocument/prepareRename might be +too slow, in which case this variable may be set to nil. +`lsp-rename' will then use `thing-at-point' `symbol' to determine +the symbol to rename at point." + :group 'lsp-mode + :type 'boolean) + +(defun lsp--get-symbol-to-rename () + "Get a symbol to rename and placeholder at point. +Returns a cons ((START . END) . PLACEHOLDER?), and nil if +renaming is generally supported but cannot be done at point. +START and END are the bounds of the identifiers being renamed, +while PLACEHOLDER?, is either nil or a string suggested by the +language server as the initial input of a new-name prompt." + (unless (lsp-feature? "textDocument/rename") + (error "The connected server(s) doesn't support renaming")) + (if (and lsp-rename-use-prepare (lsp-feature? "textDocument/prepareRename")) + (when-let ((response + (lsp-request "textDocument/prepareRename" + (lsp--text-document-position-params)))) + (let* ((bounds (lsp--range-to-region + (if (lsp-range? response) + response + (lsp:prepare-rename-result-range response)))) + (placeholder + (and (not (lsp-range? response)) + (lsp:prepare-rename-result-placeholder response)))) + (cons bounds placeholder))) + (when-let ((bounds (bounds-of-thing-at-point 'symbol))) + (cons bounds nil)))) + +(defface lsp-face-rename '((t :underline t)) + "Face used to highlight the identifier being renamed. +Renaming can be done using `lsp-rename'." + :group 'lsp-mode) + +(defface lsp-rename-placeholder-face '((t :inherit font-lock-variable-name-face)) + "Face used to display the rename placeholder in. +When calling `lsp-rename' interactively, this will be the face of +the new name." + :group 'lsp-mode) + +(defvar lsp-rename-history '() + "History for `lsp--read-rename'.") + +(defun lsp--read-rename (at-point) + "Read a new name for a `lsp-rename' at `point' from the user. +AT-POINT shall be a structure as returned by +`lsp--get-symbol-to-rename'. + +Returns a string, which should be the new name for the identifier +at point. If renaming cannot be done at point (as determined from +AT-POINT), throw a `user-error'. + +This function is for use in `lsp-rename' only, and shall not be +relied upon." + (unless at-point + (user-error "`lsp-rename' is invalid here")) + (-let* ((((start . end) . placeholder?) at-point) + ;; Do the `buffer-substring' first to not include `lsp-face-rename' + (rename-me (buffer-substring start end)) + (placeholder (or placeholder? rename-me)) + (placeholder (propertize placeholder 'face 'lsp-rename-placeholder-face)) + + overlay) + ;; We need unwind protect, as the user might cancel here, causing the + ;; overlay to linger. + (unwind-protect + (progn + (setq overlay (make-overlay start end)) + (overlay-put overlay 'face 'lsp-face-rename) + + (read-string (format "Rename %s to: " rename-me) placeholder + 'lsp-rename-history)) + (and overlay (delete-overlay overlay))))) + +(defun lsp-rename (newname) + "Rename the symbol (and all references to it) under point to NEWNAME." + (interactive (list (lsp--read-rename (lsp--get-symbol-to-rename)))) + (when-let ((edits (lsp-request "textDocument/rename" + `( :textDocument ,(lsp--text-document-identifier) + :position ,(lsp--cur-position) + :newName ,newname)))) + (lsp--apply-workspace-edit edits 'rename))) + +(defun lsp--on-rename-file (old-func old-name new-name &optional ok-if-already-exists?) + "Advice around function `rename-file'. +Applies OLD-FUNC with OLD-NAME, NEW-NAME and OK-IF-ALREADY-EXISTS?. + +This advice sends workspace/willRenameFiles before renaming file +to check if server wants to apply any workspaceEdits after renamed." + (if (and lsp-apply-edits-after-file-operations + (lsp--send-will-rename-files-p old-name)) + (let ((params (lsp-make-rename-files-params + :files (vector (lsp-make-file-rename + :oldUri (lsp--path-to-uri old-name) + :newUri (lsp--path-to-uri new-name)))))) + (when-let ((edits (lsp-request "workspace/willRenameFiles" params))) + (lsp--apply-workspace-edit edits 'rename-file) + (funcall old-func old-name new-name ok-if-already-exists?) + (when (lsp--send-did-rename-files-p) + (lsp-notify "workspace/didRenameFiles" params)))) + (funcall old-func old-name new-name ok-if-already-exists?))) + +(advice-add 'rename-file :around #'lsp--on-rename-file) + +(defcustom lsp-xref-force-references nil + "If non-nil threat everything as references(e. g. jump if only one item.)" + :group 'lsp-mode + :type 'boolean) + +(defun lsp-show-xrefs (xrefs display-action references?) + (unless (region-active-p) (push-mark nil t)) + (if (boundp 'xref-show-definitions-function) + (with-no-warnings + (xref-push-marker-stack) + (funcall (if (and references? (not lsp-xref-force-references)) + xref-show-xrefs-function + xref-show-definitions-function) + (-const xrefs) + `((window . ,(selected-window)) + (display-action . ,display-action) + ,(if (and references? (not lsp-xref-force-references)) + `(auto-jump . ,xref-auto-jump-to-first-xref) + `(auto-jump . ,xref-auto-jump-to-first-definition))))) + (xref--show-xrefs xrefs display-action))) + +(cl-defmethod seq-empty-p ((ht hash-table)) + "Function `seq-empty-p' for hash-table." + (hash-table-empty-p ht)) + +(cl-defun lsp-find-locations (method &optional extra &key display-action references?) + "Send request named METHOD and get cross references of the symbol under point. +EXTRA is a plist of extra parameters. +REFERENCES? t when METHOD returns references." + (let ((loc (lsp-request method + (append (lsp--text-document-position-params) extra)))) + (if (seq-empty-p loc) + (lsp--error "Not found for: %s" (or (thing-at-point 'symbol t) "")) + (lsp-show-xrefs (lsp--locations-to-xref-items loc) display-action references?)))) + +(cl-defun lsp-find-declaration (&key display-action) + "Find declarations of the symbol under point." + (interactive) + (lsp-find-locations "textDocument/declaration" nil :display-action display-action)) + +(cl-defun lsp-find-definition (&key display-action) + "Find definitions of the symbol under point." + (interactive) + (lsp-find-locations "textDocument/definition" nil :display-action display-action)) + +(defun lsp-find-definition-mouse (click) + "Click to start `lsp-find-definition' at clicked point." + (interactive "e") + (let* ((ec (event-start click)) + (p1 (posn-point ec)) + (w1 (posn-window ec))) + (select-window w1) + (goto-char p1) + (lsp-find-definition))) + +(cl-defun lsp-find-implementation (&key display-action) + "Find implementations of the symbol under point." + (interactive) + (lsp-find-locations "textDocument/implementation" + nil + :display-action display-action + :references? t)) + +(cl-defun lsp-find-references (&optional exclude-declaration &key display-action) + "Find references of the symbol under point." + (interactive "P") + (lsp-find-locations "textDocument/references" + (list :context `(:includeDeclaration ,(lsp-json-bool (not (or exclude-declaration lsp-references-exclude-definition))))) + :display-action display-action + :references? t)) + +(cl-defun lsp-find-type-definition (&key display-action) + "Find type definitions of the symbol under point." + (interactive) + (lsp-find-locations "textDocument/typeDefinition" nil :display-action display-action)) + +(defalias 'lsp-find-custom #'lsp-find-locations) +(defalias 'lsp-goto-implementation #'lsp-find-implementation) +(defalias 'lsp-goto-type-definition #'lsp-find-type-definition) + +(with-eval-after-load 'evil + (evil-set-command-property 'lsp-find-definition :jump t) + (evil-set-command-property 'lsp-find-implementation :jump t) + (evil-set-command-property 'lsp-find-references :jump t) + (evil-set-command-property 'lsp-find-type-definition :jump t)) + +(defun lsp--workspace-method-supported? (check-command method capability workspace) + (with-lsp-workspace workspace + (if check-command + (funcall check-command workspace) + (or + (when capability (lsp--capability capability)) + (lsp--registered-capability method) + (and (not capability) (not check-command)))))) + +(defun lsp-disable-method-for-server (method server-id) + "Disable METHOD for SERVER-ID." + (cl-callf + (lambda (reqs) + (-let (((&plist :check-command :capability) reqs)) + (list :check-command + (lambda (workspace) + (unless (-> workspace + lsp--workspace-client + lsp--client-server-id + (eq server-id)) + (lsp--workspace-method-supported? check-command + method + capability + workspace)))))) + (alist-get method lsp-method-requirements nil nil 'string=))) + +(defun lsp--find-workspaces-for (msg-or-method) + "Find all workspaces in the current project that can handle MSG." + (let ((method (if (stringp msg-or-method) + msg-or-method + (plist-get msg-or-method :method)))) + (-if-let (reqs (cdr (assoc method lsp-method-requirements))) + (-let (((&plist :capability :check-command) reqs)) + (-filter + (-partial #'lsp--workspace-method-supported? + check-command method capability) + (lsp-workspaces))) + (lsp-workspaces)))) + +(defun lsp-can-execute-command? (command-name) + "Returns non-nil if current language server(s) can execute COMMAND-NAME. +The command is executed via `workspace/executeCommand'" + (cl-position + command-name + (lsp:execute-command-options-commands + (lsp:server-capabilities-execute-command-provider? + (lsp--server-capabilities))) + :test #'equal)) + +(defalias 'lsp-feature? 'lsp--find-workspaces-for) + +(cl-defmethod lsp-execute-command (_server _command _arguments) + "Dispatch COMMAND execution." + (signal 'cl-no-applicable-method nil)) + +(defun lsp-workspace-command-execute (command &optional args) + "Execute workspace COMMAND with ARGS." + (condition-case-unless-debug err + (let ((params (if args + (list :command command :arguments args) + (list :command command)))) + (lsp-request "workspace/executeCommand" params)) + (error + (error "`workspace/executeCommand' with `%s' failed.\n\n%S" + command err)))) + +(defun lsp-send-execute-command (command &optional args) + "Create and send a `workspace/executeCommand' message having command COMMAND +and optional ARGS." + (lsp-workspace-command-execute command args)) + +(defalias 'lsp-point-to-position #'lsp--point-to-position) +(defalias 'lsp-text-document-identifier #'lsp--text-document-identifier) +(defalias 'lsp--send-execute-command #'lsp-send-execute-command) +(defalias 'lsp-on-open #'lsp--text-document-did-open) +(defalias 'lsp-on-save #'lsp--text-document-did-save) + +(defun lsp--set-configuration (settings) + "Set the SETTINGS for the lsp server." + (lsp-notify "workspace/didChangeConfiguration" `(:settings ,settings))) + +(defun lsp-current-buffer () + (or lsp--virtual-buffer + (current-buffer))) + +(defun lsp-buffer-live-p (buffer-id) + (if-let ((buffer-live (plist-get buffer-id :buffer-live?))) + (funcall buffer-live buffer-id) + (buffer-live-p buffer-id))) + +(defun lsp--on-set-visited-file-name (old-func &rest args) + "Advice around function `set-visited-file-name'. + +This advice sends textDocument/didClose for the old file and +textDocument/didOpen for the new file." + (when lsp--cur-workspace + (lsp--text-document-did-close t)) + (prog1 (apply old-func args) + (when lsp--cur-workspace + (lsp--text-document-did-open)))) + +(advice-add 'set-visited-file-name :around #'lsp--on-set-visited-file-name) + +(defvar lsp--flushing-delayed-changes nil) + +(defun lsp--send-no-wait (message proc) + "Send MESSAGE to PROC without waiting for further output." + + (unless lsp--flushing-delayed-changes + (let ((lsp--flushing-delayed-changes t)) + (lsp--flush-delayed-changes))) + (lsp-process-send proc message)) + +(define-error 'lsp-parse-error + "Error parsing message from language server" 'lsp-error) +(define-error 'lsp-unknown-message-type + "Unknown message type" '(lsp-error lsp-parse-error)) +(define-error 'lsp-unknown-json-rpc-version + "Unknown JSON-RPC protocol version" '(lsp-error lsp-parse-error)) +(define-error 'lsp-no-content-length + "Content-Length header missing in message" '(lsp-error lsp-parse-error)) +(define-error 'lsp-invalid-header-name + "Invalid header name" '(lsp-error lsp-parse-error)) + +;; id method +;; x x request +;; x . response +;; . x notification +(defun lsp--get-message-type (json-data) + "Get the message type from JSON-DATA." + (if (lsp:json-message-id? json-data) + (if (lsp:json-message-error? json-data) + 'response-error + (if (lsp:json-message-method? json-data) + 'request + 'response)) + 'notification)) + +(defconst lsp--default-notification-handlers + (ht ("window/showMessage" #'lsp--window-show-message) + ("window/logMessage" #'lsp--window-log-message) + ("window/showInputBox" #'lsp--window-show-input-box) + ("window/showQuickPick" #'lsp--window-show-quick-pick) + ("textDocument/publishDiagnostics" #'lsp--on-diagnostics) + ("textDocument/diagnosticsEnd" #'ignore) + ("textDocument/diagnosticsBegin" #'ignore) + ("telemetry/event" #'ignore) + ("$/progress" (lambda (workspace params) + (funcall lsp-progress-function workspace params))))) + +(lsp-defun lsp--on-notification (workspace (&JSONNotification :params :method)) + "Call the appropriate handler for NOTIFICATION." + (-let ((client (lsp--workspace-client workspace))) + (when (lsp--log-io-p method) + (lsp--log-entry-new (lsp--make-log-entry method nil params 'incoming-notif) + lsp--cur-workspace)) + (if-let ((handler (or (gethash method (lsp--client-notification-handlers client)) + (gethash method lsp--default-notification-handlers)))) + (funcall handler workspace params) + (when (and method (not (string-prefix-p "$" method))) + (lsp-warn "Unknown notification: %s" method))))) + +(lsp-defun lsp--build-workspace-configuration-response ((&ConfigurationParams :items)) + "Get section configuration. +PARAMS are the `workspace/configuration' request params" + (->> items + (-map (-lambda ((&ConfigurationItem :section?)) + (-let* ((path-parts (split-string section? "\\.")) + (path-without-last (s-join "." (-slice path-parts 0 -1))) + (path-parts-len (length path-parts))) + (cond + ((<= path-parts-len 1) + (ht-get (lsp-configuration-section section?) + (car-safe path-parts) + (ht-create))) + ((> path-parts-len 1) + (when-let ((section (lsp-configuration-section path-without-last)) + (keys path-parts)) + (while (and keys section) + (setf section (ht-get section (pop keys)))) + section)))))) + (apply #'vector))) + +(defun lsp--ms-since (timestamp) + "Integer number of milliseconds since TIMESTAMP. Fractions discarded." + (floor (* 1000 (float-time (time-since timestamp))))) + +(defun lsp--send-request-response (workspace recv-time request response) + "Send the RESPONSE for REQUEST in WORKSPACE and log if needed." + (-let* (((&JSONResponse :params :method :id) request) + (process (lsp--workspace-proc workspace)) + (response (lsp--make-response id response)) + (req-entry (and lsp-log-io + (lsp--make-log-entry method id params 'incoming-req))) + (resp-entry (and lsp-log-io + (lsp--make-log-entry method id response 'outgoing-resp + (lsp--ms-since recv-time))))) + ;; Send response to the server. + (when (lsp--log-io-p method) + (lsp--log-entry-new req-entry workspace) + (lsp--log-entry-new resp-entry workspace)) + (lsp--send-no-wait response process))) + +(lsp-defun lsp--on-request (workspace (request &as &JSONRequest :params :method)) + "Call the appropriate handler for REQUEST, and send the return value to the +server. WORKSPACE is the active workspace." + (-let* ((recv-time (current-time)) + (client (lsp--workspace-client workspace)) + (buffers (lsp--workspace-buffers workspace)) + handler + (response (cond + ((setq handler (gethash method (lsp--client-request-handlers client) nil)) + (funcall handler workspace params)) + ((setq handler (gethash method (lsp--client-async-request-handlers client) nil)) + (funcall handler workspace params + (-partial #'lsp--send-request-response + workspace recv-time request)) + 'delay-response) + ((equal method "client/registerCapability") + (mapc #'lsp--server-register-capability + (lsp:registration-params-registrations params)) + (mapc (lambda (buf) + (when (lsp-buffer-live-p buf) + (lsp-with-current-buffer buf + (lsp-unconfig-buffer) + (lsp-configure-buffer)))) + buffers) + nil) + ((equal method "window/showMessageRequest") + (let ((choice (lsp--window-log-message-request params))) + `(:title ,choice))) + ((equal method "window/showDocument") + (let ((success? (lsp--window-show-document params))) + (lsp-make-show-document-result :success (or success? + :json-false)))) + ((equal method "client/unregisterCapability") + (mapc #'lsp--server-unregister-capability + (lsp:unregistration-params-unregisterations params)) + (mapc (lambda (buf) + (when (lsp-buffer-live-p buf) + (lsp-with-current-buffer buf + (lsp-unconfig-buffer) + (lsp-configure-buffer)))) + buffers) + nil) + ((equal method "workspace/applyEdit") + (list :applied (condition-case err + (prog1 t + (lsp--apply-workspace-edit (lsp:apply-workspace-edit-params-edit params) 'server-requested)) + (error + (lsp--error "Failed to apply edits with message %s" + (error-message-string err)) + :json-false)))) + ((equal method "workspace/configuration") + (with-lsp-workspace workspace + (if-let ((buf (car buffers))) + (lsp-with-current-buffer buf + (lsp--build-workspace-configuration-response params)) + (lsp--with-workspace-temp-buffer (lsp--workspace-root workspace) + (lsp--build-workspace-configuration-response params))))) + ((equal method "workspace/workspaceFolders") + (let ((folders (or (-> workspace + (lsp--workspace-client) + (lsp--client-server-id) + (gethash (lsp-session-server-id->folders (lsp-session)))) + (lsp-session-folders (lsp-session))))) + (->> folders + (-distinct) + (-map (lambda (folder) + (list :uri (lsp--path-to-uri folder)))) + (apply #'vector)))) + ((equal method "window/workDoneProgress/create") + nil ;; no specific reply, no processing required + ) + ((equal method "workspace/semanticTokens/refresh") + (when (and lsp-semantic-tokens-enable + (fboundp 'lsp--semantic-tokens-on-refresh)) + (lsp--semantic-tokens-on-refresh workspace)) + nil) + ((equal method "workspace/codeLens/refresh") + (when (and lsp-lens-enable + (fboundp 'lsp--lens-on-refresh)) + (lsp--lens-on-refresh workspace)) + nil) + (t (lsp-warn "Unknown request method: %s" method) nil)))) + ;; Send response to the server. + (unless (eq response 'delay-response) + (lsp--send-request-response workspace recv-time request response)))) + +(lsp-defun lsp--error-string ((&JSONError :message :code)) + "Format ERR as a user friendly string." + (format "Error from the Language Server: %s (%s)" + message + (or (car (alist-get code lsp--errors)) "Unknown error"))) + +(defun lsp--get-body-length (headers) + (let ((content-length (cdr (assoc "Content-Length" headers)))) + (if content-length + (string-to-number content-length) + + ;; This usually means either the server or our parser is + ;; screwed up with a previous Content-Length + (error "No Content-Length header")))) + +(defun lsp--parse-header (s) + "Parse string S as a LSP (KEY . VAL) header." + (let ((pos (string-match "\:" s)) + key val) + (unless pos + (signal 'lsp-invalid-header-name (list s))) + (setq key (substring s 0 pos) + val (s-trim-left (substring s (+ 1 pos)))) + (when (equal key "Content-Length") + (cl-assert (cl-loop for c across val + when (or (> c ?9) (< c ?0)) return nil + finally return t) + nil (format "Invalid Content-Length value: %s" val))) + (cons key val))) + +(defmacro lsp--read-json (str) + "Read json string STR." + (if (progn + (require 'json) + (fboundp 'json-parse-string)) + `(json-parse-string ,str + :object-type (if lsp-use-plists + 'plist + 'hash-table) + :null-object nil + :false-object nil) + `(let ((json-array-type 'vector) + (json-object-type (if lsp-use-plists + 'plist + 'hash-table)) + (json-false nil)) + (json-read-from-string ,str)))) + +(defmacro lsp-json-read-buffer () + "Read json from the current buffer." + (if (progn + (require 'json) + (fboundp 'json-parse-buffer)) + `(json-parse-buffer :object-type (if lsp-use-plists + 'plist + 'hash-table) + :null-object nil + :false-object nil) + `(let ((json-array-type 'vector) + (json-object-type (if lsp-use-plists + 'plist + 'hash-table)) + (json-false nil)) + (json-read)))) + +(defun lsp--read-json-file (file-path) + "Read json file." + (-> file-path + (f-read-text) + (lsp--read-json))) + +(defun lsp--parser-on-message (json-data workspace) + "Called when the parser P read a complete MSG from the server." + (with-demoted-errors "Error processing message %S." + (with-lsp-workspace workspace + (let* ((client (lsp--workspace-client workspace)) + (id (--when-let (lsp:json-response-id json-data) + (if (stringp it) (string-to-number it) it))) + (data (lsp:json-response-result json-data))) + (pcase (lsp--get-message-type json-data) + ('response + (cl-assert id) + (-let [(callback _ method _ before-send) (gethash id (lsp--client-response-handlers client))] + (when (lsp--log-io-p method) + (lsp--log-entry-new + (lsp--make-log-entry method id data 'incoming-resp + (lsp--ms-since before-send)) + workspace)) + (when callback + (remhash id (lsp--client-response-handlers client)) + (funcall callback (lsp:json-response-result json-data))))) + ('response-error + (cl-assert id) + (-let [(_ callback method _ before-send) (gethash id (lsp--client-response-handlers client))] + (when (lsp--log-io-p method) + (lsp--log-entry-new + (lsp--make-log-entry method id (lsp:json-response-error-error json-data) + 'incoming-resp (lsp--ms-since before-send)) + workspace)) + (when callback + (remhash id (lsp--client-response-handlers client)) + (funcall callback (lsp:json-response-error-error json-data))))) + ('notification + (lsp--on-notification workspace json-data)) + ('request (lsp--on-request workspace json-data))))))) + +(defun lsp--create-filter-function (workspace) + "Make filter for the workspace." + (let ((body-received 0) + leftovers body-length body chunk) + (lambda (_proc input) + (setf chunk (if (s-blank? leftovers) + input + (concat leftovers input))) + + (let (messages) + (while (not (s-blank? chunk)) + (if (not body-length) + ;; Read headers + (if-let ((body-sep-pos (string-match-p "\r\n\r\n" chunk))) + ;; We've got all the headers, handle them all at once: + (setf body-length (lsp--get-body-length + (mapcar #'lsp--parse-header + (split-string + (substring-no-properties chunk + (or (string-match-p "Content-Length" chunk) + (error "Unable to find Content-Length header.")) + body-sep-pos) + "\r\n"))) + body-received 0 + leftovers nil + chunk (substring-no-properties chunk (+ body-sep-pos 4))) + + ;; Haven't found the end of the headers yet. Save everything + ;; for when the next chunk arrives and await further input. + (setf leftovers chunk + chunk nil)) + (let* ((chunk-length (string-bytes chunk)) + (left-to-receive (- body-length body-received)) + (this-body (if (< left-to-receive chunk-length) + (prog1 (substring-no-properties chunk 0 left-to-receive) + (setf chunk (substring-no-properties chunk left-to-receive))) + (prog1 chunk + (setf chunk nil)))) + (body-bytes (string-bytes this-body))) + (push this-body body) + (setf body-received (+ body-received body-bytes)) + (when (>= chunk-length left-to-receive) + (condition-case err + (with-temp-buffer + (apply #'insert + (nreverse + (prog1 body + (setf leftovers nil + body-length nil + body-received nil + body nil)))) + (decode-coding-region (point-min) + (point-max) + 'utf-8) + (goto-char (point-min)) + (push (lsp-json-read-buffer) messages)) + + (error + (lsp-warn "Failed to parse the following chunk:\n'''\n%s\n'''\nwith message %s" + (concat leftovers input) + err))))))) + (mapc (lambda (msg) + (lsp--parser-on-message msg workspace)) + (nreverse messages)))))) + +(defvar-local lsp--line-col-to-point-hash-table nil + "Hash table with keys (line . col) and values that are either point positions +or markers.") + +(defcustom lsp-imenu-detailed-outline t + "Whether `lsp-imenu' should include signatures. +This will be ignored if the server doesn't provide the necessary +information, for example if it doesn't support DocumentSymbols." + :group 'lsp-imenu + :type 'boolean) + +(defcustom lsp-imenu-hide-parent-details t + "Whether `lsp-imenu' should hide signatures of parent nodes." + :group 'lsp-imenu + :type 'boolean) + +(defface lsp-details-face '((t :height 0.8 :inherit shadow)) + "Used to display additional information throughout `lsp'. +Things like line numbers, signatures, ... are considered +additional information. Often, additional faces are defined that +inherit from this face by default, like `lsp-signature-face', and +they may be customized for finer control." + :group 'lsp-mode) + +(defface lsp-signature-face '((t :inherit lsp-details-face)) + "Used to display signatures in `imenu', ...." + :group 'lsp-mode) + +(lsp-defun lsp-render-symbol ((&DocumentSymbol :name :detail? :deprecated?) + show-detail?) + "Render INPUT0, an `&DocumentSymbol', to a string. +If SHOW-DETAIL? is set, make use of its `:detail?' field (often +the signature)." + (let ((detail (and show-detail? (s-present? detail?) + (propertize (concat " " (s-trim-left detail?)) + 'face 'lsp-signature-face))) + (name (if deprecated? + (propertize name 'face 'lsp-face-semhl-deprecated) name))) + (concat name detail))) + +(lsp-defun lsp-render-symbol-information ((&SymbolInformation :name :deprecated? :container-name?) + separator) + "Render a piece of SymbolInformation. +Handle :deprecated?. If SEPARATOR is non-nil, the +symbol's (optional) parent, SEPARATOR and the symbol itself are +concatenated." + (when (and separator container-name? (not (string-empty-p container-name?))) + (setq name (concat name separator container-name?))) + (if deprecated? (propertize name 'face 'lsp-face-semhl-deprecated) name)) + +(defun lsp--symbol-to-imenu-elem (sym) + "Convert SYM to imenu element. + +SYM is a SymbolInformation message. + +Return a cons cell (full-name . start-point)." + (let ((start-point (ht-get lsp--line-col-to-point-hash-table + (lsp--get-line-and-col sym)))) + (cons (lsp-render-symbol-information + sym (and lsp-imenu-show-container-name + lsp-imenu-container-name-separator)) + start-point))) + +(lsp-defun lsp--symbol-to-hierarchical-imenu-elem ((sym &as &DocumentSymbol :children?)) + "Convert SYM to hierarchical imenu elements. + +SYM is a DocumentSymbol message. + +Return cons cell (\"symbol-name (symbol-kind)\" . start-point) if +SYM doesn't have any children. Otherwise return a cons cell with +an alist + + (\"symbol-name\" . ((\"(symbol-kind)\" . start-point) + cons-cells-from-children))" + (let ((filtered-children (lsp--imenu-filter-symbols children?)) + (signature (lsp-render-symbol sym lsp-imenu-detailed-outline))) + (if (seq-empty-p filtered-children) + (cons signature + (ht-get lsp--line-col-to-point-hash-table + (lsp--get-line-and-col sym))) + (cons signature + (lsp--imenu-create-hierarchical-index filtered-children))))) + +(lsp-defun lsp--symbol-ignore ((&SymbolInformation :kind)) + "Determine if SYM is for the current document and is to be shown." + ;; It's a SymbolInformation or DocumentSymbol, which is always in the + ;; current buffer file. + (and lsp-imenu-index-symbol-kinds + (numberp kind) + (let ((clamped-kind (if (< 0 kind (length lsp/symbol-kind-lookup)) + kind + 0))) + (not (memql (aref lsp/symbol-kind-lookup clamped-kind) + lsp-imenu-index-symbol-kinds))))) + +(lsp-defun lsp--get-symbol-type ((&SymbolInformation :kind)) + "The string name of the kind of SYM." + (alist-get kind lsp-symbol-kinds "Other")) + +(defun lsp--get-line-and-col (sym) + "Obtain the line and column corresponding to SYM." + (-let* ((location (lsp:symbol-information-location sym)) + (name-range (or (and location (lsp:location-range location)) + (lsp:document-symbol-selection-range sym))) + ((&Range :start (&Position :line :character)) name-range)) + (cons line character))) + +(defun lsp--collect-lines-and-cols (symbols) + "Return a sorted list ((line . col) ...) of the locations of SYMBOLS." + (let ((stack (mapcar 'identity symbols)) + line-col-list) + (while stack + (let ((sym (pop stack))) + (push (lsp--get-line-and-col sym) line-col-list) + (unless (seq-empty-p (lsp:document-symbol-children? sym)) + (setf stack (nconc (lsp--imenu-filter-symbols (lsp:document-symbol-children? sym)) stack))))) + (-sort #'lsp--line-col-comparator line-col-list))) + +(defun lsp--convert-line-col-to-points-batch (line-col-list) + "Convert a sorted list of positions from line-column +representation to point representation." + (let ((line-col-to-point-map (ht-create)) + (inhibit-field-text-motion t) + (curr-line 0)) + (lsp-save-restriction-and-excursion + (goto-char (point-min)) + (cl-loop for (line . col) in line-col-list do + (forward-line (- line curr-line)) + (setq curr-line line) + (let ((line-end (line-end-position))) + (if (or (not col) (> col (- line-end (point)))) + (goto-char line-end) + (forward-char col))) + (ht-set! line-col-to-point-map (cons line col) (if imenu-use-markers + (point-marker) + (point))))) + line-col-to-point-map)) + +(cl-defun lsp--line-col-comparator ((l1 . c1) (l2 . c2)) + (or (< l1 l2) + (and (= l1 l2) + (cond ((and c1 c2) + (< c1 c2)) + (c1 t))))) + +(defun lsp-imenu-create-uncategorized-index (symbols) + "Create imenu index from document SYMBOLS. +This function, unlike `lsp-imenu-create-categorized-index', does +not categorize by type, but instead returns an `imenu' index +corresponding to the symbol hierarchy returned by the server +directly." + (let* ((lsp--line-col-to-point-hash-table (-> symbols + lsp--collect-lines-and-cols + lsp--convert-line-col-to-points-batch))) + (if (lsp--imenu-hierarchical-p symbols) + (lsp--imenu-create-hierarchical-index symbols) + (lsp--imenu-create-non-hierarchical-index symbols)))) + +(defcustom lsp-imenu-symbol-kinds + '((1 . "Files") + (2 . "Modules") + (3 . "Namespaces") + (4 . "Packages") + (5 . "Classes") + (6 . "Methods") + (7 . "Properties") + (8 . "Fields") + (9 . "Constructors") + (10 . "Enums") + (11 . "Interfaces") + (12 . "Functions") + (13 . "Variables") + (14 . "Constants") + (15 . "Strings") + (16 . "Numbers") + (17 . "Booleans") + (18 . "Arrays") + (19 . "Objects") + (20 . "Keys") + (21 . "Nulls") + (22 . "Enum Members") + (23 . "Structs") + (24 . "Events") + (25 . "Operators") + (26 . "Type Parameters")) + "`lsp-symbol-kinds', but only used by `imenu'. +A new variable is needed, as it is `imenu' convention to use +pluralized categories, which `lsp-symbol-kinds' doesn't. If the +non-pluralized names are preferred, this can be set to +`lsp-symbol-kinds'." + :type '(alist :key-type integer :value-type string)) + +(defun lsp--imenu-kind->name (kind) + (alist-get kind lsp-imenu-symbol-kinds "?")) + +(defun lsp-imenu-create-top-level-categorized-index (symbols) + "Create an `imenu' index categorizing SYMBOLS by type. +Only root symbols are categorized. + +See `lsp-symbol-kinds' to customize the category naming. SYMBOLS +shall be a list of DocumentSymbols or SymbolInformation." + (mapcan + (-lambda ((type . symbols)) + (let ((cat (lsp--imenu-kind->name type)) + (symbols (lsp-imenu-create-uncategorized-index symbols))) + ;; If there is no :kind (this is being defensive), or we couldn't look it + ;; up, just display the symbols inline, without categories. + (if cat (list (cons cat symbols)) symbols))) + (sort (seq-group-by #'lsp:document-symbol-kind symbols) + (-lambda ((kinda) (kindb)) (< kinda kindb))))) + +(lsp-defun lsp--symbol->imenu ((sym &as &DocumentSymbol :selection-range (&RangeToPoint :start))) + "Convert an `&DocumentSymbol' to an `imenu' entry." + (cons (lsp-render-symbol sym lsp-imenu-detailed-outline) start)) + +(defun lsp--imenu-create-categorized-index-1 (symbols) + "Returns an `imenu' index from SYMBOLS categorized by type. +The result looks like this: ((\"Variables\" . (...)))." + (->> + symbols + (mapcan + (-lambda ((sym &as &DocumentSymbol :kind :children?)) + (if (seq-empty-p children?) + (list (list kind (lsp--symbol->imenu sym))) + (let ((parent (lsp-render-symbol sym (and lsp-imenu-detailed-outline + (not lsp-imenu-hide-parent-details))))) + (cons + (list kind (lsp--symbol->imenu sym)) + (mapcar (-lambda ((type . imenu-items)) + (list type (cons parent (mapcan #'cdr imenu-items)))) + (-group-by #'car (lsp--imenu-create-categorized-index-1 children?)))))))) + (-group-by #'car) + (mapcar + (-lambda ((kind . syms)) + (cons kind (mapcan #'cdr syms)))))) + +(defun lsp--imenu-create-categorized-index (symbols) + (let ((syms (lsp--imenu-create-categorized-index-1 symbols))) + (dolist (sym syms) + (setcar sym (lsp--imenu-kind->name (car sym)))) + syms)) + +(lsp-defun lsp--symbol-information->imenu ((sym &as &SymbolInformation :location (&Location :range (&RangeToPoint :start)))) + (cons (lsp-render-symbol-information sym nil) start)) + +(defun lsp--imenu-create-categorized-index-flat (symbols) + "Create a kind-categorized index for SymbolInformation." + (mapcar (-lambda ((kind . syms)) + (cons (lsp--imenu-kind->name kind) + (mapcan (-lambda ((parent . children)) + (let ((children (mapcar #'lsp--symbol-information->imenu children))) + (if parent (list (cons parent children)) children))) + (-group-by #'lsp:symbol-information-container-name? syms)))) + (seq-group-by #'lsp:symbol-information-kind symbols))) + +(defun lsp-imenu-create-categorized-index (symbols) + (if (lsp--imenu-hierarchical-p symbols) + (lsp--imenu-create-categorized-index symbols) + (lsp--imenu-create-categorized-index-flat symbols))) + +(defcustom lsp-imenu-index-function #'lsp-imenu-create-uncategorized-index + "Function that should create an `imenu' index. +It will be called with a list of SymbolInformation or +DocumentSymbols, whose first level is already filtered. It shall +then return an appropriate `imenu' index (see +`imenu-create-index-function'). + +Note that this interface is not stable, and subject to change any +time." + :group 'lsp-imenu + :type '(radio + (const :tag "Categorize by type" + lsp-imenu-create-categorized-index) + (const :tag "Categorize root symbols by type" + lsp-imenu-create-top-level-categorized-index) + (const :tag "Uncategorized, inline entries" + lsp-imenu-create-uncategorized-index) + (function :tag "Custom function"))) + +(defun lsp--imenu-create-index () + "Create an `imenu' index based on the language server. +Respects `lsp-imenu-index-function'." + (let ((symbols (lsp--imenu-filter-symbols (lsp--get-document-symbols)))) + (funcall lsp-imenu-index-function symbols))) + +(defun lsp--imenu-filter-symbols (symbols) + "Filter out unsupported symbols from SYMBOLS." + (seq-remove #'lsp--symbol-ignore symbols)) + +(defun lsp--imenu-hierarchical-p (symbols) + "Determine whether any element in SYMBOLS has children." + (seq-some #'lsp-document-symbol? symbols)) + +(defun lsp--imenu-create-non-hierarchical-index (symbols) + "Create imenu index for non-hierarchical SYMBOLS. + +SYMBOLS are a list of DocumentSymbol messages. + +Return a nested alist keyed by symbol names. e.g. + + ((\"SomeClass\" (\"(Class)\" . 10) + (\"someField (Field)\" . 20) + (\"someFunction (Function)\" . 25) + (\"SomeSubClass\" (\"(Class)\" . 30) + (\"someSubField (Field)\" . 35)) + (\"someFunction (Function)\" . 40))" + (seq-map (lambda (nested-alist) + (cons (car nested-alist) + (seq-map #'lsp--symbol-to-imenu-elem (cdr nested-alist)))) + (seq-group-by #'lsp--get-symbol-type symbols))) + +(defun lsp--imenu-create-hierarchical-index (symbols) + "Create imenu index for hierarchical SYMBOLS. + +SYMBOLS are a list of DocumentSymbol messages. + +Return a nested alist keyed by symbol names. e.g. + + ((\"SomeClass\" (\"(Class)\" . 10) + (\"someField (Field)\" . 20) + (\"someFunction (Function)\" . 25) + (\"SomeSubClass\" (\"(Class)\" . 30) + (\"someSubField (Field)\" . 35)) + (\"someFunction (Function)\" . 40))" + (seq-map #'lsp--symbol-to-hierarchical-imenu-elem + (seq-sort #'lsp--imenu-symbol-lessp symbols))) + +(defun lsp--imenu-symbol-lessp (sym1 sym2) + (let* ((compare-results (mapcar (lambda (method) + (funcall (alist-get method lsp--imenu-compare-function-alist) + sym1 sym2)) + lsp-imenu-sort-methods)) + (result (seq-find (lambda (result) + (not (= result 0))) + compare-results + 0))) + (and (numberp result) (< result 0)))) + +(lsp-defun lsp--imenu-compare-kind ((&SymbolInformation :kind left) + (&SymbolInformation :kind right)) + "Compare SYM1 and SYM2 by kind." + (- left right)) + +(defun lsp--imenu-compare-line-col (sym1 sym2) + (if (lsp--line-col-comparator + (lsp--get-line-and-col sym1) + (lsp--get-line-and-col sym2)) + -1 + 1)) + +(lsp-defun lsp--imenu-compare-name ((&SymbolInformation :name name1) + (&SymbolInformation :name name2)) + "Compare SYM1 and SYM2 by name." + (let ((result (compare-strings name1 0 (length name1) name2 0 (length name2)))) + (if (numberp result) result 0))) + +(defun lsp--imenu-refresh () + "Force Imenu to refresh itself." + (imenu--menubar-select imenu--rescan-item)) + +(defun lsp-enable-imenu () + "Use lsp-imenu for the current buffer." + (imenu--cleanup) + (add-function :override (local 'imenu-create-index-function) #'lsp--imenu-create-index) + (setq-local imenu-menubar-modified-tick -1) + (setq-local imenu--index-alist nil) + (when menu-bar-mode + (lsp--imenu-refresh))) + +(defun lsp-resolve-final-command (command &optional test?) + "Resolve final function COMMAND." + (let* ((command (lsp-resolve-value command)) + (command (cl-etypecase command + (list + (cl-assert (seq-every-p (apply-partially #'stringp) command) nil + "Invalid command list") + command) + (string (list command))))) + (if (and (file-remote-p default-directory) (not test?)) + (list shell-file-name "-c" + (string-join (cons "stty raw > /dev/null;" + (mapcar #'shell-quote-argument command)) + " ")) + command))) + +(defun lsp-server-present? (final-command) + "Check whether FINAL-COMMAND is present." + (let ((binary-found? (executable-find (cl-first final-command) t))) + (if binary-found? + (lsp-log "Command \"%s\" is present on the path." (s-join " " final-command)) + (lsp-log "Command \"%s\" is not present on the path." (s-join " " final-command))) + binary-found?)) + +(defun lsp--value-to-string (value) + "Convert VALUE to a string that can be set as value in an environment +variable." + (cond + ((stringp value) value) + ((booleanp value) (if value + "1" + "0")) + ((and (sequencep value) + (seq-every-p #'stringp value)) (string-join value ":")) + (t (user-error "Only strings, booleans, and sequences of strings are supported as environment variables")))) + +(defun lsp--compute-process-environment (environment-fn) + "Append a list of KEY=VALUE from the alist ENVIRONMENT to `process-environment'. +Ignore non-boolean keys whose value is nil." + (let ((environment (if environment-fn + (funcall environment-fn) + nil))) + (-flatten (cons (cl-loop for (key . value) in environment + if (or (eval value) + (eq (get value 'custom-type) 'boolean)) + collect (concat key "=" (lsp--value-to-string + (eval value)))) + process-environment)))) + +(defun lsp--default-directory-for-connection (&optional path) + "Return path to be used for the working directory of a LSP process. + +If `lsp-use-workspace-root-for-server-default-directory' is +non-nil, uses `lsp-workspace-root' to find the directory +corresponding to PATH, else returns `default-directory'." + (if lsp-use-workspace-root-for-server-default-directory + (lsp-workspace-root path) + default-directory)) + +(defun lsp--fix-remote-cmd (program) + "Helper for `lsp-stdio-connection'. +Originally coppied from eglot." + + (if (file-remote-p default-directory) + (list shell-file-name "-c" + (string-join (cons "stty raw > /dev/null;" + (mapcar #'shell-quote-argument program)) + " ")) + program)) + +(defvar tramp-use-ssh-controlmaster-options) +(defvar tramp-ssh-controlmaster-options) + +(defun lsp-stdio-connection (command &optional test-command) + "Returns a connection property list using COMMAND. +COMMAND can be: A string, denoting the command to launch the +language server. A list of strings, denoting an executable with +its command line arguments. A function, that either returns a +string or a list of strings. In all cases, the launched language +server should send and receive messages on standard I/O. +TEST-COMMAND is a function with no arguments which returns +whether the command is present or not. When not specified +`lsp-mode' will check whether the first element of the list +returned by COMMAND is available via `executable-find'" + (cl-check-type command (or string + function + (and list + (satisfies (lambda (l) + (seq-every-p (lambda (el) + (stringp el)) + l)))))) + (list :connect (lambda (filter sentinel name environment-fn workspace) + (if (and (functionp 'json-rpc-connection) + (not (file-remote-p default-directory))) + (lsp-json-rpc-connection workspace (lsp-resolve-final-command command)) + (let ((final-command (lsp-resolve-final-command command)) + (process-name (generate-new-buffer-name name)) + (process-environment + (lsp--compute-process-environment environment-fn))) + (let* ((stderr-buf (get-buffer-create (format "*%s::stderr*" process-name))) + (default-directory (lsp--default-directory-for-connection)) + (tramp-use-ssh-controlmaster-options 'suppress) + (tramp-ssh-controlmaster-options "-o ControlMaster=no -o ControlPath=none") + (proc (make-process + :name process-name + :connection-type 'pipe + :buffer (format "*%s*" process-name) + :coding 'no-conversion + :command final-command + :filter filter + :sentinel sentinel + :stderr stderr-buf + :noquery t + :file-handler t))) + (set-process-query-on-exit-flag proc nil) + (set-process-query-on-exit-flag (get-buffer-process stderr-buf) nil) + (with-current-buffer (get-buffer stderr-buf) + ;; Make the *NAME::stderr* buffer buffer-read-only, q to bury, etc. + (special-mode)) + (cons proc proc))))) + :test? (or + test-command + (lambda () + (lsp-server-present? (lsp-resolve-final-command command t)))))) + +(defun lsp--open-network-stream (host port name) + "Open network stream to HOST:PORT. + NAME will be passed to `open-network-stream'. + RETRY-COUNT is the number of the retries. + SLEEP-INTERVAL is the sleep interval between each retry." + (let* ((retries 0) + (sleep-interval 0.01) + (number-of-retries (/ lsp-tcp-connection-timeout sleep-interval)) + connection) + (while (and (not connection) (< retries number-of-retries)) + (condition-case err + (setq connection (open-network-stream name nil host port + :type 'plain + :coding 'no-conversion)) + (file-error + (let ((inhibit-message t)) + (lsp--warn "Failed to connect to %s:%s with error message %s" + host + port + (error-message-string err)) + (sleep-for sleep-interval) + (cl-incf retries))))) + (or connection (error "Port %s was never taken. Consider increasing `lsp-tcp-connection-timeout'." port)))) + +(defun lsp--port-available (host port) + "Return non-nil if HOST and PORT are available." + (condition-case _err + (delete-process (open-network-stream "*connection-test*" nil host port :type 'plain)) + (file-error t))) + +(defun lsp--find-available-port (host starting-port) + "Find available port on HOST starting from STARTING-PORT." + (let ((port starting-port)) + (while (not (lsp--port-available host port)) + (cl-incf port)) + port)) + +(defun lsp-tcp-connection (command-fn) + "Returns a connection property list similar to `lsp-stdio-connection'. +COMMAND-FN can only be a function that takes a single argument, a +port number. It should return a command for launches a language server +process listening for TCP connections on the provided port." + (cl-check-type command-fn function) + (list + :connect (lambda (filter sentinel name environment-fn _workspace) + (let* ((host "localhost") + (port (lsp--find-available-port host (cl-incf lsp--tcp-port))) + (command (funcall command-fn port)) + (final-command (if (consp command) command (list command))) + (_ (unless (lsp-server-present? final-command) + (user-error (format "Couldn't find executable %s" (cl-first final-command))))) + (process-environment + (lsp--compute-process-environment environment-fn)) + (proc (make-process :name name :connection-type 'pipe :coding 'no-conversion + :command final-command :sentinel sentinel :stderr (format "*%s::stderr*" name) :noquery t)) + (tcp-proc (lsp--open-network-stream host port (concat name "::tcp")))) + + ;; TODO: Same :noquery issue (see above) + (set-process-query-on-exit-flag proc nil) + (set-process-query-on-exit-flag tcp-proc nil) + (set-process-filter tcp-proc filter) + (cons tcp-proc proc))) + :test? (lambda () (lsp-server-present? (funcall command-fn 0))))) + +(defalias 'lsp-tcp-server 'lsp-tcp-server-command) + +(defun lsp-tcp-server-command (command-fn) + "Create tcp server connection. +In this mode Emacs is TCP server and the language server connects +to it. COMMAND is function with one parameter(the port) and it +should return the command to start the LS server." + (cl-check-type command-fn function) + (list + :connect (lambda (filter sentinel name environment-fn _workspace) + (let* (tcp-client-connection + (tcp-server (make-network-process :name (format "*tcp-server-%s*" name) + :buffer (format "*tcp-server-%s*" name) + :family 'ipv4 + :service lsp--tcp-server-port + :sentinel (lambda (proc _string) + (lsp-log "Language server %s is connected." name) + (setf tcp-client-connection proc)) + :server 't)) + (port (process-contact tcp-server :service)) + (final-command (funcall command-fn port)) + (process-environment + (lsp--compute-process-environment environment-fn)) + (cmd-proc (make-process :name name + :connection-type 'pipe + :coding 'no-conversion + :command final-command + :stderr (format "*tcp-server-%s*::stderr" name) + :noquery t))) + (let ((retries 0)) + ;; wait for the client to connect (we sit-for 500 ms, so have to double lsp--tcp-server-wait-seconds) + (while (and (not tcp-client-connection) (< retries (* 2 lsp--tcp-server-wait-seconds))) + (lsp--info "Waiting for connection for %s, retries: %s" name retries) + (sit-for 0.500) + (cl-incf retries))) + + (unless tcp-client-connection + (condition-case nil (delete-process tcp-server) (error)) + (condition-case nil (delete-process cmd-proc) (error)) + (error "Failed to create connection to %s on port %s" name port)) + (lsp--info "Successfully connected to %s" name) + + (set-process-query-on-exit-flag cmd-proc nil) + (set-process-query-on-exit-flag tcp-client-connection nil) + (set-process-query-on-exit-flag tcp-server nil) + + (set-process-filter tcp-client-connection filter) + (set-process-sentinel tcp-client-connection sentinel) + (cons tcp-client-connection cmd-proc))) + :test? (lambda () (lsp-server-present? (funcall command-fn 0))))) + +(defalias 'lsp-tramp-connection 'lsp-stdio-connection) + +(defun lsp--auto-configure () + "Autoconfigure `company', `flycheck', `lsp-ui', etc if they are installed." + (when (functionp 'lsp-ui-mode) + (lsp-ui-mode)) + + (if lsp-headerline-breadcrumb-enable + (add-hook 'lsp-configure-hook 'lsp-headerline-breadcrumb-mode) + (remove-hook 'lsp-configure-hook 'lsp-headerline-breadcrumb-mode)) + (if lsp-modeline-code-actions-enable + (add-hook 'lsp-configure-hook 'lsp-modeline-code-actions-mode) + (remove-hook 'lsp-configure-hook 'lsp-modeline-code-actions-mode)) + (if lsp-modeline-diagnostics-enable + (add-hook 'lsp-configure-hook 'lsp-modeline-diagnostics-mode) + (remove-hook 'lsp-configure-hook 'lsp-modeline-diagnostics-mode)) + (if lsp-modeline-workspace-status-enable + (add-hook 'lsp-configure-hook 'lsp-modeline-workspace-status-mode) + (remove-hook 'lsp-configure-hook 'lsp-modeline-workspace-status-mode)) + (if lsp-lens-enable + (add-hook 'lsp-configure-hook 'lsp-lens--enable) + (remove-hook 'lsp-configure-hook 'lsp-lens--enable)) + (if lsp-semantic-tokens-enable + (add-hook 'lsp-configure-hook 'lsp-semantic-tokens--enable) + (remove-hook 'lsp-configure-hook 'lsp-semantic-tokens--enable)) + + ;; yas-snippet config + (setq-local yas-inhibit-overlay-modification-protection t)) + +(defvar-local lsp--buffer-deferred nil + "Whether buffer was loaded via `lsp-deferred'.") + +(defun lsp--restart-if-needed (workspace) + "Handler restart for WORKSPACE." + (when (or (eq lsp-restart 'auto-restart) + (eq (lsp--workspace-shutdown-action workspace) 'restart) + (and (eq lsp-restart 'interactive) + (let ((query (format + "Server %s exited (check corresponding stderr buffer for details). Do you want to restart it?" + (lsp--workspace-print workspace)))) + (y-or-n-p query)))) + (--each (lsp--workspace-buffers workspace) + (when (lsp-buffer-live-p it) + (lsp-with-current-buffer it + (if lsp--buffer-deferred + (lsp-deferred) + (lsp--info "Restarting LSP in buffer %s" (buffer-name)) + (lsp))))))) + +(defun lsp--update-key (table key fn) + "Apply FN on value corresponding to KEY in TABLE." + (let ((existing-value (gethash key table))) + (if-let ((new-value (funcall fn existing-value))) + (puthash key new-value table) + (remhash key table)))) + +(defun lsp--process-sentinel (workspace process exit-str) + "Create the sentinel for WORKSPACE." + (unless (process-live-p process) + (lsp--handle-process-exit workspace exit-str))) + +(defun lsp--handle-process-exit (workspace exit-str) + (let* ((folder->workspaces (lsp-session-folder->servers (lsp-session))) + (proc (lsp--workspace-proc workspace))) + (lsp--warn "%s has exited (%s)" + (lsp-process-name proc) + (string-trim-right (or exit-str ""))) + (with-lsp-workspace workspace + ;; Clean workspace related data in each of the buffers + ;; in the workspace. + (--each (lsp--workspace-buffers workspace) + (when (lsp-buffer-live-p it) + (lsp-with-current-buffer it + (setq lsp--buffer-workspaces (delete workspace lsp--buffer-workspaces)) + (lsp--uninitialize-workspace) + (lsp--spinner-stop) + (lsp--remove-overlays 'lsp-highlight)))) + + ;; Cleanup session from references to the closed workspace. + (--each (hash-table-keys folder->workspaces) + (lsp--update-key folder->workspaces it (apply-partially 'delete workspace))) + + (lsp-process-cleanup proc)) + + (run-hook-with-args 'lsp-after-uninitialized-functions workspace) + + (if (eq (lsp--workspace-shutdown-action workspace) 'shutdown) + (lsp--info "Workspace %s shutdown." (lsp--workspace-print workspace)) + (lsp--restart-if-needed workspace)) + (lsp--cleanup-hanging-watches))) + +(defun lsp-workspace-folders (workspace) + "Return all folders associated with WORKSPACE." + (let (result) + (->> (lsp-session) + (lsp-session-folder->servers) + (maphash (lambda (folder workspaces) + (when (-contains? workspaces workspace) + (push folder result))))) + result)) + +(defun lsp--start-workspace (session client-template root &optional initialization-options) + "Create new workspace for CLIENT-TEMPLATE with project root ROOT. +INITIALIZATION-OPTIONS are passed to initialize function. +SESSION is the active session." + (lsp--spinner-start) + (-let* ((default-directory root) + (client (copy-lsp--client client-template)) + (workspace (make-lsp--workspace + :root root + :client client + :status 'starting + :buffers (list (lsp-current-buffer)) + :host-root (file-remote-p root))) + ((&lsp-cln 'server-id 'environment-fn 'new-connection 'custom-capabilities + 'multi-root 'initialized-fn) client) + ((proc . cmd-proc) (funcall + (or (plist-get new-connection :connect) + (user-error "Client %s is configured incorrectly" client)) + (lsp--create-filter-function workspace) + (apply-partially #'lsp--process-sentinel workspace) + (format "%s" server-id) + environment-fn + workspace)) + (workspace-folders (gethash server-id (lsp-session-server-id->folders session)))) + (setf (lsp--workspace-proc workspace) proc + (lsp--workspace-cmd-proc workspace) cmd-proc) + + ;; update (lsp-session-folder->servers) depending on whether we are starting + ;; multi/single folder workspace + (mapc (lambda (project-root) + (->> session + (lsp-session-folder->servers) + (gethash project-root) + (cl-pushnew workspace))) + (or workspace-folders (list root))) + + (with-lsp-workspace workspace + (run-hooks 'lsp-before-initialize-hook) + (lsp-request-async + "initialize" + (append + (list :processId (unless (file-remote-p (buffer-file-name)) + (emacs-pid)) + :rootPath (lsp-file-local-name (expand-file-name root)) + :clientInfo (list :name "emacs" + :version (emacs-version)) + :rootUri (lsp--path-to-uri root) + :capabilities (lsp--client-capabilities custom-capabilities) + :initializationOptions initialization-options + :workDoneToken "1") + (when lsp-server-trace + (list :trace lsp-server-trace)) + (when multi-root + (->> workspace-folders + (-distinct) + (-map (lambda (folder) + (list :uri (lsp--path-to-uri folder) + :name (f-filename folder)))) + (apply 'vector) + (list :workspaceFolders)))) + (-lambda ((&InitializeResult :capabilities)) + ;; we know that Rust Analyzer will send {} which will be parsed as null + ;; when using plists + (when (equal 'rust-analyzer server-id) + (-> capabilities + (lsp:server-capabilities-text-document-sync?) + (lsp:set-text-document-sync-options-save? t))) + + (setf (lsp--workspace-server-capabilities workspace) capabilities + (lsp--workspace-status workspace) 'initialized) + + (with-lsp-workspace workspace + (lsp-notify "initialized" lsp--empty-ht)) + + (when initialized-fn (funcall initialized-fn workspace)) + + (cl-callf2 -filter #'lsp-buffer-live-p (lsp--workspace-buffers workspace)) + (->> workspace + (lsp--workspace-buffers) + (mapc (lambda (buffer) + (lsp-with-current-buffer buffer + (lsp--open-in-workspace workspace))))) + + (with-lsp-workspace workspace + (run-hooks 'lsp-after-initialize-hook)) + (lsp--info "%s initialized successfully in folders: %s" + (lsp--workspace-print workspace) + (lsp-workspace-folders workspace))) + :mode 'detached)) + workspace)) + +(defun lsp--load-default-session () + "Load default session." + (setq lsp--session (or (condition-case err + (lsp--read-from-file lsp-session-file) + (error (lsp--error "Failed to parse the session %s, starting with clean one." + (error-message-string err)) + nil)) + (make-lsp-session)))) + +(defun lsp-session () + "Get the session associated with the current buffer." + (or lsp--session (setq lsp--session (lsp--load-default-session)))) + +(defun lsp--client-disabled-p (buffer-major-mode client) + (seq-some + (lambda (entry) + (pcase entry + ((pred symbolp) (eq entry client)) + (`(,mode . ,client-or-list) + (and (eq mode buffer-major-mode) + (if (listp client-or-list) + (memq client client-or-list) + (eq client client-or-list)))))) + lsp-disabled-clients)) + + +;; download server + +(defcustom lsp-server-install-dir (expand-file-name + (locate-user-emacs-file (f-join ".cache" "lsp"))) + "Directory in which the servers will be installed." + :risky t + :type 'directory + :package-version '(lsp-mode . "6.3") + :group 'lsp-mode) + +(defcustom lsp-verify-signature t + "Whether to check GPG signatures of downloaded files." + :type 'boolean + :package-version '(lsp-mode . "8.0.0") + :group 'lsp-mode) + +(defvar lsp--dependencies (ht)) + +(defun lsp-dependency (name &rest definitions) + "Used to specify a language server DEPENDENCY, the server +executable or other required file path. Typically, the +DEPENDENCY is found by locating it on the system path using +`executable-find'. + +You can explicitly call lsp-dependency in your environment to +specify the absolute path to the DEPENDENCY. For example, the +typescript-language-server requires both the server and the +typescript compiler. If you have installed them in a team shared +read-only location, you can instruct lsp-mode to use them via + + (eval-after-load `lsp-mode + `(progn + (require lsp-javascript) + (lsp-dependency typescript-language-server (:system ,tls-exe)) + (lsp-dependency typescript (:system ,ts-js)))) + +where tls-exe is the absolute path to the typescript-language-server +executable and ts-js is the absolute path to the typescript compiler +JavaScript file, tsserver.js (the *.js is required for Windows)." + (ht-set lsp--dependencies name definitions)) + +(defun lsp--server-binary-present? (client) + (unless (equal (lsp--client-server-id client) 'lsp-pwsh) + (condition-case () + (-some-> client lsp--client-new-connection (plist-get :test?) funcall) + (error nil) + (args-out-of-range nil)))) + +(define-minor-mode lsp-installation-buffer-mode + "Mode used in *lsp-installation* buffers. +It can be used to set-up keybindings, etc. Disabling this mode +detaches the installation buffer from commands like +`lsp-select-installation-buffer'." + :init-value nil + :lighter nil) + +(defface lsp-installation-finished-buffer-face '((t :foreground "orange")) + "Face used for finished installation buffers. +Used in `lsp-select-installation-buffer'." + :group 'lsp-mode) + +(defface lsp-installation-buffer-face '((t :foreground "green")) + "Face used for installation buffers still in progress. +Used in `lsp-select-installation-buffer'." + :group 'lsp-mode) + +(defun lsp--installation-buffer? (buf) + "Check whether BUF is an `lsp-async-start-process' buffer." + (buffer-local-value 'lsp-installation-buffer-mode buf)) + +(defun lsp-select-installation-buffer (&optional show-finished) + "Interactively choose an installation buffer. +If SHOW-FINISHED is set, leftover (finished) installation buffers +are still shown." + (interactive "P") + (let ((bufs (--filter (and (lsp--installation-buffer? it) + (or show-finished (get-buffer-process it))) + (buffer-list)))) + (pcase bufs + (`nil (user-error "No installation buffers")) + (`(,buf) (pop-to-buffer buf)) + (bufs (pop-to-buffer (completing-read "Select installation buffer: " + (--map (propertize (buffer-name it) 'face + (if (get-buffer-process it) + 'lsp-installation-buffer-face + 'lsp-installation-finished-buffer-face)) + bufs))))))) + +(defun lsp-cleanup-installation-buffers () + "Delete finished *lsp-installation* buffers." + (interactive) + (dolist (buf (buffer-list)) + (when (and (lsp--installation-buffer? buf) (not (get-buffer-process buf))) + (kill-buffer buf)))) + +(defun lsp--download-status () + (-some--> #'lsp--client-download-in-progress? + (lsp--filter-clients it) + (-map (-compose #'symbol-name #'lsp--client-server-id) it) + (format "%s" it) + (propertize it 'face 'success) + (format " Installing following servers: %s" it) + (propertize it + 'local-map (make-mode-line-mouse-map + 'mouse-1 #'lsp-select-installation-buffer) + 'mouse-face 'highlight))) + +(defun lsp--install-server-internal (client &optional update?) + (unless (lsp--client-download-server-fn client) + (user-error "There is no automatic installation for `%s', you have to install it manually following lsp-mode's documentation." + (lsp--client-server-id client))) + + (setf (lsp--client-download-in-progress? client) t) + (add-to-list 'global-mode-string '(t (:eval (lsp--download-status)))) + (cl-flet ((done + (success? &optional error-message) + ;; run with idle timer to make sure the lsp command is executed in + ;; the main thread, see #2739. + (run-with-timer + 0.0 + nil + (lambda () + (-let [(&lsp-cln 'server-id 'buffers) client] + (setf (lsp--client-download-in-progress? client) nil + (lsp--client-buffers client) nil) + (if success? + (lsp--info "Server %s downloaded, auto-starting in %s buffers." server-id + (length buffers)) + (lsp--error "Server %s install process failed with the following error message: %s. +Check `*lsp-install*' and `*lsp-log*' buffer." + server-id + error-message)) + (seq-do + (lambda (buffer) + (when (lsp-buffer-live-p buffer) + (lsp-with-current-buffer buffer + (cl-callf2 -remove-item '(t (:eval (lsp--download-status))) + global-mode-string) + (when success? (lsp))))) + buffers) + (unless (lsp--filter-clients #'lsp--client-download-in-progress?) + (cl-callf2 -remove-item '(t (:eval (lsp--download-status))) + global-mode-string))))))) + (lsp--info "Download %s started." (lsp--client-server-id client)) + (condition-case err + (funcall + (lsp--client-download-server-fn client) + client + (lambda () (done t)) + (lambda (msg) (done nil msg)) + update?) + (error + (done nil (error-message-string err)))))) + +(defun lsp--require-packages () + "Load `lsp-client-packages' if needed." + (when (and lsp-auto-configure (not lsp--client-packages-required)) + (seq-do (lambda (package) + ;; loading client is slow and `lsp' can be called repeatedly + (unless (featurep package) + (require package nil t))) + lsp-client-packages) + (setq lsp--client-packages-required t))) + +;;;###autoload +(defun lsp-install-server (update? &optional server-id) + "Interactively install or re-install server. +When prefix UPDATE? is t force installation even if the server is present." + (interactive "P") + (lsp--require-packages) + (let* ((chosen-client (or (gethash server-id lsp-clients) + (lsp--completing-read + "Select server to install/re-install: " + (or (->> lsp-clients + (ht-values) + (-filter (-andfn + (-not #'lsp--client-download-in-progress?) + #'lsp--client-download-server-fn))) + (user-error "There are no servers with automatic installation")) + (lambda (client) + (let ((server-name (-> client lsp--client-server-id symbol-name))) + (if (lsp--server-binary-present? client) + (concat server-name " (Already installed)") + server-name))) + nil + t))) + (update? (or update? + (and (not (lsp--client-download-in-progress? chosen-client)) + (lsp--server-binary-present? chosen-client))))) + (lsp--install-server-internal chosen-client update?))) + +;;;###autoload +(defun lsp-uninstall-server (dir) + "Delete a LSP server from `lsp-server-install-dir'." + (interactive + (list (read-directory-name "Uninstall LSP server: " (f-slash lsp-server-install-dir)))) + (unless (file-directory-p dir) + (user-error "Couldn't find %s directory" dir)) + (delete-directory dir 'recursive) + (message "Server `%s' uninstalled." (file-name-nondirectory (directory-file-name dir)))) + +;;;###autoload +(defun lsp-uninstall-servers () + "Uninstall all installed servers." + (interactive) + (let* ((dir lsp-server-install-dir) + (servers (ignore-errors + (directory-files dir t + directory-files-no-dot-files-regexp)))) + (if (or (not (file-directory-p dir)) (zerop (length servers))) + (user-error "No servers to uninstall") + (when (yes-or-no-p + (format "Servers to uninstall: %d (%s), proceed? " + (length servers) + (mapconcat (lambda (server) + (file-name-nondirectory (directory-file-name server))) + servers " "))) + (mapc #'lsp-uninstall-server servers) + (message "All servers uninstalled"))))) + +;;;###autoload +(defun lsp-update-server (&optional server-id) + "Interactively update (reinstall) a server." + (interactive) + (lsp--require-packages) + (let ((chosen-client (or (gethash server-id lsp-clients) + (lsp--completing-read + "Select server to update (if not on the list, probably you need to `lsp-install-server`): " + (or (->> lsp-clients + (ht-values) + (-filter (-andfn + (-not #'lsp--client-download-in-progress?) + #'lsp--client-download-server-fn + #'lsp--server-binary-present?))) + (user-error "There are no servers to update")) + (lambda (client) + (-> client lsp--client-server-id symbol-name)) + nil + t)))) + (lsp--install-server-internal chosen-client t))) + +;;;###autoload +(defun lsp-update-servers () + "Update (reinstall) all installed servers." + (interactive) + (lsp--require-packages) + (mapc (lambda (client) (lsp--install-server-internal client t)) + (-filter (-andfn + (-not #'lsp--client-download-in-progress?) + #'lsp--client-download-server-fn + #'lsp--server-binary-present?) (hash-table-values lsp-clients)))) + +;;;###autoload +(defun lsp-ensure-server (server-id) + "Ensure server SERVER-ID" + (lsp--require-packages) + (if-let ((client (gethash server-id lsp-clients))) + (unless (lsp--server-binary-present? client) + (lsp--info "Server `%s' is not preset, installing..." server-id) + (lsp-install-server nil server-id)) + (warn "Unable to find server registration with id %s" server-id))) + +(defun lsp-async-start-process (callback error-callback &rest command) + "Start async process COMMAND with CALLBACK and ERROR-CALLBACK." + (let ((name (cl-first command))) + (with-current-buffer (compilation-start (mapconcat #'shell-quote-argument (-filter (lambda (cmd) + (not (null cmd))) + command) + " ") t + (lambda (&rest _) + (generate-new-buffer-name (format "*lsp-install: %s*" name)))) + (lsp-installation-buffer-mode +1) + (view-mode +1) + (add-hook + 'compilation-finish-functions + (lambda (_buf status) + (if (string= "finished\n" status) + (condition-case err + (funcall callback) + (error + (funcall error-callback (error-message-string err)))) + (funcall error-callback (s-trim-right status)))) + nil t)))) + +(defun lsp-resolve-value (value) + "Resolve VALUE's value. +If it is function - call it. +If it is a variable - return it's value +Otherwise returns value itself." + (cond + ((functionp value) (funcall value)) + ((and (symbolp value) (boundp value)) (symbol-value value)) + (value))) + +(defvar lsp-deps-providers + (list :npm (list :path #'lsp--npm-dependency-path + :install #'lsp--npm-dependency-install) + :cargo (list :path #'lsp--cargo-dependency-path + :install #'lsp--cargo-dependency-install) + :system (list :path #'lsp--system-path) + :download (list :path #'lsp-download-path + :install #'lsp-download-install))) + +(defun lsp--system-path (path) + "If PATH is absolute and exists return it as is. Otherwise, +return the absolute path to the executable defined by PATH or +nil." + ;; For node.js 'sub-packages' PATH may point to a *.js file. Consider the + ;; typescript-language-server. When lsp invokes the server, lsp needs to + ;; supply the path to the typescript compiler, tsserver.js, as an argument. To + ;; make code platform independent, one must pass the absolute path to the + ;; tsserver.js file (Windows requires a *.js file - see help on the JavaScript + ;; child process spawn command that is invoked by the + ;; typescript-language-server). This is why we check for existence and not + ;; that the path is executable. + (let ((path (lsp-resolve-value path))) + (cond + ((and (f-absolute? path) + (f-exists? path)) + path) + ((executable-find path t) path)))) + +(defun lsp-package-path (dependency) + "Path to the DEPENDENCY each of the registered providers." + (let (path) + (-first (-lambda ((provider . rest)) + (setq path (-some-> lsp-deps-providers + (plist-get provider) + (plist-get :path) + (apply rest)))) + (gethash dependency lsp--dependencies)) + path)) + +(defun lsp-package-ensure (dependency callback error-callback) + "Asynchronously ensure a package." + (or (-first (-lambda ((provider . rest)) + (-some-> lsp-deps-providers + (plist-get provider) + (plist-get :install) + (apply (cl-list* callback error-callback rest)))) + (gethash dependency lsp--dependencies)) + (funcall error-callback (format "Unable to find a way to install %s" dependency)))) + + +;; npm handling + +;; https://docs.npmjs.com/files/folders#executables +(cl-defun lsp--npm-dependency-path (&key package path &allow-other-keys) + "Return npm dependency PATH for PACKAGE." + (let ((path (executable-find + (f-join lsp-server-install-dir "npm" package + (cond ((eq system-type 'windows-nt) "") + (t "bin")) + path) + t))) + (unless (and path (f-exists? path)) + (error "The package %s is not installed. Unable to find %s" package path)) + path)) + +(cl-defun lsp--npm-dependency-install (callback error-callback &key package &allow-other-keys) + (if-let ((npm-binary (executable-find "npm"))) + (progn + ;; Explicitly `make-directory' to work around NPM bug in + ;; versions 7.0.0 through 7.4.1. See + ;; https://github.com/emacs-lsp/lsp-mode/issues/2364 for + ;; discussion. + (make-directory (f-join lsp-server-install-dir "npm" package "lib") 'parents) + (lsp-async-start-process (lambda () + (if (string-empty-p + (string-trim (shell-command-to-string + (mapconcat #'shell-quote-argument `(,npm-binary "view" ,package "peerDependencies") " ")))) + (funcall callback) + (let ((default-directory (f-dirname (car (last (directory-files-recursively (f-join lsp-server-install-dir "npm" package) "package.json"))))) + (process-environment (append '("npm_config_yes=true") process-environment))) ;; Disable prompting for older versions of npx + (when (f-dir-p default-directory) + (lsp-async-start-process callback + error-callback + (executable-find "npx") + "npm-install-peers"))))) + error-callback + npm-binary + "-g" + "--prefix" + (f-join lsp-server-install-dir "npm" package) + "install" + package)) + (lsp-log "Unable to install %s via `npm' because it is not present" package) + nil)) + + +;; Cargo dependency handling +(cl-defun lsp--cargo-dependency-path (&key package path &allow-other-keys) + (let ((path (executable-find + (f-join lsp-server-install-dir + "cargo" + package + "bin" + path) + t))) + (unless (and path (f-exists? path)) + (error "The package %s is not installed. Unable to find %s" package path)) + path)) + +(cl-defun lsp--cargo-dependency-install (callback error-callback &key package git &allow-other-keys) + (if-let ((cargo-binary (executable-find "cargo"))) + (lsp-async-start-process + callback + error-callback + cargo-binary + "install" + package + (when git + "--git") + git + "--root" + (f-join lsp-server-install-dir "cargo" package)) + (lsp-log "Unable to install %s via `cargo' because it is not present" package) + nil)) + + + +;; Download URL handling +(cl-defun lsp-download-install (callback error-callback &key url asc-url pgp-key store-path decompress &allow-other-keys) + (let* ((url (lsp-resolve-value url)) + (store-path (lsp-resolve-value store-path)) + ;; (decompress (lsp-resolve-value decompress)) + (download-path + (pcase decompress + (:gzip (concat store-path ".gz")) + (:zip (concat store-path ".zip")) + (:targz (concat store-path ".tar.gz")) + (`nil store-path) + (_ (error ":decompress must be `:gzip', `:zip', `:targz' or `nil'"))))) + (make-thread + (lambda () + (condition-case err + (progn + (when (f-exists? download-path) + (f-delete download-path)) + (when (f-exists? store-path) + (f-delete store-path)) + (lsp--info "Starting to download %s to %s..." url download-path) + (mkdir (f-parent download-path) t) + (url-copy-file url download-path) + (lsp--info "Finished downloading %s..." download-path) + (when (and lsp-verify-signature asc-url pgp-key) + (if (executable-find epg-gpg-program) + (let ((asc-download-path (concat download-path ".asc")) + (context (epg-make-context)) + (fingerprint) + (signature)) + (when (f-exists? asc-download-path) + (f-delete asc-download-path)) + (lsp--info "Starting to download %s to %s..." asc-url asc-download-path) + (url-copy-file asc-url asc-download-path) + (lsp--info "Finished downloading %s..." asc-download-path) + (epg-import-keys-from-string context pgp-key) + (setq fingerprint (epg-import-status-fingerprint + (car + (epg-import-result-imports + (epg-context-result-for context 'import))))) + (lsp--info "Verifying signature %s..." asc-download-path) + (epg-verify-file context asc-download-path download-path) + (setq signature (car (epg-context-result-for context 'verify))) + (unless (and + (eq (epg-signature-status signature) 'good) + (equal (epg-signature-fingerprint signature) fingerprint)) + (error "Failed to verify GPG signature: %s" (epg-signature-to-string signature)))) + (lsp--warn "GPG is not installed, skipping the signature check."))) + (when decompress + (lsp--info "Decompressing %s..." download-path) + (pcase decompress + (:gzip + (lsp-gunzip download-path)) + (:zip (lsp-unzip download-path (f-parent store-path))) + (:targz (lsp-tar-gz-decompress download-path (f-parent store-path)))) + (lsp--info "Decompressed %s..." store-path)) + (funcall callback)) + (error (funcall error-callback err))))))) + +(cl-defun lsp-download-path (&key store-path binary-path set-executable? &allow-other-keys) + "Download URL and store it into STORE-PATH. + +SET-EXECUTABLE? when non-nil change the executable flags of +STORE-PATH to make it executable. BINARY-PATH can be specified +when the binary to start does not match the name of the +archive (e.g. when the archive has multiple files)" + (let ((store-path (or (lsp-resolve-value binary-path) + (lsp-resolve-value store-path)))) + (cond + ((executable-find store-path) store-path) + ((and set-executable? (f-exists? store-path)) + (set-file-modes store-path #o0700) + store-path) + ((f-exists? store-path) store-path)))) + +(defun lsp--find-latest-gh-release-url (url regex) + "Fetch the latest version in the releases given by URL by using REGEX." + (let ((url-request-method "GET")) + (with-current-buffer (url-retrieve-synchronously url) + (goto-char (point-min)) + (re-search-forward "\n\n" nil 'noerror) + (delete-region (point-min) (point)) + (let* ((json-result (lsp-json-read-buffer))) + (message "Latest version found: %s" (lsp-get json-result :tag_name)) + (--> json-result + (lsp-get it :assets) + (seq-find (lambda (entry) (string-match-p regex (lsp-get entry :name))) it) + (lsp-get it :browser_download_url)))))) + +;; unzip + +(defconst lsp-ext-pwsh-script "powershell -noprofile -noninteractive \ +-nologo -ex bypass -command Expand-Archive -path '%s' -dest '%s'" + "Powershell script to unzip file.") + +(defconst lsp-ext-unzip-script "bash -c 'mkdir -p %2$s && unzip -qq -o %1$s -d %2$s'" + "Unzip script to unzip file.") + +(defcustom lsp-unzip-script (lambda () + (cond ((executable-find "unzip") lsp-ext-unzip-script) + ((executable-find "powershell") lsp-ext-pwsh-script) + (t nil))) + "The script to unzip." + :group 'lsp-mode + :type 'string + :package-version '(lsp-mode . "8.0.0")) + +(defun lsp-unzip (zip-file dest) + "Unzip ZIP-FILE to DEST." + (unless lsp-unzip-script + (error "Unable to find `unzip' or `powershell' on the path, please customize `lsp-unzip-script'")) + (shell-command (format (lsp-resolve-value lsp-unzip-script) zip-file dest))) + +;; gunzip + +(defconst lsp-ext-gunzip-script "gzip -d %1$s" + "Script to decompress a gzippped file with gzip.") + +(defcustom lsp-gunzip-script (lambda () + (cond ((executable-find "gzip") lsp-ext-gunzip-script) + (t nil))) + "The script to decompress a gzipped file. +Should be a format string with one argument for the file to be decompressed +in place." + :group 'lsp-mode + :type 'string + :package-version '(lsp-mode . "8.0.0")) + +(defun lsp-gunzip (gz-file) + "Decompress GZ-FILE in place." + (unless lsp-gunzip-script + (error "Unable to find `gzip' on the path, please either customize `lsp-gunzip-script' or manually decompress %s" gz-file)) + (shell-command (format (lsp-resolve-value lsp-gunzip-script) gz-file))) + +;; tar.gz decompression + +(defconst lsp-ext-tar-script "bash -c 'mkdir -p %2$s; tar xf %1$s --directory=%2$s'" + "Script to decompress a .tar.gz file.") + +(defcustom lsp-tar-script (lambda () + (cond ((executable-find "tar") lsp-ext-tar-script) + (t nil))) + "The script to decompress a .tar.gz file. +Should be a format string with one argument for the file to be decompressed +in place." + :group 'lsp-mode + :type 'string) + +(defun lsp-tar-gz-decompress (targz-file dest) + "Decompress TARGZ-FILE in DEST." + (unless lsp-tar-script + (error "Unable to find `tar' on the path, please either customize `lsp-tar-script' or manually decompress %s" targz-file)) + (shell-command (format (lsp-resolve-value lsp-tar-script) targz-file dest))) + + +;; VSCode marketplace + +(defcustom lsp-vscode-ext-url + "https://marketplace.visualstudio.com/_apis/public/gallery/publishers/%s/vsextensions/%s/%s/vspackage%s" + "Vscode extension template url." + :group 'lsp-mode + :type 'string + :package-version '(lsp-mode . "8.0.0")) + +(defun lsp-vscode-extension-url (publisher name version &optional targetPlatform) + "Return the URL to vscode extension. +PUBLISHER is the extension publisher. +NAME is the name of the extension. +VERSION is the version of the extension. +TARGETPLATFORM is the targetPlatform of the extension." + (format lsp-vscode-ext-url publisher name version (or targetPlatform ""))) + + + +;; Queueing prompts + +(defvar lsp--question-queue nil + "List of questions yet to be asked by `lsp-ask-question'.") + +(defun lsp-ask-question (question options callback) + "Prompt the user to answer the QUESTION with one of the OPTIONS from the +minibuffer. Once the user selects an option, the CALLBACK function will be +called, passing the selected option to it. + +If the user is currently being shown a question, the question will be stored in +`lsp--question-queue', and will be asked once the user has answered the current +question." + (add-to-list 'lsp--question-queue `(("question" . ,question) + ("options" . ,options) + ("callback" . ,callback)) t) + (when (eq (length lsp--question-queue) 1) + (lsp--process-question-queue))) + +(defun lsp--process-question-queue () + "Take the first question from `lsp--question-queue', process it, then process +the next question until the queue is empty." + (-let* (((&alist "question" "options" "callback") (car lsp--question-queue)) + (answer (completing-read question options nil t))) + (pop lsp--question-queue) + (funcall callback answer) + (when lsp--question-queue + (lsp--process-question-queue)))) + +(defun lsp--supports-buffer? (client) + (and + ;; both file and client remote or both local + (eq (---truthy? (file-remote-p (buffer-file-name))) + (---truthy? (lsp--client-remote? client))) + + ;; activation function or major-mode match. + (if-let ((activation-fn (lsp--client-activation-fn client))) + (funcall activation-fn (buffer-file-name) major-mode) + (-contains? (lsp--client-major-modes client) major-mode)) + + ;; check whether it is enabled if `lsp-enabled-clients' is not null + (or (null lsp-enabled-clients) + (or (member (lsp--client-server-id client) lsp-enabled-clients) + (ignore (lsp--info "Client %s is not in lsp-enabled-clients" + (lsp--client-server-id client))))) + + ;; check whether it is not disabled. + (not (lsp--client-disabled-p major-mode (lsp--client-server-id client))))) + +(defun lsp--filter-clients (pred) + (->> lsp-clients hash-table-values (-filter pred))) + +(defun lsp--find-clients () + "Find clients which can handle current buffer." + (-when-let (matching-clients (lsp--filter-clients (-andfn #'lsp--supports-buffer? + #'lsp--server-binary-present?))) + (lsp-log "Found the following clients for %s: %s" + (buffer-file-name) + (s-join ", " + (-map (lambda (client) + (format "(server-id %s, priority %s)" + (lsp--client-server-id client) + (lsp--client-priority client))) + matching-clients))) + (-let* (((add-on-clients main-clients) (-separate #'lsp--client-add-on? matching-clients)) + (selected-clients (if-let ((main-client (and main-clients + (--max-by (> (lsp--client-priority it) + (lsp--client-priority other)) + main-clients)))) + (cons main-client add-on-clients) + add-on-clients))) + (lsp-log "The following clients were selected based on priority: %s" + (s-join ", " + (-map (lambda (client) + (format "(server-id %s, priority %s)" + (lsp--client-server-id client) + (lsp--client-priority client))) + selected-clients))) + selected-clients))) + +(defun lsp-workspace-remove-all-folders() + "Delete all lsp tracked folders." + (interactive) + (--each (lsp-session-folders (lsp-session)) + (lsp-workspace-folders-remove it))) + +(defun lsp-register-client (client) + "Registers LSP client CLIENT." + (let ((client-id (lsp--client-server-id client))) + (puthash client-id client lsp-clients) + (setplist (intern (format "lsp-%s-after-open-hook" client-id)) + `( standard-value (nil) custom-type hook + custom-package-version (lsp-mode . "7.0.1") + variable-documentation ,(format "Hooks to run after `%s' server is run." client-id) + custom-requests nil))) + (when (and lsp-auto-register-remote-clients + (not (lsp--client-remote? client))) + (let ((remote-client (copy-lsp--client client))) + (setf (lsp--client-remote? remote-client) t + (lsp--client-server-id remote-client) (intern + (format "%s-tramp" + (lsp--client-server-id client))) + ;; disable automatic download + (lsp--client-download-server-fn remote-client) nil) + (lsp-register-client remote-client)))) + +(defun lsp--create-initialization-options (_session client) + "Create initialization-options from SESSION and CLIENT. +Add workspace folders depending on server being multiroot and +session workspace folder configuration for the server." + (let* ((initialization-options-or-fn (lsp--client-initialization-options client))) + (if (functionp initialization-options-or-fn) + (funcall initialization-options-or-fn) + initialization-options-or-fn))) + +(defvar lsp-client-settings (make-hash-table :test 'equal) + "For internal use, any external users please use + `lsp-register-custom-settings' function instead") + +(defun lsp-register-custom-settings (props) + "Register PROPS. +PROPS is list of triple (path value boolean?) where PATH is the path to the +property; VALUE can be a literal value, symbol to be evaluated, or either a +function or lambda function to be called without arguments; BOOLEAN? is an +optional flag that should be non-nil for boolean settings, when it is nil the +property will be ignored if the VALUE is nil. + +Example: `(lsp-register-custom-settings `((\"foo.bar.buzz.enabled\" t t)))' +\(note the double parentheses)" + (mapc + (-lambda ((path . rest)) + (puthash path rest lsp-client-settings)) + props)) + +(defun lsp-region-text (region) + "Get the text for REGION in current buffer." + (-let (((start . end) (lsp--range-to-region region))) + (buffer-substring-no-properties start end))) + +(defun lsp-ht-set (tbl paths value) + "Set nested hash table value. +TBL - a hash table, PATHS is the path to the nested VALUE." + (pcase paths + (`(,path) (ht-set! tbl path value)) + (`(,path . ,rst) (let ((nested-tbl (or (gethash path tbl) + (let ((temp-tbl (ht))) + (ht-set! tbl path temp-tbl) + temp-tbl)))) + (lsp-ht-set nested-tbl rst value))))) + +;; sections + +(defalias 'defcustom-lsp 'lsp-defcustom) + +(defmacro lsp-defcustom (symbol standard doc &rest args) + "Defines `lsp-mode' server property." + (declare (doc-string 3) (debug (name body)) + (indent defun)) + (let ((path (plist-get args :lsp-path))) + (cl-remf args :lsp-path) + `(progn + (lsp-register-custom-settings + (quote ((,path ,symbol ,(equal ''boolean (plist-get args :type)))))) + + (defcustom ,symbol ,standard ,doc + :set (lambda (sym val) + (lsp--set-custom-property sym val ,path)) + ,@args)))) + +(defun lsp--set-custom-property (sym val path) + (set sym val) + (let ((section (cl-first (s-split "\\." path)))) + (mapc (lambda (workspace) + (when (-contains? (lsp--client-synchronize-sections (lsp--workspace-client workspace)) + section) + (with-lsp-workspace workspace + (lsp--set-configuration (lsp-configuration-section section))))) + (lsp--session-workspaces (lsp-session))))) + +(defun lsp-configuration-section (section) + "Get settings for SECTION." + (let ((ret (ht-create))) + (maphash (-lambda (path (variable boolean?)) + (when (s-matches? (concat (regexp-quote section) "\\..*") path) + (let* ((symbol-value (-> variable + lsp-resolve-value + lsp-resolve-value)) + (value (if (and boolean? (not symbol-value)) + :json-false + symbol-value))) + (when (or boolean? value) + (lsp-ht-set ret (s-split "\\." path) value))))) + lsp-client-settings) + ret)) + + +(defun lsp--start-connection (session client project-root) + "Initiates connection created from CLIENT for PROJECT-ROOT. +SESSION is the active session." + (when (lsp--client-multi-root client) + (cl-pushnew project-root (gethash (lsp--client-server-id client) + (lsp-session-server-id->folders session)))) + (run-hook-with-args 'lsp-workspace-folders-changed-functions (list project-root) nil) + + (unwind-protect + (lsp--start-workspace session client project-root (lsp--create-initialization-options session client)) + (lsp--spinner-stop))) + +;; lsp-log-io-mode + +(defvar lsp-log-io-mode-map + (let ((map (make-sparse-keymap))) + (define-key map (kbd "M-n") #'lsp-log-io-next) + (define-key map (kbd "M-p") #'lsp-log-io-prev) + (define-key map (kbd "k") #'lsp--erase-log-buffer) + (define-key map (kbd "K") #'lsp--erase-session-log-buffers) + map) + "Keymap for lsp log buffer mode.") + +(define-derived-mode lsp-log-io-mode special-mode "LspLogIo" + "Special mode for viewing IO logs.") + +(defun lsp-workspace-show-log (workspace) + "Display the log buffer of WORKSPACE." + (interactive + (list (if lsp-log-io + (if (eq (length (lsp-workspaces)) 1) + (cl-first (lsp-workspaces)) + (lsp--completing-read "Workspace: " (lsp-workspaces) + #'lsp--workspace-print nil t)) + (user-error "IO logging is disabled")))) + (pop-to-buffer (lsp--get-log-buffer-create workspace))) + +(defalias 'lsp-switch-to-io-log-buffer 'lsp-workspace-show-log) + +(defun lsp--get-log-buffer-create (workspace) + "Return the lsp log buffer of WORKSPACE, creating a new one if needed." + (let* ((server-id (-> workspace lsp--workspace-client lsp--client-server-id symbol-name)) + (pid (-> workspace lsp--workspace-cmd-proc lsp-process-id))) + (get-buffer-create (format "*lsp-log: %s:%s*" server-id pid)))) + +(defun lsp--erase-log-buffer (&optional all) + "Delete contents of current lsp log buffer. +When ALL is t, erase all log buffers of the running session." + (interactive) + (let* ((workspaces (lsp--session-workspaces (lsp-session))) + (current-log-buffer (current-buffer))) + (dolist (w workspaces) + (let ((b (lsp--get-log-buffer-create w))) + (when (or all (eq b current-log-buffer)) + (with-current-buffer b + (let ((inhibit-read-only t)) + (erase-buffer)))))))) + +(defun lsp--erase-session-log-buffers () + "Erase log buffers of the running session." + (interactive) + (lsp--erase-log-buffer t)) + +(defun lsp-log-io-next (arg) + "Move to next log entry." + (interactive "P") + (ewoc-goto-next lsp--log-io-ewoc (or arg 1))) + +(defun lsp-log-io-prev (arg) + "Move to previous log entry." + (interactive "P") + (ewoc-goto-prev lsp--log-io-ewoc (or arg 1))) + + + +(cl-defmethod lsp-process-id ((process process)) + (process-id process)) + +(cl-defmethod lsp-process-name ((process process)) (process-name process)) + +(cl-defmethod lsp-process-status ((process process)) (process-status process)) + +(cl-defmethod lsp-process-kill ((process process)) + (when (process-live-p process) + (kill-process process))) + +(cl-defmethod lsp-process-send ((process process) message) + (condition-case err + (process-send-string process (lsp--make-message message)) + (error (lsp--error "Sending to process failed with the following error: %s" + (error-message-string err))))) + +(cl-defmethod lsp-process-cleanup (process) + ;; Kill standard error buffer only if the process exited normally. + ;; Leave it intact otherwise for debugging purposes. + (let ((buffer (-> process process-name get-buffer))) + (when (and (eq (process-status process) 'exit) + (zerop (process-exit-status process)) + (buffer-live-p buffer)) + (kill-buffer buffer)))) + + +;; native JSONRPC + +(declare-function json-rpc "ext:json") +(declare-function json-rpc-connection "ext:json") +(declare-function json-rpc-send "ext:json") +(declare-function json-rpc-shutdown "ext:json") +(declare-function json-rpc-stderr "ext:json") +(declare-function json-rpc-pid "ext:json") + +(defvar lsp-json-rpc-thread nil) +(defvar lsp-json-rpc-queue nil) +(defvar lsp-json-rpc-done nil) +(defvar lsp-json-rpc-mutex (make-mutex)) +(defvar lsp-json-rpc-condition (make-condition-variable lsp-json-rpc-mutex)) + +(defun lsp-json-rpc-process-queue () + (while (not lsp-json-rpc-done) + (while lsp-json-rpc-queue + (-let (((proc . message) (pop lsp-json-rpc-queue))) + (json-rpc-send + proc message + :null-object nil + :false-object :json-false))) + (with-mutex lsp-json-rpc-mutex + (condition-wait lsp-json-rpc-condition)))) + +(cl-defmethod lsp-process-id (process) (json-rpc-pid process)) + +(cl-defmethod lsp-process-name (_process) "TBD") + +(cl-defmethod lsp-process-kill (process) (json-rpc-shutdown process)) + +(cl-defmethod lsp-process-send (proc message) + (unless lsp-json-rpc-thread + (with-current-buffer (get-buffer-create " *json-rpc*") + (setq lsp-json-rpc-thread (make-thread #'lsp-json-rpc-process-queue "*json-rpc-queue*")))) + + (with-mutex lsp-json-rpc-mutex + (setq lsp-json-rpc-queue (append lsp-json-rpc-queue + (list (cons proc message)))) + (condition-notify lsp-json-rpc-condition))) + +(cl-defmethod lsp-process-cleanup (_proc)) + +(defun lsp-json-rpc-connection (workspace command) + (let ((con (apply #'json-rpc-connection command)) + (object-type (if lsp-use-plists 'plist 'hash-table))) + (with-current-buffer (get-buffer-create " *json-rpc*") + (make-thread + (lambda () + (json-rpc + con + (lambda (result err done) + (run-with-timer + 0.0 + nil + (lambda () + (cond + (result (lsp--parser-on-message result workspace)) + (err (warn "Json parsing failed with the following error: %s" err)) + (done (lsp--handle-process-exit workspace "")))))) + :object-type object-type + :null-object nil + :false-object nil)) + "*json-rpc-connection*")) + (cons con con))) + +(defun lsp-json-rpc-stderr () + (interactive) + (--when-let (pcase (lsp-workspaces) + (`nil (user-error "There are no active servers in the current buffer")) + (`(,workspace) workspace) + (workspaces (lsp--completing-read "Select server: " + workspaces + 'lsp--workspace-print nil t))) + (let ((content (json-rpc-stderr (lsp--workspace-cmd-proc it))) + (buffer (format "*stderr-%s*" (lsp--workspace-print it)) )) + (with-current-buffer (get-buffer-create buffer) + (with-help-window buffer + (insert content)))))) + + +(defun lsp--workspace-print (workspace) + "Visual representation WORKSPACE." + (let* ((proc (lsp--workspace-cmd-proc workspace)) + (status (lsp--workspace-status workspace)) + (server-id (-> workspace lsp--workspace-client lsp--client-server-id symbol-name)) + (pid (lsp-process-id proc))) + + (if (eq 'initialized status) + (format "%s:%s" server-id pid) + (format "%s:%s/%s" server-id pid status)))) + +(defun lsp--map-tree-widget (m) + "Build `tree-widget' from a hash-table or plist M." + (when (lsp-structure-p m) + (let (nodes) + (lsp-map (lambda (k v) + (push `(tree-widget + :tag ,(if (lsp-structure-p v) + (format "%s:" k) + (format "%s: %s" k + (propertize (format "%s" v) + 'face + 'font-lock-string-face))) + :open t + ,@(lsp--map-tree-widget v)) + nodes)) + m) + nodes))) + +(defun lsp-buffer-name (buffer-id) + (if-let ((buffer-name (plist-get buffer-id :buffer-name))) + (funcall buffer-name buffer-id) + (buffer-name buffer-id))) + +(defun lsp--render-workspace (workspace) + "Tree node representation of WORKSPACE." + `(tree-widget :tag ,(lsp--workspace-print workspace) + :open t + (tree-widget :tag ,(propertize "Buffers" 'face 'font-lock-function-name-face) + :open t + ,@(->> workspace + (lsp--workspace-buffers) + (--map `(tree-widget + :tag ,(when (lsp-buffer-live-p it) + (let ((buffer-name (lsp-buffer-name it))) + (if (lsp-with-current-buffer it buffer-read-only) + (propertize buffer-name 'face 'font-lock-constant-face) + buffer-name))))))) + (tree-widget :tag ,(propertize "Capabilities" 'face 'font-lock-function-name-face) + ,@(-> workspace lsp--workspace-server-capabilities lsp--map-tree-widget)))) + +(define-derived-mode lsp-browser-mode special-mode "LspBrowser" + "Define mode for displaying lsp sessions." + (setq-local display-buffer-base-action '(nil . ((inhibit-same-window . t))))) + +(defun lsp-describe-session () + "Describes current `lsp-session'." + (interactive) + (let ((session (lsp-session)) + (buf (get-buffer-create "*lsp session*")) + (root (lsp-workspace-root))) + (with-current-buffer buf + (lsp-browser-mode) + (let ((inhibit-read-only t)) + (erase-buffer) + (--each (lsp-session-folders session) + (widget-create + `(tree-widget + :tag ,(propertize it 'face 'font-lock-keyword-face) + :open t + ,@(->> session + (lsp-session-folder->servers) + (gethash it) + (-map 'lsp--render-workspace))))))) + (pop-to-buffer buf) + (goto-char (point-min)) + (cl-loop for tag = (widget-get (widget-get (widget-at) :node) :tag) + until (or (and root (string= tag root)) (eobp)) + do (goto-char (next-overlay-change (point)))))) + +(defun lsp--session-workspaces (session) + "Get all workspaces that are part of the SESSION." + (-> session lsp-session-folder->servers hash-table-values -flatten -uniq)) + +(defun lsp--find-multiroot-workspace (session client project-root) + "Look for a multiroot connection in SESSION created from CLIENT for +PROJECT-ROOT and BUFFER-MAJOR-MODE." + (when (lsp--client-multi-root client) + (-when-let (multi-root-workspace (->> session + (lsp--session-workspaces) + (--first (eq (-> it lsp--workspace-client lsp--client-server-id) + (lsp--client-server-id client))))) + (with-lsp-workspace multi-root-workspace + (lsp-notify "workspace/didChangeWorkspaceFolders" + (lsp-make-did-change-workspace-folders-params + :event (lsp-make-workspace-folders-change-event + :added (vector (lsp-make-workspace-folder + :uri (lsp--path-to-uri project-root) + :name (f-filename project-root))) + :removed [])))) + + (->> session (lsp-session-folder->servers) (gethash project-root) (cl-pushnew multi-root-workspace)) + (->> session (lsp-session-server-id->folders) (gethash (lsp--client-server-id client)) (cl-pushnew project-root)) + + (lsp--persist-session session) + + (lsp--info "Opened folder %s in workspace %s" project-root (lsp--workspace-print multi-root-workspace)) + (lsp--open-in-workspace multi-root-workspace) + + multi-root-workspace))) + +(defun lsp--ensure-lsp-servers (session clients project-root ignore-multi-folder) + "Ensure that SESSION contain server CLIENTS created for PROJECT-ROOT. +IGNORE-MULTI-FOLDER to ignore multi folder server." + (-map (lambda (client) + (or + (lsp--find-workspace session client project-root) + (unless ignore-multi-folder + (lsp--find-multiroot-workspace session client project-root)) + (lsp--start-connection session client project-root))) + clients)) + +(defun lsp--spinner-stop () + "Stop the spinner in case all of the workspaces are started." + (when (--all? (eq (lsp--workspace-status it) 'initialized) + lsp--buffer-workspaces) + (spinner-stop))) + +(defun lsp--open-in-workspace (workspace) + "Open in existing WORKSPACE." + (if (eq 'initialized (lsp--workspace-status workspace)) + ;; when workspace is initialized just call document did open. + (progn + (with-lsp-workspace workspace + (when-let ((before-document-open-fn (-> workspace + lsp--workspace-client + lsp--client-before-file-open-fn))) + (funcall before-document-open-fn workspace)) + (lsp--text-document-did-open)) + (lsp--spinner-stop)) + ;; when it is not initialized + (lsp--spinner-start) + (cl-pushnew (lsp-current-buffer) (lsp--workspace-buffers workspace)))) + +(defun lsp--find-workspace (session client project-root) + "Find server connection created with CLIENT in SESSION for PROJECT-ROOT." + (when-let ((workspace (->> session + (lsp-session-folder->servers) + (gethash project-root) + (--first (eql (-> it lsp--workspace-client lsp--client-server-id) + (lsp--client-server-id client)))))) + (lsp--open-in-workspace workspace) + workspace)) + +(defun lsp--read-char (prompt &optional options) + "Wrapper for `read-char-from-minibuffer' if Emacs +27. +Fallback to `read-key' otherwise. +PROMPT is the message and OPTIONS the available options." + (if (fboundp 'read-char-from-minibuffer) + (read-char-from-minibuffer prompt options) + (read-key prompt))) + +(defun lsp--find-root-interactively (session) + "Find project interactively. +Returns nil if the project should not be added to the current SESSION." + (condition-case nil + (let* ((project-root-suggestion (or (lsp--suggest-project-root) default-directory)) + (action (lsp--read-char + (format + "%s is not part of any project. + +%s ==> Import project root %s +%s ==> Import project by selecting root directory interactively +%s ==> Import project at current directory %s +%s ==> Do not ask again for the current project by adding %s to lsp-session-folders-blocklist +%s ==> Do not ask again for the current project by selecting ignore path interactively +%s ==> Do nothing: ask again when opening other files from the current project + +Select action: " + (propertize (buffer-name) 'face 'bold) + (propertize "i" 'face 'success) + (propertize project-root-suggestion 'face 'bold) + (propertize "I" 'face 'success) + (propertize "." 'face 'success) + (propertize default-directory 'face 'bold) + (propertize "d" 'face 'warning) + (propertize project-root-suggestion 'face 'bold) + (propertize "D" 'face 'warning) + (propertize "n" 'face 'warning)) + '(?i ?\r ?I ?. ?d ?D ?n)))) + (cl-case action + (?i project-root-suggestion) + (?\r project-root-suggestion) + (?I (read-directory-name "Select workspace folder to add: " + (or project-root-suggestion default-directory) + nil + t)) + (?. default-directory) + (?d (push project-root-suggestion (lsp-session-folders-blocklist session)) + (lsp--persist-session session) + nil) + (?D (push (read-directory-name "Select folder to blocklist: " + (or project-root-suggestion default-directory) + nil + t) + (lsp-session-folders-blocklist session)) + (lsp--persist-session session) + nil) + (t nil))) + (quit))) + +(declare-function tramp-file-name-host "ext:tramp" (file) t) +(declare-function tramp-dissect-file-name "ext:tramp" (file &optional nodefault)) + +(defun lsp--files-same-host (f1 f2) + "Predicate on whether or not two files are on the same host." + (or (not (or (file-remote-p f1) (file-remote-p f2))) + (and (file-remote-p f1) + (file-remote-p f2) + (progn (require 'tramp) + (equal (tramp-file-name-host (tramp-dissect-file-name f1)) + (tramp-file-name-host (tramp-dissect-file-name f2))))))) + +(defun lsp-find-session-folder (session file-name) + "Look in the current SESSION for folder containing FILE-NAME." + (let ((file-name-canonical (lsp-f-canonical file-name))) + (->> session + (lsp-session-folders) + (--filter (and (lsp--files-same-host it file-name-canonical) + (or (lsp-f-same? it file-name-canonical) + (and (f-dir? it) + (lsp-f-ancestor-of? it file-name-canonical))))) + (--max-by (> (length it) + (length other)))))) + +(defun lsp-find-workspace (server-id &optional file-name) + "Find workspace for SERVER-ID for FILE-NAME." + (-when-let* ((session (lsp-session)) + (folder->servers (lsp-session-folder->servers session)) + (workspaces (if file-name + (gethash (lsp-find-session-folder session file-name) folder->servers) + (lsp--session-workspaces session)))) + + (--first (eq (lsp--client-server-id (lsp--workspace-client it)) server-id) workspaces))) + +(defun lsp--calculate-root (session file-name) + "Calculate project root for FILE-NAME in SESSION." + (and + (->> session + (lsp-session-folders-blocklist) + (--first (and (lsp--files-same-host it file-name) + (lsp-f-ancestor-of? it file-name) + (prog1 t + (lsp--info "File %s is in blocklisted directory %s" file-name it)))) + not) + (or + (when lsp-auto-guess-root + (lsp--suggest-project-root)) + (unless lsp-guess-root-without-session + (lsp-find-session-folder session file-name)) + (unless lsp-auto-guess-root + (when-let ((root-folder (lsp--find-root-interactively session))) + (if (or (not (f-equal? root-folder (expand-file-name "~/"))) + (yes-or-no-p + (concat + (propertize "[WARNING] " 'face 'warning) + "You are trying to import your home folder as project root. This may cause performance issue because some language servers (python, lua, etc) will try to scan all files under project root. To avoid that you may: + +1. Use `I' option from the interactive project import to select subfolder(e. g. `~/foo/bar' instead of `~/'). +2. If your file is under `~/' then create a subfolder and move that file in this folder. + +Type `No' to go back to project selection. +Type `Yes' to confirm `HOME' as project root. +Type `C-g' to cancel project import process and stop `lsp'"))) + root-folder + (lsp--calculate-root session file-name))))))) + +(defun lsp--try-open-in-library-workspace () + "Try opening current file as library file in any of the active workspace. +The library folders are defined by each client for each of the active workspace." + (when-let ((workspace (->> (lsp-session) + (lsp--session-workspaces) + ;; Sort the last active workspaces first as they are more likely to be + ;; the correct ones, especially when jumping to a definition. + (-sort (lambda (a _b) + (-contains? lsp--last-active-workspaces a))) + (--first + (and (-> it lsp--workspace-client lsp--supports-buffer?) + (when-let ((library-folders-fn + (-> it lsp--workspace-client lsp--client-library-folders-fn))) + (-first (lambda (library-folder) + (lsp-f-ancestor-of? library-folder (buffer-file-name))) + (funcall library-folders-fn it)))))))) + (lsp--open-in-workspace workspace) + (view-mode t) + (lsp--info "Opening read-only library file %s." (buffer-file-name)) + (list workspace))) + +(defun lsp--persist-session (session) + "Persist SESSION to `lsp-session-file'." + (lsp--persist lsp-session-file (make-lsp-session + :folders (lsp-session-folders session) + :folders-blocklist (lsp-session-folders-blocklist session) + :server-id->folders (lsp-session-server-id->folders session)))) + +(defun lsp--try-project-root-workspaces (ask-for-client ignore-multi-folder) + "Try create opening file as a project file. +When IGNORE-MULTI-FOLDER is t the lsp mode will start new +language server even if there is language server which can handle +current language. When IGNORE-MULTI-FOLDER is nil current file +will be opened in multi folder language server if there is +such." + (-let ((session (lsp-session))) + (-if-let (clients (if ask-for-client + (list (lsp--completing-read "Select server to start: " + (ht-values lsp-clients) + (-compose 'symbol-name 'lsp--client-server-id) nil t)) + (lsp--find-clients))) + (-if-let (project-root (-some-> session + (lsp--calculate-root (buffer-file-name)) + (lsp-f-canonical))) + (progn + ;; update project roots if needed and persist the lsp session + (unless (-contains? (lsp-session-folders session) project-root) + (cl-pushnew project-root (lsp-session-folders session)) + (lsp--persist-session session)) + (lsp--ensure-lsp-servers session clients project-root ignore-multi-folder)) + (lsp--warn "%s not in project or it is blocklisted." (buffer-name)) + nil) + (lsp--warn "No LSP server for %s(check *lsp-log*)." major-mode) + nil))) + +(defun lsp-shutdown-workspace () + "Shutdown language server." + (interactive) + (--when-let (pcase (lsp-workspaces) + (`nil (user-error "There are no active servers in the current buffer")) + (`(,workspace) (when (y-or-n-p (format "Are you sure you want to stop the server %s?" + (lsp--workspace-print workspace))) + workspace)) + (workspaces (lsp--completing-read "Select server: " + workspaces + 'lsp--workspace-print nil t))) + (lsp-workspace-shutdown it))) + +(make-obsolete 'lsp-shutdown-workspace 'lsp-workspace-shutdown "lsp-mode 6.1") + +(defcustom lsp-auto-select-workspace t + "Shutdown or restart a single workspace. +If set and the current buffer has only a single workspace +associated with it, `lsp-shutdown-workspace' and +`lsp-restart-workspace' will act on it without asking." + :type 'boolean + :group 'lsp-mode) + +(defun lsp--read-workspace () + "Ask the user to select a workspace. +Errors if there are none." + (pcase (lsp-workspaces) + (`nil (error "No workspaces associated with the current buffer")) + ((and `(,workspace) (guard lsp-auto-select-workspace)) workspace) + (workspaces (lsp--completing-read "Select workspace: " workspaces + #'lsp--workspace-print nil t)))) + +(defun lsp-workspace-shutdown (workspace) + "Shut the workspace WORKSPACE and the language server associated with it" + (interactive (list (lsp--read-workspace))) + (lsp--warn "Stopping %s" (lsp--workspace-print workspace)) + (with-lsp-workspace workspace (lsp--shutdown-workspace))) + +(defun lsp-disconnect () + "Disconnect the buffer from the language server." + (interactive) + (lsp--text-document-did-close t) + (lsp-managed-mode -1) + (lsp-mode -1) + (setq lsp--buffer-workspaces nil) + (lsp--info "Disconnected")) + +(defun lsp-restart-workspace () + (interactive) + (--when-let (pcase (lsp-workspaces) + (`nil (user-error "There are no active servers in the current buffer")) + (`(,workspace) workspace) + (workspaces (lsp--completing-read "Select server: " + workspaces + 'lsp--workspace-print nil t))) + (lsp-workspace-restart it))) + +(make-obsolete 'lsp-restart-workspace 'lsp-workspace-restart "lsp-mode 6.1") + +(defun lsp-workspace-restart (workspace) + "Restart the workspace WORKSPACE and the language server associated with it" + (interactive (list (lsp--read-workspace))) + (lsp--warn "Restarting %s" (lsp--workspace-print workspace)) + (with-lsp-workspace workspace (lsp--shutdown-workspace t))) + +;;;###autoload +(defun lsp (&optional arg) + "Entry point for the server startup. +When ARG is t the lsp mode will start new language server even if +there is language server which can handle current language. When +ARG is nil current file will be opened in multi folder language +server if there is such. When `lsp' is called with prefix +argument ask the user to select which language server to start." + (interactive "P") + + (lsp--require-packages) + + (when (buffer-file-name) + (let (clients + (matching-clients (lsp--filter-clients + (-andfn #'lsp--supports-buffer? + #'lsp--server-binary-present?)))) + (cond + (matching-clients + (when (setq lsp--buffer-workspaces + (or (and + ;; Don't open as library file if file is part of a project. + (not (lsp-find-session-folder (lsp-session) (buffer-file-name))) + (lsp--try-open-in-library-workspace)) + (lsp--try-project-root-workspaces (equal arg '(4)) + (and arg (not (equal arg 1)))))) + (lsp-mode 1) + (when lsp-auto-configure (lsp--auto-configure)) + (setq lsp-buffer-uri (lsp--buffer-uri)) + (lsp--info "Connected to %s." + (apply 'concat (--map (format "[%s %s]" + (lsp--workspace-print it) + (lsp--workspace-root it)) + lsp--buffer-workspaces))))) + ;; look for servers which are currently being downloaded. + ((setq clients (lsp--filter-clients (-andfn #'lsp--supports-buffer? + #'lsp--client-download-in-progress?))) + (lsp--info "There are language server(%s) installation in progress. +The server(s) will be started in the buffer when it has finished." + (-map #'lsp--client-server-id clients)) + (seq-do (lambda (client) + (cl-pushnew (current-buffer) (lsp--client-buffers client))) + clients)) + ;; look for servers to install + ((setq clients (lsp--filter-clients + (-andfn #'lsp--supports-buffer? + (-const lsp-enable-suggest-server-download) + #'lsp--client-download-server-fn + (-not #'lsp--client-download-in-progress?)))) + (let ((client (lsp--completing-read + (concat "Unable to find installed server supporting this file. " + "The following servers could be installed automatically: ") + clients + (-compose #'symbol-name #'lsp--client-server-id) + nil + t))) + (cl-pushnew (current-buffer) (lsp--client-buffers client)) + (lsp--install-server-internal client))) + ;; ignore other warnings + ((not lsp-warn-no-matched-clients) + nil) + ;; automatic installation disabled + ((setq clients (unless matching-clients + (lsp--filter-clients (-andfn #'lsp--supports-buffer? + #'lsp--client-download-server-fn + (-not (-const lsp-enable-suggest-server-download)) + (-not #'lsp--server-binary-present?))))) + (lsp--warn "The following servers support current file but automatic download is disabled: %s +\(If you have already installed the server check *lsp-log*)." + (mapconcat (lambda (client) + (symbol-name (lsp--client-server-id client))) + clients + " "))) + ;; no clients present + ((setq clients (unless matching-clients + (lsp--filter-clients (-andfn #'lsp--supports-buffer? + (-not #'lsp--server-binary-present?))))) + (lsp--warn "The following servers support current file but do not have automatic installation: %s +You may find the installation instructions at https://emacs-lsp.github.io/lsp-mode/page/languages. +\(If you have already installed the server check *lsp-log*)." + (mapconcat (lambda (client) + (symbol-name (lsp--client-server-id client))) + clients + " "))) + ;; no matches + ((-> #'lsp--supports-buffer? lsp--filter-clients not) + (lsp--error "There are no language servers supporting current mode `%s' registered with `lsp-mode'. +This issue might be caused by: +1. The language you are trying to use does not have built-in support in `lsp-mode'. You must install the required support manually. Examples of this are `lsp-java' or `lsp-metals'. +2. The language server that you expect to run is not configured to run for major mode `%s'. You may check that by checking the `:major-modes' that are passed to `lsp-register-client'. +3. `lsp-mode' doesn't have any integration for the language behind `%s'. Refer to https://emacs-lsp.github.io/lsp-mode/page/languages and https://langserver.org/ . +4. You are over `tramp'. In this case follow https://emacs-lsp.github.io/lsp-mode/page/remote/. +5. You have disabled the `lsp-mode' clients for that file. (Check `lsp-enabled-clients' and `lsp-disabled-clients'). +You can customize `lsp-warn-no-matched-clients' to disable this message." + major-mode major-mode major-mode)))))) + +(defun lsp--buffer-visible-p () + "Return non nil if current buffer is visible." + (or (buffer-modified-p) (get-buffer-window nil t))) + +(defun lsp--init-if-visible () + "Run `lsp' for the current buffer if the buffer is visible. +Returns non nil if `lsp' was run for the buffer." + (when (lsp--buffer-visible-p) + (remove-hook 'window-configuration-change-hook #'lsp--init-if-visible t) + (lsp) + t)) + +;;;###autoload +(defun lsp-deferred () + "Entry point that defers server startup until buffer is visible. +`lsp-deferred' will wait until the buffer is visible before invoking `lsp'. +This avoids overloading the server with many files when starting Emacs." + ;; Workspace may not be initialized yet. Use a buffer local variable to + ;; remember that we deferred loading of this buffer. + (setq lsp--buffer-deferred t) + (let ((buffer (current-buffer))) + ;; Avoid false positives as desktop-mode restores buffers by deferring + ;; visibility check until the stack clears. + (run-with-idle-timer 0 nil (lambda () + (when (buffer-live-p buffer) + (with-current-buffer buffer + (unless (lsp--init-if-visible) + (add-hook 'window-configuration-change-hook #'lsp--init-if-visible nil t)))))))) + + + +(defvar lsp-file-truename-cache (ht)) + +(defmacro lsp-with-cached-filetrue-name (&rest body) + "Executes BODY caching the `file-truename' calls." + `(let ((old-fn (symbol-function 'file-truename))) + (unwind-protect + (progn + (fset 'file-truename + (lambda (file-name &optional counter prev-dirs) + (or (gethash file-name lsp-file-truename-cache) + (puthash file-name (apply old-fn (list file-name counter prev-dirs)) + lsp-file-truename-cache)))) + ,@body) + (fset 'file-truename old-fn)))) + + +(defun lsp-virtual-buffer-call (key &rest args) + (when lsp--virtual-buffer + (when-let ((fn (plist-get lsp--virtual-buffer key))) + (apply fn args)))) + +(defun lsp-translate-column (column) + "Translate COLUMN taking into account virtual buffers." + (or (lsp-virtual-buffer-call :real->virtual-char column) + column)) + +(defun lsp-translate-line (line) + "Translate LINE taking into account virtual buffers." + (or (lsp-virtual-buffer-call :real->virtual-line line) + line)) + + +;; lsp internal validation. + +(defmacro lsp--doctor (&rest checks) + `(-let [buf (current-buffer)] + (with-current-buffer (get-buffer-create "*lsp-performance*") + (with-help-window (current-buffer) + ,@(-map (-lambda ((msg form)) + `(insert (format "%s: %s\n" ,msg + (let ((res (with-current-buffer buf + ,form))) + (cond + ((eq res :optional) (propertize "OPTIONAL" 'face 'warning)) + (res (propertize "OK" 'face 'success)) + (t (propertize "ERROR" 'face 'error))))))) + (-partition 2 checks)))))) + +(define-obsolete-function-alias 'lsp-diagnose + 'lsp-doctor "lsp-mode 8.0.0") + +(defun lsp-doctor () + "Validate performance settings." + (interactive) + (lsp--doctor + "Checking for Native JSON support" (functionp 'json-serialize) + "Check emacs supports `read-process-output-max'" (boundp 'read-process-output-max) + "Check `read-process-output-max' default has been changed from 4k" + (and (boundp 'read-process-output-max) + (> read-process-output-max 4096)) + "Byte compiled against Native JSON (recompile lsp-mode if failing when Native JSON available)" + (condition-case _err + (progn (lsp--make-message (list "a" "b")) + nil) + (error t)) + "`gc-cons-threshold' increased?" (> gc-cons-threshold 800000) + "Using `plist' for deserialized objects? (refer to https://emacs-lsp.github.io/lsp-mode/page/performance/#use-plists-for-deserialization)" (or lsp-use-plists :optional) + "Using emacs 28+ with native compilation?" + (or (and (fboundp 'native-comp-available-p) + (native-comp-available-p)) + :optional))) + +(declare-function package-version-join "ext:package") +(declare-function package-desc-version "ext:package") +(declare-function package--alist "ext:package") + +(defun lsp-version () + "Return string describing current version of `lsp-mode'." + (interactive) + (unless (featurep 'package) + (require 'package)) + (let ((ver (format "lsp-mode %s, Emacs %s, %s" + (package-version-join + (package-desc-version + (car (alist-get 'lsp-mode (package--alist))))) + emacs-version + system-type))) + (if (called-interactively-p 'interactive) + (lsp--info "%s" ver) + ver))) + + + +;; org-mode/virtual-buffer + +(declare-function org-babel-get-src-block-info "ext:ob-core") +(declare-function org-do-remove-indentation "ext:org-macs") +(declare-function org-src-get-lang-mode "ext:org-src") +(declare-function org-element-context "ext:org-element") + +(defun lsp--virtual-buffer-update-position () + (-if-let (virtual-buffer (-first (-lambda ((&plist :in-range)) + (funcall in-range)) + lsp--virtual-buffer-connections)) + (unless (equal virtual-buffer lsp--virtual-buffer) + (lsp-org)) + (when lsp-managed-mode + (lsp-managed-mode -1) + (lsp-mode -1) + (setq lsp--buffer-workspaces nil) + (setq lsp--virtual-buffer nil) + (setq lsp-buffer-uri nil) + + ;; force refresh of diagnostics + (run-hooks 'lsp-after-diagnostics-hook)))) + +(defun lsp-virtual-buffer-on-change (start end length) + "Adjust on change event to be executed against the proper language server." + (let ((max-point (max end + (or (plist-get lsp--before-change-vals :end) 0) + (+ start length)))) + (when-let ((virtual-buffer (-first (lambda (vb) + (let ((lsp--virtual-buffer vb)) + (and (lsp-virtual-buffer-call :in-range start) + (lsp-virtual-buffer-call :in-range max-point)))) + lsp--virtual-buffer-connections))) + (lsp-with-current-buffer virtual-buffer + (lsp-on-change start end length + (lambda (&rest _) + (list :range (lsp--range (list :character 0 :line 0) + lsp--virtual-buffer-point-max) + :text (lsp--buffer-content)))))))) + +(defun lsp-virtual-buffer-before-change (start _end) + (when-let ((virtual-buffer (-first (lambda (vb) + (lsp-with-current-buffer vb + (lsp-virtual-buffer-call :in-range start))) + lsp--virtual-buffer-connections))) + (lsp-with-current-buffer virtual-buffer + (setq lsp--virtual-buffer-point-max + (lsp--point-to-position (lsp-virtual-buffer-call :last-point)))))) + +(defun lsp-patch-on-change-event () + (remove-hook 'after-change-functions #'lsp-on-change t) + (add-hook 'after-change-functions #'lsp-virtual-buffer-on-change nil t) + (add-hook 'before-change-functions #'lsp-virtual-buffer-before-change nil t)) + +(defun lsp-kill-virtual-buffers () + (mapc #'lsp-virtual-buffer-disconnect lsp--virtual-buffer-connections)) + +(defun lsp--move-point-in-indentation (point indentation) + (save-excursion + (goto-char point) + (if (<= point (+ (line-beginning-position) indentation)) + (line-beginning-position) + point))) + +(declare-function flycheck-checker-supports-major-mode-p "ext:flycheck") +(declare-function flycheck-add-mode "ext:flycheck") +(declare-function lsp-diagnostics-lsp-checker-if-needed "lsp-diagnostics") + +(defalias 'lsp-client-download-server-fn 'lsp--client-download-server-fn) + +(defun lsp-flycheck-add-mode (mode) + "Register flycheck support for MODE." + (lsp-diagnostics-lsp-checker-if-needed) + (unless (flycheck-checker-supports-major-mode-p 'lsp mode) + (flycheck-add-mode 'lsp mode))) + +(defun lsp-progress-spinner-type () + "Retrieve the spinner type value, if value is not a symbol of `spinner-types +defaults to `progress-bar." + (or (car (assoc lsp-progress-spinner-type spinner-types)) 'progress-bar)) + +(defun lsp-org () + (interactive) + (-if-let ((virtual-buffer &as &plist :workspaces) (-first (-lambda ((&plist :in-range)) + (funcall in-range)) + lsp--virtual-buffer-connections)) + (unless (equal lsp--virtual-buffer virtual-buffer) + (setq lsp--buffer-workspaces workspaces) + (setq lsp--virtual-buffer virtual-buffer) + (setq lsp-buffer-uri nil) + (lsp-mode 1) + (lsp-managed-mode 1) + (lsp-patch-on-change-event)) + + (save-excursion + (-let* (virtual-buffer + (wcb (lambda (f) + (with-current-buffer (plist-get virtual-buffer :buffer) + (-let* (((&plist :major-mode :buffer-file-name + :goto-buffer :workspaces) virtual-buffer) + (lsp--virtual-buffer virtual-buffer) + (lsp--buffer-workspaces workspaces)) + (save-excursion + (funcall goto-buffer) + (funcall f)))))) + ((&plist :begin :end :post-blank :language) (cl-second (org-element-context))) + ((&alist :tangle file-name) (cl-third (org-babel-get-src-block-info 'light))) + + (file-name (if file-name + (f-expand file-name) + (user-error "You should specify file name in the src block header."))) + (begin-marker (progn + (goto-char begin) + (forward-line) + (set-marker (make-marker) (point)))) + (end-marker (progn + (goto-char end) + (forward-line (1- (- post-blank))) + (set-marker (make-marker) (1+ (point))))) + (buf (current-buffer)) + (src-block (buffer-substring-no-properties begin-marker + (1- end-marker))) + (indentation (with-temp-buffer + (insert src-block) + + (goto-char (point-min)) + (let ((indentation (current-indentation))) + (plist-put lsp--virtual-buffer :indentation indentation) + (org-do-remove-indentation) + (goto-char (point-min)) + (- indentation (current-indentation)))))) + (add-hook 'post-command-hook #'lsp--virtual-buffer-update-position nil t) + + (when (fboundp 'flycheck-add-mode) + (lsp-flycheck-add-mode 'org-mode)) + + (setq lsp--virtual-buffer + (list + :in-range (lambda (&optional point) + (<= begin-marker (or point (point)) (1- end-marker))) + :goto-buffer (lambda () (goto-char begin-marker)) + :buffer-string + (lambda () + (let ((src-block (buffer-substring-no-properties + begin-marker + (1- end-marker)))) + (with-temp-buffer + (insert src-block) + + (goto-char (point-min)) + (while (not (eobp)) + (delete-region (point) (if (> (+ (point) indentation) (line-end-position)) + (line-end-position) + (+ (point) indentation))) + (forward-line)) + (buffer-substring-no-properties (point-min) + (point-max))))) + :buffer buf + :begin begin-marker + :end end-marker + :indentation indentation + :last-point (lambda () (1- end-marker)) + :cur-position (lambda () + (lsp-save-restriction-and-excursion + (list :line (- (lsp--cur-line) + (lsp--cur-line begin-marker)) + :character (let ((character (- (point) + (line-beginning-position) + indentation))) + (if (< character 0) + 0 + character))))) + :line/character->point (-lambda (line character) + (-let [inhibit-field-text-motion t] + (+ indentation + (lsp-save-restriction-and-excursion + (goto-char begin-marker) + (forward-line line) + (-let [line-end (line-end-position)] + (if (> character (- line-end (point))) + line-end + (forward-char character) + (point))))))) + :major-mode (org-src-get-lang-mode language) + :buffer-file-name file-name + :buffer-uri (lsp--path-to-uri file-name) + :with-current-buffer wcb + :buffer-live? (lambda (_) (buffer-live-p buf)) + :buffer-name (lambda (_) + (propertize (format "%s(%s:%s)%s" + (buffer-name buf) + begin-marker + end-marker + language) + 'face 'italic)) + :real->virtual-line (lambda (line) + (+ line (line-number-at-pos begin-marker) -1)) + :real->virtual-char (lambda (char) (+ char indentation)) + :cleanup (lambda () + (set-marker begin-marker nil) + (set-marker end-marker nil)))) + (setf virtual-buffer lsp--virtual-buffer) + (puthash file-name virtual-buffer lsp--virtual-buffer-mappings) + (push virtual-buffer lsp--virtual-buffer-connections) + + ;; TODO: tangle only connected sections + (add-hook 'after-save-hook 'org-babel-tangle nil t) + (add-hook 'lsp-after-open-hook #'lsp-patch-on-change-event nil t) + (add-hook 'kill-buffer-hook #'lsp-kill-virtual-buffers nil t) + + (setq lsp--buffer-workspaces + (lsp-with-current-buffer virtual-buffer + (lsp) + (plist-put virtual-buffer :workspaces (lsp-workspaces)) + (lsp-workspaces))))))) + +(defun lsp-virtual-buffer-disconnect (virtual-buffer) + (interactive (list (or + lsp--virtual-buffer + (when lsp--virtual-buffer-connections + (lsp--completing-read "Select virtual buffer to disconnect: " + lsp--virtual-buffer-connections + (-lambda ((&plist :buffer-file-name)) + buffer-file-name)))))) + (-if-let ((&plist :buffer-file-name file-name :cleanup) virtual-buffer) + (progn + (lsp-with-current-buffer virtual-buffer + (lsp--text-document-did-close)) + (setq lsp--virtual-buffer-connections (-remove-item virtual-buffer lsp--virtual-buffer-connections)) + (when (eq virtual-buffer lsp--virtual-buffer) + (setf lsp--virtual-buffer nil)) + (when cleanup (funcall cleanup)) + (remhash file-name lsp--virtual-buffer-mappings) + + (lsp--virtual-buffer-update-position) + (lsp--info "Disconnected from buffer %s" file-name)) + (lsp--error "Nothing to disconnect from?"))) + + +;; inlay hints + +(defface lsp-inlay-hint-face + '((t :inherit font-lock-comment-face)) + "The face to use for the JavaScript inlays." + :group 'lsp-mode + :package-version '(lsp-mode . "8.0.1")) + +(defface lsp-inlay-hint-type-face + '((t :inherit lsp-inlay-hint-face)) + "Face for inlay type hints (e.g. inferred variable types)." + :group 'lsp-mode + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-inlay-hint-type-format "%s" + "Format string for variable inlays (part of the inlay face)." + :type '(string :tag "String") + :group 'lsp-mode + :package-version '(lsp-mode . "8.0.1")) + +(defface lsp-inlay-hint-parameter-face + '((t :inherit lsp-inlay-hint-face)) + "Face for inlay parameter hints (e.g. function parameter names at +call-site)." + :group 'lsp-mode + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-inlay-hint-param-format "%s" + "Format string for parameter inlays (part of the inlay face)." + :type '(string :tag "String") + :group 'lsp-mode + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-update-inlay-hints-on-scroll t + "If non-nil update inlay hints immediately when scrolling or +modifying window sizes." + :type 'boolean + :package-version '(lsp-mode . "8.0.1")) + +(defun lsp--format-inlay (text kind) + (cond + ((eql kind lsp/inlay-hint-kind-type-hint) (format lsp-inlay-hint-type-format text)) + ((eql kind lsp/inlay-hint-kind-parameter-hint) (format lsp-inlay-hint-param-format text)) + (t text))) + +(defun lsp--face-for-inlay (kind) + (cond + ((eql kind lsp/inlay-hint-kind-type-hint) 'lsp-inlay-hint-type-face) + ((eql kind lsp/inlay-hint-kind-parameter-hint) 'lsp-inlay-hint-parameter-face) + (t 'lsp-inlay-hint-face))) + +(defun lsp--update-inlay-hints-scroll-function (window start) + (lsp-update-inlay-hints start (window-end window t))) + +(defun lsp--update-inlay-hints () + (lsp-update-inlay-hints (window-start) (window-end nil t))) + +(defun lsp--label-from-inlay-hints-response (label) + "Returns a string label built from an array of +InlayHintLabelParts or the argument itself if it's already a +string." + (cl-typecase label + (string label) + (vector + (string-join (mapcar (lambda (part) + (-let (((&InlayHintLabelPart :value) part)) + value)) + label))))) + +(defun lsp-update-inlay-hints (start end) + (lsp-request-async + "textDocument/inlayHint" + (lsp-make-inlay-hints-params + :text-document (lsp--text-document-identifier) + :range (lsp-make-range :start + (lsp-point-to-position start) + :end + (lsp-point-to-position end))) + (lambda (res) + (lsp--remove-overlays 'lsp-inlay-hint) + (dolist (hint res) + (-let* (((&InlayHint :label :position :kind? :padding-left? :padding-right?) hint) + (kind (or kind? lsp/inlay-hint-kind-type-hint)) + (label (lsp--label-from-inlay-hints-response label)) + (pos (lsp--position-to-point position)) + (overlay (make-overlay pos pos nil 'front-advance 'end-advance))) + (when (stringp label) + (overlay-put overlay 'lsp-inlay-hint t) + (overlay-put overlay 'before-string + (format "%s%s%s" + (if padding-left? " " "") + (propertize (lsp--format-inlay label kind) + 'font-lock-face (lsp--face-for-inlay kind)) + (if padding-right? " " ""))))))) + :mode 'tick)) + +(define-minor-mode lsp-inlay-hints-mode + "Mode for displaying inlay hints." + :lighter nil + (cond + ((and lsp-inlay-hints-mode lsp--buffer-workspaces) + (add-hook 'lsp-on-idle-hook #'lsp--update-inlay-hints nil t) + (when lsp-update-inlay-hints-on-scroll + (add-to-list (make-local-variable 'window-scroll-functions) + #'lsp--update-inlay-hints-scroll-function))) + (t + (lsp--remove-overlays 'lsp-inlay-hint) + (remove-hook 'lsp-on-idle-hook #'lsp--update-inlay-hints t) + (setf window-scroll-functions + (delete #'lsp--update-inlay-hints-scroll-function window-scroll-functions))))) + + + +;;;###autoload +(defun lsp-start-plain () + "Start `lsp-mode' using minimal configuration using the latest `melpa' version +of the packages. + +In case the major-mode that you are using for " + (interactive) + (let ((start-plain (make-temp-file "plain" nil ".el"))) + (url-copy-file "https://raw.githubusercontent.com/emacs-lsp/lsp-mode/master/scripts/lsp-start-plain.el" + start-plain t) + (async-shell-command + (format "%s -q -l %s %s" + (expand-file-name invocation-name invocation-directory) + start-plain + (or (buffer-file-name) "")) + (generate-new-buffer " *lsp-start-plain*")))) + + + +(provide 'lsp-mode) +;;; lsp-mode.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-modeline.el b/code/elpa/lsp-mode-20240319.1043/lsp-modeline.el new file mode 100644 index 0000000..9449f5c --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-modeline.el @@ -0,0 +1,354 @@ +;;; lsp-modeline.el --- LSP modeline features -*- lexical-binding: t; -*- +;; +;; Copyright (C) 2020 emacs-lsp maintainers +;; +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . +;; +;;; Commentary: +;; +;; LSP modeline +;; +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-modeline nil + "LSP support for modeline" + :prefix "lsp-modeline-" + :group 'lsp-mode + :tag "LSP Modeline") + +(defcustom lsp-modeline-code-actions-kind-regex "$\\|quickfix.*\\|refactor.*" + "Regex for the code actions kinds to show in the modeline." + :type 'string + :group 'lsp-modeline) + +(defcustom lsp-modeline-code-actions-segments '(count icon) + "Define what should display on the modeline when code actions are available." + :type '(repeat (choice + (const :tag "Show the lightbulb icon" icon) + (const :tag "Show the name of the preferred code action" name) + (const :tag "Show the count of how many code actions available" count))) + :group 'lsp-modeline + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-modeline-code-action-fallback-icon "💡" + "Define what should display on the modeline when code actions are available." + :type 'string + :group 'lsp-modeline + :package-version '(lsp-mode . "8.0.0")) + +(defface lsp-modeline-code-actions-face + '((t :inherit homoglyph)) + "Face used to code action text on modeline." + :group 'lsp-modeline) + +(defface lsp-modeline-code-actions-preferred-face + '((t :foreground "yellow")) + "Face used to code action text on modeline." + :group 'lsp-modeline) + +;;;###autoload +(define-obsolete-variable-alias 'lsp-diagnostics-modeline-scope + 'lsp-modeline-diagnostics-scope "lsp-mode 7.0.1") + +(defcustom lsp-modeline-diagnostics-scope :workspace + "The modeline diagnostics scope." + :group 'lsp-modeline + :type '(choice (const :tag "File" :file) + (const :tag "Project" :workspace) + (const :tag "All Projects" :global)) + :package-version '(lsp-mode . "6.3")) + +(declare-function all-the-icons-octicon "ext:all-the-icons" t t) +(declare-function lsp-treemacs-errors-list "ext:lsp-treemacs" t) + + +;; code actions + +(defvar-local lsp-modeline--code-actions-string nil + "Holds the current code action string on modeline.") + +(defun lsp-modeline--code-action-face (preferred-code-action) + "Return the face checking if there is any PREFERRED-CODE-ACTION." + (if preferred-code-action + 'lsp-modeline-code-actions-preferred-face + 'lsp-modeline-code-actions-face)) + +(defun lsp-modeline--code-actions-icon (face) + "Build the icon for modeline code actions using FACE." + (if (require 'all-the-icons nil t) + (all-the-icons-octicon "light-bulb" + :face face + :v-adjust -0.0575) + (propertize lsp-modeline-code-action-fallback-icon 'face face))) + +(defun lsp-modeline--code-action-name (actions preferred-code-action-title) + "Return the code action name from ACTIONS and PREFERRED-CODE-ACTION-TITLE." + (or preferred-code-action-title + (->> actions + lsp-seq-first + lsp-modeline--code-action->string))) + +(defun lsp-modeline--code-action->string (action) + "Convert code ACTION to friendly string." + (->> action + lsp:code-action-title + (replace-regexp-in-string "[\n\t ]+" " "))) + +(defun lsp-modeline--build-code-actions-segments (actions) + "Build the code ACTIONS string from the defined segments." + (let* ((preferred-code-action (-some->> actions + (-first #'lsp:code-action-is-preferred?) + lsp-modeline--code-action->string)) + (face (lsp-modeline--code-action-face preferred-code-action))) + (mapconcat + (lambda (segment) + (pcase segment + ('icon (lsp-modeline--code-actions-icon face)) + ('name (propertize (lsp-modeline--code-action-name actions preferred-code-action) + 'face face)) + ('count (propertize (number-to-string (seq-length actions)) + 'face face)))) + lsp-modeline-code-actions-segments " "))) + +(defun lsp-modeline--build-code-actions-string (actions) + "Build the string to be presented on modeline for code ACTIONS." + (-let* ((single-action? (= (length actions) 1)) + (keybinding (concat "(" + (-some->> #'lsp-execute-code-action + where-is-internal + (-find (lambda (o) + (not (member (aref o 0) '(menu-bar normal-state))))) + key-description) + ")")) + (built-string (lsp-modeline--build-code-actions-segments actions)) + (preferred-code-action (-some->> actions + (-first #'lsp:code-action-is-preferred?) + lsp-modeline--code-action->string))) + (add-text-properties 0 (length built-string) + (list 'help-echo + (concat (format "Apply code actions %s\nmouse-1: " keybinding) + (if single-action? + (lsp-modeline--code-action-name actions preferred-code-action) + "select from multiple code actions")) + 'mouse-face 'mode-line-highlight + 'local-map (make-mode-line-mouse-map + 'mouse-1 (lambda () + (interactive) + (if single-action? + (lsp-execute-code-action (lsp-seq-first actions)) + (lsp-execute-code-action (lsp--select-action actions)))))) + built-string) + (unless (string= "" built-string) + (concat built-string " ")))) + +(defun lsp--modeline-update-code-actions (actions) + "Update modeline with new code ACTIONS." + (when lsp-modeline-code-actions-kind-regex + (setq actions (seq-filter (-lambda ((&CodeAction :kind?)) + (or (not kind?) + (s-match lsp-modeline-code-actions-kind-regex kind?))) + actions))) + (setq lsp-modeline--code-actions-string + (if (seq-empty-p actions) "" + (lsp-modeline--build-code-actions-string actions))) + (force-mode-line-update)) + +(defun lsp-modeline--check-code-actions (&rest _) + "Request code actions to update modeline for given BUFFER." + (when (lsp-feature? "textDocument/codeAction") + (lsp-request-async + "textDocument/codeAction" + (lsp--text-document-code-action-params) + #'lsp--modeline-update-code-actions + :mode 'unchanged + :cancel-token :lsp-modeline-code-actions))) + +(defun lsp-modeline--enable-code-actions () + "Enable code actions on modeline mode." + (when (and lsp-modeline-code-actions-enable + (lsp-feature? "textDocument/codeAction")) + (lsp-modeline-code-actions-mode 1))) + +(defun lsp-modeline--disable-code-actions () + "Disable code actions on modeline mode." + (lsp-modeline-code-actions-mode -1)) + +;;;###autoload +(define-minor-mode lsp-modeline-code-actions-mode + "Toggle code actions on modeline." + :group 'lsp-modeline + :global nil + :lighter "" + (cond + (lsp-modeline-code-actions-mode + (add-to-list 'global-mode-string '(t (:eval lsp-modeline--code-actions-string))) + + (add-hook 'lsp-on-idle-hook 'lsp-modeline--check-code-actions nil t) + (add-hook 'lsp-configure-hook #'lsp-modeline--enable-code-actions nil t) + (add-hook 'lsp-unconfigure-hook #'lsp-modeline--disable-code-actions nil t)) + (t + (remove-hook 'lsp-on-idle-hook 'lsp-modeline--check-code-actions t) + (remove-hook 'lsp-configure-hook #'lsp-modeline--enable-code-actions t) + (remove-hook 'lsp-unconfigure-hook #'lsp-modeline--disable-code-actions t) + (setq global-mode-string (remove '(t (:eval lsp-modeline--code-actions-string)) global-mode-string))))) + + +;; diagnostics + +(defvar-local lsp-modeline--diagnostics-string nil + "Value of current buffer diagnostics statistics.") + +(defvar lsp-modeline--diagnostics-wks->strings nil + "Plist of workspaces to their modeline strings. +The `:global' workspace is global one.") + +(defun lsp-modeline-diagnostics-statistics () + "Calculate diagnostics statistics based on `lsp-modeline-diagnostics-scope'." + (let ((diagnostics (cond + ((equal :file lsp-modeline-diagnostics-scope) + (list (lsp--get-buffer-diagnostics))) + (t (->> (eq :workspace lsp-modeline-diagnostics-scope) + (lsp-diagnostics) + (ht-values))))) + (stats (make-vector lsp/diagnostic-severity-max 0)) + strs + (i 0)) + (mapc (lambda (buf-diags) + (mapc (lambda (diag) + (-let [(&Diagnostic? :severity?) diag] + (when severity? + (cl-incf (aref stats severity?))))) + buf-diags)) + diagnostics) + (while (< i lsp/diagnostic-severity-max) + (when (> (aref stats i) 0) + (setq strs + (nconc strs + `(,(propertize + (format "%s" (aref stats i)) + 'face + (cond + ((= i lsp/diagnostic-severity-error) 'error) + ((= i lsp/diagnostic-severity-warning) 'warning) + ((= i lsp/diagnostic-severity-information) 'success) + ((= i lsp/diagnostic-severity-hint) 'success))))))) + (cl-incf i)) + (-> (s-join "/" strs) + (propertize 'mouse-face 'mode-line-highlight + 'help-echo "mouse-1: Show diagnostics" + 'local-map (when (require 'lsp-treemacs nil t) + (make-mode-line-mouse-map + 'mouse-1 #'lsp-treemacs-errors-list)))))) + +(defun lsp-modeline--diagnostics-reset-modeline-cache () + "Reset the modeline diagnostics cache." + (plist-put lsp-modeline--diagnostics-wks->strings (car (lsp-workspaces)) nil) + (plist-put lsp-modeline--diagnostics-wks->strings :global nil) + (setq lsp-modeline--diagnostics-string nil)) + +(defun lsp-modeline--diagnostics-update-modeline () + "Update diagnostics modeline string." + (cl-labels ((calc-modeline () + (let ((str (lsp-modeline-diagnostics-statistics))) + (if (string-empty-p str) "" + (concat str " "))))) + (setq lsp-modeline--diagnostics-string + (cl-case lsp-modeline-diagnostics-scope + (:file (or lsp-modeline--diagnostics-string + (calc-modeline))) + (:workspace + (let ((wk (car (lsp-workspaces)))) + (or (plist-get lsp-modeline--diagnostics-wks->strings wk) + (let ((ml (calc-modeline))) + (setq lsp-modeline--diagnostics-wks->strings + (plist-put lsp-modeline--diagnostics-wks->strings wk ml)) + ml)))) + (:global + (or (plist-get lsp-modeline--diagnostics-wks->strings :global) + (let ((ml (calc-modeline))) + (setq lsp-modeline--diagnostics-wks->strings + (plist-put lsp-modeline--diagnostics-wks->strings :global ml)) + ml))))))) + +(defun lsp-modeline--enable-diagnostics () + "Enable diagnostics on modeline mode." + (when (and lsp-modeline-diagnostics-enable + (lsp-feature? "textDocument/publishDiagnostics")) + (lsp-modeline-diagnostics-mode 1))) + +(defun lsp-modeline--disable-diagnostics () + "Disable diagnostics on modeline mode." + (lsp-modeline-diagnostics-mode -1)) + +;;;###autoload +(define-obsolete-function-alias 'lsp-diagnostics-modeline-mode + 'lsp-modeline-diagnostics-mode "lsp-mode 7.0.1") + +;;;###autoload +(define-minor-mode lsp-modeline-diagnostics-mode + "Toggle diagnostics modeline." + :group 'lsp-modeline + :global nil + :lighter "" + (cond + (lsp-modeline-diagnostics-mode + (add-hook 'lsp-configure-hook #'lsp-modeline--enable-diagnostics nil t) + (add-hook 'lsp-unconfigure-hook #'lsp-modeline--disable-diagnostics nil t) + (add-to-list 'global-mode-string '(t (:eval (lsp-modeline--diagnostics-update-modeline)))) + (add-hook 'lsp-diagnostics-updated-hook 'lsp-modeline--diagnostics-reset-modeline-cache)) + (t + (remove-hook 'lsp-configure-hook #'lsp-modeline--enable-diagnostics t) + (remove-hook 'lsp-unconfigure-hook #'lsp-modeline--disable-diagnostics t) + (remove-hook 'lsp-diagnostics-updated-hook 'lsp-modeline--diagnostics-reset-modeline-cache) + (setq global-mode-string (remove '(t (:eval (lsp-modeline--diagnostics-update-modeline))) global-mode-string))))) + + +;; workspace status + +(defun lsp-modeline--workspace-status-string () + "Build the workspace status string." + '(t (:eval (-keep #'lsp--workspace-status-string (lsp-workspaces))))) + +(defun lsp-modeline--enable-workspace-status () + "Enable workspace status on modeline." + (let ((status (lsp-modeline--workspace-status-string))) + (setq-local global-mode-string (if (-contains? global-mode-string status) + global-mode-string + (cons status global-mode-string))))) + +(defun lsp-modeline--disable-workspace-status () + "Disable workspace status on modeline." + (let ((status (lsp-modeline--workspace-status-string))) + (setq-local global-mode-string (remove status global-mode-string)))) + +;;;###autoload +(define-minor-mode lsp-modeline-workspace-status-mode + "Toggle workspace status on modeline." + :group 'lsp-modeline + :global nil + :lighter "" + (cond + (lsp-modeline-workspace-status-mode + (add-hook 'lsp-configure-hook #'lsp-modeline--enable-workspace-status nil t) + (add-hook 'lsp-unconfigure-hook #'lsp-modeline--disable-workspace-status nil t)) + (t + (remove-hook 'lsp-configure-hook #'lsp-modeline--enable-workspace-status t) + (remove-hook 'lsp-unconfigure-hook #'lsp-modeline--disable-workspace-status t)))) + +(lsp-consistency-check lsp-modeline) + +(provide 'lsp-modeline) +;;; lsp-modeline.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-mojo.el b/code/elpa/lsp-mode-20240319.1043/lsp-mojo.el new file mode 100644 index 0000000..72164d2 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-mojo.el @@ -0,0 +1,50 @@ +;;; lsp-mojo.el --- lsp-mode Mojo integration -*- lexical-binding: t; -*- + +;; Copyright (C) 2023 Adam Liter + +;; Author: Adam Liter +;; Keywords: languages,tools + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; client for Mojo 🔥 + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-mojo nil + "LSP support for Mojo 🔥, using mojo-lsp-server." + :group 'lsp-mode + :link '(url-link "https://github.com/modularml/mojo")) + +(defcustom lsp-mojo-executable "mojo-lsp-server" + "The Mojo 🔥 LSP executable to use. +Leave as just the executable name to use the default behavior of +finding the executable with variable `exec-path'." + :group 'lsp-mojo + :type 'string) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection (lambda () lsp-mojo-executable)) + :activation-fn (lsp-activate-on "mojo") + :server-id 'mojo)) + +(lsp-consistency-check lsp-mojo) + +(provide 'lsp-mojo) +;;; lsp-mojo.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-move.el b/code/elpa/lsp-mode-20240319.1043/lsp-move.el new file mode 100644 index 0000000..d3a27fa --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-move.el @@ -0,0 +1,71 @@ +;;; lsp-move.el --- MOVE client settings -*- lexical-binding: t -*- + +;; Copyright (C) 2023 Dmitri Makarov + +;; Author: Dmitri Makarov +;; Keywords: lsp, move + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;;; To enable lsp-move include the following lisp code in init.el after +;;; loading lsp-mode +;;; +;;; (with-eval-after-load 'lsp-mode +;;; (require 'move-mode) +;;; (require 'lsp-move) +;;; (add-hook 'move-mode-hook #'lsp) +;;; +;;; See `lsp-clients-move-analyzer-executable' to customize the path to move-analyzer. + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-move nil + "LSP support for Move." + :group 'lsp-mode + :link '(url-link "https://github.com/move-language/move")) + +(defcustom lsp-clients-move-analyzer-executable "move-analyzer" + "The move-analyzer executable to use. +Leave as just the executable name to use the default behavior of +finding the executable with `exec-path'." + :group 'lsp-move + :risky t + :type 'file) + +(defcustom lsp-clients-move-analyzer-args '() + "Extra arguments for the move-analyzer executable." + :group 'lsp-move + :risky t + :type '(repeat string)) + +(defun lsp-clients--move-analyzer-command () + "Generate the language server startup command." + `(,lsp-clients-move-analyzer-executable ,@lsp-clients-move-analyzer-args)) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection + 'lsp-clients--move-analyzer-command) + :activation-fn (lsp-activate-on "move") + :major-modes '(move-mode) + :priority -1 + :server-id 'move-analyzer)) + +(provide 'lsp-move) + +;;; lsp-move.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-nginx.el b/code/elpa/lsp-mode-20240319.1043/lsp-nginx.el new file mode 100644 index 0000000..b64604f --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-nginx.el @@ -0,0 +1,64 @@ +;;; lsp-nginx.el --- Nginx Client settings -*- lexical-binding: t; -*- + +;; Copyright (C) 2021-2023 Shen, Jen-Chieh + +;; Author: Jen-Chieh Shen +;; Keywords: nginx lsp + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: +;; +;; LSP client for Nginx +;; + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-nginx nil + "LSP support for Nginx." + :group 'lsp-mode + :link '(url-link "https://github.com/pappasam/nginx-language-server") + :package-version `(lsp-mode . "8.0.1")) + +(defcustom lsp-nginx-server-command '("nginx-language-server") + "Command to start Nginx Language Server." + :risky t + :group 'lsp-nginx + :type '(repeat string) + :package-version `(lsp-mode . "8.0.1")) + +(defun lsp-nginx--download-server (_client callback error-callback update?) + "Install/update Nginx language server using `pip + +Will invoke CALLBACK or ERROR-CALLBACK based on result. +Will update if UPDATE? is t." + (lsp-async-start-process + callback + error-callback + "pip" "install" "nginx-language-server" (when update? "-U"))) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection + (lambda () lsp-nginx-server-command)) + :major-modes '(nginx-mode) + :priority -1 + :server-id 'nginx-ls + :download-server-fn #'lsp-nginx--download-server)) + +(lsp-consistency-check lsp-nginx) + +(provide 'lsp-nginx) +;;; lsp-nginx.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-nim.el b/code/elpa/lsp-mode-20240319.1043/lsp-nim.el new file mode 100644 index 0000000..86edf21 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-nim.el @@ -0,0 +1,103 @@ +;;; lsp-nim.el --- description -*- lexical-binding: t; -*- + +;; Copyright (C) 2020 emacs-lsp maintainers + +;; Author: emacs-lsp maintainers +;; Keywords: lsp, nim + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP Clients for the Nim Programming Language. + +;;; Code: + +(require 'lsp-mode) + +;; Nim +(defgroup lsp-nimlsp nil + "LSP support for Nim, using nimlsp." + :group 'lsp-mode + :link '(url-link "https://github.com/PMunch/nimlsp")) + +(lsp-defcustom lsp-nim-project-mapping [] + "Nimsuggest project mapping. Sample value + +[(:projectFile \"root.nim\" + :fileRegex \".*\\.nim\")]" + + :type '(lsp-repeatable-vector plist) + :group 'lsp-nim + :package-version '(lsp-mode . "8.0.1") + :lsp-path "nim.projectMapping") + +(lsp-defcustom lsp-nim-timeout 120000 + "Timeout for restarting `nimsuggest'" + :type 'number + :group 'lsp-nim + :package-version '(lsp-mode . "8.0.1") + :lsp-path "nim.timeout") + +(lsp-defcustom lsp-nim-nimsuggest-path "nimsuggest" + "Path to `nimsuggest' to use." + :type 'number + :group 'lsp-nim + :package-version '(lsp-mode . "8.0.1") + :lsp-path "nim.nimsuggestPath") + +(lsp-defcustom lsp-nim-auto-check-file t + "Check the file on the fly" + :type 'boolean + :group 'lsp-nim + :package-version '(lsp-mode . "8.0.1") + :lsp-path "nim.autoCheckFile") + +(lsp-defcustom lsp-nim-auto-check-project t + "Check the project after saving the file" + :type 'boolean + :group 'lsp-nim + :package-version '(lsp-mode . "8.0.1") + :lsp-path "nim.autoCheckProject") + +(defcustom lsp-nim-langserver "nimlangserver" + "Path to `nimlangserver'" + :type 'number + :group 'lsp-nim + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-nim-lsp "nimlsp" + "Path to `nimlsp'" + :type 'number + :group 'lsp-nim + :package-version '(lsp-mode . "8.0.1")) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection + (lambda () lsp-nim-lsp)) + :activation-fn (lsp-activate-on "nim") + :priority -1 + :server-id 'nimlsp)) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection + (lambda () lsp-nim-langserver)) + :synchronize-sections '("nim") + :activation-fn (lsp-activate-on "nim") + :server-id 'nimlangserver)) + +(lsp-consistency-check lsp-nim) + +(provide 'lsp-nim) +;;; lsp-nim.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-nix.el b/code/elpa/lsp-mode-20240319.1043/lsp-nix.el new file mode 100644 index 0000000..4a7e09a --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-nix.el @@ -0,0 +1,122 @@ +;;; lsp-nix.el --- lsp-mode nix integration -*- lexical-binding: t; -*- + +;; Copyright (C) 2020 lsp-mode maintainers + +;; Author: Seong Yong-ju +;; Keywords: languages + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; Client for the rnix language server. + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-nix-rnix nil + "LSP support for Nix, using rnix-lsp." + :group 'lsp-mode + :link '(url-link "https://github.com/nix-community/rnix-lsp")) + +(defcustom lsp-nix-rnix-server-path "rnix-lsp" + "Executable path for the server." + :group 'lsp-nix-rnix + :type 'string + :package-version '(lsp-mode . "8.0.0")) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection (lambda () lsp-nix-rnix-server-path)) + :major-modes '(nix-mode nix-ts-mode) + :server-id 'rnix-lsp + :priority -2)) + +(defgroup lsp-nix-nixd nil + "LSP support for Nix, using nixd language server." + :group 'lsp-mode + :link '(url-link "https://github.com/nix-community/nixd")) + +(defcustom lsp-nix-nixd-server-path "nixd" + "Executable path for the server." + :group 'lsp-nix-nixd + :type 'string + :package-version '(lsp-mode . "8.0.0")) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection (lambda () lsp-nix-nixd-server-path)) + :major-modes '(nix-mode) + :server-id 'nixd-lsp + :priority -1)) + +(defgroup lsp-nix-nil nil + "LSP support for Nix, using nil." + :group 'lsp-mode + :link '(url-link "https://github.com/oxalica/nil")) + +(defcustom lsp-nix-nil-server-path "nil" + "Executable path for the server." + :group 'lsp-nix-nil + :type 'string + :package-version '(lsp-mode . "8.0.1")) + +(lsp-defcustom lsp-nix-nil-formatter nil + "External formatter command with arguments. + + Example [nixpkgs-fmt]." + :type 'lsp-string-vector + :group 'lsp-nix-nil + :lsp-path "nil.formatting.command" + :package-version '(lsp-mode . "8.0.1")) + +(lsp-defcustom lsp-nix-nil-ignored-diagnostics nil + "Ignored diagnostic kinds." + :type 'lsp-string-vector + :group 'lsp-nix-nil + :lsp-path "nil.diagnostics.ignored" + :package-version '(lsp-mode . "8.0.1")) + +(lsp-defcustom lsp-nix-nil-exclude-files-diagnostic nil + "Files to exclude from showing diagnostics." + :type 'lsp-string-vector + :group 'lsp-nix-nil + :lsp-path "nil.diagnostics.excludedFiles" + :package-version '(lsp-mode . "8.0.1")) +(lsp-defcustom lsp-nix-nil-max-mem 10000 + "Max Memory MB" + :type 'number + :group 'lsp-nix-nil + :lsp-path "nil.nix.maxMemoryMB" + :package-version '(lsp-mode . "8.0.1")) +(lsp-defcustom lsp-nix-nil-auto-eval-inputs t + "Auto Eval Inputs" + :type 'boolean + :group 'lsp-nix-nil + :lsp-path "nil.nix.flake.autoEvalInputs" + :package-version '(lsp-mode . "8.0.1")) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection (lambda () lsp-nix-nil-server-path)) + :major-modes '(nix-mode nix-ts-mode) + :initialized-fn (lambda (workspace) + (with-lsp-workspace workspace + (lsp--set-configuration + (lsp-configuration-section "nil")))) + :synchronize-sections '("nil") + :server-id 'nix-nil)) + +(lsp-consistency-check lsp-nix) + +(provide 'lsp-nix) +;;; lsp-nix.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-nushell.el b/code/elpa/lsp-mode-20240319.1043/lsp-nushell.el new file mode 100644 index 0000000..19855e5 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-nushell.el @@ -0,0 +1,59 @@ +;;; lsp-nushell.el --- lsp-mode ansible integration -*- lexical-binding: t; -*- + +;; Copyright (C) 2024 emacs-lsp maintainers + +;; Author: lsp-mode maintainers +;; Keywords: lsp, nushell + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP Client for the nushell Language + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-nushell nil + "LSP support for nushell." + :group 'lsp-mode + :link '(url-link "https://github.com/nushell/nushell")) + +(defcustom lsp-nushell-language-server-command + '("nu" "--lsp") + "The command that starts the nushell language server." + :type '(repeat :tag "List of string values" string) + :group 'lsp-nushell) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection lsp-nushell-language-server-command) + :activation-fn (lsp-activate-on "nushell") + :priority -1 + :initialized-fn (lambda (workspace) + ;; Nushell server returns an empty list of + ;; completion options at initialization + ;; so completionProvider capability is {} + ;; When using plists, this value is parsed as + ;; null/nil so we need to force it to "t" + ;; to enable completion + (let ((caps (lsp--workspace-server-capabilities workspace))) + (unless (lsp-get caps :completionProvider) + (lsp:set-server-capabilities-completion-provider? caps t)))) + :server-id 'nushell-ls)) + +(lsp-consistency-check lsp-nushell) + +(provide 'lsp-nushell) +;;; lsp-nushell.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-ocaml.el b/code/elpa/lsp-mode-20240319.1043/lsp-ocaml.el new file mode 100644 index 0000000..59ffa9c --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-ocaml.el @@ -0,0 +1,135 @@ +;;; lsp-ocaml.el --- description -*- lexical-binding: t; -*- + +;; Copyright (C) 2020 emacs-lsp maintainers + +;; Author: emacs-lsp maintainers +;; Keywords: lsp, ocaml + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP Clients for the Ocaml Programming Language. + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-ocaml nil + "LSP support for OCaml, using ocaml-language-server." + :group 'lsp-mode + :link '(url-link "https://github.com/freebroccolo/ocaml-language-server")) + +(define-obsolete-variable-alias + 'lsp-ocaml-ocaml-lang-server-command + 'lsp-ocaml-lang-server-command + "lsp-mode 6.1") + +(defcustom lsp-ocaml-lang-server-command + '("ocaml-language-server" "--stdio") + "Command to start ocaml-language-server." + :group 'lsp-ocaml + :type '(choice + (string :tag "Single string value") + (repeat :tag "List of string values" + string))) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection + (lambda () lsp-ocaml-lang-server-command)) + :major-modes '(reason-mode caml-mode tuareg-mode) + :priority -1 + :server-id 'ocaml-ls)) + +(defgroup lsp-ocaml-lsp-server nil + "LSP support for OCaml, using ocaml-lsp-server." + :group 'lsp-mode + :link '(url-link "https://github.com/ocaml/ocaml-lsp")) + +(define-obsolete-variable-alias 'lsp-merlin 'lsp-ocaml-lsp-server "lsp-mode 6.1") +(define-obsolete-variable-alias 'lsp-merlin-command 'lsp-ocaml-lsp-server-command "lsp-mode 6.1") + +(defcustom lsp-ocaml-lsp-server-command + '("ocamllsp") + "Command to start ocaml-language-server." + :group 'lsp-ocaml + :type '(choice + (string :tag "Single string value") + (repeat :tag "List of string values" + string))) + +(lsp-register-client + (make-lsp-client + :new-connection + (lsp-stdio-connection (lambda () lsp-ocaml-lsp-server-command)) + :major-modes '(reason-mode caml-mode tuareg-mode) + :priority 0 + :server-id 'ocaml-lsp-server)) + +(defcustom lsp-cut-signature 'space + "If non-nil, signatures returned on hover will not be split on newline." + :group 'lsp-ocaml + :type '(choice (symbol :tag "Default behaviour" 'cut) + (symbol :tag "Display all the lines with spaces" 'space))) + +(cl-defmethod lsp-clients-extract-signature-on-hover (contents (_server-id (eql ocaml-lsp-server)) &optional storable) + "Extract a representative line from OCaml's CONTENTS, to show in the echo area. +This function splits the content between the signature +and the documentation to display the signature +and truncate it if it's too wide. +The STORABLE argument is used if you want to use this +function to get the type and, for example, kill and yank it. + +An example of function using STORABLE is: + + (defun mdrp/lsp-get-type-and-kill () + (interactive) + (let ((contents (-some->> (lsp--text-document-position-params) + (lsp--make-request \"textDocument/hover\") + (lsp--send-request) + (lsp:hover-contents)))) + (let ((contents (and contents + (lsp--render-on-hover-content + contents + t)))) + (let ((contents + (pcase (lsp-workspaces) + (`(,workspace) + (lsp-clients-extract-signature-on-hover + contents + (lsp--workspace-server-id workspace) + t)) + (lsp-clients-extract-signature-on-hover + contents + nil) + ))) + (message \"Copied %s to kill-ring\" contents) + (kill-new contents)))))" + (let ((type (s-trim (lsp--render-element (lsp-make-marked-string + :language "ocaml" + :value (car (s-split "---" (lsp--render-element contents)))))))) + (if (equal nil storable) + (if (eq lsp-cut-signature 'cut) + (car (s-lines type)) + ;; else lsp-cut-signature is 'space + (let ((ntype (s-replace "\n" " " type))) + (if (>= (length ntype) (frame-width)) + (concat (substring ntype 0 (- (frame-width) 4)) "...") + ntype))) + type))) + +(lsp-consistency-check lsp-ocaml) + +(provide 'lsp-ocaml) +;;; lsp-ocaml.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-openscad.el b/code/elpa/lsp-mode-20240319.1043/lsp-openscad.el new file mode 100644 index 0000000..2c1fd02 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-openscad.el @@ -0,0 +1,102 @@ +;;; lsp-openscad.el --- openscad client -*- lexical-binding: t; -*- + +;; Copyright (C) 2022 Len Trigg + +;; Author: Len Trigg +;; Keywords: openscad lsp + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; lsp-openscad client + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-openscad nil + "LSP support for openscad." + :group 'lsp-mode + :link '(url-link "https://github.com/Leathong/openscad-LSP")) + +(defcustom lsp-openscad-server + "openscad-lsp" + "Path to the openscad language server." + :group 'lsp-openscad + :risky t + :type 'file) + +(defcustom lsp-openscad-server-connection-type + 'tcp + "Type of connection to use with the OpenSCAD Language Server: tcp or stdio." + :group 'lsp-openscad + :risky t + :type 'symbol) + +(defcustom lsp-openscad-search-paths "" + "Customized search path." + :type 'string + :group 'lsp-openscad) + +(defcustom lsp-openscad-format-exe "clang-format" + "Path to the clang-format executable." + :type 'string + :group 'lsp-openscad) + +(defcustom lsp-openscad-format-style "file" + "Style argument to use with clang-format." + :type 'string + :group 'lsp-openscad) + +(lsp-register-custom-settings + '(("openscad.search_paths" lsp-openscad-search-paths) + ("openscad.fmt_exe" lsp-openscad-format-exe) + ("openscad.fmt_style" lsp-openscad-format-style))) + +(defun lsp-openscad-server-stdio-start-fun () + "Create arguments to start openscad language server in stdio mode." + `(,lsp-openscad-server "--stdio" )) + +(defun lsp-openscad-server-tcp-start-fun (port) + "Create arguments to start openscad language server in TCP mode on PORT." + `(,lsp-openscad-server "--port" ,(number-to-string port))) + +(defun lsp-openscad-server-connection () + "Create command line arguments to start openscad language server." + (if (eq lsp-openscad-server-connection-type 'tcp) + (lsp-tcp-connection 'lsp-openscad-server-tcp-start-fun) + (lsp-stdio-connection 'lsp-openscad-server-stdio-start-fun))) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-openscad-server-connection) + :major-modes '(scad-mode) + :priority -1 + :initialized-fn (lambda (workspace) + ;; OpenSCAD-LSP returns an empty list of + ;; completion options at initialization + ;; so completionProvider capability is {} + ;; When using plists, this value is parsed as + ;; null/nil so we need to force it to "t" + ;; to enable completion + (let ((caps (lsp--workspace-server-capabilities workspace))) + (unless (lsp-get caps :completionProvider) + (lsp:set-server-capabilities-completion-provider? caps t))) + (with-lsp-workspace workspace + (lsp--set-configuration + (lsp-configuration-section "openscad")))) + :server-id 'openscad)) + +(provide 'lsp-openscad) +;;; lsp-openscad.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-perl.el b/code/elpa/lsp-mode-20240319.1043/lsp-perl.el new file mode 100644 index 0000000..8273d5d --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-perl.el @@ -0,0 +1,117 @@ +;;; lsp-perl.el --- lsp-perl config -*- lexical-binding: t; -*- + +;; Copyright (C) 2020 lsp-mode developers + +;; Author: Hiroki Noda +;; Keywords: + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; lsp-perl client + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-perl nil + "LSP support for Perl" + :group 'lsp-mode + :link '(url-link "https://github.com/richterger/Perl-LanguageServer") + :package-version '(lsp-mode . "6.3")) + +(defcustom lsp-perl-language-server-path "perl" + "Path to perl interpreter." + :type 'string + :group 'lsp-perl + :package-version '(lsp-mode . "6.3")) + +(defcustom lsp-perl-language-server-port 13603 + "Choose listen port." + :type 'integer + :group 'lsp-perl + :package-version '(lsp-mode . "6.3")) + +(defcustom lsp-perl-language-server-client-version "2.1.0" + "Choose client version." + :type 'string + :group 'lsp-perl + :package-version '(lsp-mode . "6.3")) + +(defcustom lsp-perl-perl-cmd nil + "Path to perl interpreter used in Perl Language Server. +Defaults to `perl' if nil." + :type 'string + :group 'lsp-perl + :package-version '(lsp-mode . "7.0.1")) +(defcustom lsp-perl-perl-inc nil + "A vector of paths to add to perl library path." + :type 'lsp-string-vector + :group 'lsp-perl + :package-version '(lsp-mode . "7.0.1")) +(defcustom lsp-perl-file-filter nil + "A vector of directories filtering perl file. +Defaults to `[\".pm\" \".pl\"]' if nil." + :type 'lsp-string-vector + :group 'lsp-perl + :package-version '(lsp-mode . "7.0.1")) +(defcustom lsp-perl-ignore-dirs nil + "A vector of directories to ignore. +Defaults to `[\".vscode\" \".git\" \".svn\"]' if nil." + :type 'lsp-string-vector + :group 'lsp-perl + :package-version '(lsp-mode . "7.0.1")) + +(defcustom lsp-perl-show-local-vars nil + "If true, show also local variables in symbol view. +Defaults to false if nil" + :type 'boolean + :group 'lsp-perl + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-perl-log-level nil + "Log level 0-2. +Defaults to 0." + :type 'integer + :group 'lsp-perl + :package-version '(lsp-mode . "8.0.0")) + +(lsp-register-custom-settings + '(("perl.perlCmd" lsp-perl-perl-cmd) + ("perl.perlInc" lsp-perl-perl-inc) + ("perl.fileFilter" lsp-perl-file-filter) + ("perl.ignoreDirs" lsp-perl-ignore-dirs) + ("perl.showLocalVars" lsp-perl-show-local-vars t) + ("perl.logLevel" lsp-perl-log-level))) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection + (lambda () + (list lsp-perl-language-server-path + "-MPerl::LanguageServer" "-e" "Perl::LanguageServer::run" "--" + (format "--port %d --version %s" + lsp-perl-language-server-port lsp-perl-language-server-client-version)))) + :major-modes '(perl-mode cperl-mode) + :initialized-fn (lambda (workspace) + (with-lsp-workspace workspace + (lsp--set-configuration + (lsp-configuration-section "perl")))) + :priority -2 + :server-id 'perl-language-server)) + +(lsp-consistency-check lsp-perl) + +(provide 'lsp-perl) +;;; lsp-perl.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-perlnavigator.el b/code/elpa/lsp-mode-20240319.1043/lsp-perlnavigator.el new file mode 100644 index 0000000..ea98004 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-perlnavigator.el @@ -0,0 +1,197 @@ +;;; lsp-perlnavigator.el --- Integrates the Perl Navigator LSP Server with lsp-mode -*- lexical-binding: t; -*- + +;; Copyright (C) 2022 Matthew Feinberg + +;; Author: Matthew Feinberg +;; Keywords: lsp, perl + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-perlnavigator nil + "LSP support for Perl Navigator." + :group 'lsp-mode + :link '(url-link "https://github.com/bscan/PerlNavigator") + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-perlnavigator-perl-path "perl" + "Full path to the perl executable (no aliases, .bat files or ~/)." + :type 'string + :group 'lsp-perlnavigator + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-perlnavigator-enable-warnings t + "Enable warnings using -Mwarnings command switch." + :type 'boolean + :group 'lsp-perlnavigator + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-perlnavigator-perltidy-profile nil + "Path to perl tidy profile (no aliases, .bat files or ~/)." + :type 'string + :group 'lsp-perlnavigator + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-perlnavigator-perlcritic-profile nil + "Path to perl critic profile. Otherwise perlcritic itself will +default to ~/.perlcriticrc. (no aliases, .bat files or ~/)." + :type 'string + :group 'lsp-perlnavigator + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-perlnavigator-perlcritic-enabled t + "Enable perl critic." + :type 'boolean + :group 'lsp-perlnavigator + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-perlnavigator-severity5 "warning" + "Editor Diagnostic severity level for Critic severity 5." + :type '(choice (:tag "error" "warning" "info" "hint" "none")) + :group 'lsp-perlnavigator + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-perlnavigator-severity4 "info" + "Editor Diagnostic severity level for Critic severity 4." + :type '(choice (:tag "error" "warning" "info" "hint" "none")) + :group 'lsp-perlnavigator + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-perlnavigator-severity3 "hint" + "Editor Diagnostic severity level for Critic severity 3." + :type '(choice (:tag "error" "warning" "info" "hint" "none")) + :group 'lsp-perlnavigator + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-perlnavigator-severity2 "hint" + "Editor Diagnostic severity level for Critic severity 2." + :type '(choice (:tag "error" "warning" "info" "hint" "none")) + :group 'lsp-perlnavigator + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-perlnavigator-severity1 "hint" + "Editor Diagnostic severity level for Critic severity 1." + :type '(choice (:tag "error" "warning" "info" "hint" "none")) + :group 'lsp-perlnavigator + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-perlnavigator-include-paths nil + "Array of paths added to @INC. You can use $workspaceRoot as a placeholder." + :type 'lsp-string-vector + :group 'lsp-perlnavigator + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-perlnavigator-logging t + "Log to stdout from the navigator. Viewable in the Perl Navigator LSP log." + :type 'boolean + :group 'lsp-perlnavigator + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-perlnavigator-trace-server "messages" + "Traces the communication between VS Code and the language server." + :type '(choice (:tag "off" "messages" "verbose")) + :group 'lsp-perlnavigator + :package-version '(lsp-mode . "8.0.1")) + +(lsp-register-custom-settings + '(("perlnavigator.trace.server" lsp-perlnavigator-trace-server) + ("perlnavigator.logging" lsp-perlnavigator-logging t) + ("perlnavigator.includePaths" lsp-perlnavigator-include-paths) + ("perlnavigator.severity1" lsp-perlnavigator-severity1) + ("perlnavigator.severity2" lsp-perlnavigator-severity2) + ("perlnavigator.severity3" lsp-perlnavigator-severity3) + ("perlnavigator.severity4" lsp-perlnavigator-severity4) + ("perlnavigator.severity5" lsp-perlnavigator-severity5) + ("perlnavigator.perlcriticEnabled" lsp-perlnavigator-perlcritic-enabled t) + ("perlnavigator.perlcriticProfile" lsp-perlnavigator-perlcritic-profile) + ("perlnavigator.perltidyProfile" lsp-perlnavigator-perltidy-profile) + ("perlnavigator.enableWarnings" lsp-perlnavigator-enable-warnings t) + ("perlnavigator.perlPath" lsp-perlnavigator-perl-path))) + +(defcustom lsp-perlnavigator-executable "perlnavigator" + "Location of the perlnavigator binary." + :group 'lsp-perlnavigator + :risky t + :type 'file) + +(defvar lsp-perlnavigator--os-suffix + (let ((x86_64 (eq (string-match "^x86_64" system-configuration) 0))) + (cond ((and x86_64 (eq system-type 'windows-nt)) + "-win-x86_64") + + ((and x86_64 (eq system-type 'darwin)) + "-macos-x86_64") + + ((and x86_64 (eq system-type 'gnu/linux)) + "-linux-x86_64"))) + + "The suffix used to specify the download for this operating system.") + +(defcustom lsp-perlnavigator-download-url + (let ((base-url "https://github.com/bscan/PerlNavigator/releases/latest/download/")) + (if lsp-perlnavigator--os-suffix + (concat base-url "perlnavigator" lsp-perlnavigator--os-suffix ".zip"))) + + "Automatic download url for PerlNavigator." + :group 'lsp-perlnavigator + :type 'string) + +(defcustom lsp-perlnavigator-autoinstall-dir + (f-join lsp-server-install-dir "perlnavigator") + "Automatic installation directory for Perl Navigator." + :group 'lsp-perlnavigator + :type 'directory) + +(defvar lsp-perlnavigator--autoinstall-store-path + (f-join lsp-perlnavigator-autoinstall-dir "latest" (concat "perlnavigator" lsp-perlnavigator--os-suffix ".zip")) + "The path where the downloaded PerlNavigator .zip archive will be stored.") + + +(defvar lsp-perlnavigator--autoinstall-binary-path + (let ((exe-name (if (eq system-type 'windows-nt) "perlnavigator.exe" "perlnavigator"))) + (f-join lsp-perlnavigator-autoinstall-dir "latest" (concat "perlnavigator" lsp-perlnavigator--os-suffix) exe-name)) + "The path to the automatically installed language server executable.") + +(lsp-dependency + 'perlnavigator + '(:system lsp-perlnavigator-executable) + `(:download + :decompress + :zip + :binary-path lsp-perlnavigator--autoinstall-binary-path + :url lsp-perlnavigator-download-url + :store-path lsp-perlnavigator--autoinstall-store-path + :set-executable? t)) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection (lambda () + (list + (or (lsp-package-path 'perlnavigator) + lsp-perlnavigator-executable) + "--stdio"))) + :activation-fn (lsp-activate-on "perl") + :priority 0 + :download-server-fn (lambda (_client callback error-callback _update?) + (lsp-package-ensure 'perlnavigator callback error-callback)) + :server-id 'perlnavigator)) + +(provide 'lsp-perlnavigator) +;;; lsp-perlnavigator.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-php.el b/code/elpa/lsp-mode-20240319.1043/lsp-php.el new file mode 100644 index 0000000..21bb345 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-php.el @@ -0,0 +1,464 @@ +;;; lsp-php.el --- description -*- lexical-binding: t; -*- + +;; Copyright (C) 2020 emacs-lsp maintainers + +;; Author: emacs-lsp maintainers +;; Keywords: lsp, php + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP Clients for the PHP Programming Language. + +;;; Code: + +(require 'lsp-mode) +(require 'lsp-protocol) + +;; PHP Language Server +(defgroup lsp-php nil + "LSP support for PHP, using php-language-server." + :link '(url-link "https://github.com/felixfbecker/php-language-server") + :group 'lsp-mode) + +(defun lsp-php-get-composer-dir () + "Get composer home directory if possible." + (if (executable-find "composer") + (replace-regexp-in-string "\n$" "" (shell-command-to-string "composer config --global home")) + "~/.composer")) + +(defcustom lsp-php-composer-dir nil + "Home directory of composer." + :group 'lsp-php + :type 'string) + +(defcustom lsp-clients-php-server-command nil + "Install directory for php-language-server." + :group 'lsp-php + :type '(repeat string)) + +(defun lsp-php--create-connection () + "Create lsp connection." + (lsp-stdio-connection + (lambda () + (unless lsp-php-composer-dir + (setq lsp-php-composer-dir (lsp-php-get-composer-dir))) + (unless lsp-clients-php-server-command + (setq lsp-clients-php-server-command + `("php", + (expand-file-name + (f-join lsp-php-composer-dir "vendor/felixfbecker/language-server/bin/php-language-server.php"))))) + lsp-clients-php-server-command) + (lambda () + (if (and (cdr lsp-clients-php-server-command) + (eq (string-match-p "php[0-9.]*\\'" (car lsp-clients-php-server-command)) 0)) + ;; Start with the php command and the list has more elems. Test the existence of the PHP script. + (let ((php-file (nth 1 lsp-clients-php-server-command))) + (or (file-exists-p php-file) + (progn + (lsp-log "%s is not present." php-file) + nil))) + t)))) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-php--create-connection) + :activation-fn (lsp-activate-on "php") + :priority -3 + :server-id 'php-ls)) + +;;; Intelephense +(defgroup lsp-intelephense nil + "LSP support for PHP, using Intelephense." + :group 'lsp-mode + :link '(url-link "https://github.com/bmewburn/vscode-intelephense") + :package-version '(lsp-mode . "6.1")) + +(lsp-defcustom lsp-intelephense-php-version "8.0.1" + "Minimum version of PHP to refer to. Affects code actions, diagnostic & +completions." + :type 'string + :group 'lsp-intelephense + :package-version '(lsp-mode . "6.1") + :lsp-path "intelephense.environment.phpVersion") + +(lsp-defcustom lsp-intelephense-files-max-size 1000000 + "Maximum file size in bytes." + :type 'number + :group 'lsp-intelephense + :package-version '(lsp-mode . "6.1") + :lsp-path "intelephense-files.maxSize") + +(lsp-defcustom lsp-intelephense-files-associations + ["*.php" "*.phtml"] + "Configure glob patterns to make files available for language +server features." + :type '(repeat string) + :group 'lsp-intelephense + :package-version '(lsp-mode . "6.1") + :lsp-path "intelephense.files.associations") + +(lsp-defcustom lsp-intelephense-files-exclude + ["**/.git/**" "**/.svn/**" "**/.hg/**" "**/CVS/**" "**/.DS_Store/**" + "**/node_modules/**" "**/bower_components/**" "**/vendor/**/{Test,test,Tests,tests}/**"] + "Configure glob patterns to exclude certain files and folders +from all language server features." + :type '(repeat string) + :group 'lsp-intelephense + :package-version '(lsp-mode . "6.1") + :lsp-path "intelephense.files.exclude") + +(lsp-defcustom lsp-intelephense-paths-include + [] + "Configure additional paths outside workspace." + :type 'lsp-string-vector + :group 'lsp-intelephense + :package-version '(lsp-mode . "8.1") + :lsp-path "intelephense.environment.includePaths") + +(lsp-defcustom lsp-intelephense-stubs + ["apache" "bcmath" "bz2" "calendar" + "com_dotnet" "Core" "ctype" "curl" "date" "dba" "dom" "enchant" + "exif" "fileinfo" "filter" "fpm" "ftp" "gd" "hash" "iconv" "imap" "interbase" + "intl" "json" "ldap" "libxml" "mbstring" "mcrypt" "meta" "mssql" "mysqli" + "oci8" "odbc" "openssl" "pcntl" "pcre" "PDO" "pdo_ibm" "pdo_mysql" + "pdo_pgsql" "pdo_sqlite" "pgsql" "Phar" "posix" "pspell" "readline" "recode" + "Reflection" "regex" "session" "shmop" "SimpleXML" "snmp" "soap" "sockets" + "sodium" "SPL" "sqlite3" "standard" "superglobals" "sybase" "sysvmsg" + "sysvsem" "sysvshm" "tidy" "tokenizer" "wddx" "xml" "xmlreader" "xmlrpc" + "xmlwriter" "Zend OPcache" "zip" "zlib"] + "Configure stub files for built in symbols and common +extensions. The default setting includes PHP core and all +bundled extensions." + :type '(repeat string) + :group 'lsp-intelephense + :package-version '(lsp-mode . "6.1") + :lsp-path "intelephense.stubs") + +(lsp-defcustom lsp-intelephense-completion-insert-use-declaration t + "Use declarations will be automatically inserted for namespaced +classes, traits, interfaces, functions, and constants." + :type 'boolean + :group 'lsp-intelephense + :package-version '(lsp-mode . "6.1") + :lsp-path "intelephense.completion.insertUseDeclaration") + +(lsp-defcustom lsp-intelephense-completion-fully-qualify-global-constants-and-functions nil + "Global namespace constants and functions will be fully +qualified (prefixed with a backslash)." + :type 'boolean + :group 'lsp-intelephense + :package-version '(lsp-mode . "6.1") + :lsp-path "intelephense.completion.fullyQualifyGlobalConstantsAndFunctions") + +(lsp-defcustom lsp-intelephense-completion-trigger-parameter-hints t + "Method and function completions will include parentheses and +trigger parameter hints." + :type 'boolean + :group 'lsp-intelephense + :package-version '(lsp-mode . "6.2") + :lsp-path "intelephense.completion.triggerParameterHints") + +(lsp-defcustom lsp-intelephense-completion-max-items 100 + "The maximum number of completion items returned per request." + :type 'number + :group 'lsp-intelephense + :package-version '(lsp-mode . "6.2") + :lsp-path "intelephense.completion.maxItems") + +(lsp-defcustom lsp-intelephense-format-enable t + "Enables formatting." + :type 'boolean + :group 'lsp-intelephense + :package-version '(lsp-mode . "6.1") + :lsp-path "intelephense.format.enable") + +(lsp-defcustom lsp-intelephense-format-braces "psr12" + "Formatting braces style. psr12, allman or k&r" + :type 'string + :group 'lsp-intelephense + :package-version '(lsp-mode . "8.1") + :lsp-path "intelephense.format.braces") + +(defcustom lsp-intelephense-licence-key nil + "Enter your intelephense licence key here to access premium +features." + :type 'string + :group 'lsp-intelephense + :package-version '(lsp-mode . "6.2")) + +(lsp-defcustom lsp-intelephense-telemetry-enabled nil + "Anonymous usage and crash data will be sent to Azure +Application Insights." + :type 'boolean + :group 'lsp-intelephense + :package-version '(lsp-mode . "6.2") + :lsp-path "intelephense.telemetry.enabled") + +(lsp-defcustom lsp-intelephense-rename-exclude + ["**/vendor/**"] + "Glob patterns to exclude files and folders from having symbols +renamed. Rename operation will fail if references and/or +definitions are found in excluded files/folders." + :type '(repeat string) + :group 'lsp-intelephense + :package-version '(lsp-mode . "6.2") + :lsp-path "intelephense.rename.exclude") + +(lsp-defcustom lsp-intelephense-trace-server "off" + "Traces the communication between VSCode and the intelephense +language server." + :type '(choice (:tag "off" "messages" "verbose")) + :group 'lsp-intelephense + :package-version '(lsp-mode . "6.1") + :lsp-path "intelephense.trace.server") + +(defcustom lsp-intelephense-storage-path + (expand-file-name (locate-user-emacs-file "lsp-cache")) + "Optional absolute path to storage dir." + :type 'directory + :group 'lsp-intelephense + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-intelephense-global-storage-path + (expand-file-name (locate-user-emacs-file "intelephense")) + "Optional absolute path to global storage dir." + :type 'directory + :group 'lsp-intelephense + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-intelephense-clear-cache nil + "Optional flag to clear server state." + :type 'boolean + :group 'lsp-intelephense + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-intelephense-multi-root t + "Flag to control if the server supports multi-root projects." + :type 'boolean + :group 'lsp-intelephense + :package-version '(lsp-mode . "6.3")) + +(define-obsolete-variable-alias + 'lsp-clients-php-iph-server-command + 'lsp-intelephense-server-command + "lsp-mode 6.1") + +(defcustom lsp-intelephense-server-command + `("intelephense" "--stdio") + "Command to start Intelephense." + :type '(repeat string) + :group 'lsp-intelephense + :package-version '(lsp-mode . "6.1")) + +(lsp-dependency 'intelephense + '(:system "intelephense") + '(:npm :package "intelephense" + :path "intelephense")) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection + (lambda () + `(,(or (executable-find + (cl-first lsp-intelephense-server-command)) + (lsp-package-path 'intelephense)) + ,@(cl-rest lsp-intelephense-server-command)))) + :activation-fn (lsp-activate-on "php") + :priority -1 + :notification-handlers (ht ("indexingStarted" #'ignore) + ("indexingEnded" #'ignore)) + :initialization-options (lambda () + (list :storagePath lsp-intelephense-storage-path + :globalStoragePath lsp-intelephense-global-storage-path + :licenceKey lsp-intelephense-licence-key + :clearCache lsp-intelephense-clear-cache)) + :multi-root lsp-intelephense-multi-root + :completion-in-comments? t + :server-id 'iph + :download-server-fn (lambda (_client callback error-callback _update?) + (lsp-package-ensure 'intelephense + callback error-callback)) + :synchronize-sections '("intelephense"))) + + +;;; Serenata +(defgroup lsp-serenata nil + "LSP support for the PHP programming language, using serenata." + :group 'lsp-mode + :link '(url-link "https://gitlab.com/Serenata/Serenata") + :package-version '(lsp-mode . "7.0")) + +(defcustom lsp-serenata-server-path + "serenata.phar" + "Path to the Serenata Language Server phar file. +It can be downloaded from https://gitlab.com/Serenata/Serenata/-/releases." + :group 'lsp-serenata + :type 'file) + +(defcustom lsp-serenata-uris + [] + "A list of folders to index for your project. +This does not have to include the root of the project itself, in +case you have need of an exotic configuration where the root of +the project is at some location but your actual PHP code is +somewhere else. Note that if you are running Serenata in a +container, you will have to ensure that these URI's are mapped +inside it. Avoid using file paths containing spaces. This is +currently broken due to apparent PHP quirks. By default, the +value is taken from the lsp workspace location." + :group 'lsp-serenata + :type 'lsp-string-vector) + +(defcustom lsp-serenata-php-version + 7.3 + "Allows you to specify the PHP version your project is written in. +At the moment this directive is still ignored, but it will +influence functionality such as refactoring in the future, where +older PHP versions may not support scalar type hints, which may +then be omitted from places such as getters and setters." + :group 'lsp-serenata + :type 'number) + +(defcustom lsp-serenata-file-extensions + ["php"] + "List of file extensions (without dot) to process. +Files that do not match this whitelist will be ignored during +indexing. Usually you'll want to set this to at least include +php, as it is the most common PHP extension. phpt is not +included by default as it is often used to contain test code that +is not directly part of the code. Note that for existing +projects, removing extensions will not not automatically prune +files having them from the index if they are already present. +Adding new ones will cause the files having them to be picked up +on the next project initialization." + :group 'lsp-serenata + :type 'lsp-string-vector) + +(defcustom lsp-serenata-index-database-uri (lsp--path-to-uri (f-join user-emacs-directory "index.sqlite")) + "The location to store the index database. +Note that, as the index database uses SQLite and WAL mode, +additional files (usually two) may be generated and used in the +same folder. Note also that Serenata relies on the Doctrine DBAL +library as well as the SQLite backends in PHP, which may not +support non-file URI's, which may prevent you from using these." + :group 'lsp-serenata + :type 'file) + +(defcustom lsp-serenata-exclude-path-expressions ["/.+Test.php$/"] + "One or more expressions of paths to ignore. +This uses Symfony's Finder in the background, so this means you +can configure anything here that can also be passed to the name +function, which includes plain strings, globs, as well as regular +expressions. Note that for existing projects, modifying these +will not not automatically prune them from the index if they are +already present." + :group 'lsp-serenata + :type 'lsp-string-vector) + +(defun lsp-serenata-server-start-fun (port) + "Define serenata start function, it requires a PORT." + `(,lsp-serenata-server-path + "-u" ,(number-to-string port))) + +(defun lsp-serenata-init-options () + "Init options for lsp-serenata." + `( :configuration ( :uris ,lsp-serenata-uris + :indexDatabaseUri ,lsp-serenata-index-database-uri + :phpVersion ,lsp-serenata-php-version + :excludedPathExpressions ,lsp-serenata-exclude-path-expressions + :fileExtensions ,lsp-serenata-file-extensions))) + + +(lsp-interface (serenata:didProgressIndexing (:sequenceOfIndexedItem :totalItemsToIndex :progressPercentage :folderUri :fileUri :info) nil )) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-tcp-connection 'lsp-serenata-server-start-fun) + :activation-fn (lsp-activate-on "php") + :priority -2 + :notification-handlers (ht ("serenata/didProgressIndexing" + (lambda (_server data) + (lsp-log "%s" (lsp:serenata-did-progress-indexing-info data))))) + + :initialization-options #'lsp-serenata-init-options + :initialized-fn (lambda (workspace) + (when (equal (length lsp-serenata-uris) 0) + (let* ((lsp-root (lsp--path-to-uri (lsp-workspace-root)))) + (setq lsp-serenata-uris (vector lsp-root)))) + (with-lsp-workspace workspace + (lsp--set-configuration + (lsp-configuration-section "serenata")))) + :server-id 'serenata)) + +;;; phpactor + +(defgroup lsp-phpactor nil + "LSP support for Phpactor." + :link '(url-link "https://github.com/phpactor/phpactor") + :group 'lsp-mode) + +(defcustom lsp-phpactor-path nil + "Path to the `phpactor' command." + :group 'lsp-phpactor + :type 'string) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection + (lambda () + (unless lsp-php-composer-dir + (setq lsp-php-composer-dir (lsp-php-get-composer-dir))) + (unless lsp-phpactor-path + (setq lsp-phpactor-path (or (executable-find "phpactor") + (f-join lsp-php-composer-dir "vendor/phpactor/phpactor/bin/phpactor")))) + (list lsp-phpactor-path "language-server"))) + :activation-fn (lsp-activate-on "php") + ;; `phpactor' is not really that feature-complete: it doesn't support + ;; `textDocument/showOccurence' and sometimes errors (e.g. find references on + ;; a global free-standing function). + :priority -4 + ;; Even though `phpactor' itself supports no options, this needs to be + ;; serialized as an empty object (otherwise the LS won't even start, due to a + ;; type error). + :initialization-options (ht) + :server-id 'phpactor)) + +(defcustom lsp-phpactor-extension-alist '(("Phpstan" . "phpactor/language-server-phpstan-extension") + ("Behat" . "phpactor/behat-extension") + ("PHPUnit" . "phpactor/phpunit-extension")) + "Alist mapping extension names to `composer' packages. +These extensions can be installed using +`lsp-phpactor-install-extension'." + :type '(alist :key-type "string" :value-type "string") + :group 'lsp-phpactor) + +(defun lsp-phpactor-install-extension (extension) + "Install a `phpactor' EXTENSION. +See `lsp-phpactor-extension-alist' and +https://phpactor.readthedocs.io/en/develop/extensions.html." + (interactive (list (completing-read "Select extension: " + lsp-phpactor-extension-alist))) + (compilation-start + (format "%s extension:install %s" + (shell-quote-argument (expand-file-name lsp-phpactor-path)) + (shell-quote-argument + (cdr (assoc extension lsp-phpactor-extension-alist)))) + nil + (lambda (_mode) + (format "*Phpactor install %s*" extension)))) + +(lsp-consistency-check lsp-php) + +(provide 'lsp-php) +;;; lsp-php.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-pls.el b/code/elpa/lsp-mode-20240319.1043/lsp-pls.el new file mode 100644 index 0000000..0b95d4e --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-pls.el @@ -0,0 +1,133 @@ +;;; lsp-pls.el --- PLS Integration for lsp-mode -*- lexical-binding: t -*- + +;; Copyright (C) 2022 Alexander Adolf + +;; Author: Alexander Adolf +;; Maintainer: Alexander Adolf +;; Package-Requires: (lsp-mode) +;; Keywords: perl, lsp + +;; This file is not part of GNU Emacs + +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; PLS client +;; https://metacpan.org/pod/PLS + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-pls nil + "LSP Mode support for PLS, the Perl Language Server." + :group 'lsp-mode + :link '(url-link "https://metacpan.org/pod/PLS") + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-pls-executable "pls" + "Full path to the PLS executable." + :type '(string) + :group 'lsp-pls + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-pls-arguments nil + "Additional arguments needed to execute PLS." + :type '(repeat 'string) + :group 'lsp-pls + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-pls-working-dir nil + "Working directory to run PLS in. +Defaults to the workspace root when not configured." + :type '(string) + :group 'lsp-pls + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-pls-include nil + "Paths to be added to your @INC." + :type '(repeat 'string) + :group 'lsp-pls + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-pls-perltidy-rc nil + "Path to your .perltidyrc file. +Default is \"~/.perltidyrc\" when not configured." + :type '(string) + :group 'lsp-pls + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-pls-perlcritic-rc nil + "Path to your .perlcriticrc file. +Default is \"~/.perlcriticrc\" when not configured." + :type '(string) + :group 'lsp-pls + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-pls-perlcritic-enabled t + "Enable perlcritic checking." + :type '(boolean) + :group 'lsp-pls + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-pls-syntax-enabled t + "Enable syntax checking." + :type '(boolean) + :group 'lsp-pls + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-pls-syntax-perl nil + "Full path to an alternate perl used for syntax checking. +By default, the perl used to run PLS will be used." + :type '(string) + :group 'lsp-pls + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-pls-syntax-args nil + "Additional arguments to pass to Perl when syntax checking. +This is useful if there is a BEGIN block in your code that +changes behavior depending on the contents of @ARGV." + :type '(repeat 'string) + :group 'lsp-pls + :package-version '(lsp-mode . "8.0.1")) + +(lsp-register-custom-settings + '(("pls.cmd" lsp-pls-executable) + ("pls.args" lsp-pls-arguments) + ("pls.cwd" lsp-pls-working-dir) + ("pls.inc" lsp-pls-include) + ("pls.perltidy.perltidyrc" lsp-pls-perltidy-rc) + ("pls.perlcritic.perlcriticrc" lsp-pls-perlcritic-rc) + ("pls.perlcritic.enabled" lsp-pls-perlcritic-enabled) + ("pls.syntax.enabled" lsp-pls-syntax-enabled) + ("pls.syntax.perl" lsp-pls-syntax-perl) + ("pls.syntax.args" lsp-pls-syntax-args))) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection + (lambda () (cons lsp-pls-executable lsp-pls-arguments))) + :activation-fn (lsp-activate-on "perl") + :initialized-fn (lambda (workspace) + (with-lsp-workspace workspace + (lsp--set-configuration + (lsp-configuration-section "pls")))) + :priority -1 + :server-id 'pls)) + +;; (lsp-consistency-check lsp-pls) + +(provide 'lsp-pls) +;;; lsp-pls.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-prolog.el b/code/elpa/lsp-mode-20240319.1043/lsp-prolog.el new file mode 100644 index 0000000..084f0ee --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-prolog.el @@ -0,0 +1,55 @@ +;;; lsp-prolog.el --- Prolog Client settings -*- lexical-binding: t; -*- + +;; Copyright (C) 2020 James Cash + +;; Author: James Cash +;; Keywords: languages,tools + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; lsp-prolog client + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-prolog nil + "LSP support for Prolog." + :link '(url-link "https://github.com/jamesnvc/lsp_server") + :group 'lsp-mode + :tag "Lsp Prolog") + +(defcustom lsp-prolog-server-command '("swipl" + "-g" "use_module(library(lsp_server))." + "-g" "lsp_server:main" + "-t" "halt" + "--" "stdio") + "The prolog-lsp server command." + :group 'lsp-prolog + :risky t + :type 'list) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection (lambda () lsp-prolog-server-command)) + :major-modes '(prolog-mode) + :multi-root t + :server-id 'prolog-lsp)) + +(lsp-consistency-check lsp-prolog) + +(provide 'lsp-prolog) +;;; lsp-prolog.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-protocol.el b/code/elpa/lsp-mode-20240319.1043/lsp-protocol.el new file mode 100644 index 0000000..b3cdb0d --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-protocol.el @@ -0,0 +1,797 @@ +;;; lsp-protocol.el --- Language Sever Protocol Bindings -*- lexical-binding: t; -*- + +;; Copyright (C) 2020 Ivan Yonchovski + +;; Author: Ivan Yonchovski +;; Keywords: convenience + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; Autogenerated bindings from lsp4j using +;; https://github.com/victools/jsonschema-generator+scripts to generate +;; scripts/generated.protocol.schema.json and then +;; scripts/lsp-generate-bindings.el + +;;; Code: + +(require 'cl-lib) +(require 'dash) +(require 'ht) +(require 's) +(require 'json) + +(eval-and-compile + (defun lsp-keyword->symbol (keyword) + "Convert a KEYWORD to symbol." + (intern (substring (symbol-name keyword) 1))) + + (defun lsp-keyword->string (keyword) + "Convert a KEYWORD to string." + (substring (symbol-name keyword) 1)) + + (defvar lsp-use-plists (getenv "LSP_USE_PLISTS"))) + +(defmacro lsp-interface (&rest interfaces) + "Generate LSP bindings from INTERFACES triplet. + +Example usage with `dash`. + +\(-let [(&ApplyWorkspaceEditResponse + :failure-reason?) (ht (\"failureReason\" \"...\"))] + failure-reason?) + +\(fn (INTERFACE-NAME-1 REQUIRED-FIELDS-1 OPTIONAL-FIELDS-1) (INTERFACE-NAME-2 REQUIRED-FIELDS-2 OPTIONAL-FIELDS-2) ...)" + (with-case-table ascii-case-table + (->> interfaces + (-map (-lambda ((interface required optional)) + (let ((params (nconc + (-map (lambda (param-name) + (cons + (intern (concat ":" (s-dashed-words (symbol-name param-name)) "?")) + param-name)) + optional) + (-map (lambda (param-name) + (cons (intern (concat ":" (s-dashed-words (symbol-name param-name)))) + param-name)) + required)))) + (cl-list* + `(defun ,(intern (format "dash-expand:&%s" interface)) (key source) + (unless (or (member key ',(-map #'cl-first params)) + (s-starts-with? ":_" (symbol-name key))) + (error "Unknown key: %s. Available keys: %s" key ',(-map #'cl-first params))) + ,(if lsp-use-plists + ``(plist-get ,source + ,(if (s-starts-with? ":_" (symbol-name key)) + key + (cl-rest (assoc key ',params)))) + ``(gethash ,(if (s-starts-with? ":_" (symbol-name key)) + (substring (symbol-name key) 1) + (substring (symbol-name + (cl-rest (assoc key ',params))) + 1)) + ,source))) + `(defun ,(intern (format "dash-expand:&%s?" interface)) (key source) + (unless (member key ',(-map #'cl-first params)) + (error "Unknown key: %s. Available keys: %s" key ',(-map #'cl-first params))) + ,(if lsp-use-plists + ``(plist-get ,source + ,(if (s-starts-with? ":_" (symbol-name key)) + key + (cl-rest (assoc key ',params)))) + ``(when (ht? ,source) + (gethash ,(substring (symbol-name + (cl-rest (assoc key ',params))) + 1) + ,source)))) + + `(defun ,(intern (format "lsp-%s?" (s-dashed-words (symbol-name interface)))) (object) + (cond + ((ht? object) + (-all? (let ((keys (ht-keys object))) + (lambda (prop) + (member prop keys))) + ',(-map (lambda (field-name) + (substring (symbol-name field-name) 1)) + required))) + ((listp object) (-all? (lambda (prop) + (plist-member object prop)) + ',required)))) + `(cl-defun ,(intern (format "lsp-make-%s" (s-dashed-words (symbol-name interface)))) + (&rest plist &key ,@(-map (-lambda ((key)) + (intern (substring (symbol-name key) 1))) params) + &allow-other-keys) + (ignore ,@(-map (-lambda ((key)) + (intern (substring (symbol-name key) 1))) params)) + ,(format "Constructs %s from `plist.' +Allowed params: %s" interface (reverse (-map #'cl-first params))) + ,(if lsp-use-plists + `(-mapcat (-lambda ((key value)) + (list (or (cl-rest (assoc key ',params)) key) value)) + (-partition 2 plist)) + `(let (($$result (ht))) + (mapc (-lambda ((key value)) + (puthash (lsp-keyword->string (or (cl-rest (assoc key ',params)) + key)) + value + $$result)) + (-partition 2 plist)) + $$result))) + `(pcase-defmacro ,interface (&rest property-bindings) + ,(if lsp-use-plists + ``(and + (pred listp) + ;; Check if all the types required by the + ;; interface exist in the expr-val. + ,@(-map + (lambda (key) + `(pred + (lambda (plist) + (plist-member plist ,key)))) + ',required) + ;; Recursively generate the bindings. + ,@(let ((current-list property-bindings) + (output-bindings nil)) + ;; Invariant: while current-list is + ;; non-nil, the car of current-list is + ;; always of the form :key, while the + ;; cadr of current-list is either a) + ;; nil, b) of the form :key-next or c) + ;; a pcase pattern that can + ;; recursively match an expression. + (while current-list + (-let* (((curr-binding-as-keyword next-entry . _) current-list) + (curr-binding-as-camelcased-symbol + (or (alist-get curr-binding-as-keyword ',params) + (error "Unknown key: %s. Available keys: %s" + (symbol-name curr-binding-as-keyword) + ',(-map #'cl-first params)))) + (bound-name (lsp-keyword->symbol curr-binding-as-keyword)) + (next-entry-is-key-or-nil + (and (symbolp next-entry) + (or (null next-entry) + (s-starts-with? ":" (symbol-name next-entry)))))) + (cond + ;; If the next-entry is either a + ;; plist-key or nil, then bind to + ;; bound-name the value corresponding + ;; to the camelcased symbol. Pop + ;; current-list once. + (next-entry-is-key-or-nil + (push `(app (lambda (plist) + (plist-get plist ,curr-binding-as-camelcased-symbol)) + ,bound-name) + output-bindings) + (setf current-list (cdr current-list))) + ;; Otherwise, next-entry is a pcase + ;; pattern we recursively match to the + ;; expression. This can in general + ;; create additional bindings that we + ;; persist in the top level of + ;; bindings. We pop current-list + ;; twice. + (t + (push `(app (lambda (plist) + (plist-get plist ,curr-binding-as-camelcased-symbol)) + ,next-entry) + output-bindings) + (setf current-list (cddr current-list)))))) + output-bindings)) + ``(and + (pred ht?) + ,@(-map + (lambda (key) + `(pred + (lambda (hash-table) + (ht-contains? hash-table ,(lsp-keyword->string key))))) + ',required) + ,@(let ((current-list property-bindings) + (output-bindings nil)) + (while current-list + (-let* (((curr-binding-as-keyword next-entry . _) current-list) + (curr-binding-as-camelcased-string + (lsp-keyword->string (or (alist-get curr-binding-as-keyword ',params) + (error "Unknown key: %s. Available keys: %s" + (symbol-name curr-binding-as-keyword) + ',(-map #'cl-first params))))) + (bound-name (lsp-keyword->symbol curr-binding-as-keyword)) + (next-entry-is-key-or-nil + (and (symbolp next-entry) + (or (null next-entry) + (s-starts-with? ":" (symbol-name next-entry)))))) + (cond + (next-entry-is-key-or-nil + (push `(app (lambda (hash-table) + (ht-get hash-table ,curr-binding-as-camelcased-string)) + ,bound-name) + output-bindings) + (setf current-list (cdr current-list))) + (t + (push `(app (lambda (hash-table) + (ht-get hash-table ,curr-binding-as-camelcased-string)) + ,next-entry) + output-bindings) + (setf current-list (cddr current-list)))))) + output-bindings)))) + (-mapcat (-lambda ((label . name)) + (list + `(defun ,(intern (format "lsp:%s-%s" + (s-dashed-words (symbol-name interface)) + (substring (symbol-name label) 1))) + (object) + ,(if lsp-use-plists + `(plist-get object ,name) + `(when (ht? object) (gethash ,(lsp-keyword->string name) object)))) + `(defun ,(intern (format "lsp:set-%s-%s" + (s-dashed-words (symbol-name interface)) + (substring (symbol-name label) 1))) + (object value) + ,@(if lsp-use-plists + `((plist-put object ,name value)) + `((puthash ,(lsp-keyword->string name) value object) + object))))) + params))))) + (apply #'append) + (cl-list* 'progn)))) + +(if lsp-use-plists + (progn + (defun lsp-get (from key) + (plist-get from key)) + (defun lsp-put (where key value) + (plist-put where key value)) + (defun lsp-map (fn value) + (-map (-lambda ((k v)) + (funcall fn (lsp-keyword->string k) v)) + (-partition 2 value ))) + (defalias 'lsp-merge 'append) + (defalias 'lsp-empty? 'null) + (defalias 'lsp-copy 'copy-sequence) + (defun lsp-member? (from key) + (when (listp from) + (plist-member from key))) + (defalias 'lsp-structure-p 'json-plist-p) + (defun lsp-delete (from key) + (cl-remf from key) + from)) + (defun lsp-get (from key) + (when from + (gethash (lsp-keyword->string key) from))) + (defun lsp-put (where key value) + (prog1 where + (puthash (lsp-keyword->string key) value where))) + (defun lsp-map (fn value) + (when value + (maphash fn value))) + (defalias 'lsp-merge 'ht-merge) + (defalias 'lsp-empty? 'ht-empty?) + (defalias 'lsp-copy 'ht-copy) + (defun lsp-member? (from key) + (when (hash-table-p from) + (not (eq (gethash (lsp-keyword->string key) from :__lsp_default) + :__lsp_default)))) + (defalias 'lsp-structure-p 'hash-table-p) + (defun lsp-delete (from key) + (ht-remove from (lsp-keyword->string key)) + from)) + +(defmacro lsp-defun (name match-form &rest body) + "Define a function named NAME. +The function destructures its input as MATCH-FORM then executes BODY. + +Note that you have to enclose the MATCH-FORM in a pair of parens, +such that: + + (-defun (x) body) + (-defun (x y ...) body) + +has the usual semantics of `defun'. Furthermore, these get +translated into a normal `defun', so there is no performance +penalty. + +See `-let' for a description of the destructuring mechanism." + (declare (doc-string 3) (indent defun) + (debug (&define name sexp + [&optional stringp] + [&optional ("declare" &rest sexp)] + [&optional ("interactive" interactive)] + def-body))) + (cond + ((nlistp match-form) + (signal 'wrong-type-argument (list #'listp match-form))) + ;; no destructuring, so just return regular defun to make things faster + ((-all? #'symbolp match-form) + `(defun ,name ,match-form ,@body)) + (t + (-let* ((inputs (--map-indexed (list it (make-symbol (format "input%d" it-index))) match-form)) + ((body docs) (cond + ;; only docs + ((and (stringp (car body)) + (not (cdr body))) + (list body (car body))) + ;; docs + body + ((stringp (car body)) + (list (cdr body) (car body))) + ;; no docs + (t (list body)))) + ((body interactive-form) (cond + ;; interactive form + ((and (listp (car body)) + (eq (caar body) 'interactive)) + (list (cdr body) (car body))) + ;; no interactive form + (t (list body))))) + ;; TODO: because inputs to the defun are evaluated only once, + ;; -let* need not to create the extra bindings to ensure that. + ;; We should find a way to optimize that. Not critical however. + `(defun ,name ,(-map #'cadr inputs) + ,@(when docs (list docs)) + ,@(when interactive-form (list interactive-form)) + (-let* ,inputs ,@body)))))) + + + + +;; manually defined interfaces +(defconst lsp/markup-kind-plain-text "plaintext") +(defconst lsp/markup-kind-markdown "markdown") + +(lsp-interface (JSONResponse (:params :id :method :result) nil) + (JSONResponseError (:error) nil) + (JSONMessage nil (:params :id :method :result :error)) + (JSONResult nil (:params :id :method)) + (JSONNotification (:params :method) nil) + (JSONRequest (:params :method) nil) + (JSONError (:message :code) (:data)) + (ProgressParams (:token :value) nil) + (Edit (:kind) nil) + (WorkDoneProgress (:kind) nil) + (WorkDoneProgressBegin (:kind :title) (:cancellable :message :percentage)) + (WorkDoneProgressReport (:kind) (:cancellable :message :percentage)) + (WorkDoneProgressEnd (:kind) (:message)) + (WorkDoneProgressOptions nil (:workDoneProgress)) + (SemanticTokensOptions (:legend) (:rangeProvider :documentProvider)) + (SemanticTokensLegend (:tokenTypes :tokenModifiers)) + (SemanticTokensResult (:resultId) (:data)) + (SemanticTokensPartialResult nil (:data)) + (SemanticTokensEdit (:start :deleteCount) (:data)) + (SemanticTokensDelta (:resultId) (:edits)) + (SemanticTokensDeltaPartialResult nil (:edits))) + +(lsp-interface (v1:ProgressParams (:id :title) (:message :percentage :done))) + +(defun dash-expand:&RangeToPoint (key source) + "Convert the position KEY from SOURCE into a point." + `(lsp--position-to-point + (lsp-get ,source ,key))) + +(lsp-interface (eslint:StatusParams (:state) nil) + (eslint:OpenESLintDocParams (:url) nil) + (eslint:ConfirmExecutionParams (:scope :file :libraryPath) nil)) + +(lsp-interface (haxe:ProcessStartNotification (:title) nil)) + +(lsp-interface (pwsh:ScriptRegion (:StartLineNumber :EndLineNumber :StartColumnNumber :EndColumnNumber :Text) nil)) + +(lsp-interface (omnisharp:ErrorMessage (:Text :FileName :Line :Column)) + (omnisharp:ProjectInformationRequest (:FileName)) + (omnisharp:MsBuildProject (:IsUnitProject :IsExe :Platform :Configuration :IntermediateOutputPath :OutputPath :TargetFrameworks :SourceFiles :TargetFramework :TargetPath :AssemblyName :Path :ProjectGuid)) + (omnisharp:ProjectInformation (:ScriptProject :MsBuildProject)) + (omnisharp:CodeStructureRequest (:FileName)) + (omnisharp:CodeStructureResponse (:Elements)) + (omnisharp:CodeElement (:Kind :Name :DisplayName :Children :Ranges :Properties)) + (omnisharp:CodeElementProperties () (:static :accessibility :testMethodName :testFramework)) + (omnisharp:Range (:Start :End)) + (omnisharp:RangeList () (:attributes :full :name)) + (omnisharp:Point (:Line :Column)) + (omnisharp:RunTestsInClassRequest (:MethodNames :RunSettings :TestFrameworkname :TargetFrameworkVersion :NoBuild :Line :Column :Buffer :FileName)) + (omnisharp:RunTestResponse (:Results :Pass :Failure :ContextHadNoTests)) + (omnisharp:TestMessageEvent (:MessageLevel :Message)) + (omnisharp:DotNetTestResult (:MethodName :Outcome :ErrorMessage :ErrorStackTrace :StandardOutput :StandardError))) + +(lsp-interface (csharp-ls:CSharpMetadata (:textDocument)) + (csharp-ls:CSharpMetadataResponse (:source :projectName :assemblyName :symbolName))) + +(lsp-interface (rls:Cmd (:args :binary :env :cwd) nil)) + +(lsp-interface (rust-analyzer:AnalyzerStatusParams (:textDocument)) + (rust-analyzer:SyntaxTreeParams (:textDocument) (:range)) + (rust-analyzer:ViewHir (:textDocument :position)) + (rust-analyzer:ViewItemTree (:textDocument)) + (rust-analyzer:ExpandMacroParams (:textDocument :position) nil) + (rust-analyzer:ExpandedMacro (:name :expansion) nil) + (rust-analyzer:MatchingBraceParams (:textDocument :positions) nil) + (rust-analyzer:OpenCargoTomlParams (:textDocument) nil) + (rust-analyzer:OpenExternalDocsParams (:textDocument :position) nil) + (rust-analyzer:ResovedCodeActionParams (:id :codeActionParams) nil) + (rust-analyzer:JoinLinesParams (:textDocument :ranges) nil) + (rust-analyzer:MoveItemParams (:textDocument :range :direction) nil) + (rust-analyzer:RunnablesParams (:textDocument) (:position)) + (rust-analyzer:Runnable (:label :kind :args) (:location)) + (rust-analyzer:RunnableArgs (:cargoArgs :executableArgs) (:workspaceRoot :expectTest)) + (rust-analyzer:RelatedTestsParams (:textDocument :position) nil) + (rust-analyzer:RelatedTests (:runnable) nil) + (rust-analyzer:SsrParams (:query :parseOnly) nil) + (rust-analyzer:CommandLink (:title :command) (:arguments :tooltip)) + (rust-analyzer:CommandLinkGroup (:commands) (:title))) + +(lsp-interface (clojure-lsp:TestTreeParams (:uri :tree) nil) + (clojure-lsp:TestTreeNode (:name :range :nameRange :kind) (:children)) + (clojure-lsp:ProjectTreeNode (:name :type) (:nodes :final :id :uri :detail :range))) + +(lsp-interface (terraform-ls:ModuleCalls (:v :module_calls) nil)) +(lsp-interface (terraform-ls:Module (:name :docs_link :version :source_type :dependent_modules) nil)) +(lsp-interface (terraform-ls:Providers (:v :provider_requirements :installed_providers) nil)) +(lsp-interface (terraform-ls:module.terraform (:v :required_version :discovered_version))) + + +;; begin autogenerated code + +(defvar lsp/completion-item-kind-lookup + [nil Text Method Function Constructor Field Variable Class Interface Module Property Unit Value Enum Keyword Snippet Color File Reference Folder EnumMember Constant Struct Event Operator TypeParameter]) +(defconst lsp/completion-item-kind-text 1) +(defconst lsp/completion-item-kind-method 2) +(defconst lsp/completion-item-kind-function 3) +(defconst lsp/completion-item-kind-constructor 4) +(defconst lsp/completion-item-kind-field 5) +(defconst lsp/completion-item-kind-variable 6) +(defconst lsp/completion-item-kind-class 7) +(defconst lsp/completion-item-kind-interface 8) +(defconst lsp/completion-item-kind-module 9) +(defconst lsp/completion-item-kind-property 10) +(defconst lsp/completion-item-kind-unit 11) +(defconst lsp/completion-item-kind-value 12) +(defconst lsp/completion-item-kind-enum 13) +(defconst lsp/completion-item-kind-keyword 14) +(defconst lsp/completion-item-kind-snippet 15) +(defconst lsp/completion-item-kind-color 16) +(defconst lsp/completion-item-kind-file 17) +(defconst lsp/completion-item-kind-reference 18) +(defconst lsp/completion-item-kind-folder 19) +(defconst lsp/completion-item-kind-enum-member 20) +(defconst lsp/completion-item-kind-constant 21) +(defconst lsp/completion-item-kind-struct 22) +(defconst lsp/completion-item-kind-event 23) +(defconst lsp/completion-item-kind-operator 24) +(defconst lsp/completion-item-kind-type-parameter 25) +(defvar lsp/completion-trigger-kind-lookup + [nil Invoked TriggerCharacter TriggerForIncompleteCompletions]) +(defconst lsp/completion-trigger-kind-invoked 1) +(defconst lsp/completion-trigger-kind-trigger-character 2) +(defconst lsp/completion-trigger-kind-trigger-for-incomplete-completions 3) +(defvar lsp/diagnostic-severity-lookup + [nil Error Warning Information Hint Max]) +(defconst lsp/diagnostic-severity-error 1) +(defconst lsp/diagnostic-severity-warning 2) +(defconst lsp/diagnostic-severity-information 3) +(defconst lsp/diagnostic-severity-hint 4) +(defconst lsp/diagnostic-severity-max 5) +(defvar lsp/diagnostic-tag-lookup + [nil Unnecessary Deprecated]) +(defconst lsp/diagnostic-tag-unnecessary 1) +(defconst lsp/diagnostic-tag-deprecated 2) +(defvar lsp/completion-item-tag-lookup + [nil Deprecated]) +(defconst lsp/completion-item-tag-deprecated 1) +(defvar lsp/document-highlight-kind-lookup + [nil Text Read Write]) +(defconst lsp/document-highlight-kind-text 1) +(defconst lsp/document-highlight-kind-read 2) +(defconst lsp/document-highlight-kind-write 3) +(defvar lsp/file-change-type-lookup + [nil Created Changed Deleted]) +(defconst lsp/file-change-type-created 1) +(defconst lsp/file-change-type-changed 2) +(defconst lsp/file-change-type-deleted 3) +(defvar lsp/insert-text-format-lookup + [nil PlainText Snippet]) +(defconst lsp/insert-text-format-plain-text 1) +(defconst lsp/insert-text-format-snippet 2) +(defvar lsp/insert-text-mode-lookup + [nil AsIs AdjustIndentation]) +(defconst lsp/insert-text-mode-as-it 1) +(defconst lsp/insert-text-mode-adjust-indentation 2) +(defvar lsp/message-type-lookup + [nil Error Warning Info Log]) +(defconst lsp/message-type-error 1) +(defconst lsp/message-type-warning 2) +(defconst lsp/message-type-info 3) +(defconst lsp/message-type-log 4) +(defvar lsp/signature-help-trigger-kind-lookup + [nil Invoked TriggerCharacter ContentChange]) +(defconst lsp/signature-help-trigger-kind-invoked 1) +(defconst lsp/signature-help-trigger-kind-trigger-character 2) +(defconst lsp/signature-help-trigger-kind-content-change 3) +(defvar lsp/symbol-kind-lookup + [nil File Module Namespace Package Class Method Property Field Constructor Enum Interface Function Variable Constant String Number Boolean Array Object Key Null EnumMember Struct Event Operator TypeParameter]) +(defconst lsp/symbol-kind-file 1) +(defconst lsp/symbol-kind-module 2) +(defconst lsp/symbol-kind-namespace 3) +(defconst lsp/symbol-kind-package 4) +(defconst lsp/symbol-kind-class 5) +(defconst lsp/symbol-kind-method 6) +(defconst lsp/symbol-kind-property 7) +(defconst lsp/symbol-kind-field 8) +(defconst lsp/symbol-kind-constructor 9) +(defconst lsp/symbol-kind-enum 10) +(defconst lsp/symbol-kind-interface 11) +(defconst lsp/symbol-kind-function 12) +(defconst lsp/symbol-kind-variable 13) +(defconst lsp/symbol-kind-constant 14) +(defconst lsp/symbol-kind-string 15) +(defconst lsp/symbol-kind-number 16) +(defconst lsp/symbol-kind-boolean 17) +(defconst lsp/symbol-kind-array 18) +(defconst lsp/symbol-kind-object 19) +(defconst lsp/symbol-kind-key 20) +(defconst lsp/symbol-kind-null 21) +(defconst lsp/symbol-kind-enum-member 22) +(defconst lsp/symbol-kind-struct 23) +(defconst lsp/symbol-kind-event 24) +(defconst lsp/symbol-kind-operator 25) +(defconst lsp/symbol-kind-type-parameter 26) +(defvar lsp/text-document-save-reason-lookup + [nil Manual AfterDelay FocusOut]) +(defconst lsp/text-document-save-reason-manual 1) +(defconst lsp/text-document-save-reason-after-delay 2) +(defconst lsp/text-document-save-reason-focus-out 3) +(defvar lsp/text-document-sync-kind-lookup + [None Full Incremental]) +(defconst lsp/text-document-sync-kind-none 0) +(defconst lsp/text-document-sync-kind-full 1) +(defconst lsp/text-document-sync-kind-incremental 2) +(defvar lsp/type-hierarchy-direction-lookup + [nil Children Parents Both]) +(defconst lsp/type-hierarchy-direction-children 1) +(defconst lsp/type-hierarchy-direction-parents 2) +(defconst lsp/type-hierarchy-direction-both 3) +(defvar lsp/call-hierarchy-direction-lookup + [nil CallsFrom CallsTo]) +(defconst lsp/call-hierarchy-direction-calls-from 1) +(defconst lsp/call-hierarchy-direction-calls-to 2) +(defvar lsp/response-error-code-lookup + [nil ParseError InvalidRequest MethodNotFound InvalidParams InternalError serverErrorStart serverErrorEnd]) +(defconst lsp/response-error-code-parse-error 1) +(defconst lsp/response-error-code-invalid-request 2) +(defconst lsp/response-error-code-method-not-found 3) +(defconst lsp/response-error-code-invalid-params 4) +(defconst lsp/response-error-code-internal-error 5) +(defconst lsp/response-error-code-server-error-start 6) +(defconst lsp/response-error-code-server-error-end 7) + +(lsp-interface + (CallHierarchyCapabilities nil (:dynamicRegistration)) + (CallHierarchyItem (:kind :name :range :selectionRange :uri) (:detail :tags)) + (ClientCapabilities nil (:experimental :textDocument :workspace)) + (ClientInfo (:name) (:version)) + (CodeActionCapabilities nil (:codeActionLiteralSupport :dynamicRegistration :isPreferredSupport :dataSupport :resolveSupport)) + (CodeActionContext (:diagnostics) (:only)) + (CodeActionKindCapabilities (:valueSet) nil) + (CodeActionLiteralSupportCapabilities nil (:codeActionKind)) + (CodeActionOptions nil (:codeActionKinds :resolveProvider)) + (CodeLensCapabilities nil (:dynamicRegistration)) + (CodeLensOptions (:resolveProvider) nil) + (Color (:red :green :blue :alpha) nil) + (ColorProviderCapabilities nil (:dynamicRegistration)) + (ColorProviderOptions nil (:documentSelector :id)) + (ColoringInformation (:range :styles) nil) + (Command (:title :command) (:arguments)) + (CompletionCapabilities nil (:completionItem :completionItemKind :contextSupport :dynamicRegistration)) + (CompletionContext (:triggerKind) (:triggerCharacter)) + (CompletionItem (:label) (:additionalTextEdits :command :commitCharacters :data :deprecated :detail :documentation :filterText :insertText :insertTextFormat :insertTextMode :kind :preselect :sortText :tags :textEdit :score :labelDetails)) + (CompletionItemCapabilities nil (:commitCharactersSupport :deprecatedSupport :documentationFormat :preselectSupport :snippetSupport :tagSupport :insertReplaceSupport :resolveSupport)) + (CompletionItemKindCapabilities nil (:valueSet)) + (CompletionItemTagSupportCapabilities (:valueSet) nil) + (CompletionOptions nil (:resolveProvider :triggerCharacters :allCommitCharacters)) + (ConfigurationItem nil (:scopeUri :section)) + (CreateFileOptions nil (:ignoreIfExists :overwrite)) + (DeclarationCapabilities nil (:dynamicRegistration :linkSupport)) + (DefinitionCapabilities nil (:dynamicRegistration :linkSupport)) + (DeleteFileOptions nil (:ignoreIfNotExists :recursive)) + (Diagnostic (:range :message) (:code :relatedInformation :severity :source :tags)) + (DiagnosticRelatedInformation (:location :message) nil) + (DiagnosticsTagSupport (:valueSet) nil) + (DidChangeConfigurationCapabilities nil (:dynamicRegistration)) + (DidChangeWatchedFilesCapabilities nil (:dynamicRegistration)) + (DocumentFilter nil (:language :pattern :scheme)) + (DocumentHighlightCapabilities nil (:dynamicRegistration)) + (DocumentLinkCapabilities nil (:dynamicRegistration :tooltipSupport)) + (DocumentLinkOptions nil (:resolveProvider)) + (DocumentOnTypeFormattingOptions (:firstTriggerCharacter) (:moreTriggerCharacter)) + (DocumentSymbol (:kind :name :range :selectionRange) (:children :deprecated :detail)) + (DocumentSymbolCapabilities nil (:dynamicRegistration :hierarchicalDocumentSymbolSupport :symbolKind)) + (ExecuteCommandCapabilities nil (:dynamicRegistration)) + (ExecuteCommandOptions (:commands) nil) + (FileEvent (:type :uri) nil) + (FileSystemWatcher (:globPattern) (:kind)) + (FileOperationFilter (:pattern) (:scheme)) + (FileOperationPattern (:glob) (:matches :options)) + (FileOperationPatternOptions nil (:ignoreCase)) + (FileOperationRegistrationOptions (:filters) nil) + (FoldingRangeCapabilities nil (:dynamicRegistration :lineFoldingOnly :rangeLimit)) + (FoldingRangeProviderOptions nil (:documentSelector :id)) + (FormattingCapabilities nil (:dynamicRegistration)) + (FormattingOptions (:tabSize :insertSpaces) (:trimTrailingWhitespace :insertFinalNewline :trimFinalNewlines)) + (HoverCapabilities nil (:contentFormat :dynamicRegistration)) + (ImplementationCapabilities nil (:dynamicRegistration :linkSupport)) + (LabelDetails (:detail :description) nil) + (LinkedEditingRanges (:ranges) (:wordPattern)) + (Location (:range :uri) nil) + (MarkedString (:language :value) nil) + (MarkupContent (:kind :value) nil) + (MessageActionItem (:title) nil) + (OnTypeFormattingCapabilities nil (:dynamicRegistration)) + (ParameterInformation (:label) (:documentation)) + (ParameterInformationCapabilities nil (:labelOffsetSupport)) + (Position (:character :line) nil) + (PublishDiagnosticsCapabilities nil (:relatedInformation :tagSupport :versionSupport)) + (Range (:start :end) nil) + (RangeFormattingCapabilities nil (:dynamicRegistration)) + (ReferenceContext (:includeDeclaration) nil) + (ReferencesCapabilities nil (:dynamicRegistration)) + (Registration (:method :id) (:registerOptions)) + (RenameCapabilities nil (:dynamicRegistration :prepareSupport)) + (RenameFileOptions nil (:ignoreIfExists :overwrite)) + (RenameOptions nil (:documentSelector :id :prepareProvider)) + (ResourceChange nil (:current :newUri)) + (ResourceOperation (:kind) nil) + (SaveOptions nil (:includeText)) + (SelectionRange (:range) (:parent)) + (SelectionRangeCapabilities nil (:dynamicRegistration)) + (SemanticHighlightingCapabilities nil (:semanticHighlighting)) + (SemanticHighlightingInformation (:line) (:tokens)) + (SemanticHighlightingServerCapabilities nil (:scopes)) + (ServerCapabilities nil (:callHierarchyProvider :codeActionProvider :codeLensProvider :colorProvider :completionProvider :declarationProvider :definitionProvider :documentFormattingProvider :documentHighlightProvider :documentLinkProvider :documentOnTypeFormattingProvider :documentRangeFormattingProvider :documentSymbolProvider :executeCommandProvider :experimental :foldingRangeProvider :hoverProvider :implementationProvider :referencesProvider :renameProvider :selectionRangeProvider :semanticHighlighting :signatureHelpProvider :textDocumentSync :typeDefinitionProvider :typeHierarchyProvider :workspace :workspaceSymbolProvider :semanticTokensProvider)) + (ServerInfo (:name) (:version)) + (SignatureHelp (:signatures) (:activeParameter :activeSignature)) + (SignatureHelpCapabilities nil (:contextSupport :dynamicRegistration :signatureInformation)) + (SignatureHelpContext (:triggerKind :isRetrigger) (:activeSignatureHelp :triggerCharacter)) + (SignatureHelpOptions nil (:retriggerCharacters :triggerCharacters)) + (SignatureInformation (:label) (:documentation :parameters)) + (SignatureInformationCapabilities nil (:documentationFormat :parameterInformation)) + (StaticRegistrationOptions nil (:documentSelector :id)) + (SymbolCapabilities nil (:dynamicRegistration :symbolKind)) + (SymbolKindCapabilities nil (:valueSet)) + (SynchronizationCapabilities nil (:didSave :dynamicRegistration :willSave :willSaveWaitUntil)) + (TextDocumentClientCapabilities nil (:callHierarchy :codeAction :codeLens :colorProvider :completion :declaration :definition :documentHighlight :documentLink :documentSymbol :foldingRange :formatting :hover :implementation :onTypeFormatting :publishDiagnostics :rangeFormatting :references :rename :selectionRange :semanticHighlightingCapabilities :signatureHelp :synchronization :typeDefinition :typeHierarchyCapabilities)) + (TextDocumentContentChangeEvent (:text) (:range :rangeLength)) + (TextDocumentEdit (:textDocument :edits) nil) + (TextDocumentIdentifier (:uri) nil) + (TextDocumentItem (:languageId :text :uri :version) nil) + (TextDocumentSyncOptions nil (:change :openClose :save :willSave :willSaveWaitUntil)) + (TextEdit (:newText :range) nil) + (InsertReplaceEdit (:newText :insert :replace) nil) + (SnippetTextEdit (:newText :range) (:insertTextFormat)) + (TypeDefinitionCapabilities nil (:dynamicRegistration :linkSupport)) + (TypeHierarchyCapabilities nil (:dynamicRegistration)) + (TypeHierarchyItem (:kind :name :range :selectionRange :uri) (:children :data :deprecated :detail :parents)) + (Unregistration (:method :id) nil) + (VersionedTextDocumentIdentifier (:uri) (:version)) + (WorkspaceClientCapabilities nil (:applyEdit :configuration :didChangeConfiguration :didChangeWatchedFiles :executeCommand :symbol :workspaceEdit :workspaceFolders)) + (WorkspaceEdit nil (:changes :documentChanges :resourceChanges)) + (WorkspaceEditCapabilities nil (:documentChanges :failureHandling :resourceChanges :resourceOperations)) + (WorkspaceFolder (:uri :name) nil) + (WorkspaceFoldersChangeEvent (:removed :added) nil) + (WorkspaceFoldersOptions nil (:changeNotifications :supported)) + (WorkspaceServerCapabilities nil (:workspaceFolders :fileOperations)) + (WorkspaceFileOperations nil (:didCreate :willCreate :didRename :willRename :didDelete :willDelete)) + (ApplyWorkspaceEditParams (:edit) (:label)) + (ApplyWorkspaceEditResponse (:applied) nil) + (CallHierarchyIncomingCall (:from :fromRanges) nil) + (CallHierarchyIncomingCallsParams (:item) nil) + (CallHierarchyOutgoingCall (:to :fromRanges) nil) + (CallHierarchyOutgoingCallsParams (:item) nil) + (CallHierarchyPrepareParams (:textDocument :position) (:uri)) + (CodeAction (:title) (:command :diagnostics :edit :isPreferred :kind :data)) + (CodeActionKind nil nil) + (CodeActionParams (:textDocument :context :range) nil) + (CodeLens (:range) (:command :data)) + (CodeLensParams (:textDocument) nil) + (CodeLensRegistrationOptions nil (:documentSelector :resolveProvider)) + (ColorInformation (:color :range) nil) + (ColorPresentation (:label) (:additionalTextEdits :textEdit)) + (ColorPresentationParams (:color :textDocument :range) nil) + (ColoringParams (:uri :infos) nil) + (ColoringStyle nil nil) + (CompletionList (:items :isIncomplete) nil) + (CompletionParams (:textDocument :position) (:context :uri)) + (CompletionRegistrationOptions nil (:documentSelector :resolveProvider :triggerCharacters)) + (ConfigurationParams (:items) nil) + (CreateFile (:kind :uri) (:options)) + (DeclarationParams (:textDocument :position) (:uri)) + (DefinitionParams (:textDocument :position) (:uri)) + (DeleteFile (:kind :uri) (:options)) + (DidChangeConfigurationParams (:settings) nil) + (DidChangeTextDocumentParams (:contentChanges :textDocument) (:uri)) + (DidChangeWatchedFilesParams (:changes) nil) + (DidChangeWatchedFilesRegistrationOptions (:watchers) nil) + (DidChangeWorkspaceFoldersParams (:event) nil) + (DidCloseTextDocumentParams (:textDocument) nil) + (DidOpenTextDocumentParams (:textDocument) (:text)) + (DidSaveTextDocumentParams (:textDocument) (:text)) + (DocumentColorParams (:textDocument) nil) + (DocumentFormattingParams (:textDocument :options) nil) + (DocumentHighlight (:range) (:kind)) + (DocumentHighlightParams (:textDocument :position) (:uri)) + (DocumentLink (:range) (:data :target :tooltip)) + (DocumentLinkParams (:textDocument) nil) + (DocumentLinkRegistrationOptions nil (:documentSelector :resolveProvider)) + (DocumentOnTypeFormattingParams (:ch :textDocument :options :position) nil) + (DocumentOnTypeFormattingRegistrationOptions (:firstTriggerCharacter) (:documentSelector :moreTriggerCharacter)) + (DocumentRangeFormattingParams (:textDocument :options :range) nil) + (DocumentSymbolParams (:textDocument) nil) + (DynamicRegistrationCapabilities nil (:dynamicRegistration)) + (ExecuteCommandParams (:command) (:arguments)) + (ExecuteCommandRegistrationOptions (:commands) nil) + (FailureHandlingKind nil nil) + (FileRename (:oldUri :newUri) nil) + (FoldingRange (:endLine :startLine) (:endCharacter :kind :startCharacter)) + (FoldingRangeKind nil nil) + (FoldingRangeRequestParams (:textDocument) nil) + (Hover (:contents) (:range)) + (HoverParams (:textDocument :position) (:uri)) + (ImplementationParams (:textDocument :position) (:uri)) + (InitializeError (:retry) nil) + (InitializeErrorCode nil nil) + (InitializeParams nil (:capabilities :clientInfo :clientName :initializationOptions :processId :rootPath :rootUri :trace :workspaceFolders)) + (InitializeResult (:capabilities) (:serverInfo)) + (InitializedParams nil nil) + (LocationLink (:targetSelectionRange :targetUri :targetRange) (:originSelectionRange)) + (MarkupKind nil nil) + (MessageParams (:type :message) nil) + (PrepareRenameParams (:textDocument :position) (:uri)) + (PrepareRenameResult (:range :placeholder) nil) + (PublishDiagnosticsParams (:diagnostics :uri) (:version)) + (QuickPickItem (:label :picked :userData) nil) + (ReferenceParams (:textDocument :context :position) (:uri)) + (RegistrationParams (:registrations) nil) + (RenameFile (:kind :newUri :oldUri) (:options)) + (RenameFilesParams (:files) nil) + (RenameParams (:newName :textDocument :position) (:uri)) + (ResolveTypeHierarchyItemParams (:item :resolve :direction) nil) + (ResourceOperationKind nil nil) + (SelectionRangeParams (:textDocument :positions) nil) + (SemanticHighlightingParams (:textDocument :lines) nil) + (ShowDocumentParams (:uri) (:external :takeFocus :selection)) + (ShowDocumentResult (:success) nil) + (ShowInputBoxParams (:prompt) (:value)) + (ShowMessageRequestParams (:type :message) (:actions)) + (ShowQuickPickParams (:placeHolder :canPickMany :items) nil) + (SignatureHelpParams (:textDocument :position) (:context :uri)) + (SignatureHelpRegistrationOptions nil (:documentSelector :triggerCharacters)) + (SymbolInformation (:kind :name :location) (:containerName :deprecated)) + (TextDocumentChangeRegistrationOptions (:syncKind) (:documentSelector)) + (TextDocumentPositionParams (:textDocument :position) (:uri)) + (TextDocumentRegistrationOptions nil (:documentSelector)) + (TextDocumentSaveRegistrationOptions nil (:documentSelector :includeText)) + (TypeDefinitionParams (:textDocument :position) (:uri)) + (TypeHierarchyParams (:resolve :textDocument :position) (:direction :uri)) + (UnregistrationParams (:unregisterations) nil) + (WatchKind nil nil) + (WillSaveTextDocumentParams (:reason :textDocument) nil) + (WorkspaceSymbolParams (:query) nil) + ;; 3.17 + (InlayHint (:label :position) (:kind :paddingLeft :paddingRight)) + (InlayHintLabelPart (:value) (:tooltip :location :command)) + (InlayHintsParams (:textDocument) (:range))) + +;; 3.17 +(defconst lsp/inlay-hint-kind-type-hint 1) +(defconst lsp/inlay-hint-kind-parameter-hint 2) + + +(provide 'lsp-protocol) + +;;; lsp-protocol.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-purescript.el b/code/elpa/lsp-mode-20240319.1043/lsp-purescript.el new file mode 100644 index 0000000..f0c4f1a --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-purescript.el @@ -0,0 +1,95 @@ +;;; lsp-purescript.el --- description -*- lexical-binding: t; -*- + +;; Copyright (C) 2020 emacs-lsp maintainers + +;; Author: emacs-lsp maintainers +;; Keywords: lsp, purescript + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP Clients for the PureScript Programming Language. + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-purescript nil + "LSP support for PureScript, using purescript-language-server." + :group 'lsp-mode + :link '(url-link "https://github.com/nwolverson/purescript-language-server")) + +(defcustom lsp-purescript-server-executable nil + "Path to server executable." + :type 'string + :risky t + :group 'lsp-purescript) + +(defcustom lsp-purescript-server-args + '("--stdio") + "Arguments to pass to the server." + :type '(repeat string) + :risky t + :group 'lsp-purescript) + +(defun lsp-purescript--server-command () + "Generate LSP startup command for purescript-language-server." + (cons (or lsp-purescript-server-executable + (lsp-package-path 'purescript-language-server)) + lsp-purescript-server-args)) + +(lsp-defcustom lsp-purescript-add-spago-sources t + "Whether to add spago sources to the globs. +Passed to the IDE server for source locations." + :type 'boolean + :group 'lsp-purescript + :package-version '(lsp-mode . "8.0.1") + :lsp-path "purescript.addSpagoSources") + +(lsp-defcustom lsp-purescript-add-npm-path nil + "Whether to add the local npm bin directory to the PATH." + :type 'boolean + :group 'lsp-purescript + :package-version '(lsp-mode . "8.0.1") + :lsp-path "purescript.addNpmPath") + +(lsp-defcustom lsp-purescript-formatter "purty" + "Tool to use to for formatting. +Must be installed and on PATH (or npm installed with addNpmPath set)" + :type '(choice (:tag none purty purs-tidy pose)) + :group 'lsp-purescript + :package-version '(lsp-mode . "8.0.1") + :lsp-path "purescript.formatter") + +(lsp-dependency 'purescript-language-server + '(:system "purescript-language-server") + '(:npm :package "purescript-language-server" + :path "purescript-language-server")) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection + #'lsp-purescript--server-command) + :major-modes '(purescript-mode) + :priority -1 + :server-id 'pursls + :download-server-fn (lambda (_client callback error-callback _update?) + (lsp-package-ensure 'purescript-language-server callback error-callback)))) + + +(lsp-consistency-check lsp-purescript) + +(provide 'lsp-purescript) +;;; lsp-purescript.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-pwsh.el b/code/elpa/lsp-mode-20240319.1043/lsp-pwsh.el new file mode 100644 index 0000000..b99b9f8 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-pwsh.el @@ -0,0 +1,361 @@ +;;; lsp-pwsh.el --- client for PowerShellEditorServices -*- lexical-binding: t; -*- + +;; Copyright (C) 2019 Kien Nguyen + +;; Author: kien.n.quang at gmail.com +;; Keywords: lsp + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; + +;;; Code: + +(require 'f) +(require 'dash) +(require 's) +(require 'ht) + +(require 'lsp-protocol) +(require 'lsp-mode) + +(defgroup lsp-pwsh nil + "LSP support for PowerShell, using the PowerShellEditorServices." + :group 'lsp-mode + :package-version '(lsp-mode . "6.2")) + +;; PowerShell vscode flags +(defcustom lsp-pwsh-help-completion "BlockComment" + "Controls the comment-based help completion behavior triggered by typing '##'. +Set the generated help style with 'BlockComment' or 'LineComment'. +Disable the feature with 'Disabled'." + :type + '(choice + (:tag "Disabled" "BlockComment" "LineComment")) + :group 'lsp-pwsh + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-pwsh-script-analysis-enable t + "Enables real-time script analysis from PowerShell Script Analyzer. +Uses the newest installed version of the PSScriptAnalyzer module or the +version bundled with this extension, if it is newer." + :type 'boolean + :group 'lsp-pwsh + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-pwsh-script-analysis-settings-path "" + "Specifies the path to a PowerShell Script Analyzer settings file. +To override the default settings for all projects, enter an absolute path, +or enter a path relative to your workspace." + :type 'string + :group 'lsp-pwsh + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-pwsh-code-folding-enable t + "Enables syntax based code folding. +When disabled, the default indentation based code folding is used." + :type 'boolean + :group 'lsp-pwsh + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-pwsh-code-folding-show-last-line t + "Shows the last line of a folded section. +Similar to the default VSCode folding style. +When disabled, the entire folded region is hidden." + :type 'boolean + :group 'lsp-pwsh + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-pwsh-code-formatting-preset "Custom" + "Sets the codeformatting options to follow the given indent style. +Sets in a way that is compatible with PowerShell syntax. +For more information about the brace styles please refer to https://github.com/PoshCode/PowerShellPracticeAndStyle/issues/81." + :type + '(choice + (:tag "Custom" "Allman" "OTBS" "Stroustrup")) + :group 'lsp-pwsh + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-pwsh-code-formatting-open-brace-on-same-line t + "Places open brace on the same line as its associated statement." + :type 'boolean + :group 'lsp-pwsh + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-pwsh-code-formatting-new-line-after-open-brace t + "Adds a newline (line break) after an open brace." + :type 'boolean + :group 'lsp-pwsh + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-pwsh-code-formatting-new-line-after-close-brace t + "Adds a newline (line break) after a closing brace." + :type 'boolean + :group 'lsp-pwsh + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-pwsh-code-formatting-pipeline-indentation-style "NoIndentation" + "Multi-line pipeline style settings." + :type + '(choice + (:tag "IncreaseIndentationForFirstPipeline" "IncreaseIndentationAfterEveryPipeline" "NoIndentation")) + :group 'lsp-pwsh + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-pwsh-code-formatting-whitespace-before-open-brace t + "Adds a space between a keyword and its associated scriptblock expression." + :type 'boolean + :group 'lsp-pwsh + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-pwsh-code-formatting-whitespace-before-open-paren t + "Adds a space between a keyword (if, elseif, while, switch, etc) and its +associated conditional expression." + :type 'boolean + :group 'lsp-pwsh + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-pwsh-code-formatting-whitespace-around-operator t + "Adds spaces before and after an operator ('=', '+', '-', etc.)." + :type 'boolean + :group 'lsp-pwsh + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-pwsh-code-formatting-whitespace-after-separator t + "Adds a space after a separator (',' and ';')." + :type 'boolean + :group 'lsp-pwsh + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-pwsh-code-formatting-whitespace-inside-brace t + "Adds a space after an opening brace ('{') and before a closing brace ('}')." + :type 'boolean + :group 'lsp-pwsh + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-pwsh-code-formatting-whitespace-around-pipe t + "Adds a space before and after the pipeline operator ('|')." + :type 'boolean + :group 'lsp-pwsh + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-pwsh-code-formatting-ignore-one-line-block t + "Does not reformat one-line code blocks, such as \"if (...) {...} else +{...}\"." + :type 'boolean + :group 'lsp-pwsh + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-pwsh-code-formatting-align-property-value-pairs t + "Align assignment statements in a hashtable or a DSC Configuration." + :type 'boolean + :group 'lsp-pwsh + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-pwsh-code-formatting-use-correct-casing nil + "Use correct casing for cmdlets." + :type 'boolean + :group 'lsp-pwsh + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-pwsh-developer-editor-services-log-level "Normal" + "Sets the log level for the PowerShell Editor Services host executable. +Valid values are 'Diagnostic', 'Verbose', 'Normal', 'Warning', and 'Error'" + :type + '(choice + (:tag "Diagnostic" "Verbose" "Normal" "Warning" "Error")) + :group 'lsp-pwsh + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-pwsh-developer-editor-services-wait-for-debugger nil + "Launches the language service with the /waitForDebugger flag to force it to +wait for a .NET debugger to attach before proceeding." + :type 'boolean + :group 'lsp-pwsh + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-pwsh-developer-feature-flags nil + "An array of strings that enable experimental features in the PowerShell +extension." + :type + '(repeat string) + :group 'lsp-pwsh + :package-version '(lsp-mode . "6.2")) + +(lsp-register-custom-settings + '(("powershell.developer.featureFlags" lsp-pwsh-developer-feature-flags) + ("powershell.developer.editorServicesWaitForDebugger" lsp-pwsh-developer-editor-services-wait-for-debugger t) + ("powershell.codeFormatting.useCorrectCasing" lsp-pwsh-code-formatting-use-correct-casing t) + ("powershell.codeFormatting.alignPropertyValuePairs" lsp-pwsh-code-formatting-align-property-value-pairs t) + ("powershell.codeFormatting.ignoreOneLineBlock" lsp-pwsh-code-formatting-ignore-one-line-block t) + ("powershell.codeFormatting.whitespaceAroundPipe" lsp-pwsh-code-formatting-whitespace-around-pipe t) + ("powershell.codeFormatting.whitespaceInsideBrace" lsp-pwsh-code-formatting-whitespace-inside-brace t) + ("powershell.codeFormatting.whitespaceAfterSeparator" lsp-pwsh-code-formatting-whitespace-after-separator t) + ("powershell.codeFormatting.whitespaceAroundOperator" lsp-pwsh-code-formatting-whitespace-around-operator t) + ("powershell.codeFormatting.whitespaceBeforeOpenParen" lsp-pwsh-code-formatting-whitespace-before-open-paren t) + ("powershell.codeFormatting.whitespaceBeforeOpenBrace" lsp-pwsh-code-formatting-whitespace-before-open-brace t) + ("powershell.codeFormatting.pipelineIndentationStyle" lsp-pwsh-code-formatting-pipeline-indentation-style) + ("powershell.codeFormatting.newLineAfterCloseBrace" lsp-pwsh-code-formatting-new-line-after-close-brace t) + ("powershell.codeFormatting.newLineAfterOpenBrace" lsp-pwsh-code-formatting-new-line-after-open-brace t) + ("powershell.codeFormatting.openBraceOnSameLine" lsp-pwsh-code-formatting-open-brace-on-same-line t) + ("powershell.codeFormatting.preset" lsp-pwsh-code-formatting-preset) + ("powershell.codeFolding.showLastLine" lsp-pwsh-code-folding-show-last-line t) + ("powershell.codeFolding.enable" lsp-pwsh-code-folding-enable t) + ("powershell.scriptAnalysis.settingsPath" lsp-pwsh-script-analysis-settings-path) + ("powershell.scriptAnalysis.enable" lsp-pwsh-script-analysis-enable t) + ("powershell.helpCompletion" lsp-pwsh-help-completion))) + +;; lsp-pwsh custom variables +(defcustom lsp-pwsh-ext-path (expand-file-name "pwsh" lsp-server-install-dir) + "The path to powershell vscode extension." + :type 'string + :group 'lsp-pwsh + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-pwsh-exe (or (executable-find "pwsh") (executable-find "powershell")) + "PowerShell executable." + :type 'string + :group 'lsp-pwsh + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-pwsh-dir lsp-pwsh-ext-path + "Path to PowerShellEditorServices without last slash." + :type 'string + :group 'lsp-pwsh + :package-version '(lsp-mode . "6.2")) + +(defvar lsp-pwsh-pses-script (expand-file-name "PowerShellEditorServices/Start-EditorServices.ps1" + lsp-pwsh-dir) + "Main script to start PSES.") + +(defvar lsp-pwsh-log-path (expand-file-name "logs" lsp-pwsh-ext-path) + "Path to directory where server will write log files. +Must not nil.") + +(defvar lsp-pwsh--sess-id (emacs-pid)) + +(defun lsp-pwsh--command () + "Return the command to start server." + `(,lsp-pwsh-exe "-NoProfile" "-NonInteractive" "-NoLogo" + ,@(if (eq system-type 'windows-nt) '("-ExecutionPolicy" "Bypass")) + "-OutputFormat" "Text" + "-File" + ,lsp-pwsh-pses-script + "-HostName" "\"Emacs Host\"" + "-HostProfileId" "'Emacs.LSP'" + "-HostVersion" "8.0.1" + "-LogPath" ,(expand-file-name "emacs-powershell.log" lsp-pwsh-log-path) + "-LogLevel" ,lsp-pwsh-developer-editor-services-log-level + "-SessionDetailsPath" ,(expand-file-name (format "PSES-VSCode-%d" lsp-pwsh--sess-id) + lsp-pwsh-log-path) + ;; "-AdditionalModules" "@('PowerShellEditorServices.VSCode')" + "-Stdio" + "-BundledModulesPath" ,lsp-pwsh-dir + "-FeatureFlags" "@()")) + +(defun lsp-pwsh--extra-init-params () + "Return form describing parameters for language server.") + +(lsp-defun lsp-pwsh--apply-code-action-edits ((&Command :command :arguments?)) + "Handle ACTION for PowerShell.ApplyCodeActionEdits." + (-if-let* (((&pwsh:ScriptRegion :start-line-number :end-line-number + :start-column-number :end-column-number :text) + (lsp-seq-first arguments?)) + (start-position (lsp-make-position :line (1- start-line-number) + :character (1- start-column-number))) + (end-position (lsp-make-position :line (1- end-line-number) + :character (1- end-column-number))) + (edits `[,(lsp-make-text-edit :range (lsp-make-range :start start-position + :end end-position) + :newText text)])) + (lsp--apply-text-edits edits 'code-action) + (lsp-send-execute-command command arguments?))) + +(lsp-defun lsp-pwsh--show-code-action-document ((&Command :arguments?)) + "Handle ACTION for PowerShell.ShowCodeActionDocumentation." + (-if-let* ((rule-raw (lsp-seq-first arguments?)) + (rule-id (if (s-prefix-p "PS" rule-raw) (substring rule-raw 2) rule-raw))) + (browse-url + (concat "https://learn.microsoft.com/en-us/powershell/utility-modules/psscriptanalyzer/rules/" + rule-id)) + (lsp-warn "Cannot show documentation for code action, no ruleName was supplied"))) + +(defvar lsp-pwsh--major-modes '(powershell-mode)) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection #'lsp-pwsh--command + (lambda () + (f-exists? lsp-pwsh-pses-script))) + :major-modes lsp-pwsh--major-modes + :server-id 'pwsh-ls + :priority -1 + :initialization-options #'lsp-pwsh--extra-init-params + :notification-handlers (ht ("powerShell/executionStatusChanged" #'ignore) + ("output" #'ignore)) + :action-handlers (ht ("PowerShell.ApplyCodeActionEdits" + #'lsp-pwsh--apply-code-action-edits) + ("PowerShell.ShowCodeActionDocumentation" + #'lsp-pwsh--show-code-action-document)) + :initialized-fn (lambda (w) + (with-lsp-workspace w + (lsp--set-configuration + (lsp-configuration-section "powershell"))) + (let ((caps (lsp--workspace-server-capabilities w))) + (lsp:set-server-capabilities-document-range-formatting-provider? caps t) + (lsp:set-server-capabilities-document-formatting-provider? caps t))) + :download-server-fn #'lsp-pwsh-setup)) + +(defcustom lsp-pwsh-github-asset-url + "https://github.com/%s/%s/releases/latest/download/%s" + "GitHub latest asset template url." + :type 'string + :group 'lsp-pwsh + :package-version '(lsp-mode . "6.2")) + +(defun lsp-pwsh-setup (_client callback error-callback update) + "Downloads PowerShellEditorServices to `lsp-pwsh-dir'. +CALLBACK is called when the download finish successfully otherwise +ERROR-CALLBACK is called. +UPDATE is non-nil if it is already downloaded. +FORCED if specified with prefix argument." + + (unless (and lsp-pwsh-exe (file-executable-p lsp-pwsh-exe)) + (user-error "Use `lsp-pwsh-exe' with the value of `%s' is not a valid powershell binary" + lsp-pwsh-exe)) + + (let ((url (format lsp-pwsh-github-asset-url "PowerShell" + "PowerShellEditorServices" "PowerShellEditorServices.zip")) + (temp-file (make-temp-file "ext" nil ".zip"))) + (unless (f-exists? lsp-pwsh-log-path) + (mkdir lsp-pwsh-log-path 'create-parent)) + (unless (and (not update) (f-exists? lsp-pwsh-pses-script)) + ;; since we know it's installed, use powershell to download the file + ;; (and avoid url.el bugginess or additional libraries) + (when (f-exists? lsp-pwsh-dir) (delete-directory lsp-pwsh-dir 'recursive)) + (lsp-async-start-process + callback + error-callback + lsp-pwsh-exe "-noprofile" "-noninteractive" "-nologo" + "-ex" "bypass" "-command" + "Invoke-WebRequest" "-UseBasicParsing" "-uri" url "-outfile" temp-file ";" + "Expand-Archive" "-Path" temp-file + "-DestinationPath" lsp-pwsh-dir)))) + +(lsp-consistency-check lsp-pwsh) + +(provide 'lsp-pwsh) +;;; lsp-pwsh.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-pyls.el b/code/elpa/lsp-mode-20240319.1043/lsp-pyls.el new file mode 100644 index 0000000..392820f --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-pyls.el @@ -0,0 +1,504 @@ +;;; lsp-pyls.el --- pyls configuration -*- lexical-binding: t; -*- + +;; Copyright (C) 2019 Ivan Yonchovski + +;; Author: Ivan Yonchovski +;; Keywords: + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; PYLS configuration + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-pyls nil + "LSP support for Python, using Palantir's Python Language Server." + :group 'lsp-mode + :link '(url-link "https://github.com/palantir/python-language-server") + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-clients-python-library-directories '("/usr/") + "List of directories which will be considered to be libraries." + :risky t + :type '(repeat string) + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(define-obsolete-variable-alias + 'lsp-clients-python-command + 'lsp-pyls-server-command + "6.1") + +(defcustom lsp-pyls-disable-warning nil + "Disable Palantir python-language-server deprecation warning" + :group 'lsp-pyls + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-pyls-server-command '("pyls") + "Command to start pyls." + :risky t + :group 'lsp-pyls + :type '(repeat string) + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-configuration-sources ["pycodestyle"] + "List of configuration sources to use." + :type '(repeat string) + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-plugins-jedi-completion-enabled t + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-plugins-jedi-completion-include-params t + "Auto-completes methods and classes with tabstops for each +parameter." + :type 'boolean + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-plugins-jedi-definition-enabled t + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-plugins-jedi-definition-follow-imports t + "The goto call will follow imports." + :type 'boolean + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-plugins-jedi-definition-follow-builtin-imports t + "If follow_imports is True will decide if it follow builtin +imports." + :type 'boolean + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-plugins-jedi-hover-enabled t + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-plugins-jedi-references-enabled t + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-plugins-jedi-signature-help-enabled t + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-plugins-jedi-symbols-enabled t + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-plugins-jedi-symbols-all-scopes t + "If True lists the names of all scopes instead of only the +module namespace." + :type 'boolean + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-plugins-mccabe-enabled t + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-plugins-mccabe-threshold 15 + "The minimum threshold that triggers warnings about cyclomatic +complexity." + :type 'number + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-plugins-preload-enabled t + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-plugins-preload-modules nil + "List of modules to import on startup" + :type '(repeat string) + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-plugins-pylint-enabled nil + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-plugins-pylint-args [] + "Arguments, passed to pylint" + :risky t + :type 'lsp-string-vector + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-plugins-pycodestyle-enabled t + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-plugins-pycodestyle-exclude nil + "Exclude files or directories which match these patterns." + :type '(repeat string) + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-plugins-pycodestyle-filename nil + "When parsing directories, only check filenames matching these +patterns." + :type '(repeat string) + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-plugins-pycodestyle-select nil + "Select errors and warnings" + :type '(repeat string) + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-plugins-pycodestyle-ignore nil + "Ignore errors and warnings" + :type '(repeat string) + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-plugins-pycodestyle-hang-closing nil + "Hang closing bracket instead of matching indentation of +opening bracket's line." + :type 'boolean + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-plugins-pycodestyle-max-line-length nil + "Set maximum allowed line length." + :type 'number + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-plugins-pydocstyle-enabled nil + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-plugins-pydocstyle-convention nil + "Choose the basic list of checked errors by specifying an +existing convention." + :type '(choice (:tag "pep257" "numpy")) + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-plugins-pydocstyle-add-ignore nil + "Ignore errors and warnings in addition to the specified +convention." + :type '(repeat string) + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-plugins-pydocstyle-add-select nil + "Select errors and warnings in addition to the specified +convention." + :type '(repeat string) + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-plugins-pydocstyle-ignore nil + "Ignore errors and warnings" + :type '(repeat string) + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-plugins-pydocstyle-select nil + "Select errors and warnings" + :type '(repeat string) + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-plugins-pydocstyle-match "(?!test_).*\\.py" + "Check only files that exactly match the given regular +expression; default is to match files that don't start with +`test_' but end with `.py'." + :type 'string + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-plugins-pydocstyle-match-dir "[^\\.].*" + "Search only dirs that exactly match the given regular +expression; default is to match dirs which do not begin with a +dot." + :type 'string + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-plugins-pyflakes-enabled t + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-plugins-rope-completion-enabled nil + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-plugins-autopep8-enabled t + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pyls + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-pyls-plugins-yapf-enabled nil + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-rope-extension-modules nil + "Builtin and c-extension modules that are allowed to be +imported and inspected by rope." + :type 'string + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-rope-rope-folder nil + "The name of the folder in which rope stores project +configurations and data. Pass `nil` for not using such a folder +at all." + :type '(repeat string) + :group 'lsp-pyls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-pyls-plugins-flake8-enabled nil + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pyls + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-pyls-plugins-flake8-exclude nil + "List of glob patterns to exclude from checks." + :type '(repeat string) + :group 'lsp-pyls + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-pyls-plugins-flake8-filename nil + "List of glob patterns to include for checks." + :type '(repeat string) + :group 'lsp-pyls + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-pyls-plugins-flake8-hang-closing nil + "Toggle whether pycodestyle should enforce matching the indentation of the +opening bracket’s line. When you specify this, it will prefer that you hang the +closing bracket rather than match the indentation." + :type 'boolean + :group 'lsp-pyls + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-pyls-plugins-flake8-ignore nil + "A list of codes to ignore." + :type '(repeat string) + :group 'lsp-pyls + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-pyls-plugins-flake8-max-line-length nil + "Set the maximum length that any line (with some exceptions) may be. +Exceptions include lines that are either strings or comments which are +entirely URLs." + :type 'integer + :group 'lsp-pyls + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-pyls-plugins-flake8-select nil + "Specify the list of error codes you wish Flake8 to report. Similarly to +`lsp-pyls-plugins-flake8-ignore'. You can specify a portion of an error code to +get all that start with that string. For example, you can use E, E4, E43, and +E431" + :type '(repeat string) + :group 'lsp-pyls + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-pyls-plugins-flake8-config nil + "A path to a config file that will be the only config file read and used. +This will cause Flake8 to ignore all other config files that exist. + +NOTE: other parameters as `lsp-pyls-plugins-flake8-max-line-length' take +precedence over parameters referenced in config." + :type 'string + :group 'lsp-pyls + :package-version '(lsp-mode . "6.3")) + +(defcustom lsp-pyls-plugins-jedi-use-pyenv-environment nil + "If enabled, pass the environment got by pyenv to jedi" + :type 'boolean + :group 'lsp-pyls + :package-version '(lsp-mode . "6.3")) + +(defcustom lsp-pyls-plugins-jedi-environment nil + "Specify the environment that jedi runs on where /bin/python +should be the python executable. This option will be prioritized over +`lsp-pyls-plugins-jedi-use-pyenv-environment'." + :type 'string + :group 'lsp-pyls + :package-version '(lsp-mode . "6.3")) + +(defcustom lsp-pyls-plugins-jedi-completion-fuzzy nil + "If enabled, uses fuzzy completion in jedi. Requires pyls >= 0.32.0 +Can hit performance, as well as lsp-mode implements its own fuzzy search on +completion items." + :type 'boolean + :group 'lsp-pyls + :package-version '(lsp-mode . "7.0")) + +(defcustom lsp-pyls-plugins-jedi-completion-include-class-objects t + "If enabled, adds class objects to completion in order to avoid snippet +with init args. + +Has no effect if `lsp-pyls-plugins-jedi-completion-include-params' is disabled. +Requires pyls >= 0.33.0" + :type 'boolean + :group 'lsp-pyls + :package-version '(lsp-mode . "7.0")) + +(defcustom lsp-pyls-rename-backend 'jedi + "Choose renaming backend. + +Jedi is preferred but only works for python >= 3.6 and pyls >= 0.32.0 +Beware that Jedi is lazy and doesn't scan the whole project. +So it will rename only references it can find." + :type '(choice (const :tag "jedi" jedi) + (const :tag "rope" rope)) + :group 'lsp-pyls + :package-version '(lsp-mode . "7.0")) + + +(defun lsp-pyls-get-pyenv-environment () + "Get the pyenv-managed environment for current workspace, where +/bin/python is the corresponding Python executable" + (if lsp-pyls-plugins-jedi-environment + lsp-pyls-plugins-jedi-environment + (when lsp-pyls-plugins-jedi-use-pyenv-environment + (let ((pyenv-version (getenv "PYENV_VERSION")) + (root (lsp-seq-first (lsp-find-roots-for-workspace lsp--cur-workspace (lsp-session))))) + (when root + (setenv "PYENV_VERSION" nil) + (let* ((pyenv-command-path (executable-find "pyenv")) + (python-env (when pyenv-command-path + (f-parent + (f-parent + (shell-command-to-string + (format "PYENV_DIR='%s' %s which python" + root pyenv-command-path))))))) + (if python-env (lsp--info "Configure pyls with environment: %s" python-env) + (lsp--warn "Can't find the python environment for + %s even if + `lsp-pyls-plugins-jedi-use-pyenv-environment` is + enabled") root) + (setenv "PYENV_VERSION" pyenv-version) + python-env)))))) + +(lsp-register-custom-settings + '(("pyls.rope.ropeFolder" lsp-pyls-rope-rope-folder) + ("pyls.rope.extensionModules" lsp-pyls-rope-extension-modules) + ("pyls.plugins.rope_rename.enabled" (lambda () (eq lsp-pyls-rename-backend 'rope)) t) + ("pyls.plugins.autopep8.enabled" lsp-pyls-plugins-autopep8-enabled t) + ("pyls.plugins.yapf.enabled" lsp-pyls-plugins-yapf-enabled t) + ("pyls.plugins.rope_completion.enabled" lsp-pyls-plugins-rope-completion-enabled t) + ("pyls.plugins.pyflakes.enabled" lsp-pyls-plugins-pyflakes-enabled t) + ("pyls.plugins.pydocstyle.matchDir" lsp-pyls-plugins-pydocstyle-match-dir) + ("pyls.plugins.pydocstyle.match" lsp-pyls-plugins-pydocstyle-match) + ("pyls.plugins.pydocstyle.select" lsp-pyls-plugins-pydocstyle-select) + ("pyls.plugins.pydocstyle.ignore" lsp-pyls-plugins-pydocstyle-ignore) + ("pyls.plugins.pydocstyle.addSelect" lsp-pyls-plugins-pydocstyle-add-select) + ("pyls.plugins.pydocstyle.addIgnore" lsp-pyls-plugins-pydocstyle-add-ignore) + ("pyls.plugins.pydocstyle.convention" lsp-pyls-plugins-pydocstyle-convention) + ("pyls.plugins.pydocstyle.enabled" lsp-pyls-plugins-pydocstyle-enabled t) + ("pyls.plugins.pycodestyle.maxLineLength" lsp-pyls-plugins-pycodestyle-max-line-length) + ("pyls.plugins.pycodestyle.hangClosing" lsp-pyls-plugins-pycodestyle-hang-closing t) + ("pyls.plugins.pycodestyle.ignore" lsp-pyls-plugins-pycodestyle-ignore) + ("pyls.plugins.pycodestyle.select" lsp-pyls-plugins-pycodestyle-select) + ("pyls.plugins.pycodestyle.filename" lsp-pyls-plugins-pycodestyle-filename) + ("pyls.plugins.pycodestyle.exclude" lsp-pyls-plugins-pycodestyle-exclude) + ("pyls.plugins.pycodestyle.enabled" lsp-pyls-plugins-pycodestyle-enabled t) + ("pyls.plugins.pylint.enabled" lsp-pyls-plugins-pylint-enabled t) + ("pyls.plugins.pylint.args" lsp-pyls-plugins-pylint-args) + ("pyls.plugins.flake8.enabled" lsp-pyls-plugins-flake8-enabled) + ("pyls.plugins.flake8.exclude" lsp-pyls-plugins-flake8-exclude) + ("pyls.plugins.flake8.filename" lsp-pyls-plugins-flake8-filename) + ("pyls.plugins.flake8.hangClosing" lsp-pyls-plugins-flake8-hang-closing) + ("pyls.plugins.flake8.ignore" lsp-pyls-plugins-flake8-ignore) + ("pyls.plugins.flake8.maxLineLength" lsp-pyls-plugins-flake8-max-line-length) + ("pyls.plugins.flake8.select" lsp-pyls-plugins-flake8-select) + ("pyls.plugins.flake8.config" lsp-pyls-plugins-flake8-config) + ("pyls.plugins.preload.modules" lsp-pyls-plugins-preload-modules) + ("pyls.plugins.preload.enabled" lsp-pyls-plugins-preload-enabled t) + ("pyls.plugins.mccabe.threshold" lsp-pyls-plugins-mccabe-threshold) + ("pyls.plugins.mccabe.enabled" lsp-pyls-plugins-mccabe-enabled t) + ("pyls.plugins.jedi_symbols.all_scopes" lsp-pyls-plugins-jedi-symbols-all-scopes t) + ("pyls.plugins.jedi_symbols.enabled" lsp-pyls-plugins-jedi-symbols-enabled t) + ("pyls.plugins.jedi_signature_help.enabled" lsp-pyls-plugins-jedi-signature-help-enabled t) + ("pyls.plugins.jedi_references.enabled" lsp-pyls-plugins-jedi-references-enabled t) + ("pyls.plugins.jedi_hover.enabled" lsp-pyls-plugins-jedi-hover-enabled t) + ("pyls.plugins.jedi_definition.follow_builtin_imports" lsp-pyls-plugins-jedi-definition-follow-builtin-imports t) + ("pyls.plugins.jedi_definition.follow_imports" lsp-pyls-plugins-jedi-definition-follow-imports t) + ("pyls.plugins.jedi_definition.enabled" lsp-pyls-plugins-jedi-definition-enabled t) + ("pyls.plugins.jedi_completion.include_params" lsp-pyls-plugins-jedi-completion-include-params t) + ("pyls.plugins.jedi_completion.enabled" lsp-pyls-plugins-jedi-completion-enabled t) + ("pyls.plugins.jedi_completion.include_class_objects" lsp-pyls-plugins-jedi-completion-include-class-objects t) + ("pyls.plugins.jedi.environment" lsp-pyls-get-pyenv-environment) + ("pyls.plugins.jedi_completion.fuzzy" lsp-pyls-plugins-jedi-completion-fuzzy t) + ("pyls.plugins.jedi_rename.enabled" (lambda () (eq lsp-pyls-rename-backend 'jedi)) t) + ("pyls.configurationSources" lsp-pyls-configuration-sources))) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection + (lambda () lsp-clients-python-command)) + :activation-fn (lsp-activate-on "python") + :priority -2 + :server-id 'pyls + :library-folders-fn (lambda (_workspace) lsp-clients-python-library-directories) + :initialized-fn (lambda (workspace) + (unless lsp-pyls-disable-warning + (warn (concat "The palantir python-language-server (pyls) is unmaintained; " + "a maintained fork is the python-lsp-server (pylsp) project; " + "you can install it with pip via: pip install python-lsp-server"))) + (with-lsp-workspace workspace + (lsp--set-configuration (lsp-configuration-section "pyls")))))) + +(lsp-consistency-check lsp-pyls) + +(provide 'lsp-pyls) +;;; lsp-pyls.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-pylsp.el b/code/elpa/lsp-mode-20240319.1043/lsp-pylsp.el new file mode 100644 index 0000000..67bb282 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-pylsp.el @@ -0,0 +1,672 @@ +;;; lsp-pylsp.el --- python-lsp-server support -*- lexical-binding: t; -*- + +;; Copyright (C) 2021 Doug Davis + +;; Author: Doug Davis +;; Keywords: language tools + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; pylsp configuration + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-pylsp nil + "LSP support for Python, using python-lsp's Python Language Server." + :group 'lsp-mode + :link '(url-link "https://github.com/python-lsp/python-lsp-server")) + +(defcustom lsp-clients-pylsp-library-directories '("/usr/") + "List of directories which will be considered to be libraries." + :risky t + :type '(repeat string) + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-server-command '("pylsp") + "Command to start pylsp." + :risky t + :group 'lsp-pylsp + :type '(repeat string)) + +(defcustom lsp-pylsp-configuration-sources ["flake8"] + "List of configuration sources to use." + :type 'lsp-string-vector + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-jedi-completion-enabled t + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-jedi-completion-include-params t + "Auto-completes methods and classes with tabstops for each +parameter." + :type 'boolean + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-jedi-definition-enabled t + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-jedi-definition-follow-imports t + "The goto call will follow imports." + :type 'boolean + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-jedi-definition-follow-builtin-imports t + "If follow_imports is True will decide if it follow builtin +imports." + :type 'boolean + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-jedi-hover-enabled t + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-jedi-references-enabled t + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-jedi-signature-help-enabled t + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-jedi-symbols-enabled t + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-jedi-symbols-all-scopes t + "If True lists the names of all scopes instead of only the +module namespace." + :type 'boolean + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-mccabe-enabled t + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-mccabe-threshold 15 + "The minimum threshold that triggers warnings about cyclomatic +complexity." + :type 'number + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-preload-enabled t + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-preload-modules nil + "List of modules to import on startup" + :type 'lsp-string-vector + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-pylint-enabled nil + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-pylint-args [] + "Arguments, passed to pylint" + :risky t + :type 'lsp-string-vector + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-pycodestyle-enabled nil + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-pycodestyle-exclude nil + "Exclude files or directories which match these patterns." + :type 'lsp-string-vector + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-pycodestyle-filename nil + "When parsing directories, only check filenames matching these +patterns." + :type 'lsp-string-vector + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-pycodestyle-select nil + "Select errors and warnings" + :type 'lsp-string-vector + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-pycodestyle-ignore nil + "Ignore errors and warnings" + :type 'lsp-string-vector + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-pycodestyle-hang-closing nil + "Hang closing bracket instead of matching indentation of +opening bracket's line." + :type 'boolean + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-pycodestyle-max-line-length nil + "Set maximum allowed line length." + :type 'number + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-pydocstyle-enabled t + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-pydocstyle-convention nil + "Choose the basic list of checked errors by specifying an +existing convention." + :type '(choice (:tag "pep257" "numpy")) + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-pydocstyle-add-ignore nil + "Ignore errors and warnings in addition to the specified +convention." + :type 'lsp-string-vector + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-pydocstyle-add-select nil + "Select errors and warnings in addition to the specified +convention." + :type 'lsp-string-vector + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-pydocstyle-ignore nil + "Ignore errors and warnings" + :type 'lsp-string-vector + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-pydocstyle-select nil + "Select errors and warnings" + :type 'lsp-string-vector + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-pydocstyle-match "(?!test_).*\\.py" + "Check only files that exactly match the given regular +expression; default is to match files that don't start with +`test_' but end with `.py'." + :type 'string + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-pydocstyle-match-dir "[^\\.].*" + "Search only dirs that exactly match the given regular +expression; default is to match dirs which do not begin with a +dot." + :type 'string + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-pyflakes-enabled nil + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-rope-autoimport-enabled nil + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-rope-autoimport-memory nil + "Make the autoimport database memory only. + +Drastically increases startup time." + :type 'boolean + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-rope-completion-enabled nil + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-rope-completion-eager nil + "Resolve documentation and detail eagerly." + :type 'boolean + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-autopep8-enabled nil + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-yapf-enabled nil + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-black-enabled nil + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-isort-enabled nil + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-rope-extension-modules nil + "Builtin and c-extension modules that are allowed to be +imported and inspected by rope." + :type 'string + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-rope-rope-folder nil + "The name of the folder in which rope stores project +configurations and data. Pass `nil` for not using such a folder +at all." + :type 'lsp-string-vector + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-flake8-enabled t + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-flake8-exclude nil + "List of glob patterns to exclude from checks." + :type 'lsp-string-vector + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-flake8-filename nil + "List of glob patterns to include for checks." + :type 'lsp-string-vector + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-flake8-hang-closing nil + "Toggle whether pycodestyle should enforce matching the indentation of the +opening bracket’s line. When you specify this, it will prefer that you hang the +closing bracket rather than match the indentation." + :type 'boolean + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-flake8-ignore nil + "A list of codes to ignore." + :type 'lsp-string-vector + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-flake8-max-line-length nil + "Set the maximum length that any line (with some exceptions) may be. +Exceptions include lines that are either strings or comments which are +entirely URLs." + :type 'integer + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-flake8-select nil + "Specify the list of error codes you wish Flake8 to report. Similarly to +`lsp-pylsp-plugins-flake8-ignore'. You can specify a portion of an error code to +get all that start with that string. For example, you can use E, E4, E43, and +E431" + :type 'lsp-string-vector + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-flake8-config nil + "A path to a config file that will be the only config file read and used. +This will cause Flake8 to ignore all other config files that exist. + +NOTE: other parameters as `lsp-pylsp-plugins-flake8-max-line-length' take +precedence over parameters referenced in config." + :type 'string + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-jedi-use-pyenv-environment nil + "If enabled, pass the environment got by pyenv to jedi" + :type 'boolean + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-jedi-environment nil + "Specify the environment that jedi runs on where /bin/python +should be the python executable. This option will be prioritized over +`lsp-pylsp-plugins-jedi-use-pyenv-environment'." + :type 'string + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-jedi-completion-fuzzy nil + "If enabled, uses fuzzy completion in jedi. Requires pylsp >= 0.32.0 +Can hit performance, as well as lsp-mode implements its own fuzzy search on +completion items." + :type 'boolean + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-jedi-completion-include-class-objects t + "If enabled, adds class objects to completion in order to avoid snippet +with init args. + +Has no effect if `lsp-pylsp-plugins-jedi-completion-include-params' is disabled. +Requires pylsp >= 0.33.0" + :type 'boolean + :group 'lsp-pylsp) + +;; See https://github.com/python-lsp/python-lsp-ruff#configuration + +(defcustom lsp-pylsp-plugins-ruff-enabled nil + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-ruff-executable nil + "Custom path to ruff." + :type 'file + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-ruff-config nil + "Custom config for ruff to use." + :type 'file + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-ruff-extend-select nil + "Rules that are additionally used by ruff." + :type 'lsp-string-vector + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-ruff-extend-ignore nil + "Rules that are additionally ignored by ruff." + :type 'lsp-string-vector + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-ruff-format nil + "Rules that should be fixed when running textDocument/formatting. + +Note each rule must additionally be marked as fixable by ruff." + :type 'lsp-string-vector + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-ruff-severities nil + "Optional table of rules where a custom severity is desired." + :type '(alist :key-type (lsp-string-vector :tag "rules") :value-type (string :tag "severity")) + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-ruff-unsafe-fixes nil + "Whether or not to offer unsafe fixes as code actions. + +Note this is ignored with the \"Fix All\" action." + :type 'boolean + :group 'lsp-pylsp) + +;; Rules that are ignored when a pyproject.toml or ruff.toml is present +(defcustom lsp-pylsp-plugins-ruff-line-length 88 + "Line length to pass to ruff checking and formatting. + +Note this variable will be ignored when a when a pyproject.toml or ruff.toml is +present." + :type 'integer + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-ruff-exclude nil + "Files to be excluded by ruff checking. + +Note this variable will be ignored when a when a pyproject.toml or ruff.toml +is present." + :type 'lsp-string-vector + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-ruff-select nil + "Rules to be enabled by ruff. + +Note this variable will be ignored when a when a pyproject.toml or ruff.toml +is present." + :type 'lsp-string-vector + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-ruff-ignore nil + "Rules to be ignored by ruff. + +Note this variable will be ignored when a when a pyproject.toml or ruff.toml +is present." + :type 'lsp-string-vector + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-ruff-per-file-ignores nil + "Rules that should be ignored for specific files. + +Note this variable will be ignored when a when a pyproject.toml or ruff.toml +is present." + :type '(alist :key-type (lsp-string-vector :tag "files") :value-type (string :tag "rule")) + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-ruff-preview nil + "Whether to enable the preview style linting and formatting. + +Note this variable will be ignored when a when a pyproject.toml or ruff.toml +is present." + :type 'boolean + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-ruff-target-version nil + "The minimum python version to target (applies for both linting and formatting). + +Note this variable will be ignored when a when a pyproject.toml or ruff.toml +is present." + :type 'string + :group 'lsp-pylsp) + +;; See https://github.com/python-lsp/pylsp-mypy#configuration + +(defcustom lsp-pylsp-plugins-mypy-enabled nil + "Enable or disable the plugin." + :type 'boolean + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-mypy-live-mode t + "If non-nil, type checking is provided as you type. + +This writes to a tempfile every time a check is done. Turning off live_mode +means you must save your changes for mypy diagnostics to update correctly." + :type 'boolean + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-mypy-dmypy nil + "If non-nil, use \"dmypy run\" rather than mypy. + +This uses the dmypy daemon and may dramatically improve the responsiveness of +the pylsp server, however this currently does not work in live_mode. Enabling +this disables live_mode, even for conflicting configs." + :type 'boolean + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-mypy-strict nil + "If non-nil, enable the strict option of mypy. + +This option often is too strict to be useful." + :type 'boolean + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-mypy-overrides [t] + "A list of alternate or supplemental command-line options. + +This modifies the options passed to mypy or the mypy-specific ones passed to +dmypy run. When present, the special boolean member True is replaced with +the command-line options that would've been passed had overrides not been +specified. Later options take precedence, which allows for replacing or +negating individual default options (see mypy.main:process_options and mypy +--help | grep inverse)." + :type '(vector (choice string boolean)) + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-mypy-dmypy-status-file ".dmypy.json" + "The status file dmypy should use. + +This modifies the --status-file option passed to dmypy given dmypy is active." + :type 'string + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-mypy-config-sub-paths nil + "Sub paths under which the mypy configuration file may be found. + +For each directory searched for the mypy config file, this also searches the +sub paths specified here." + :type 'lsp-string-vector + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-mypy-report-progress nil + "If non-nil, report basic progress to the LSP client. + +With this option, pylsp-mypy will report when mypy is running, given your editor +supports LSP progress reporting. For small files this might produce annoying +flashing, especially in with live_mode. For large projects, enabling this can +be helpful to assure yourself whether mypy is still running." + :type 'boolean + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-plugins-mypy-exclude nil + "A list of regular expressions which should be ignored. + +The mypy runner wil not be invoked when a document path is matched by one of the +expressions. Note that this differs from the exclude directive of a mypy config +which is only used for recursively discovering files when mypy is invoked on a +whole directory. For both windows or unix platforms you should use forward +slashes (/) to indicate paths." + :type 'lsp-string-vector + :group 'lsp-pylsp) + +(defcustom lsp-pylsp-rename-backend 'jedi + "Choose renaming backend. + +Jedi is preferred but only works for python >= 3.6 and pylsp >= 0.32.0 +Beware that Jedi is lazy and doesn't scan the whole project. +So it will rename only references it can find." + :type '(choice (const :tag "jedi" jedi) + (const :tag "rope" rope)) + :group 'lsp-pylsp) + +(defun lsp-pylsp-get-pyenv-environment () + "Get the pyenv-managed environment for current workspace, where +/bin/python is the corresponding Python executable" + (if lsp-pylsp-plugins-jedi-environment + lsp-pylsp-plugins-jedi-environment + (when lsp-pylsp-plugins-jedi-use-pyenv-environment + (let ((pyenv-version (getenv "PYENV_VERSION")) + (root (lsp-seq-first (lsp-find-roots-for-workspace lsp--cur-workspace (lsp-session))))) + (when root + (setenv "PYENV_VERSION" nil) + (let* ((pyenv-command-path (executable-find "pyenv")) + (python-env (when pyenv-command-path + (f-parent + (f-parent + (shell-command-to-string + (format "PYENV_DIR='%s' %s which python" + root pyenv-command-path))))))) + (if python-env (lsp--info "Configure pylsp with environment: %s" python-env) + (lsp--warn "Can't find the python environment for + %s even if + `lsp-pylsp-plugins-jedi-use-pyenv-environment` is + enabled") root) + (setenv "PYENV_VERSION" pyenv-version) + python-env)))))) + +(lsp-register-custom-settings + '(("pylsp.rope.ropeFolder" lsp-pylsp-rope-rope-folder) + ("pylsp.rope.extensionModules" lsp-pylsp-rope-extension-modules) + ("pylsp.plugins.rope_rename.enabled" (lambda () (eq lsp-pylsp-rename-backend 'rope)) t) + ("pylsp.plugins.autopep8.enabled" lsp-pylsp-plugins-autopep8-enabled t) + ("pylsp.plugins.yapf.enabled" lsp-pylsp-plugins-yapf-enabled t) + ("pylsp.plugins.black.enabled" lsp-pylsp-plugins-black-enabled t) + ("pylsp.plugins.pyls_isort.enabled" lsp-pylsp-plugins-isort-enabled t) + ("pylsp.plugins.rope_autoimport.enabled" lsp-pylsp-plugins-rope-autoimport-enabled t) + ("pylsp.plugins.rope_autoimport.memory" lsp-pylsp-plugins-rope-autoimport-memory t) + ("pylsp.plugins.rope_completion.enabled" lsp-pylsp-plugins-rope-completion-enabled t) + ("pylsp.plugins.rope_completion.eager" lsp-pylsp-plugins-rope-completion-eager t) + ("pylsp.plugins.pyflakes.enabled" lsp-pylsp-plugins-pyflakes-enabled t) + ("pylsp.plugins.pydocstyle.matchDir" lsp-pylsp-plugins-pydocstyle-match-dir) + ("pylsp.plugins.pydocstyle.match" lsp-pylsp-plugins-pydocstyle-match) + ("pylsp.plugins.pydocstyle.select" lsp-pylsp-plugins-pydocstyle-select) + ("pylsp.plugins.pydocstyle.ignore" lsp-pylsp-plugins-pydocstyle-ignore) + ("pylsp.plugins.pydocstyle.addSelect" lsp-pylsp-plugins-pydocstyle-add-select) + ("pylsp.plugins.pydocstyle.addIgnore" lsp-pylsp-plugins-pydocstyle-add-ignore) + ("pylsp.plugins.pydocstyle.convention" lsp-pylsp-plugins-pydocstyle-convention) + ("pylsp.plugins.pydocstyle.enabled" lsp-pylsp-plugins-pydocstyle-enabled t) + ("pylsp.plugins.pycodestyle.maxLineLength" lsp-pylsp-plugins-pycodestyle-max-line-length) + ("pylsp.plugins.pycodestyle.hangClosing" lsp-pylsp-plugins-pycodestyle-hang-closing t) + ("pylsp.plugins.pycodestyle.ignore" lsp-pylsp-plugins-pycodestyle-ignore) + ("pylsp.plugins.pycodestyle.select" lsp-pylsp-plugins-pycodestyle-select) + ("pylsp.plugins.pycodestyle.filename" lsp-pylsp-plugins-pycodestyle-filename) + ("pylsp.plugins.pycodestyle.exclude" lsp-pylsp-plugins-pycodestyle-exclude) + ("pylsp.plugins.pycodestyle.enabled" lsp-pylsp-plugins-pycodestyle-enabled t) + ("pylsp.plugins.pylint.enabled" lsp-pylsp-plugins-pylint-enabled t) + ("pylsp.plugins.pylint.args" lsp-pylsp-plugins-pylint-args) + ("pylsp.plugins.flake8.enabled" lsp-pylsp-plugins-flake8-enabled) + ("pylsp.plugins.flake8.exclude" lsp-pylsp-plugins-flake8-exclude) + ("pylsp.plugins.flake8.filename" lsp-pylsp-plugins-flake8-filename) + ("pylsp.plugins.flake8.hangClosing" lsp-pylsp-plugins-flake8-hang-closing) + ("pylsp.plugins.flake8.ignore" lsp-pylsp-plugins-flake8-ignore) + ("pylsp.plugins.flake8.maxLineLength" lsp-pylsp-plugins-flake8-max-line-length) + ("pylsp.plugins.flake8.select" lsp-pylsp-plugins-flake8-select) + ("pylsp.plugins.flake8.config" lsp-pylsp-plugins-flake8-config) + ("pylsp.plugins.preload.modules" lsp-pylsp-plugins-preload-modules) + ("pylsp.plugins.preload.enabled" lsp-pylsp-plugins-preload-enabled t) + ("pylsp.plugins.mccabe.threshold" lsp-pylsp-plugins-mccabe-threshold) + ("pylsp.plugins.mccabe.enabled" lsp-pylsp-plugins-mccabe-enabled t) + ("pylsp.plugins.ruff.enabled" lsp-pylsp-plugins-ruff-enabled t) + ("pylsp.plugins.ruff.executable" lsp-pylsp-plugins-ruff-executable) + ("pylsp.plugins.ruff.config" lsp-pylsp-plugins-ruff-config) + ("pylsp.plugins.ruff.extendSelect" lsp-pylsp-plugins-ruff-extend-select) + ("pylsp.plugins.ruff.extendIgnore" lsp-pylsp-plugins-ruff-extend-ignore) + ("pylsp.plugins.ruff.format" lsp-pylsp-plugins-ruff-format) + ("pylsp.plugins.ruff.severities" lsp-pylsp-plugins-ruff-severities) + ("pylsp.plugins.ruff.unsafeFixes" lsp-pylsp-plugins-ruff-unsafe-fixes t) + ("pylsp.plugins.ruff.lineLength" lsp-pylsp-plugins-ruff-line-length) + ("pylsp.plugins.ruff.exclude" lsp-pylsp-plugins-ruff-exclude) + ("pylsp.plugins.ruff.select" lsp-pylsp-plugins-ruff-select) + ("pylsp.plugins.ruff.ignore" lsp-pylsp-plugins-ruff-ignore) + ("pylsp.plugins.ruff.perFileIgnores" lsp-pylsp-plugins-ruff-per-file-ignores) + ("pylsp.plugins.ruff.preview" lsp-pylsp-plugins-ruff-preview t) + ("pylsp.plugins.ruff.targetVersion" lsp-pylsp-plugins-ruff-target-version) + ("pylsp.plugins.pylsp_mypy.enabled" lsp-pylsp-plugins-mypy-enabled t) + ("pylsp.plugins.pylsp_mypy.live_mode" lsp-pylsp-plugins-mypy-live-mode t) + ("pylsp.plugins.pylsp_mypy.dmypy" lsp-pylsp-plugins-mypy-dmypy t) + ("pylsp.plugins.pylsp_mypy.strict" lsp-pylsp-plugins-mypy-strict t) + ("pylsp.plugins.pylsp_mypy.overrides" lsp-pylsp-plugins-mypy-overrides) + ("pylsp.plugins.pylsp_mypy.dmypy_status_file" lsp-pylsp-plugins-mypy-dmypy-status-file) + ("pylsp.plugins.pylsp_mypy.config_sub_paths" lsp-pylsp-plugins-mypy-config-sub-paths) + ("pylsp.plugins.pylsp_mypy.report_progress" lsp-pylsp-plugins-mypy-report-progress t) + ("pylsp.plugins.pylsp_mypy.exclude" lsp-pylsp-plugins-mypy-exclude) + ("pylsp.plugins.jedi_symbols.all_scopes" lsp-pylsp-plugins-jedi-symbols-all-scopes t) + ("pylsp.plugins.jedi_symbols.enabled" lsp-pylsp-plugins-jedi-symbols-enabled t) + ("pylsp.plugins.jedi_signature_help.enabled" lsp-pylsp-plugins-jedi-signature-help-enabled t) + ("pylsp.plugins.jedi_references.enabled" lsp-pylsp-plugins-jedi-references-enabled t) + ("pylsp.plugins.jedi_hover.enabled" lsp-pylsp-plugins-jedi-hover-enabled t) + ("pylsp.plugins.jedi_definition.follow_builtin_imports" lsp-pylsp-plugins-jedi-definition-follow-builtin-imports t) + ("pylsp.plugins.jedi_definition.follow_imports" lsp-pylsp-plugins-jedi-definition-follow-imports t) + ("pylsp.plugins.jedi_definition.enabled" lsp-pylsp-plugins-jedi-definition-enabled t) + ("pylsp.plugins.jedi_completion.include_params" lsp-pylsp-plugins-jedi-completion-include-params t) + ("pylsp.plugins.jedi_completion.enabled" lsp-pylsp-plugins-jedi-completion-enabled t) + ("pylsp.plugins.jedi_completion.include_class_objects" lsp-pylsp-plugins-jedi-completion-include-class-objects t) + ("pylsp.plugins.jedi.environment" lsp-pylsp-get-pyenv-environment) + ("pylsp.plugins.jedi_completion.fuzzy" lsp-pylsp-plugins-jedi-completion-fuzzy t) + ("pylsp.plugins.jedi_rename.enabled" (lambda () (eq lsp-pylsp-rename-backend 'jedi)) t) + ("pylsp.configurationSources" lsp-pylsp-configuration-sources))) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection + (lambda () lsp-pylsp-server-command)) + :activation-fn (lsp-activate-on "python") + :priority -1 + :server-id 'pylsp + :library-folders-fn (lambda (_workspace) lsp-clients-pylsp-library-directories) + :initialized-fn (lambda (workspace) + (with-lsp-workspace workspace + (lsp--set-configuration (lsp-configuration-section "pylsp")))))) + +(lsp-consistency-check lsp-pylsp) + +(provide 'lsp-pylsp) +;;; lsp-pylsp.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-r.el b/code/elpa/lsp-mode-20240319.1043/lsp-r.el new file mode 100644 index 0000000..da54bc3 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-r.el @@ -0,0 +1,49 @@ +;;; lsp-r.el --- description -*- lexical-binding: t; -*- + +;; Copyright (C) 2020 emacs-lsp maintainers + +;; Author: emacs-lsp maintainers +;; Keywords: lsp, r + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP Clients for the R Programming Language. + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-r nil + "LSP support for R." + :group 'lsp-mode + :link '(url-link "https://github.com/REditorSupport/languageserver")) + +(defcustom lsp-clients-r-server-command '("R" "--slave" "-e" "languageserver::run()") + "Command to start the R language server." + :group 'lsp-r + :risky t + :type '(repeat string)) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection lsp-clients-r-server-command) + :major-modes '(ess-r-mode) + :server-id 'lsp-r)) + + +(lsp-consistency-check lsp-r) + +(provide 'lsp-r) +;;; lsp-r.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-racket.el b/code/elpa/lsp-mode-20240319.1043/lsp-racket.el new file mode 100644 index 0000000..be00ba9 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-racket.el @@ -0,0 +1,77 @@ +;;; lsp-racket.el --- lsp-mode racket integration -*- lexical-binding: t; -*- + +;; Copyright (C) 2020 lsp-mode maintainers + +;; Author: lsp-mode maintainers +;; Keywords: languages + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; Client for the Racket language server. + +;;; Code: + +(require 'ht) +(require 'lsp-mode) + + +;; racket-langserver + +(defgroup lsp-racket-langserver nil + "LSP support for Racket, using racket-langserver" + :group 'lsp-mode + :link '(url-link "https://github.com/jeapostrophe/racket-langserver")) + +(defcustom lsp-racket-langserver-command '("racket" "--lib" "racket-langserver") + "Command to start the server." + :type 'string + :package-version '(lsp-mode . "8.0.0")) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection (lambda () lsp-racket-langserver-command)) + :major-modes '(racket-mode) + :priority 1 + :server-id 'racket-langserver)) + + +;; Theia + +(defgroup lsp-racket-language-server nil + "LSP support for Racket, using racket-language-server." + :group 'lsp-mode + :link '(url-link "https://github.com/theia-ide/racket-language-server")) + +(defcustom lsp-racket-language-server-path "racket-language-server" + "Executable path for the server." + :type 'string + :package-version '(lsp-mode . "8.0.0")) + +(defun lsp-racket-language-server-colorize-handler (&rest _args) + "Handler for the colorize notification." + ;; TODO: + nil) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection (lambda () lsp-racket-language-server-path)) + :major-modes '(racket-mode) + :priority -1 + :notification-handlers (ht ("racket/colorize" #'lsp-racket-language-server-colorize-handler)) + :server-id 'racket-language-server)) + +(lsp-consistency-check lsp-racket) + +(provide 'lsp-racket) +;;; lsp-racket.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-remark.el b/code/elpa/lsp-mode-20240319.1043/lsp-remark.el new file mode 100644 index 0000000..19cdaa7 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-remark.el @@ -0,0 +1,69 @@ +;;; lsp-remark.el --- lsp-mode remark integration -*- lexical-binding: t; -*- + +;; Copyright (C) 2021 lsp-mode maintainers + +;; Author: lsp-mode maintainers +;; Keywords: languages + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP client for remark-language-server + +;;; Code: + +(require 'lsp-mode) + +;;; Markdown +(defgroup lsp-remark nil + "Settings for the markdown language server client." + :group 'lsp-mode + :link '(url-link "https://github.com/remarkjs/remark-language-server") + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-remark-server-command "remark-language-server" + "The binary (or full path to binary) which executes the server." + :type 'string + :group 'lsp-remark + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-remark-server-command-args '("--stdio") + "Command-line arguments for the markdown lsp server." + :type '(repeat 'string) + :group 'lsp-remark + :package-version '(lsp-mode . "8.0.1")) + +(lsp-dependency 'remark-language-server + '(:system "remark-language-server") + '(:npm :package "remark-language-server" + :path "remark-language-server")) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection + (lambda () + (cons (or (executable-find lsp-remark-server-command) + (lsp-package-path 'remark-language-server)) + lsp-remark-server-command-args))) + :activation-fn (lsp-activate-on "markdown") + :initialized-fn (lambda (workspace) + (with-lsp-workspace workspace + (lsp--set-configuration (lsp-configuration-section "remark-language-server")))) + :priority 0 + :server-id 'remark)) + +(lsp-consistency-check lsp-remark) + +(provide 'lsp-remark) +;;; lsp-remark.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-rf.el b/code/elpa/lsp-mode-20240319.1043/lsp-rf.el new file mode 100644 index 0000000..eee0a16 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-rf.el @@ -0,0 +1,147 @@ +;;; lsp-rf.el --- description -*- lexical-binding: t; -*- + +;; Copyright (C) 2020 emacs-lsp maintainers + +;; Author: emacs-lsp maintainers +;; Keywords: lsp, rf, robot + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP Clients for the Robot Framework. + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-rf nil + "Settings for Robot Framework Language Server." + :group 'lsp-mode + :link '(url-link "https://github.com/tomi/vscode-rf-language-server")) + +(defcustom lsp-rf-language-server-start-command '("~/.nvm/versions/node/v9.11.2/bin/node" "~/.vscode/extensions/tomiturtiainen.rf-intellisense-2.8.0/server/server.js") + "Path to the server.js file of the rf-intellisense server. +Accepts a list of strings (path/to/interpreter path/to/server.js)" + :type 'list + :group 'lsp-rf) + +(defcustom lsp-rf-language-server-include-paths [] + "An array of files that should be included by the parser. +Glob patterns as strings are accepted (eg. *.robot between double quotes)" + :type 'lsp-string-vector + :group 'lsp-rf) + +(defcustom lsp-rf-language-server-exclude-paths [] + "An array of files that should be ignored by the parser. +Glob patterns as strings are accepted (eg. *bad.robot between double quotes)" + :type 'lsp-string-vector + :group 'lsp-rf) + +(defcustom lsp-rf-language-server-dir "~/.vscode/extensions/tomiturtiainen.rf-intellisense-2.8.0/server/library-docs/" + "Libraries directory for libraries in `lsp-rf-language-server-libraries'" + :type 'string + :group 'lsp-rf) + +(defcustom lsp-rf-language-server-libraries ["BuiltIn-3.1.1" "Collections-3.0.4"] + "Libraries whose keywords are suggested with `auto-complete'." + :type '(repeat string) + ;; :type 'lsp-string-vector + :group 'lsp-rf) + +(defcustom lsp-rf-language-server-log-level "debug" + "What language server log messages are printed." + :type 'string + ;; :type '(choice (:tag "off" "errors" "info" "debug")) + :group 'lsp-rf) + +(defcustom lsp-rf-language-server-trace-server "verbose" + "Traces the communication between VSCode and the rfLanguageServer service." + :type 'string + ;; :type '(choice (:tag "off" "messages" "verbose")) + :group 'lsp-rf) + +(defun parse-rf-language-server-library-dirs (dirs) + (vconcat (mapcar + (lambda (x) + (concat + (expand-file-name + lsp-rf-language-server-dir) + x + ".json")) + dirs))) + +(defun expand-start-command () + (mapcar 'expand-file-name lsp-rf-language-server-start-command)) + +(defun parse-rf-language-server-globs-to-regex (vector) + "Convert a VECTOR of globs to a regex." + (--> (mapcan #'lsp-glob-to-regexps vector) + (s-join "\\|" it) + (concat "\\(?:" it "\\)"))) + +(defun parse-rf-language-server-include-path-regex (vector) + "Creates regexp to select files from workspace directory." + (let ((globs (if (eq vector []) + ["*.robot" "*.resource"] + vector))) + (parse-rf-language-server-globs-to-regex globs))) + +(defun parse-rf-language-server-exclude-paths (seq) + "Creates regexp to select files from workspace directory." + (if (eq lsp-rf-language-server-exclude-paths []) + seq + (cl-delete-if (lambda (x) (string-match-p + (parse-rf-language-server-globs-to-regex + lsp-rf-language-server-exclude-paths) + x)) + seq))) + +(lsp-register-custom-settings + '( + ("rfLanguageServer.trace.server" lsp-rf-language-server-trace-server) + ("rfLanguageServer.logLevel" lsp-rf-language-server-log-level) + ("rfLanguageServer.libraries" lsp-rf-language-server-libraries) + ("rfLanguageServer.excludePaths" lsp-rf-language-server-exclude-paths) + ("rfLanguageServer.includePaths" lsp-rf-language-server-include-paths))) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection + (expand-start-command)) + :major-modes '(robot-mode) + :server-id 'rf-intellisense + ;; :library-folders-fn (lambda (_workspace) + ;; lsp-rf-language-server-libraries) + :library-folders-fn (lambda (_workspace) + (parse-rf-language-server-library-dirs + lsp-rf-language-server-libraries)) + :initialized-fn (lambda (workspace) + (with-lsp-workspace workspace + (lsp--set-configuration + (lsp-configuration-section "rfLanguageServer")) + (lsp-request "buildFromFiles" + (list :files + (vconcat + (parse-rf-language-server-exclude-paths + (directory-files-recursively + (lsp--workspace-root workspace) + (parse-rf-language-server-include-path-regex + lsp-rf-language-server-include-paths)))))))))) + + + +(lsp-consistency-check lsp-rf) + +(provide 'lsp-rf) +;;; lsp-rf.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-rpm-spec.el b/code/elpa/lsp-mode-20240319.1043/lsp-rpm-spec.el new file mode 100644 index 0000000..7d807bd --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-rpm-spec.el @@ -0,0 +1,60 @@ +;;; lsp-rpm-spec.el --- lsp-mode integration for the rpm-spec-language-server -*- lexical-binding: t; -*- + +;; Copyright (C) 2024 emacs-lsp maintainers + +;; Author: emacs-lsp maintainers +;; Keywords: lsp, rpm-spec + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP Client for RPM Spec files + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-rpm-spec nil + "LSP support for RPM spec files using rpm-spec-language-server." + :group 'lsp-mode + :tag "Language Server" + :link '(url-link "https://github.com/dcermak/rpm-spec-language-server")) + +(defcustom lsp-rpm-spec-server-command '("python" "-m" "rpm_spec_language_server" "--stdio") + "Command to start rpm-spec-language-server." + :risky t + :group 'lsp-rpm-spec + :type '(repeat string)) + +(defun lsp-rpm-spec--install-server (_client callback error-callback update?) + "Install the rpm-spec-language-server via pip. + +Will invoke CALLBACK or ERROR-CALLBACK based on result. +If UPDATE? is true, then pip will update the server." + (lsp-async-start-process + callback + error-callback + "pip" "install" "--user" "rpm-spec-language-server" (when update? "-U"))) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection (lambda () lsp-rpm-spec-server-command)) + :activation-fn (lsp-activate-on "rpm-spec") + :server-id 'rpm-spec-language-server)) + +(lsp-consistency-check lsp-rpm-spec) + +(provide 'lsp-rpm-spec) + +;;; lsp-rpm-spec.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-rubocop.el b/code/elpa/lsp-mode-20240319.1043/lsp-rubocop.el new file mode 100644 index 0000000..8186964 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-rubocop.el @@ -0,0 +1,66 @@ +;;; lsp-rubocop.el --- lsp-mode for RuboCop -*- lexical-binding: t; -*- + +;; Copyright (C) 2023 Koichi Ito + +;; Author: Koichi Ito +;; Keywords: lsp, ruby, languages + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP client for RuboCop which is a Ruby static code analyzer (a.k.a. linter) +;; and code formatter. + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-rubocop nil + "LSP support for RuboCop, using the RuboCop built-in language server." + :group 'lsp-mode + :link '(url-link "https://github.com/rubocop/rubocop") + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rubocop-use-bundler nil + "Run RuboCop using Bundler." + :type 'boolean + :safe #'booleanp + :group 'lsp-rubocop + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rubocop-server-path nil + "Path of the RuboCop built-in language server executable. +If specified, `lsp-rubocop-use-bundler' is ignored." + :type 'file + :group 'lsp-rubocop + :package-version '(lsp-mode . "8.0.1")) + +(defun lsp-rubocop--build-command () + "Build a command to start the RuboCop built-in language server." + (append + (if (and lsp-rubocop-use-bundler (not lsp-rubocop-server-path)) '("bundle" "exec")) + (list (or lsp-rubocop-server-path "rubocop") "--lsp"))) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection #'lsp-rubocop--build-command) + :activation-fn (lsp-activate-on "ruby") + :priority -1 + :server-id 'rubocop-ls)) + +(lsp-consistency-check lsp-rubocop) + +(provide 'lsp-rubocop) +;;; lsp-rubocop.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-ruby-lsp.el b/code/elpa/lsp-mode-20240319.1043/lsp-ruby-lsp.el new file mode 100644 index 0000000..e6039da --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-ruby-lsp.el @@ -0,0 +1,56 @@ +;;; lsp-ruby-lsp.el --- lsp-mode for the Ruby ruby-lsp gem -*- lexical-binding: t; -*- + +;; Copyright (C) 2023 Šimon Lukašík + +;; Author: Šimon Lukašík +;; Keywords: languages + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP client for the Ruby ruby-lsp - an optionated language server for Ruby. +;; Not to be confused with lsp-ruby that has been deprecated for a while. + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-ruby-lsp nil + "LSP support for the ruby-lsp language server." + :group 'lsp-mode + :link '(url-link "https://github.com/shopify/ruby-lsp")) + +(defcustom lsp-ruby-lsp-use-bundler nil + "Run ruby-lsp using bundler." + :type 'boolean + :safe #'booleanp + :group 'lsp-ruby-lsp) + +(defun lsp-ruby-lsp--build-command () + (append + (if lsp-ruby-lsp-use-bundler '("bundle" "exec")) + '("ruby-lsp"))) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection #'lsp-ruby-lsp--build-command) + :activation-fn (lsp-activate-on "ruby") + :priority -2 + :server-id 'ruby-lsp-ls)) + +(lsp-consistency-check lsp-ruby-lsp) + +(provide 'lsp-ruby-lsp) +;;; lsp-ruby-lsp.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-ruby-syntax-tree.el b/code/elpa/lsp-mode-20240319.1043/lsp-ruby-syntax-tree.el new file mode 100644 index 0000000..23122ce --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-ruby-syntax-tree.el @@ -0,0 +1,59 @@ +;;; lsp-ruby-syntax-tree.el --- lsp-mode for the Ruby syntax_tree gem -*- lexical-binding: t; -*- + +;; Copyright (C) 2022 Geoffrey Lessel + +;; Author: Geoffrey Lessel +;; Keywords: languages + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP client for the Ruby syntax_tree gem. + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-ruby-syntax-tree nil + "LSP support for the Ruby syntax_tree gem." + :group 'lsp-mode + :link '(url-link "https://github.com/ruby-syntax-tree/syntax_tree")) + +(defcustom lsp-ruby-syntax-tree-use-bundler nil + "Run stree (the syntax_tree executable) using bundler." + :type 'boolean + :safe #'booleanp + :group 'lsp-ruby-syntax-tree) + +(defcustom lsp-ruby-syntax-tree-format-options nil + "Options to pass to the stree lsp server." + :type '(repeat string) + :group 'lsp-ruby-syntax-tree) + +(defun lsp-ruby-syntax-tree--build-command () + (append + (if lsp-ruby-syntax-tree-use-bundler '("bundle" "exec")) + '("stree" "lsp") + lsp-ruby-syntax-tree-format-options)) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection #'lsp-ruby-syntax-tree--build-command) + :activation-fn (lsp-activate-on "ruby") + :priority -4 + :server-id 'ruby-syntax-tree-ls)) + +(provide 'lsp-ruby-syntax-tree) +;;; lsp-ruby-syntax-tree.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-ruff-lsp.el b/code/elpa/lsp-mode-20240319.1043/lsp-ruff-lsp.el new file mode 100644 index 0000000..c95359d --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-ruff-lsp.el @@ -0,0 +1,115 @@ +;;; lsp-ruff-lsp.el --- ruff-lsp support -*- lexical-binding: t; -*- + +;; Copyright (C) 2023 Freja Nordsiek +;; +;; Author: Freja Nordsiek . + +;;; Commentary: + +;; ruff-lsp Client for the Python programming language + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-ruff-lsp nil + "LSP support for Python, using ruff-lsp's Python Language Server." + :group 'lsp-mode + :link '(url-link "https://github.com/charliermarsh/ruff-lsp")) + +(defcustom lsp-ruff-lsp-server-command '("ruff-lsp") + "Command to start ruff-lsp." + :risky t + :type '(repeat string) + :group 'lsp-ruff-lsp) + +(defcustom lsp-ruff-lsp-ruff-path ["ruff"] + "Paths to ruff to try, in order." + :risky t + :type 'lsp-string-vector + :group 'lsp-ruff-lsp) + +(defcustom lsp-ruff-lsp-ruff-args [] + "Arguments, passed to ruff." + :risky t + :type 'lsp-string-vector + :group 'lsp-ruff-lsp) + +(defcustom lsp-ruff-lsp-log-level "error" + "Tracing level." + :type '(choice (const "debug") + (const "error") + (const "info") + (const "off") + (const "warn")) + :group 'lsp-ruff-lsp) + +(defcustom lsp-ruff-lsp-python-path "python3" + "Path to the Python interpreter." + :risky t + :type 'string + :group 'lsp-ruff-lsp) + +(defcustom lsp-ruff-lsp-show-notifications "off" + "When notifications are shown." + :type '(choice (const "off") + (const "onError") + (const "onWarning") + (const "always")) + :group 'lsp-ruff-lsp) + +(defcustom lsp-ruff-lsp-advertize-organize-imports t + "Whether to report ability to handle source.organizeImports actions." + :type 'boolean + :group 'lsp-ruff-lsp) + +(defcustom lsp-ruff-lsp-advertize-fix-all t + "Whether to report ability to handle source.fixAll actions." + :type 'boolean + :group 'lsp-ruff-lsp) + +(defcustom lsp-ruff-lsp-import-strategy "fromEnvironment" + "Where ruff is imported from if lsp-ruff-lsp-ruff-path is not set." + :type '(choice (const "fromEnvironment") + (const "useBundled")) + :group 'lsp-ruff-lsp) + + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection + (lambda () lsp-ruff-lsp-server-command)) + :activation-fn (lsp-activate-on "python") + :server-id 'ruff-lsp + :priority -2 + :add-on? t + :initialization-options + (lambda () + (list :settings + (list :args lsp-ruff-lsp-ruff-args + :logLevel lsp-ruff-lsp-log-level + :path lsp-ruff-lsp-ruff-path + :interpreter (vector lsp-ruff-lsp-python-path) + :showNotifications lsp-ruff-lsp-show-notifications + :organizeImports (lsp-json-bool lsp-ruff-lsp-advertize-organize-imports) + :fixAll (lsp-json-bool lsp-ruff-lsp-advertize-fix-all) + :importStrategy lsp-ruff-lsp-import-strategy))))) + +(lsp-consistency-check lsp-ruff-lsp) + +(provide 'lsp-ruff-lsp) +;;; lsp-ruff-lsp.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-rust.el b/code/elpa/lsp-mode-20240319.1043/lsp-rust.el new file mode 100644 index 0000000..0781174 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-rust.el @@ -0,0 +1,1753 @@ +;;; lsp-rust.el --- Rust Client settings -*- lexical-binding: t; -*- + +;; Copyright (C) 2019 Ivan Yonchovski + +;; Author: Ivan Yonchovski +;; Keywords: + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; lsp-rust client + +;;; Code: + +(require 'lsp-mode) +(require 'ht) +(require 'dash) +(require 'lsp-semantic-tokens) + +(defgroup lsp-rust nil + "LSP support for Rust, using Rust Language Server or rust-analyzer." + :group 'lsp-mode + :link '(url-link "https://github.com/rust-lang/rls") + :package-version '(lsp-mode . "6.1")) + +(defgroup lsp-rust-rls nil + "LSP support for Rust, using Rust Language Server." + :group 'lsp-mode + :link '(url-link "https://github.com/rust-lang/rls") + :package-version '(lsp-mode . "8.0.0")) + +(defgroup lsp-rust-analyzer nil + "LSP support for Rust, using rust-analyzer." + :group 'lsp-mode + :link '(url-link "https://github.com/rust-lang/rust-analyzer") + :package-version '(lsp-mode . "8.0.0")) + +(defgroup lsp-rust-analyzer-semantic-tokens nil + "LSP semantic tokens support for rust-analyzer." + :group 'lsp-rust-analyzer + :link '(url-link "https://github.com/rust-lang/rust-analyzer") + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-server 'rust-analyzer + "Choose LSP server." + :type '(choice (const :tag "rls" rls) + (const :tag "rust-analyzer" rust-analyzer)) + :group 'lsp-rust + :package-version '(lsp-mode . "6.2")) + +;; RLS + +(defcustom lsp-rust-rls-server-command '("rls") + "Command to start RLS." + :type '(repeat string) + :group 'lsp-rust-rls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-rust-library-directories '("~/.cargo/registry/src" "~/.rustup/toolchains") + "List of directories which will be considered to be libraries." + :risky t + :type '(repeat string) + :group 'lsp-rust-rls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-rust-sysroot nil + "If non-nil, use the given path as the sysroot for all rustc invocations +instead of trying to detect the sysroot automatically." + :type '(choice + (const :tag "None" nil) + (string :tag "Sysroot")) + :group 'lsp-rust-rls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-rust-target nil + "If non-nil, use the given target triple for all rustc invocations." + :type '(choice + (const :tag "None" nil) + (string :tag "Target")) + :group 'lsp-rust-rls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-rust-rustflags nil + "Flags added to RUSTFLAGS." + :type '(choice + (const :tag "None" nil) + (string :tag "Flags")) + :group 'lsp-rust-rls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-rust-clear-env-rust-log t + "Clear the RUST_LOG environment variable before running rustc or cargo." + :type 'boolean + :group 'lsp-rust-rls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-rust-build-lib nil + "If non-nil, checks the project as if you passed the `--lib' argument to +cargo. + +Mutually exclusive with, and preferred over, `lsp-rust-build-bin'. (Unstable)" + :type 'boolean + :group 'lsp-rust-rls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-rust-build-bin nil + "If non-nil, checks the project as if you passed `-- bin ' +argument to cargo. + +Mutually exclusive with `lsp-rust-build-lib'. (Unstable)" + :type '(choice + (const :tag "None" nil) + (string :tag "Binary")) + :group 'lsp-rust-rls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-rust-cfg-test nil + "If non-nil, checks the project as if you were running `cargo test' rather +than cargo build. + +I.e., compiles (but does not run) test code." + :type 'boolean + :group 'lsp-rust-rls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-rust-unstable-features nil + "Enable unstable features." + :type 'boolean + :group 'lsp-rust-rls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-rust-wait-to-build nil + "Time in milliseconds between receiving a change notification +and starting build. If not specified, automatically inferred by +the latest build duration." + :type '(choice + (const :tag "Auto" nil) + (number :tag "Time")) + :group 'lsp-rust-rls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-rust-show-warnings t + "Show warnings." + :type 'boolean + :group 'lsp-rust-rls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-rust-crate-blocklist [ + "cocoa" + "gleam" + "glium" + "idna" + "libc" + "openssl" + "rustc_serialize" + "serde" + "serde_json" + "typenum" + "unicode_normalization" + "unicode_segmentation" + "winapi" + ] + "A list of Cargo crates to blocklist." + :type 'lsp-string-vector + :group 'lsp-rust-rls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-rust-build-on-save nil + "Only index the project when a file is saved and not on change." + :type 'boolean + :group 'lsp-rust-rls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-rust-features [] + "List of features to activate. +Set this to `\"all\"` to pass `--all-features` to cargo." + :type 'lsp-string-vector + :group 'lsp-rust-rls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-rust-all-features nil + "Enable all Cargo features." + :type 'boolean + :group 'lsp-rust-rls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-rust-no-default-features nil + "Do not enable default Cargo features." + :type 'boolean + :group 'lsp-rust-rls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-rust-racer-completion t + "Enables code completion using racer." + :type 'boolean + :group 'lsp-rust-rls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-rust-clippy-preference "opt-in" + "Controls eagerness of clippy diagnostics when available. +Valid values are (case-insensitive): + - \"off\": Disable clippy lints. + - \"opt-in\": Clippy lints are shown when crates specify `#![warn(clippy)]'. + - \"on\": Clippy lints enabled for all crates in workspace. + +You need to install clippy via rustup if you haven't already." + :type '(choice + (const "on") + (const "opt-in") + (const "off")) + :group 'lsp-rust-rls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-rust-jobs nil + "Number of Cargo jobs to be run in parallel." + :type '(choice + (const :tag "Auto" nil) + (number :tag "Jobs")) + :group 'lsp-rust-rls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-rust-all-targets t + "Checks the project as if you were running cargo check --all-targets. +I.e., check all targets and integration tests too." + :type 'boolean + :group 'lsp-rust-rls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-rust-target-dir nil + "When specified, it places the generated analysis files at the +specified target directory. By default it is placed target/rls +directory." + :type '(choice + (const :tag "Default" nil) + (string :tag "Directory")) + :group 'lsp-rust-rls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-rust-rustfmt-path nil + "When specified, RLS will use the Rustfmt pointed at the path +instead of the bundled one" + :type '(choice + (const :tag "Bundled" nil) + (string :tag "Path")) + :group 'lsp-rust-rls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-rust-build-command nil + "EXPERIMENTAL (requires `rust.unstable_features') +If set, executes a given program responsible for rebuilding save-analysis to be +loaded by the RLS. The program given should output a list of resulting .json +files on stdout. + +Implies `rust.build_on_save': true." + :type '(choice + (const :tag "None" nil) + (string :tag "Command")) + :group 'lsp-rust-rls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-rust-full-docs nil + "Instructs cargo to enable full documentation extraction during +save-analysis while building the crate." + :type 'boolean + :group 'lsp-rust-rls + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-rust-show-hover-context t + "Show additional context in hover tooltips when available. This +is often the type local variable declaration." + :type 'boolean + :group 'lsp-rust-rls + :package-version '(lsp-mode . "6.1")) + +(lsp-register-custom-settings + '(("rust.show_hover_context" lsp-rust-show-hover-context t) + ("rust.full_docs" lsp-rust-full-docs t) + ("rust.build_command" lsp-rust-build-command) + ("rust.rustfmt_path" lsp-rust-rustfmt-path) + ("rust.target_dir" lsp-rust-target-dir) + ("rust.all_targets" lsp-rust-all-targets t) + ("rust.jobs" lsp-rust-jobs) + ("rust.clippy_preference" lsp-rust-clippy-preference) + ("rust.racer_completion" lsp-rust-racer-completion t) + ("rust.no_default_features" lsp-rust-no-default-features t) + ("rust.all_features" lsp-rust-all-features t) + ("rust.features" lsp-rust-features) + ("rust.build_on_save" lsp-rust-build-on-save t) + ("rust.crate_blocklist" lsp-rust-crate-blocklist) + ("rust.show_warnings" lsp-rust-show-warnings t) + ("rust.wait_to_build" lsp-rust-wait-to-build) + ("rust.unstable_features" lsp-rust-unstable-features t) + ("rust.cfg_test" lsp-rust-cfg-test t) + ("rust.build_bin" lsp-rust-build-bin) + ("rust.build_lib" lsp-rust-build-lib t) + ("rust.clear_env_rust_log" lsp-rust-clear-env-rust-log t) + ("rust.rustflags" lsp-rust-rustflags) + ("rust.target" lsp-rust-target) + ("rust.sysroot" lsp-rust-sysroot))) + +(defun lsp-clients--rust-window-progress (workspace params) + "Progress report handling. +PARAMS progress report notification data." + (-let [(&v1:ProgressParams :done? :message? :title) params] + (if (or done? (s-blank-str? message?)) + (lsp-workspace-status nil workspace) + (lsp-workspace-status (format "%s - %s" title (or message? "")) workspace)))) + +(lsp-defun lsp-rust--rls-run ((&Command :arguments? params)) + (-let* (((&rls:Cmd :env :binary :args :cwd) (lsp-seq-first params)) + (default-directory (or cwd (lsp-workspace-root) default-directory) )) + (compile + (format "%s %s %s" + (s-join " " (ht-amap (format "%s=%s" key value) env)) + binary + (s-join " " args))))) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection (lambda () lsp-rust-rls-server-command)) + :activation-fn (lsp-activate-on "rust") + :priority (if (eq lsp-rust-server 'rls) 1 -1) + :initialization-options '((omitInitBuild . t) + (cmdRun . t)) + :notification-handlers (ht ("window/progress" 'lsp-clients--rust-window-progress)) + :action-handlers (ht ("rls.run" 'lsp-rust--rls-run)) + :library-folders-fn (lambda (_workspace) lsp-rust-library-directories) + :initialized-fn (lambda (workspace) + (with-lsp-workspace workspace + (lsp--set-configuration + (lsp-configuration-section "rust")))) + :server-id 'rls)) + + +;; rust-analyzer +(defcustom lsp-rust-analyzer-server-command '("rust-analyzer") + "Command to start rust-analyzer." + :type '(repeat string) + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "6.2")) + +(defcustom lsp-rust-analyzer-library-directories '("~/.cargo/registry/src" "~/.rustup/toolchains") + "List of directories which will be considered to be libraries." + :risky t + :type '(repeat string) + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-server-format-inlay-hints t + "Whether to ask rust-analyzer to format inlay hints itself. If +active, the various inlay format settings are not used." + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-hide-closure-initialization nil + "Whether to hide inlay type hints for `let` statements that initialize +to a closure. Only applies to closures with blocks, same as +`#rust-analyzer.inlayHints.closureReturnTypeHints.enable#`." + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-highlight-breakpoints t + "Enables highlighting of related references while the cursor is on +`break`, `loop`, `while`, or `for` keywords." + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-highlight-closure-captures t + "Enables highlighting of all captures of a closure while the +cursor is on the `|` or move keyword of a closure." + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-highlight-exit-points t + "Enables highlighting of all exit points while the cursor is on +any `return`, `?`, `fn`, or return type arrow (`->`)." + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-highlight-references t + "Enables highlighting of related references while the cursor is on +any identifier." + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-highlight-yield-points t + "Enables highlighting of all break points for a loop or block +context while the cursor is on any `async` or `await` keywords." + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-closure-return-type-hints "never" + "Whether to show inlay type hints for return types of closures." + :type '(choice + (const "never") + (const "always") + (const "with_block")) + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-discriminants-hints "never" + "Whether to show enum variant discriminant hints." + :type '(choice + (const "never") + (const "always") + (const "fieldless")) + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-expression-adjustment-hints "never" + "Whether to show inlay hints for type adjustments.." + :type '(choice + (const "never") + (const "always") + (const "reborrow")) + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-expression-adjustment-hints-mode "prefix" + "Whether to show inlay hints as postfix ops (`.*` instead of `*`, etc)." + :type '(choice + (const "prefix") + (const "postfix") + (const "prefer_prefix") + (const "prefer_postfix")) + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-expression-adjustment-hide-unsafe nil + "Whether to hide inlay hints for type adjustments outside of +`unsafe` blocks." + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-implicit-drops nil + "Whether to show implicit drop hints." + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.1")) + + +(defcustom lsp-rust-analyzer-closure-capture-hints nil + "Whether to show inlay hints for closure captures." + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-closure-style "impl_fn" + "Closure notation in type and chaining inlay hints." + :type 'string + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-hide-named-constructor nil + "Whether to hide inlay type hints for constructors." + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-max-inlay-hint-length nil + "Max inlay hint length." + :type 'integer + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "6.2.2")) + +(defcustom lsp-rust-analyzer-display-chaining-hints nil + "Whether to show inlay type hints for method chains. These +hints will be formatted with the type hint formatting options, if +the mode is not configured to ask the server to format them." + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "6.2.2")) + +(defcustom lsp-rust-analyzer-display-lifetime-elision-hints-enable "never" + "Whether to show elided lifetime inlay hints." + :type '(choice + (const "never") + (const "always") + (const "skip_trivial")) + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-display-lifetime-elision-hints-use-parameter-names nil + "When showing elided lifetime inlay hints, whether to use +parameter names or numeric placeholder names for the lifetimes." + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-display-closure-return-type-hints nil + "Whether to show closure return type inlay hints for closures +with block bodies." + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-display-parameter-hints nil + "Whether to show function parameter name inlay hints at the call site." + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "6.2.2")) + +(defcustom lsp-rust-analyzer-display-reborrow-hints "never" + "Whether to show inlay type hints for compiler inserted reborrows." + :type '(choice + (const "always") + (const "never") + (const "mutable")) + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-binding-mode-hints nil + "Whether to show inlay type hints for binding modes." + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-closing-brace-hints t + "Whether to show inlay hints after a closing `}` to indicate what item it +belongs to." + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-closing-brace-hints-min-lines 25 + "Minimum number of lines required before the `}` until the hint is shown +\(set to 0 or 1 to always show them)." + :type 'integer + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-lru-capacity nil + "Number of syntax trees rust-analyzer keeps in memory." + :type 'integer + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "6.2.2")) + +(defcustom lsp-rust-analyzer-cargo-target nil + "Compilation target (target triple)." + :type '(choice + (string :tag "Target") + (const :tag "None" nil)) + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-rust-analyzer-cargo-watch-enable t + "Enable Cargo watch." + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "6.2.2")) + +(defcustom lsp-rust-analyzer-cargo-watch-command "check" + "Cargo watch command." + :type 'string + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "6.2.2")) + +(defcustom lsp-rust-analyzer-cargo-watch-args [] + "Extra arguments for `cargo check`." + :type 'lsp-string-vector + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "6.2.2")) + +(defcustom lsp-rust-analyzer-cargo-override-command [] + "Advanced option, fully override the command rust-analyzer uses for checking. +The command should include `--message=format=json` or similar option." + :type 'lsp-string-vector + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "6.2.2")) + +(defcustom lsp-rust-analyzer-check-all-targets t + "Enables --all-targets for `cargo check`." + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.2")) + +(defcustom lsp-rust-analyzer-checkonsave-features [] + "List of features to activate. +Set this to `\"all\"` to pass `--all-features` to cargo." + :type 'lsp-string-vector + :group 'lsp-rust-rust-analyzer + :package-version '(lsp-mode . "8.0.2")) + +(defcustom lsp-rust-analyzer-cargo-unset-test [] + "force rust-analyzer to unset `#[cfg(test)]` for the specified crates." + :type 'lsp-string-vector + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-use-client-watching t + "Use client watching" + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "6.2.2")) + +(defcustom lsp-rust-analyzer-exclude-globs [] + "Exclude globs" + :type 'lsp-string-vector + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "6.2.2")) + +(defcustom lsp-rust-analyzer-exclude-dirs [] + "These directories will be ignored by rust-analyzer." + :type 'lsp-string-vector + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-rust-analyzer-macro-expansion-method 'lsp-rust-analyzer-macro-expansion-default + "Use a different function if you want formatted macro expansion results and +syntax highlighting." + :type 'function + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "6.2.2")) + +(defcustom lsp-rust-analyzer-diagnostics-enable t + "Whether to show native rust-analyzer diagnostics." + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "6.3.2")) + +(defcustom lsp-rust-analyzer-diagnostics-enable-experimental nil + "Whether to show native rust-analyzer diagnostics that are still experimental +\(might have more false positives than usual)." + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-rust-analyzer-diagnostics-disabled [] + "List of native rust-analyzer diagnostics to disable." + :type 'lsp-string-vector + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-rust-analyzer-diagnostics-warnings-as-hint [] + "List of warnings that should be displayed with hint severity." + :type 'lsp-string-vector + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-rust-analyzer-diagnostics-warnings-as-info [] + "List of warnings that should be displayed with info severity." + :type 'lsp-string-vector + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.0")) + +(define-obsolete-variable-alias + 'lsp-rust-analyzer-cargo-load-out-dirs-from-check + 'lsp-rust-analyzer-cargo-run-build-scripts + "8.0.0") + +(defcustom lsp-rust-analyzer-cargo-run-build-scripts t + "Whether to run build scripts (`build.rs`) for more precise code analysis." + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-rust-analyzer-rustfmt-extra-args [] + "Additional arguments to rustfmt." + :type 'lsp-string-vector + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "6.3.2")) + +(defcustom lsp-rust-analyzer-rustfmt-override-command [] + "Advanced option, fully override the command rust-analyzer uses +for formatting." + :type 'lsp-string-vector + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "6.3.2")) + +(defcustom lsp-rust-analyzer-rustfmt-rangeformatting-enable nil + "Enables the use of rustfmt's unstable range formatting command for the +`textDocument/rangeFormatting` request. The rustfmt option is unstable and only +available on a nightly build." + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-completion-add-call-parenthesis t + "Whether to add parenthesis when completing functions." + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "6.3.2")) + +(defcustom lsp-rust-analyzer-completion-add-call-argument-snippets t + "Whether to add argument snippets when completing functions." + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "6.3.2")) + +(defcustom lsp-rust-analyzer-completion-postfix-enable t + "Whether to show postfix snippets like `dbg`, `if`, `not`, etc." + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "6.3.2")) + +(defcustom lsp-rust-analyzer-call-info-full t + "Whether to show function name and docs in parameter hints." + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "6.3.2")) + +(defcustom lsp-rust-analyzer-proc-macro-enable t + "Enable Proc macro support. +Implies `lsp-rust-analyzer-cargo-run-build-scripts'" + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "6.3.2")) + +(defcustom lsp-rust-analyzer-import-prefix "plain" + "The path structure for newly inserted paths to use. +Valid values are: + - \"plain\": Insert import paths relative to the current module, using up to +one `super' prefix if the parent module contains the requested item. + - \"by_self\": Prefix all import paths with `self' if they don't begin with +`self', `super', `crate' or a crate name. + - \"by_crate\": Force import paths to be absolute by always starting +them with `crate' or the crate name they refer to." + :type '(choice + (const "plain") + (const "by_self") + (const "by_crate")) + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-rust-analyzer-import-granularity "crate" + "How imports should be grouped into use statements." + :type '(choice + (const "crate" :doc "Merge imports from the same crate into a single use statement. This kind of nesting is only supported in Rust versions later than 1.24.") + (const "module" :doc "Merge imports from the same module into a single use statement.") + (const "item" :doc "Don’t merge imports at all, creating one import per item.") + (const "preserve" :doc "Do not change the granularity of any imports. For auto-import this has the same effect as `\"item\"'")) + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-rust-analyzer-cargo-auto-reload t + "Automatically refresh project info via `cargo metadata' on `Cargo.toml' changes." + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-rust-analyzer-use-rustc-wrapper-for-build-scripts t + "Use `RUSTC_WRAPPER=rust-analyzer' when running build scripts to avoid +compiling unnecessary things." + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-rust-analyzer-completion-auto-import-enable t + "Toggles the additional completions that automatically add imports when +completed. `lsp-completion-enable-additional-text-edit' must be non-nil + for this feature to be fully enabled." + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-rust-analyzer-completion-auto-self-enable t + "Toggles the additional completions that automatically show method calls +and field accesses with self prefixed to them when inside a method." + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-rust-analyzer-import-enforce-granularity nil + "Whether to enforce the import granularity setting for all files. + If set to nil rust-analyzer will try to keep import styles consistent per file." + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-rust-analyzer-imports-merge-glob t + "Whether to allow import insertion to merge new imports into single path +glob imports like `use std::fmt::*;`." + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-import-group t + "Group inserted imports by the following order: +https://rust-analyzer.github.io/manual.html#auto-import. + Groups are separated by newlines." + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-rust-analyzer-highlighting-strings t + "Use semantic tokens for strings." + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-rust-analyzer-rustc-source nil + "Path to the Cargo.toml of the rust compiler workspace." + :type '(choice + (file :tag "Path") + (const :tag "None" nil)) + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-rust-analyzer-linked-projects [] + "Disable project auto-discovery in favor of explicitly specified set of +projects. Elements must be paths pointing to `Cargo.toml`, `rust-project.json`, +or JSON objects in `rust-project.json` format." + :type 'lsp-string-vector + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-experimental-proc-attr-macros t + "Whether to enable experimental support for expanding proc macro attributes." + :type 'boolean + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.0")) + +(defconst lsp-rust-notification-handlers + '(("rust-analyzer/publishDecorations" . (lambda (_w _p))))) + +(defconst lsp-rust-action-handlers + '()) + +(define-derived-mode lsp-rust-analyzer-syntax-tree-mode special-mode "Rust-Analyzer-Syntax-Tree" + "Mode for the rust-analyzer syntax tree buffer.") + +(defun lsp-rust-analyzer-syntax-tree () + "Display syntax tree for current buffer." + (interactive) + (-let* ((root (lsp-workspace-root default-directory)) + (params (lsp-make-rust-analyzer-syntax-tree-params + :text-document (lsp--text-document-identifier) + :range? (if (use-region-p) + (lsp--region-to-range (region-beginning) (region-end)) + (lsp--region-to-range (point-min) (point-max))))) + (results (lsp-send-request (lsp-make-request + "rust-analyzer/syntaxTree" + params)))) + (let ((buf (get-buffer-create (format "*rust-analyzer syntax tree %s*" root))) + (inhibit-read-only t)) + (with-current-buffer buf + (lsp-rust-analyzer-syntax-tree-mode) + (erase-buffer) + (insert results) + (goto-char (point-min))) + (pop-to-buffer buf)))) + +(define-derived-mode lsp-rust-analyzer-status-mode special-mode "Rust-Analyzer-Status" + "Mode for the rust-analyzer status buffer.") + +(defun lsp-rust-analyzer-status () + "Displays status information for rust-analyzer." + (interactive) + (-let* ((root (lsp-workspace-root default-directory)) + (params (lsp-make-rust-analyzer-analyzer-status-params + :text-document (lsp--text-document-identifier))) + (results (lsp-send-request (lsp-make-request + "rust-analyzer/analyzerStatus" + params)))) + (let ((buf (get-buffer-create (format "*rust-analyzer status %s*" root))) + (inhibit-read-only t)) + (with-current-buffer buf + (lsp-rust-analyzer-status-mode) + (erase-buffer) + (insert results) + (pop-to-buffer buf))))) + +(defun lsp-rust-analyzer-view-item-tree () + "Show item tree of rust file." + (interactive) + (-let* ((params (lsp-make-rust-analyzer-view-item-tree + :text-document (lsp--text-document-identifier))) + (results (lsp-send-request (lsp-make-request + "rust-analyzer/viewItemTree" + params)))) + (let ((buf (get-buffer-create "*rust-analyzer item tree*")) + (inhibit-read-only t)) + (with-current-buffer buf + (special-mode) + (erase-buffer) + (insert (lsp--render-string results "rust")) + (pop-to-buffer buf))))) + +(defun lsp-rust-analyzer-view-hir () + "View Hir of function at point." + (interactive) + (-let* ((params (lsp-make-rust-analyzer-expand-macro-params + :text-document (lsp--text-document-identifier) + :position (lsp--cur-position))) + (results (lsp-send-request (lsp-make-request + "rust-analyzer/viewHir" + params)))) + (let ((buf (get-buffer-create "*rust-analyzer hir*")) + (inhibit-read-only t)) + (with-current-buffer buf + (special-mode) + (erase-buffer) + (insert results) + (pop-to-buffer buf))))) + +(defun lsp-rust-analyzer-join-lines () + "Join selected lines into one, smartly fixing up whitespace and trailing commas." + (interactive) + (let* ((params (lsp-make-rust-analyzer-join-lines-params + :text-document (lsp--text-document-identifier) + :ranges (vector (if (use-region-p) + (lsp--region-to-range (region-beginning) (region-end)) + (lsp--region-to-range (point) (point)))))) + (result (lsp-send-request (lsp-make-request "experimental/joinLines" params)))) + (lsp--apply-text-edits result 'code-action))) + +(defun lsp-rust-analyzer-reload-workspace () + "Reload workspace, picking up changes from Cargo.toml" + (interactive) + (lsp--cur-workspace-check) + (lsp-send-request (lsp-make-request "rust-analyzer/reloadWorkspace"))) + +(defcustom lsp-rust-analyzer-download-url + (format "https://github.com/rust-lang/rust-analyzer/releases/latest/download/%s" + (pcase system-type + ('gnu/linux "rust-analyzer-x86_64-unknown-linux-gnu.gz") + ('darwin (if (string-match "^aarch64-.*" system-configuration) + "rust-analyzer-aarch64-apple-darwin.gz" + "rust-analyzer-x86_64-apple-darwin.gz")) + ('windows-nt "rust-analyzer-x86_64-pc-windows-msvc.gz"))) + "Automatic download url for Rust Analyzer" + :type 'string + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-rust-analyzer-store-path (f-join lsp-server-install-dir + "rust" + (if (eq system-type 'windows-nt) + "rust-analyzer.exe" + "rust-analyzer")) + "The path to the file in which `rust-analyzer' will be stored." + :type 'file + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.0")) + +(lsp-dependency + 'rust-analyzer + `(:download :url lsp-rust-analyzer-download-url + :decompress :gzip + :store-path lsp-rust-analyzer-store-path + :set-executable? t) + '(:system "rust-analyzer")) + +(lsp-defun lsp-rust--analyzer-run-single ((&Command :arguments?)) + (lsp-rust-analyzer-run (lsp-seq-first arguments?))) + +(lsp-defun lsp-rust--analyzer-show-references + ((&Command :title :arguments? [_uri _filepos references])) + (lsp-show-xrefs (lsp--locations-to-xref-items references) nil + (s-contains-p "reference" title))) + +(declare-function dap-debug "ext:dap-mode" (template) t) + +(lsp-defun lsp-rust--analyzer-debug-lens ((&Command :arguments? [args])) + (lsp-rust-analyzer-debug args)) + +;; Semantic tokens + +;; Modifier faces +(defface lsp-rust-analyzer-documentation-modifier-face + '((t nil)) + "The face modification to use for documentation items." + :group 'lsp-rust-analyzer-semantic-tokens) + +(defface lsp-rust-analyzer-declaration-modifier-face + '((t nil)) + "The face modification to use for declaration items." + :group 'lsp-rust-analyzer-semantic-tokens) + +(defface lsp-rust-analyzer-definition-modifier-face + '((t nil)) + "The face modification to use for definition items." + :group 'lsp-rust-analyzer-semantic-tokens) + +(defface lsp-rust-analyzer-static-modifier-face + '((t nil)) + "The face modification to use for static items." + :group 'lsp-rust-analyzer-semantic-tokens) + +(defface lsp-rust-analyzer-abstract-modifier-face + '((t nil)) + "The face modification to use for abstract items." + :group 'lsp-rust-analyzer-semantic-tokens) + +(defface lsp-rust-analyzer-deprecated-modifier-face + '((t nil)) + "The face modification to use for deprecated items." + :group 'lsp-rust-analyzer-semantic-tokens) + +(defface lsp-rust-analyzer-readonly-modifier-face + '((t nil)) + "The face modification to use for readonly items." + :group 'lsp-rust-analyzer-semantic-tokens) + +(defface lsp-rust-analyzer-default-library-modifier-face + '((t nil)) + "The face modification to use for default-library items." + :group 'lsp-rust-analyzer-semantic-tokens) + +(defface lsp-rust-analyzer-async-modifier-face + '((t nil)) + "The face modification to use for async items." + :group 'lsp-rust-analyzer-semantic-tokens) + +(defface lsp-rust-analyzer-attribute-modifier-face + '((t nil)) + "The face modification to use for attribute items." + :group 'lsp-rust-analyzer-semantic-tokens) + +(defface lsp-rust-analyzer-callable-modifier-face + '((t nil)) + "The face modification to use for callable items." + :group 'lsp-rust-analyzer-semantic-tokens) + +(defface lsp-rust-analyzer-constant-modifier-face + '((t nil)) + "The face modification to use for constant items." + :group 'lsp-rust-analyzer-semantic-tokens) + +(defface lsp-rust-analyzer-consuming-modifier-face + '((t nil)) + "The face modification to use for consuming items." + :group 'lsp-rust-analyzer-semantic-tokens) + +(defface lsp-rust-analyzer-control-flow-modifier-face + '((t nil)) + "The face modification to use for control-flow items." + :group 'lsp-rust-analyzer-semantic-tokens) + +(defface lsp-rust-analyzer-crate-root-modifier-face + '((t nil)) + "The face modification to use for crate-root items." + :group 'lsp-rust-analyzer-semantic-tokens) + +(defface lsp-rust-analyzer-injected-modifier-face + '((t nil)) + "The face modification to use for injected items." + :group 'lsp-rust-analyzer-semantic-tokens) + +(defface lsp-rust-analyzer-intra-doc-link-modifier-face + '((t nil)) + "The face modification to use for intra-doc-link items.") + :group 'lsp-rust-analyzer-semantic-tokens + +(defface lsp-rust-analyzer-library-modifier-face + '((t nil)) + "The face modification to use for library items." + :group 'lsp-rust-analyzer-semantic-tokens) + +(defface lsp-rust-analyzer-mutable-modifier-face + '((t :underline t)) + "The face modification to use for mutable items." + :group 'lsp-rust-analyzer-semantic-tokens) + +(defface lsp-rust-analyzer-public-modifier-face + '((t nil)) + "The face modification to use for public items." + :group 'lsp-rust-analyzer-semantic-tokens) + +(defface lsp-rust-analyzer-reference-modifier-face + '((t :bold t)) + "The face modification to use for reference items." + :group 'lsp-rust-analyzer-semantic-tokens) + +(defface lsp-rust-analyzer-trait-modifier-face + '((t nil)) + "The face modification to use for trait items." + :group 'lsp-rust-analyzer-semantic-tokens) + +(defface lsp-rust-analyzer-unsafe-modifier-face + '((t nil)) + "The face modification to use for unsafe items." + :group 'lsp-rust-analyzer-semantic-tokens) + + +;; --------------------------------------------------------------------- +;; Semantic token modifier face customization + +(defcustom lsp-rust-analyzer-documentation-modifier 'lsp-rust-analyzer-documentation-modifier-face + "Face for semantic token modifier for `documentation' attribute." + :type 'face + :group 'lsp-rust-analyzer-semantic-tokens + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-declaration-modifier 'lsp-rust-analyzer-declaration-modifier-face + "Face for semantic token modifier for `declaration' attribute." + :type 'face + :group 'lsp-rust-analyzer-semantic-tokens + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-definition-modifier 'lsp-rust-analyzer-definition-modifier-face + "Face for semantic token modifier for `definition' attribute." + :type 'face + :group 'lsp-rust-analyzer-semantic-tokens + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-static-modifier 'lsp-rust-analyzer-static-modifier-face + "Face for semantic token modifier for `static' attribute." + :type 'face + :group 'lsp-rust-analyzer-semantic-tokens + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-abstract-modifier 'lsp-rust-analyzer-abstract-modifier-face + "Face for semantic token modifier for `abstract' attribute." + :type 'face + :group 'lsp-rust-analyzer-semantic-tokens + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-deprecated-modifier 'lsp-rust-analyzer-deprecated-modifier-face + "Face for semantic token modifier for `deprecated' attribute." + :type 'face + :group 'lsp-rust-analyzer-semantic-tokens + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-readonly-modifier 'lsp-rust-analyzer-readonly-modifier-face + "Face for semantic token modifier for `readonly' attribute." + :type 'face + :group 'lsp-rust-analyzer-semantic-tokens + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-default-library-modifier 'lsp-rust-analyzer-default-library-modifier-face + "Face for semantic token modifier for `default' attribute." + :type 'face + :group 'lsp-rust-analyzer-semantic-tokens + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-async-modifier 'lsp-rust-analyzer-async-modifier-face + "Face for semantic token modifier for `async' attribute." + :type 'face + :group 'lsp-rust-analyzer-semantic-tokens + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-attribute-modifier 'lsp-rust-analyzer-attribute-modifier-face + "Face for semantic token modifier for `attribute' attribute." + :type 'face + :group 'lsp-rust-analyzer-semantic-tokens + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-callable-modifier 'lsp-rust-analyzer-callable-modifier-face + "Face for semantic token modifier for `callable' attribute." + :type 'face + :group 'lsp-rust-analyzer-semantic-tokens + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-constant-modifier 'lsp-rust-analyzer-constant-modifier-face + "Face for semantic token modifier for `constant' attribute." + :type 'face + :group 'lsp-rust-analyzer-semantic-tokens + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-consuming-modifier 'lsp-rust-analyzer-consuming-modifier-face + "Face for semantic token modifier for `consuming' attribute." + :type 'face + :group 'lsp-rust-analyzer-semantic-tokens + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-control-flow-modifier 'lsp-rust-analyzer-control-flow-modifier-face + "Face for semantic token modifier for `control_flow' attribute." + :type 'face + :group 'lsp-rust-analyzer-semantic-tokens + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-crate-root-modifier 'lsp-rust-analyzer-crate-root-modifier-face + "Face for semantic token modifier for `crate_root' attribute." + :type 'face + :group 'lsp-rust-analyzer-semantic-tokens + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-injected-modifier 'lsp-rust-analyzer-injected-modifier-face + "Face for semantic token modifier for `injected' attribute." + :type 'face + :group 'lsp-rust-analyzer-semantic-tokens + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-intra-doc-link-modifier 'lsp-rust-analyzer-intra-doc-link-modifier-face + "Face for semantic token modifier for `intra_doc_link' attribute." + :type 'face + :group 'lsp-rust-analyzer-semantic-tokens + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-library-modifier 'lsp-rust-analyzer-library-modifier-face + "Face for semantic token modifier for `library' attribute." + :type 'face + :group 'lsp-rust-analyzer-semantic-tokens + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-mutable-modifier 'lsp-rust-analyzer-mutable-modifier-face + "Face for semantic token modifier for `mutable' attribute." + :type 'face + :group 'lsp-rust-analyzer-semantic-tokens + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-public-modifier 'lsp-rust-analyzer-public-modifier-face + "Face for semantic token modifier for `public' attribute." + :type 'face + :group 'lsp-rust-analyzer-semantic-tokens + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-reference-modifier 'lsp-rust-analyzer-reference-modifier-face + "Face for semantic token modifier for `reference' attribute." + :type 'face + :group 'lsp-rust-analyzer-semantic-tokens + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-trait-modifier 'lsp-rust-analyzer-trait-modifier-face + "Face for semantic token modifier for `trait' attribute." + :type 'face + :group 'lsp-rust-analyzer-semantic-tokens + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-unsafe-modifier 'lsp-rust-analyzer-unsafe-modifier-face + "Face for semantic token modifier for `unsafe' attribute." + :type 'face + :group 'lsp-rust-analyzer-semantic-tokens + :package-version '(lsp-mode . "8.0.1")) + +;; --------------------------------------------------------------------- + + +(defun lsp-rust-analyzer--semantic-modifiers () + "Mapping between rust-analyzer keywords and fonts to apply. +The keywords are sent in the initialize response, in the semantic +tokens legend." + `( + ("documentation" . ,lsp-rust-analyzer-documentation-modifier) + ("declaration" . ,lsp-rust-analyzer-declaration-modifier) + ("definition" . ,lsp-rust-analyzer-definition-modifier) + ("static" . ,lsp-rust-analyzer-static-modifier) + ("abstract" . ,lsp-rust-analyzer-abstract-modifier) + ("deprecated" . ,lsp-rust-analyzer-deprecated-modifier) + ("readonly" . ,lsp-rust-analyzer-readonly-modifier) + ("default_library" . ,lsp-rust-analyzer-default-library-modifier) + ("async" . ,lsp-rust-analyzer-async-modifier) + ("attribute" . ,lsp-rust-analyzer-attribute-modifier) + ("callable" . ,lsp-rust-analyzer-callable-modifier) + ("constant" . ,lsp-rust-analyzer-constant-modifier) + ("consuming" . ,lsp-rust-analyzer-consuming-modifier) + ("control_flow" . ,lsp-rust-analyzer-control-flow-modifier) + ("crate_root" . ,lsp-rust-analyzer-crate-root-modifier) + ("injected" . ,lsp-rust-analyzer-injected-modifier) + ("intra_doc_link" . ,lsp-rust-analyzer-intra-doc-link-modifier) + ("library" . ,lsp-rust-analyzer-library-modifier) + ("mutable" . ,lsp-rust-analyzer-mutable-modifier) + ("public" . ,lsp-rust-analyzer-public-modifier) + ("reference" . ,lsp-rust-analyzer-reference-modifier) + ("trait" . ,lsp-rust-analyzer-trait-modifier) + ("unsafe" . ,lsp-rust-analyzer-unsafe-modifier))) + +(defun lsp-rust-switch-server (&optional lsp-server) + "Switch priorities of lsp servers, unless LSP-SERVER is already active." + (interactive) + (let ((current-server (if (> (lsp--client-priority (gethash 'rls lsp-clients)) 0) + 'rls + 'rust-analyzer))) + (unless (eq lsp-server current-server) + (dolist (server '(rls rust-analyzer)) + (when (natnump (setf (lsp--client-priority (gethash server lsp-clients)) + (* (lsp--client-priority (gethash server lsp-clients)) -1))) + (message (format "Switched to server %s." server))))))) + +;; inlay hints + +(defcustom lsp-rust-analyzer-debug-lens-extra-dap-args + '(:MIMode "gdb" :miDebuggerPath "gdb" :stopAtEntry t :externalConsole :json-false) + "Extra arguments to pass to DAP template when debugging a test from code lens. + +As a rule of the thumb, do not add extra keys to this plist unless you exactly +what you are doing, it might break the \"Debug test\" lens otherwise. + +See dap-mode documentation and cpptools documentation for the extra variables +meaning." + :type 'plist + :group 'lsp-rust-analyzer + :package-version '(lsp-mode . "8.0.0")) + +;; lenses + +(defgroup lsp-rust-analyzer-lens nil + "LSP lens support for Rust when using rust-analyzer. + +Lenses are (depending on your configuration) clickable links to +the right of function definitions and the like. These display +some useful information in their own right and/or perform a +shortcut action when clicked such as displaying uses of that +function or running an individual test. +" + :prefix "lsp-rust-analyzer-lens-" + :group 'lsp-rust-analyzer + :link '(url-link "https://emacs-lsp.github.io/lsp-mode/") + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-lens-debug-enable t + "Enable or disable the Debug lens." + :type 'boolean + :group 'lsp-rust-analyzer-lens + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-lens-enable t + "Master-enable of lenses in Rust files." + :type 'boolean + :group 'lsp-rust-analyzer-lens + :package-version '(lsp-mode . "8.0.1")) + +;; This customisation "works" in that it works as described, but the default is fine and changing it +;; from the default will either stop lenses working or do nothing. +;; +;; If this is ever uncommented to re-enable the option, don't forget to also uncomment it in defun +;; lsp-rust-analyzer--make-init-options too or it'll not do anything. + +;; (defcustom lsp-rust-analyzer-lens-force-custom-commands t +;; "Internal config: use custom client-side commands even when the +;; client doesn't set the corresponding capability." +;; :type 'boolean +;; :group 'lsp-rust-analyzer-lens +;; :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-lens-implementations-enable t + "Enable or disable the Implementations lens. + +The Implementations lens shows `NN implementations' to the right +of the first line of an enum, struct, or union declaration. This +is the count of impl blocks, including derived traits. Clicking +on it gives a list of the impls of that type. +" + :type 'boolean + :group 'lsp-rust-analyzer-lens + :package-version '(lsp-mode . "8.0.1")) + +;; The valid range of values for this is documented in the rust-lang/rust-analyzer repository at the +;; path "editors/code/package.json"; the TL:DR is that it's "above_name" or "above_whole_item". +;; However, setting it to "above_whole_item" causes lenses to disappear in Emacs. I suspect this +;; feature has only ever been tested in some other IDE and it's broken in Emacs. So I've disabled it +;; for now. +;; +;; If this is ever uncommented to re-enable the option, don't forget to also uncomment it in defun +;; lsp-rust-analyzer--make-init-options too or it'll not do anything. + +;; (defcustom lsp-rust-analyzer-lens-location "above_name" +;; "Where to render annotations." +;; :type '(choice +;; (const :tag "Above name" "above_name") +;; (const :tag "Above whole item" "above_whole_item") +;; :group 'lsp-rust-analyzer-lens +;; :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-lens-references-adt-enable nil + "Enable or disable the References lens on enums, structs, and traits. + +The References lens shows `NN references` to the right of the +first line of each enum, struct, or union declaration. This is +the count of uses of that type. Clicking on it gives a list of +where that type is used." + :type 'boolean + :group 'lsp-rust-analyzer-lens + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-lens-references-enum-variant-enable nil + "Enable or disable the References lens on enum variants. + +The References lens shows `NN references` to the right of the +first (or only) line of each enum variant. This is the count of +uses of that enum variant. Clicking on it gives a list of where +that enum variant is used." + :type 'boolean + :group 'lsp-rust-analyzer-lens + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-lens-references-method-enable nil + "Enable or disable the References lens on functions. + +The References lens shows `NN references` to the right of the +first line of each function declaration. This is the count of +uses of that function. Clicking on it gives a list of where that +function is used." + + :type 'boolean + :group 'lsp-rust-analyzer-lens + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-lens-references-trait-enable nil + "Enable or disable the References lens on traits. + +The References lens shows `NN references` to the right of the +first line of each trait declaration. This is a count of uses of +that trait. Clicking on it gives a list of where that trait is +used. + +There is some overlap with the Implementations lens which slows +all of the trait's impl blocks, but this also shows other uses +such as imports and dyn traits." + :type 'boolean + :group 'lsp-rust-analyzer-lens + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-rust-analyzer-lens-run-enable t + "Enable or disable the Run lens." + :type 'boolean + :group 'lsp-rust-analyzer-lens + :package-version '(lsp-mode . "8.0.1")) + +(defun lsp-rust-analyzer-initialized? () + (when-let ((workspace (lsp-find-workspace 'rust-analyzer (buffer-file-name)))) + (eq 'initialized (lsp--workspace-status workspace)))) + +(defun lsp-rust-analyzer-expand-macro () + "Expands the macro call at point recursively." + (interactive) + (-if-let* ((params (lsp-make-rust-analyzer-expand-macro-params + :text-document (lsp--text-document-identifier) + :position (lsp--cur-position))) + (response (lsp-request + "rust-analyzer/expandMacro" + params)) + ((&rust-analyzer:ExpandedMacro :expansion) response)) + (funcall lsp-rust-analyzer-macro-expansion-method expansion) + (lsp--error "No macro found at point, or it could not be expanded."))) + +(defun lsp-rust-analyzer-macro-expansion-default (result) + "Default method for displaying macro expansion." + (let* ((root (lsp-workspace-root default-directory)) + (buf (get-buffer-create (get-buffer-create (format "*rust-analyzer macro expansion %s*" root))))) + (with-current-buffer buf + (let ((inhibit-read-only t)) + (erase-buffer) + (insert (lsp--render-string result "rust")) + (special-mode))) + (pop-to-buffer buf))) + +;; runnables +(defvar lsp-rust-analyzer--last-runnable nil) + +(defun lsp-rust-analyzer--runnables () + (lsp-send-request (lsp-make-request + "experimental/runnables" + (lsp-make-rust-analyzer-runnables-params + :text-document (lsp--text-document-identifier) + :position? (lsp--cur-position))))) + +(defun lsp-rust-analyzer--select-runnable () + (lsp--completing-read + "Select runnable:" + (if lsp-rust-analyzer--last-runnable + (cons lsp-rust-analyzer--last-runnable + (-remove (-lambda ((&rust-analyzer:Runnable :label)) + (equal label (lsp-get lsp-rust-analyzer--last-runnable :label))) + (lsp-rust-analyzer--runnables))) + (lsp-rust-analyzer--runnables)) + (-lambda ((&rust-analyzer:Runnable :label)) label))) + + +(defun lsp-rust-analyzer--common-runner (runnable) + "Execute a given RUNNABLE. + +Extract the arguments, prepare the minor mode (cargo-process-mode if possible) +and run a compilation" + (-let* (((&rust-analyzer:Runnable :kind :label :args) runnable) + ((&rust-analyzer:RunnableArgs :cargo-args :executable-args :workspace-root? :expect-test?) args) + (default-directory (or workspace-root? default-directory))) + (if (not (string-equal kind "cargo")) + (lsp--error "'%s' runnable is not supported" kind) + (compilation-start + (string-join (append (when expect-test? '("env" "UPDATE_EXPECT=1")) + (list "cargo") cargo-args + (when executable-args '("--")) executable-args '()) " ") + + ;; cargo-process-mode is nice, but try to work without it... + (if (functionp 'cargo-process-mode) 'cargo-process-mode nil) + (lambda (_) (concat "*" label "*")))))) + + +(defun lsp-rust-analyzer-run (runnable) + "Select and run a RUNNABLE action." + (interactive (list (lsp-rust-analyzer--select-runnable))) + (when (lsp-rust-analyzer--common-runner runnable) + (setq lsp-rust-analyzer--last-runnable runnable))) + +(defun lsp-rust-analyzer-debug (runnable) + "Select and debug a RUNNABLE action." + (interactive (list (lsp-rust-analyzer--select-runnable))) + (unless (featurep 'dap-cpptools) + (user-error "You must require `dap-cpptools'")) + (-let (((&rust-analyzer:Runnable + :args (&rust-analyzer:RunnableArgs :cargo-args :workspace-root? :executable-args) + :label) runnable)) + (pcase (aref cargo-args 0) + ("run" (aset cargo-args 0 "build")) + ("test" (when (-contains? (append cargo-args ()) "--no-run") + (cl-callf append cargo-args (list "--no-run"))))) + (->> (append (list (executable-find "cargo")) + cargo-args + (list "--message-format=json")) + (s-join " ") + (shell-command-to-string) + (s-lines) + (-keep (lambda (s) + (condition-case nil + (-let* ((json-object-type 'plist) + ((msg &as &plist :reason :executable) (json-read-from-string s))) + (when (and executable (string= "compiler-artifact" reason)) + executable)) + (error)))) + (funcall + (lambda (artifact-spec) + (pcase artifact-spec + (`() (user-error "No compilation artifacts or obtaining the runnable artifacts failed")) + (`(,spec) spec) + (_ (user-error "Multiple compilation artifacts are not supported"))))) + (list :type "cppdbg" + :request "launch" + :name label + :args executable-args + :cwd workspace-root? + :sourceLanguages ["rust"] + :program) + (append lsp-rust-analyzer-debug-lens-extra-dap-args) + (dap-debug)))) + +(defun lsp-rust-analyzer-rerun (&optional runnable) + (interactive (list (or lsp-rust-analyzer--last-runnable + (lsp-rust-analyzer--select-runnable)))) + (lsp-rust-analyzer-run (or runnable lsp-rust-analyzer--last-runnable))) + +;; goto parent module +(cl-defun lsp-rust-find-parent-module (&key display-action) + "Find parent module of current module." + (interactive) + (lsp-find-locations "experimental/parentModule" nil :display-action display-action)) + +(defun lsp-rust-analyzer-open-cargo-toml (&optional new-window) + "Open the closest Cargo.toml from the current file. + +Rust-Analyzer LSP protocol documented here and added in November 2020 +https://github.com/rust-lang/rust-analyzer/blob/master/docs/dev/lsp-extensions.md#open-cargotoml + +If NEW-WINDOW (interactively the prefix argument) is non-nil, +open in a new window." + (interactive "P") + (-if-let (workspace (lsp-find-workspace 'rust-analyzer (buffer-file-name))) + (-if-let* ((response (with-lsp-workspace workspace + (lsp-send-request (lsp-make-request + "experimental/openCargoToml" + (lsp-make-rust-analyzer-open-cargo-toml-params + :text-document (lsp--text-document-identifier)))))) + ((&Location :uri :range) response)) + (funcall (if new-window #'find-file-other-window #'find-file) + (lsp--uri-to-path uri)) + (lsp--warn "Couldn't find a Cargo.toml file or your version of rust-analyzer doesn't support this extension")) + (lsp--error "OpenCargoToml is an extension available only with rust-analyzer"))) + +(defun lsp-rust-analyzer-open-external-docs () + "Open a URL for documentation related to the current TextDocumentPosition. + +Rust-Analyzer LSP protocol documented here +https://github.com/rust-lang/rust-analyzer/blob/master/docs/dev/lsp-extensions.md#open-external-documentation" + (interactive) + (-if-let* ((params (lsp-make-rust-analyzer-open-external-docs-params + :text-document (lsp--text-document-identifier) + :position (lsp--cur-position))) + (url (lsp-request "experimental/externalDocs" params))) + (browse-url url) + (lsp--warn "Couldn't find documentation URL or your version of rust-analyzer doesn't support this extension"))) + +(defun lsp-rust-analyzer--related-tests () + "Get runnable test items related to the current TextDocumentPosition. +Calls a rust-analyzer LSP extension endpoint that returns a wrapper over +Runnable[]." + (lsp-send-request (lsp-make-request + "rust-analyzer/relatedTests" + (lsp--text-document-position-params)))) + +(defun lsp-rust-analyzer--select-related-test () + "Call the endpoint and ask for user selection. + +Cannot reuse `lsp-rust-analyzer--select-runnable' because the runnables endpoint +responds with Runnable[], while relatedTests responds with TestInfo[], +which is a wrapper over runnable. Also, this method doesn't set +the `lsp-rust-analyzer--last-runnable' variable." + (-if-let* ((resp (lsp-rust-analyzer--related-tests)) + (runnables (seq-map + #'lsp:rust-analyzer-related-tests-runnable + resp))) + (lsp--completing-read + "Select test: " + runnables + #'lsp:rust-analyzer-runnable-label))) + +(defun lsp-rust-analyzer-related-tests (runnable) + "Execute a RUNNABLE test related to the current document position. + +Rust-Analyzer LSP protocol extension +https://github.com/rust-lang/rust-analyzer/blob/master/docs/dev/lsp-extensions.md#related-tests" + (interactive (list (lsp-rust-analyzer--select-related-test))) + (if runnable + (lsp-rust-analyzer--common-runner runnable) + (lsp--info "There are no tests related to the symbol at point"))) + +(defun lsp-rust-analyzer-move-item (direction) + "Move item under cursor or selection in some DIRECTION" + (let* ((params (lsp-make-rust-analyzer-move-item-params + :text-document (lsp--text-document-identifier) + :range (if (use-region-p) + (lsp--region-to-range (region-beginning) (region-end)) + (lsp--region-to-range (point) (point))) + :direction direction)) + (edits (lsp-request "experimental/moveItem" params))) + (lsp--apply-text-edits edits 'code-action))) + +(defun lsp-rust-analyzer-move-item-up () + "Move item under cursor or selection up" + (interactive) + (lsp-rust-analyzer-move-item "Up")) + +(defun lsp-rust-analyzer-move-item-down () + "Move item under cursor or selection down" + (interactive) + (lsp-rust-analyzer-move-item "Down")) + +(defun lsp-rust-analyzer--make-init-options () + "Init options for rust-analyzer" + `(:diagnostics (:enable ,(lsp-json-bool lsp-rust-analyzer-diagnostics-enable) + :enableExperimental ,(lsp-json-bool lsp-rust-analyzer-diagnostics-enable-experimental) + :disabled ,lsp-rust-analyzer-diagnostics-disabled + :warningsAsHint ,lsp-rust-analyzer-diagnostics-warnings-as-hint + :warningsAsInfo ,lsp-rust-analyzer-diagnostics-warnings-as-info) + :imports (:granularity (:enforce ,(lsp-json-bool lsp-rust-analyzer-import-enforce-granularity) + :group ,lsp-rust-analyzer-import-granularity) + :group ,(lsp-json-bool lsp-rust-analyzer-import-group) + :merge (:glob ,(lsp-json-bool lsp-rust-analyzer-imports-merge-glob)) + :prefix ,lsp-rust-analyzer-import-prefix) + :lruCapacity ,lsp-rust-analyzer-lru-capacity + :checkOnSave (:enable ,(lsp-json-bool lsp-rust-analyzer-cargo-watch-enable) + :command ,lsp-rust-analyzer-cargo-watch-command + :extraArgs ,lsp-rust-analyzer-cargo-watch-args + :allTargets ,(lsp-json-bool lsp-rust-analyzer-check-all-targets) + :features ,lsp-rust-analyzer-checkonsave-features + :overrideCommand ,lsp-rust-analyzer-cargo-override-command) + :highlightRelated (:breakPoints (:enable ,(lsp-json-bool lsp-rust-analyzer-highlight-breakpoints)) + :closureCaptures (:enable ,(lsp-json-bool lsp-rust-analyzer-highlight-closure-captures)) + :exitPoints (:enable ,(lsp-json-bool lsp-rust-analyzer-highlight-exit-points)) + :references (:enable ,(lsp-json-bool lsp-rust-analyzer-highlight-references)) + :yieldPoints (:enable ,(lsp-json-bool lsp-rust-analyzer-highlight-yield-points))) + :files (:exclude ,lsp-rust-analyzer-exclude-globs + :watcher ,(if lsp-rust-analyzer-use-client-watching "client" "notify") + :excludeDirs ,lsp-rust-analyzer-exclude-dirs) + :cargo (:allFeatures ,(lsp-json-bool lsp-rust-all-features) + :noDefaultFeatures ,(lsp-json-bool lsp-rust-no-default-features) + :features ,lsp-rust-features + :target ,lsp-rust-analyzer-cargo-target + :runBuildScripts ,(lsp-json-bool lsp-rust-analyzer-cargo-run-build-scripts) + ; Obsolete, but used by old Rust-Analyzer versions + :loadOutDirsFromCheck ,(lsp-json-bool lsp-rust-analyzer-cargo-run-build-scripts) + :autoreload ,(lsp-json-bool lsp-rust-analyzer-cargo-auto-reload) + :useRustcWrapperForBuildScripts ,(lsp-json-bool lsp-rust-analyzer-use-rustc-wrapper-for-build-scripts) + :unsetTest ,lsp-rust-analyzer-cargo-unset-test) + :rustfmt (:extraArgs ,lsp-rust-analyzer-rustfmt-extra-args + :overrideCommand ,lsp-rust-analyzer-rustfmt-override-command + :rangeFormatting (:enable ,(lsp-json-bool lsp-rust-analyzer-rustfmt-rangeformatting-enable))) + :lens (:debug (:enable ,(lsp-json-bool lsp-rust-analyzer-lens-debug-enable)) + :enable ,(lsp-json-bool lsp-rust-analyzer-lens-enable) + ;; :forceCustomCommands ,(lsp-json-bool lsp-rust-analyzer-lens-force-custom-commands) + :implementations (:enable ,(lsp-json-bool lsp-rust-analyzer-lens-implementations-enable)) + ;; :location ,lsp-rust-analyzer-lens-location + :references (:adt (:enable ,(lsp-json-bool lsp-rust-analyzer-lens-references-adt-enable)) + :enumVariant (:enable ,(lsp-json-bool lsp-rust-analyzer-lens-references-enum-variant-enable)) + :method (:enable ,(lsp-json-bool lsp-rust-analyzer-lens-references-method-enable)) + :trait (:enable ,(lsp-json-bool lsp-rust-analyzer-lens-references-trait-enable))) + :run (:enable ,(lsp-json-bool lsp-rust-analyzer-lens-run-enable))) + + :inlayHints (:bindingModeHints (:enable ,(lsp-json-bool lsp-rust-analyzer-binding-mode-hints)) + :chainingHints (:enable ,(lsp-json-bool lsp-rust-analyzer-display-chaining-hints)) + :closingBraceHints (:enable ,(lsp-json-bool lsp-rust-analyzer-closing-brace-hints) + :minLines ,lsp-rust-analyzer-closing-brace-hints-min-lines) + :closureCaptureHints (:enable ,(lsp-json-bool lsp-rust-analyzer-closure-capture-hints)) + :closureReturnTypeHints (:enable ,lsp-rust-analyzer-closure-return-type-hints) + :closureStyle ,lsp-rust-analyzer-closure-style + :discriminantHints (:enable ,lsp-rust-analyzer-discriminants-hints) + + :expressionAdjustmentHints (:enable ,lsp-rust-analyzer-expression-adjustment-hints + :hideOutsideUnsafe ,(lsp-json-bool lsp-rust-analyzer-expression-adjustment-hide-unsafe) + :mode ,lsp-rust-analyzer-expression-adjustment-hints-mode) + :implicitDrops (:enable ,(lsp-json-bool lsp-rust-analyzer-implicit-drops)) + :lifetimeElisionHints (:enable ,lsp-rust-analyzer-display-lifetime-elision-hints-enable + :useParameterNames ,(lsp-json-bool lsp-rust-analyzer-display-lifetime-elision-hints-use-parameter-names)) + :maxLength ,lsp-rust-analyzer-max-inlay-hint-length + :parameterHints (:enable ,(lsp-json-bool lsp-rust-analyzer-display-parameter-hints)) + :reborrowHints (:enable ,lsp-rust-analyzer-display-reborrow-hints) + :renderColons ,(lsp-json-bool lsp-rust-analyzer-server-format-inlay-hints) + :typeHints (:enable ,(lsp-json-bool lsp-inlay-hint-enable) + :hideClosureInitialization ,(lsp-json-bool lsp-rust-analyzer-hide-closure-initialization) + :hideNamedConstructor ,(lsp-json-bool lsp-rust-analyzer-hide-named-constructor)) + ) + :completion (:addCallParenthesis ,(lsp-json-bool lsp-rust-analyzer-completion-add-call-parenthesis) + :addCallArgumentSnippets ,(lsp-json-bool lsp-rust-analyzer-completion-add-call-argument-snippets) + :postfix (:enable ,(lsp-json-bool lsp-rust-analyzer-completion-postfix-enable)) + :autoimport (:enable ,(lsp-json-bool lsp-rust-analyzer-completion-auto-import-enable)) + :autoself (:enable ,(lsp-json-bool lsp-rust-analyzer-completion-auto-self-enable))) + :callInfo (:full ,(lsp-json-bool lsp-rust-analyzer-call-info-full)) + :procMacro (:enable ,(lsp-json-bool lsp-rust-analyzer-proc-macro-enable)) + :rustcSource ,lsp-rust-analyzer-rustc-source + :linkedProjects ,lsp-rust-analyzer-linked-projects + :highlighting (:strings ,(lsp-json-bool lsp-rust-analyzer-highlighting-strings)) + :experimental (:procAttrMacros ,(lsp-json-bool lsp-rust-analyzer-experimental-proc-attr-macros)))) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection + (lambda () + `(,(or (executable-find + (cl-first lsp-rust-analyzer-server-command)) + (lsp-package-path 'rust-analyzer) + "rust-analyzer") + ,@(cl-rest lsp-rust-analyzer-server-command)))) + :activation-fn (lsp-activate-on "rust") + :priority (if (eq lsp-rust-server 'rust-analyzer) 1 -1) + :initialization-options 'lsp-rust-analyzer--make-init-options + :notification-handlers (ht<-alist lsp-rust-notification-handlers) + :action-handlers (ht ("rust-analyzer.runSingle" #'lsp-rust--analyzer-run-single) + ("rust-analyzer.debugSingle" #'lsp-rust--analyzer-debug-lens) + ("rust-analyzer.showReferences" #'lsp-rust--analyzer-show-references) + ("rust-analyzer.triggerParameterHints" #'lsp--action-trigger-parameter-hints)) + :library-folders-fn (lambda (_workspace) lsp-rust-analyzer-library-directories) + :semantic-tokens-faces-overrides `(:discard-default-modifiers t + :modifiers + ,(lsp-rust-analyzer--semantic-modifiers)) + :server-id 'rust-analyzer + :custom-capabilities `((experimental . ((snippetTextEdit . ,(and lsp-enable-snippet (featurep 'yasnippet)))))) + :download-server-fn (lambda (_client callback error-callback _update?) + (lsp-package-ensure 'rust-analyzer callback error-callback)))) + + +(lsp-consistency-check lsp-rust) + +(provide 'lsp-rust) +;;; lsp-rust.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-semantic-tokens.el b/code/elpa/lsp-mode-20240319.1043/lsp-semantic-tokens.el new file mode 100644 index 0000000..e864fbe --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-semantic-tokens.el @@ -0,0 +1,920 @@ +;;; lsp-semantic-tokens.el --- Semantic tokens -*- lexical-binding: t; -*- +;; +;; Copyright (C) 2020 emacs-lsp maintainers +;; +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . +;; +;;; Commentary: +;; +;; Semantic tokens +;; https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_semanticTokens +;; +;;; Code: + +(require 'lsp-mode) +(require 'dash) + +(defgroup lsp-semantic-tokens nil + "LSP support for semantic-tokens." + :prefix "lsp-semantic-tokens-" + :group 'lsp-mode + :tag "LSP Semantic tokens") + +(define-obsolete-variable-alias 'lsp-semantic-highlighting-warn-on-missing-face 'lsp-semantic-tokens-warn-on-missing-face "lsp-mode 8.0.0") + +(defcustom lsp-semantic-tokens-warn-on-missing-face nil + "Warning on missing face for token type/modifier. +When non-nil, this option will emit a warning any time a token +or modifier type returned by a language server has no face associated with it." + :group 'lsp-semantic-tokens + :type 'boolean) + +(defcustom lsp-semantic-tokens-apply-modifiers t + "Whether semantic tokens should take token modifiers into account." + :group 'lsp-semantic-tokens + :type 'boolean) + +(defcustom lsp-semantic-tokens-allow-ranged-requests t + "Whether to use ranged semantic token requests when available. + +Note that even when this is set to t, delta requests will +be preferred whenever possible, unless +`lsp-semantic-tokens-allow-delta-requests' is false." + :group 'lsp-semantic-tokens + :type 'boolean) + +(defcustom lsp-semantic-tokens-allow-delta-requests t + "Whether to use semantic token delta requests when available. + +When supported by the language server, delta requests are always +preferred over both full and ranged token requests." + :group 'lsp-semantic-tokens + :type 'boolean) + +(defcustom lsp-semantic-tokens-honor-refresh-requests nil + "Whether to honor semanticTokens/refresh requests. + +When set to nil, refresh requests will be silently discarded. +When set to t, semantic tokens will be re-requested for all buffers +associated with the requesting language server." + :group 'lsp-semantic-tokens + :type 'boolean) + +(defcustom lsp-semantic-tokens-enable-multiline-token-support t + "When set to nil, tokens will be truncated after end-of-line." + :group 'lsp-semantic-tokens + :type 'boolean) + +(defface lsp-face-semhl-constant + '((t :inherit font-lock-constant-face)) + "Face used for semantic highlighting scopes matching constant scopes." + :group 'lsp-semantic-tokens) + +(defface lsp-face-semhl-variable + '((t :inherit font-lock-variable-name-face)) + "Face used for semantic highlighting scopes matching variable.*. +Unless overridden by a more specific face association." + :group 'lsp-semantic-tokens) + +(defface lsp-face-semhl-function + '((t :inherit font-lock-function-name-face)) + "Face used for semantic highlighting scopes matching entity.name.function.*. +Unless overridden by a more specific face association." + :group 'lsp-semantic-tokens) + +(defface lsp-face-semhl-method + '((t :inherit lsp-face-semhl-function)) + "Face used for semantic highlighting scopes matching entity.name.method.*. +Unless overridden by a more specific face association." + :group 'lsp-semantic-tokens) + +(defface lsp-face-semhl-namespace + '((t :inherit font-lock-type-face :weight bold)) + "Face used for semantic highlighting scopes matching entity.name.namespace.*. +Unless overridden by a more specific face association." + :group 'lsp-semantic-tokens) + +(defface lsp-face-semhl-comment + '((t (:inherit font-lock-comment-face))) + "Face used for comments." + :group 'lsp-semantic-tokens) + +(defface lsp-face-semhl-keyword + '((t (:inherit font-lock-keyword-face))) + "Face used for keywords." + :group 'lsp-semantic-tokens) + +(defface lsp-face-semhl-string + '((t (:inherit font-lock-string-face))) + "Face used for keywords." + :group 'lsp-semantic-tokens) + +(defface lsp-face-semhl-number + '((t (:inherit font-lock-constant-face))) + "Face used for numbers." + :group 'lsp-semantic-tokens) + +(defface lsp-face-semhl-regexp + '((t (:inherit font-lock-string-face :slant italic))) + "Face used for regexps." + :group 'lsp-semantic-tokens) + +(defface lsp-face-semhl-operator + '((t (:inherit font-lock-function-name-face))) + "Face used for operators." + :group 'lsp-semantic-tokens) + +(defface lsp-face-semhl-namespace + '((t (:inherit font-lock-keyword-face))) + "Face used for namespaces." + :group 'lsp-semantic-tokens) + +(defface lsp-face-semhl-type + '((t (:inherit font-lock-type-face))) + "Face used for types." + :group 'lsp-semantic-tokens) + +(defface lsp-face-semhl-struct + '((t (:inherit font-lock-type-face))) + "Face used for structs." + :group 'lsp-semantic-tokens) + +(defface lsp-face-semhl-class + '((t (:inherit font-lock-type-face))) + "Face used for classes." + :group 'lsp-semantic-tokens) + +(defface lsp-face-semhl-interface + '((t (:inherit font-lock-type-face))) + "Face used for interfaces." + :group 'lsp-semantic-tokens) + +(defface lsp-face-semhl-enum + '((t (:inherit font-lock-type-face))) + "Face used for enums." + :group 'lsp-semantic-tokens) + +(defface lsp-face-semhl-type-parameter + '((t (:inherit font-lock-type-face))) + "Face used for type parameters." + :group 'lsp-semantic-tokens) + +;; function face already defined, move here when support +;; for theia highlighting gets removed +(defface lsp-face-semhl-member + '((t (:inherit font-lock-variable-name-face))) + "Face used for members." + :group 'lsp-semantic-tokens) + +(defface lsp-face-semhl-property + '((t (:inherit font-lock-variable-name-face))) + "Face used for properties." + :group 'lsp-semantic-tokens) + +(defface lsp-face-semhl-event + '((t (:inherit font-lock-variable-name-face))) + "Face used for event properties." + :group 'lsp-semantic-tokens) + +(defface lsp-face-semhl-macro + '((t (:inherit font-lock-preprocessor-face))) + "Face used for macros." + :group 'lsp-semantic-tokens) + +(defface lsp-face-semhl-variable + '((t (:inherit font-lock-variable-name-face))) + "Face used for variables." + :group 'lsp-semantic-tokens) + +(defface lsp-face-semhl-parameter + '((t (:inherit font-lock-variable-name-face))) + "Face used for parameters." + :group 'lsp-semantic-tokens) + +(defface lsp-face-semhl-label + '((t (:inherit font-lock-comment-face))) + "Face used for labels." + :group 'lsp-semantic-tokens) + +(defface lsp-face-semhl-deprecated + '((t :strike-through t)) + "Face used for semantic highlighting scopes matching constant scopes." + :group 'lsp-semantic-tokens) + +(defface lsp-face-semhl-definition + '((t :inherit font-lock-function-name-face :weight bold)) + "Face used for definition modifier." + :group 'lsp-semantic-tokens) + +(defface lsp-face-semhl-implementation + '((t :inherit font-lock-function-name-face :weight bold)) + "Face used for implementation modifier." + :group 'lsp-semantic-tokens) + +(defface lsp-face-semhl-default-library + '((t :inherit font-lock-builtin-face)) + "Face used for defaultLibrary modifier." + :group 'lsp-semantic-tokens) + +(defface lsp-face-semhl-static + '((t :inherit font-lock-keyword-face)) + "Face used for static modifier." + :group 'lsp-semantic-tokens) + +(defvar-local lsp-semantic-token-faces + '(("comment" . lsp-face-semhl-comment) + ("keyword" . lsp-face-semhl-keyword) + ("string" . lsp-face-semhl-string) + ("number" . lsp-face-semhl-number) + ("regexp" . lsp-face-semhl-regexp) + ("operator" . lsp-face-semhl-operator) + ("namespace" . lsp-face-semhl-namespace) + ("type" . lsp-face-semhl-type) + ("struct" . lsp-face-semhl-struct) + ("class" . lsp-face-semhl-class) + ("interface" . lsp-face-semhl-interface) + ("enum" . lsp-face-semhl-enum) + ("typeParameter" . lsp-face-semhl-type-parameter) + ("function" . lsp-face-semhl-function) + ("method" . lsp-face-semhl-method) + ("member" . lsp-face-semhl-member) + ("property" . lsp-face-semhl-property) + ("event" . lsp-face-semhl-event) + ("macro" . lsp-face-semhl-macro) + ("variable" . lsp-face-semhl-variable) + ("parameter" . lsp-face-semhl-parameter) + ("label" . lsp-face-semhl-label) + ("enumConstant" . lsp-face-semhl-constant) + ("enumMember" . lsp-face-semhl-constant) + ("dependent" . lsp-face-semhl-type) + ("concept" . lsp-face-semhl-interface)) + "Faces to use for semantic tokens.") + +(defvar-local lsp-semantic-token-modifier-faces + '(("declaration" . lsp-face-semhl-interface) + ("definition" . lsp-face-semhl-definition) + ("implementation" . lsp-face-semhl-implementation) + ("readonly" . lsp-face-semhl-constant) + ("static" . lsp-face-semhl-static) + ("deprecated" . lsp-face-semhl-deprecated) + ("abstract" . lsp-face-semhl-keyword) + ("async" . lsp-face-semhl-macro) + ("modification" . lsp-face-semhl-operator) + ("documentation" . lsp-face-semhl-comment) + ("defaultLibrary" . lsp-face-semhl-default-library)) + "Semantic tokens modifier faces. +Faces to use for semantic token modifiers if +`lsp-semantic-tokens-apply-modifiers' is non-nil.") + +(defun lsp--semantic-tokens-capabilities () + `((semanticTokens + . ((dynamicRegistration . t) + (requests . ((range . t) (full . t))) + (tokenModifiers . ,(if lsp-semantic-tokens-apply-modifiers + (apply 'vector (mapcar #'car (lsp-semantic-tokens--modifier-faces-for (lsp--workspace-client lsp--cur-workspace)))) + [])) + (overlappingTokenSupport . t) + (multilineTokenSupport . ,(if lsp-semantic-tokens-enable-multiline-token-support t json-false)) + (tokenTypes . ,(apply 'vector (mapcar #'car (lsp-semantic-tokens--type-faces-for (lsp--workspace-client lsp--cur-workspace))))) + (formats . ["relative"]))))) + +(defvar lsp--semantic-tokens-pending-full-token-requests '() + "Buffers which should have their semantic tokens refreshed on idle. + +This is an alist of the form ((buffer_i . fontify_immediately_i) ...); entries +with fontify_immediately set to t will immediately refontify once their +token request is answered.") + +;; NOTE: doesn't keep track of outstanding requests, so might still produce large latency outliers +;; if the language server doesn't process all outstanding token requests within one lsp-idle-delay +(defcustom lsp-semantic-tokens-max-concurrent-idle-requests 1 + "Maximum number of on-idle token requests to be dispatched simultaneously." + :group 'lsp-semantic-tokens + :type 'integer) + +(defvar lsp--semantic-tokens-idle-timer nil) + +(defun lsp--semantic-tokens-process-pending-requests () + (let ((fuel lsp-semantic-tokens-max-concurrent-idle-requests)) + (while (and lsp--semantic-tokens-pending-full-token-requests (> fuel 0)) + (-let (((buffer . fontify-immediately) (pop lsp--semantic-tokens-pending-full-token-requests))) + (when (buffer-live-p buffer) + (setq fuel (1- fuel)) + (with-current-buffer buffer + (lsp--semantic-tokens-request nil fontify-immediately)))))) + (unless lsp--semantic-tokens-pending-full-token-requests + (cancel-timer lsp--semantic-tokens-idle-timer) + (setq lsp--semantic-tokens-idle-timer nil))) + +(defun lsp--semantic-tokens-sort-pending-requests (pending-requests) + ;; service currently visible buffers first, otherwise prefer immediate-fontification requests + (-sort (lambda (entry-a entry-b) + (let ((a-hidden (eq nil (get-buffer-window (car entry-a)))) + (b-hidden (eq nil (get-buffer-window (car entry-b))))) + (cond ((and b-hidden (not a-hidden)) t) ; sort a before b + ((and a-hidden (not b-hidden)) nil) ; sort b before a + ((and (not (cdr entry-a)) (cdr entry-b)) nil) ; otherwise sort b before a only if b is immediate and a is not + (t t)))) + (--filter (buffer-live-p (car it)) pending-requests))) + +(defun lsp--semantic-tokens-request-full-token-set-when-idle (buffer fontify-immediately) + "Request full token set after an idle timeout of `lsp-idle-delay'. + +If FONTIFY-IMMEDIATELY is non-nil, fontification will be performed immediately + once the corresponding response is received." + (let ((do-fontify-immediately (or fontify-immediately + (cdr (assoc buffer lsp--semantic-tokens-pending-full-token-requests))))) + (setq lsp--semantic-tokens-pending-full-token-requests + (lsp--semantic-tokens-sort-pending-requests + (cons (cons buffer do-fontify-immediately) + (--remove (eq buffer (car it)) lsp--semantic-tokens-pending-full-token-requests))))) + (unless lsp--semantic-tokens-idle-timer + (setq lsp--semantic-tokens-idle-timer + (run-with-idle-timer lsp-idle-delay t #'lsp--semantic-tokens-process-pending-requests)))) + +(defun lsp--semantic-tokens-refresh-if-enabled (buffer) + (when (buffer-local-value 'lsp-semantic-tokens-mode buffer) + (lsp--semantic-tokens-request-full-token-set-when-idle buffer t))) + +(defvar-local lsp--semantic-tokens-cache nil + "Previously returned token set. + +When non-nil, `lsp--semantic-tokens-cache' should adhere to the +following lsp-interface: +`(_SemanticTokensCache + (:_documentVersion) + (:response :_region :_truncated))'.") + +(defsubst lsp--semantic-tokens-putcache (k v) + "Set key K of `lsp--semantic-tokens-cache' to V." + (setq lsp--semantic-tokens-cache + (plist-put lsp--semantic-tokens-cache k v))) + +(defvar-local lsp--semantic-tokens-teardown nil) + +(defun lsp--semantic-tokens-ingest-range-response (response) + "Handle RESPONSE to semanticTokens/range request." + (lsp--semantic-tokens-putcache :response response) + (cl-assert (plist-get lsp--semantic-tokens-cache :_region)) + (lsp--semantic-tokens-request-full-token-set-when-idle (current-buffer) nil)) + +(defun lsp--semantic-tokens-ingest-full-response (response) + "Handle RESPONSE to semanticTokens/full request." + (lsp--semantic-tokens-putcache :response response) + (cl-assert (not (plist-get lsp--semantic-tokens-cache :_region)))) + +(defsubst lsp--semantic-tokens-apply-delta-edits (old-data edits) + "Apply EDITS obtained from full/delta request to OLD-DATA." + (let* ((old-token-count (length old-data)) + (old-token-index 0) + (substrings)) + (cl-loop + for edit across edits + do + (when (< old-token-index (lsp-get edit :start)) + (push (substring old-data old-token-index (lsp-get edit :start)) substrings)) + (push (lsp-get edit :data) substrings) + (setq old-token-index (+ (lsp-get edit :start) (lsp-get edit :deleteCount))) + finally do (push (substring old-data old-token-index old-token-count) substrings)) + (apply #'vconcat (nreverse substrings)))) + +(defun lsp--semantic-tokens-ingest-full/delta-response (response) + "Handle RESPONSE to semanticTokens/full/delta request." + (if (lsp-get response :edits) + (let ((old-data (--> lsp--semantic-tokens-cache (plist-get it :response) (lsp-get it :data)))) + (cl-assert (not (plist-get lsp--semantic-tokens-cache :_region))) + (when old-data + (lsp--semantic-tokens-putcache + :response (lsp-put response + :data (lsp--semantic-tokens-apply-delta-edits + old-data (lsp-get response :edits)))))) + ;; server decided to send full response instead + (lsp--semantic-tokens-ingest-full-response response))) + + +(defun lsp--semantic-tokens-request (region fontify-immediately) + "Send semantic tokens request to the language server. + +A full/delta request will be sent if delta requests are supported by +the language server, allowed via `lsp-semantic-tokens-allow-delta-requests', +and if a full set of tokens had previously been received. +Otherwise, a ranged request will be dispatched if REGION is non-nil, +ranged requests are supported by the language server, and allowed via +`lsp-semantic-tokens-allow-delta-requests'. In all other cases, a full +tokens request will be dispatched. + +If FONTIFY-IMMEDIATELY is non-nil, fontification will be performed immediately + upon receiving the response." + (let ((request-type "textDocument/semanticTokens/full") + (request `(:textDocument ,(lsp--text-document-identifier))) + (response-handler nil) + (final-region nil)) + (cond + ((and lsp-semantic-tokens-allow-delta-requests + (lsp-feature? "textDocument/semanticTokensFull/Delta") + (--> lsp--semantic-tokens-cache + (plist-get it :response) + (and (lsp-get it :resultId) (lsp-get it :data) + (not (plist-get lsp--semantic-tokens-cache :_region))))) + (setq request-type "textDocument/semanticTokens/full/delta") + (setq response-handler #'lsp--semantic-tokens-ingest-full/delta-response) + (setq request + (plist-put request :previousResultId + (lsp-get (plist-get lsp--semantic-tokens-cache :response) :resultId)))) + ((and lsp-semantic-tokens-allow-ranged-requests region + (lsp-feature? "textDocument/semanticTokensRangeProvider")) + (setq request-type "textDocument/semanticTokens/range") + (setq final-region region) + (setq request + (plist-put request :range (lsp--region-to-range (car final-region) (cdr final-region)))) + (setq response-handler #'lsp--semantic-tokens-ingest-range-response)) + (t (setq response-handler #'lsp--semantic-tokens-ingest-full-response))) + (lsp-request-async + request-type request + (lambda (response) + (lsp--semantic-tokens-putcache :_documentVersion lsp--cur-version) + (lsp--semantic-tokens-putcache :_region final-region) + (funcall response-handler response) + (when (or fontify-immediately (plist-get lsp--semantic-tokens-cache :_truncated)) (font-lock-flush))) + :error-handler ;; buffer is not captured in `error-handler', it is in `callback' + (let ((buf (current-buffer))) + (lambda (&rest _) + (when (buffer-live-p buf) + (lsp--semantic-tokens-request-full-token-set-when-idle buf t)))) + :mode 'tick + :cancel-token (format "semantic-tokens-%s" (lsp--buffer-uri))))) + + +;;;###autoload +(defvar-local semantic-token-modifier-cache (make-hash-table) + "A cache of modifier values to the selected fonts. +This allows whole-bitmap lookup instead of checking each bit. The +expectation is that usage of modifiers will tend to cluster, so +we will not have the full range of possible usages, hence a +tractable hash map. + +This is set as buffer-local. It should probably be shared in a +given workspace/language-server combination. + +This cache should be flushed every time any modifier +configuration changes.") + +(defun lsp-semantic-tokens--fontify (old-fontify-region beg-orig end-orig &optional loudly) + "Apply fonts to retrieved semantic tokens. +OLD-FONTIFY-REGION is the underlying region fontification function, +e.g., `font-lock-fontify-region'. +BEG-ORIG and END-ORIG deliminate the requested fontification region and maybe +modified by OLD-FONTIFY-REGION. +LOUDLY will be forwarded to OLD-FONTIFY-REGION as-is." + ;; TODO: support multiple language servers per buffer? + (let ((faces (seq-some #'lsp--workspace-semantic-tokens-faces lsp--buffer-workspaces)) + (modifier-faces + (when lsp-semantic-tokens-apply-modifiers + (seq-some #'lsp--workspace-semantic-tokens-modifier-faces lsp--buffer-workspaces))) + old-bounds + beg end) + (cond + ((or (eq nil faces) + (eq nil lsp--semantic-tokens-cache) + (eq nil (plist-get lsp--semantic-tokens-cache :response))) + ;; default to non-semantic highlighting until first response has arrived + (funcall old-fontify-region beg-orig end-orig loudly)) + ((not (= lsp--cur-version (plist-get lsp--semantic-tokens-cache :_documentVersion))) + ;; delay fontification until we have fresh tokens + '(jit-lock-bounds 0 . 0)) + (t + (setq old-bounds (funcall old-fontify-region beg-orig end-orig loudly)) + ;; this is to prevent flickering when semantic token highlighting + ;; is layered on top of, e.g., tree-sitter-hl, or clojure-mode's syntax highlighting. + (setq beg (min beg-orig (cadr old-bounds)) + end (max end-orig (cddr old-bounds))) + ;; if we're using the response to a ranged request, we'll only be able to fontify within + ;; that range (and hence shouldn't clear any highlights outside of that range) + (let ((token-region (plist-get lsp--semantic-tokens-cache :_region))) + (if token-region + (progn + (lsp--semantic-tokens-putcache :_truncated (or (< beg (car token-region)) + (> end (cdr token-region)))) + (setq beg (max beg (car token-region))) + (setq end (min end (cdr token-region)))) + (lsp--semantic-tokens-putcache :_truncated nil))) + (-let* ((inhibit-field-text-motion t) + (data (lsp-get (plist-get lsp--semantic-tokens-cache :response) :data)) + (i0 0) + (i-max (1- (length data))) + (current-line 1) + (line-delta) + (column 0) + (face) + (line-start-pos) + (line-min) + (line-max-inclusive) + (text-property-beg) + (text-property-end)) + (save-mark-and-excursion + (save-restriction + (widen) + (goto-char beg) + (goto-char (line-beginning-position)) + (setq line-min (line-number-at-pos)) + (with-silent-modifications + (goto-char end) + (goto-char (line-end-position)) + (setq line-max-inclusive (line-number-at-pos)) + (forward-line (- line-min line-max-inclusive)) + (let ((skip-lines (- line-min current-line))) + (while (and (<= i0 i-max) (< (aref data i0) skip-lines)) + (setq skip-lines (- skip-lines (aref data i0))) + (setq i0 (+ i0 5))) + (setq current-line (- line-min skip-lines))) + (forward-line (- current-line line-min)) + (setq line-start-pos (point)) + (cl-loop + for i from i0 to i-max by 5 do + (setq line-delta (aref data i)) + (unless (= line-delta 0) + (forward-line line-delta) + (setq line-start-pos (point)) + (setq column 0) + (setq current-line (+ current-line line-delta))) + (setq column (+ column (aref data (1+ i)))) + (setq face (aref faces (aref data (+ i 3)))) + (setq text-property-beg (+ line-start-pos column)) + (setq text-property-end + (min (if lsp-semantic-tokens-enable-multiline-token-support + (point-max) (line-end-position)) + (+ text-property-beg (aref data (+ i 2))))) + (when face + (put-text-property text-property-beg text-property-end 'face face)) + ;; Deal with modifiers. We cache common combinations of + ;; modifiers, storing the faces they resolve to. + (let* ((modifier-code (aref data (+ i 4))) + (faces-to-apply (gethash modifier-code semantic-token-modifier-cache 'not-found))) + (when (eq 'not-found faces-to-apply) + (setq faces-to-apply nil) + (cl-loop for j from 0 to (1- (length modifier-faces)) do + (when (and (aref modifier-faces j) + (> (logand modifier-code (ash 1 j)) 0)) + (push (aref modifier-faces j) faces-to-apply))) + (puthash modifier-code faces-to-apply semantic-token-modifier-cache)) + (dolist (face faces-to-apply) + (add-face-text-property text-property-beg text-property-end face))) + when (> current-line line-max-inclusive) return nil))))) + `(jit-lock-bounds ,beg . ,end))))) + +(defun lsp-semantic-tokens--request-update () + "Request semantic-tokens update." + ;; when dispatching ranged requests, we'll over-request by several chunks in both directions, + ;; which should minimize those occasions where font-lock region extension extends beyond the + ;; region covered by our freshly requested tokens (see lsp-mode issue #3154), while still limiting + ;; requests to fairly small regions even if the underlying buffer is large + (when (lsp-feature? "textDocument/semanticTokensFull") + (lsp--semantic-tokens-request + (cons (max (point-min) (- (window-start) (* 5 jit-lock-chunk-size))) + (min (point-max) (+ (window-end) (* 5 jit-lock-chunk-size)))) t))) + +(defun lsp--semantic-tokens-as-defined-by-workspace (workspace) + "Return plist of token-types and token-modifiers defined by WORKSPACE, +or nil if none are defined." + (when-let ((token-capabilities + (or + (-some-> + (lsp--registered-capability "textDocument/semanticTokens") + (lsp--registered-capability-options)) + (lsp:server-capabilities-semantic-tokens-provider? + (lsp--workspace-server-capabilities workspace))))) + (-let* (((&SemanticTokensOptions :legend) token-capabilities)) + `(:token-types ,(lsp:semantic-tokens-legend-token-types legend) + :token-modifiers ,(lsp:semantic-tokens-legend-token-modifiers legend))))) + +(defun lsp-semantic-tokens-suggest-overrides () + "Suggest face overrides that best match the faces +chosen by `font-lock-fontify-region'." + (interactive) + (-when-let* ((token-info (-some #'lsp--semantic-tokens-as-defined-by-workspace lsp--buffer-workspaces)) + ((&plist :token-types token-types :token-modifiers token-modifiers) token-info)) + (let* ((tokens (lsp-request + "textDocument/semanticTokens/full" + `(:textDocument, (lsp--text-document-identifier)))) + (inhibit-field-text-motion t) + (data (lsp-get tokens :data)) + (associated-faces '()) + (line-delta) + ;; KLUDGE: clear cache so our font-lock advice won't apply semantic-token faces + (old-cache lsp--semantic-tokens-cache) + (face-or-faces)) + (setq lsp--semantic-tokens-cache nil) + (save-restriction + (save-excursion + (widen) + (font-lock-fontify-region (point-min) (point-max) t) + (save-mark-and-excursion + (save-restriction + (widen) + (goto-char (point-min)) + (cl-loop + for i from 0 to (1- (length data)) by 5 do + (setq line-delta (aref data i)) + (unless (= line-delta 0) (forward-line line-delta)) + (forward-char (aref data (+ i 1))) + (setq face-or-faces (get-text-property (point) 'face)) + ;; TODO: consider modifiers? + (when face-or-faces + (--each (if (listp face-or-faces) face-or-faces (list face-or-faces)) + (cl-pushnew `(,(aref data (+ i 3)) . ,it) associated-faces :test #'equal)))) + (setq lsp--semantic-tokens-cache old-cache) + (font-lock-flush))))) + (switch-to-buffer (get-buffer-create "*Suggested Overrides*")) + (insert "(") + ;; TODO: sort alternatives by frequency + (--each-indexed (-group-by #'car associated-faces) + (insert (if (= it-index 0) "(" "\n (")) + (insert (format "%s . " (aref token-types (car it)))) + (--each-indexed (mapcar #'cdr (cdr it)) + (insert (if (= it-index 0) (format "%s)" (prin1-to-string it)) + (format " ; Alternative: %s" (prin1-to-string it)))))) + (insert ")")))) + +(declare-function tree-sitter-hl-mode "ext:tree-sitter-hl") + +(with-eval-after-load 'tree-sitter-hl + (add-hook + 'tree-sitter-hl-mode-hook + (lambda () + (when (and lsp-mode lsp--semantic-tokens-teardown + (boundp 'tree-sitter-hl-mode) tree-sitter-hl-mode) + (lsp-warn "It seems you have configured tree-sitter-hl to activate after lsp-mode. +To prevent tree-sitter-hl from overriding lsp-mode's semantic token highlighting, lsp-mode +will now disable both semantic highlighting and tree-sitter-hl mode and subsequently re-enable both, +starting with tree-sitter-hl-mode. + +Please adapt your config to prevent unnecessary mode reinitialization in the future.") + (tree-sitter-hl-mode -1) + (funcall lsp--semantic-tokens-teardown) + (setq lsp--semantic-tokens-teardown nil) + (tree-sitter-hl-mode t) + (lsp--semantic-tokens-initialize-buffer))))) + +;;;###autoload +(defun lsp--semantic-tokens-initialize-buffer () + "Initialize the buffer for semantic tokens. +IS-RANGE-PROVIDER is non-nil when server supports range requests." + (let* ((old-extend-region-functions font-lock-extend-region-functions) + ;; make sure font-lock always fontifies entire lines (TODO: do we also have + ;; to change some jit-lock-...-region functions/variables?) + (new-extend-region-functions + (if (memq 'font-lock-extend-region-wholelines old-extend-region-functions) + old-extend-region-functions + (cons 'font-lock-extend-region-wholelines old-extend-region-functions))) + (buffer (current-buffer))) + (setq lsp--semantic-tokens-cache nil) + (setq font-lock-extend-region-functions new-extend-region-functions) + (add-function :around (local 'font-lock-fontify-region-function) #'lsp-semantic-tokens--fontify) + (add-hook 'lsp-on-change-hook #'lsp-semantic-tokens--request-update nil t) + (lsp-semantic-tokens--request-update) + (setq lsp--semantic-tokens-teardown + (lambda () + (setq lsp--semantic-tokens-pending-full-token-requests + (--remove (eq buffer (car it)) lsp--semantic-tokens-pending-full-token-requests)) + (setq font-lock-extend-region-functions old-extend-region-functions) + (setq lsp--semantic-tokens-cache nil) + (remove-function (local 'font-lock-fontify-region-function) + #'lsp-semantic-tokens--fontify) + (remove-hook 'lsp-on-change-hook #'lsp-semantic-tokens--request-update t))))) + +(defun lsp--semantic-tokens-build-face-map (identifiers faces category varname) + "Build map of FACES for IDENTIFIERS using CATEGORY and VARNAME." + (apply 'vector + (mapcar (lambda (id) + (let ((maybe-face (cdr (assoc id faces)))) + (when (and lsp-semantic-tokens-warn-on-missing-face (not maybe-face)) + (lsp-warn "No face has been associated to the %s '%s': consider adding a corresponding definition to %s" + category id varname)) maybe-face)) identifiers))) + +(defun lsp-semantic-tokens--apply-alist-overrides (base overrides discard-defaults) + "Merge or replace BASE with OVERRIDES, depending on DISCARD-DEFAULTS. +For keys present in both alists, the assignments made by +OVERRIDES will take precedence." + (if discard-defaults + overrides + (let* ((copy-base (copy-alist base))) + (mapc (-lambda ((key . value)) (setf (alist-get key copy-base nil nil #'string=) value)) overrides) + copy-base))) + +(defun lsp-semantic-tokens--type-faces-for (client) + "Return the semantic token type faces for CLIENT." + (lsp-semantic-tokens--apply-alist-overrides + lsp-semantic-token-faces + (plist-get (lsp--client-semantic-tokens-faces-overrides client) :types) + (plist-get (lsp--client-semantic-tokens-faces-overrides client) :discard-default-types))) + +(defun lsp-semantic-tokens--modifier-faces-for (client) + "Return the semantic token type faces for CLIENT." + (lsp-semantic-tokens--apply-alist-overrides + lsp-semantic-token-modifier-faces + (plist-get (lsp--client-semantic-tokens-faces-overrides client) :modifiers) + (plist-get (lsp--client-semantic-tokens-faces-overrides client) :discard-default-modifiers))) + +(defun lsp--semantic-tokens-on-refresh (workspace) + "Clear semantic tokens within all buffers of WORKSPACE, +refresh in currently active buffer." + (cl-assert (not (eq nil workspace))) + (when lsp-semantic-tokens-honor-refresh-requests + (cl-loop + for ws-buffer in (lsp--workspace-buffers workspace) do + (let ((fontify-immediately (equal (current-buffer) ws-buffer))) + (with-current-buffer ws-buffer (lsp--semantic-tokens-request nil fontify-immediately)))))) + +;;;###autoload +(defun lsp--semantic-tokens-initialize-workspace (workspace) + "Initialize semantic tokens for WORKSPACE." + (cl-assert workspace) + (-let (((&plist :token-types types :token-modifiers modifiers) + (lsp--semantic-tokens-as-defined-by-workspace workspace)) + (client (lsp--workspace-client workspace))) + (setf (lsp--workspace-semantic-tokens-faces workspace) + (lsp--semantic-tokens-build-face-map + types (lsp-semantic-tokens--type-faces-for client) + "semantic token" "lsp-semantic-token-faces")) + (setf (lsp--workspace-semantic-tokens-modifier-faces workspace) + (lsp--semantic-tokens-build-face-map + modifiers (lsp-semantic-tokens--modifier-faces-for client) + "semantic token modifier" "lsp-semantic-token-modifier-faces")))) + +;;;###autoload +(defun lsp-semantic-tokens--warn-about-deprecated-setting () + "Warn about deprecated semantic highlighting variable." + (when (boundp 'lsp-semantic-highlighting) + (pcase lsp-semantic-highlighting + (:semantic-tokens + (lsp-warn "It seems you wish to use semanticTokens-based + highlighting. To do so, please remove any references to the + deprecated variable `lsp-semantic-highlighting' from your + configuration and set `lsp-semantic-tokens-enable' to `t' + instead.") + (setq lsp-semantic-tokens-enable t)) + ((or :immediate :deferred) + (lsp-warn "It seems you wish to use Theia-based semantic + highlighting. This protocol has been superseded by the + semanticTokens protocol specified by LSP v3.16 and is no longer + supported by lsp-mode. If your language server provides + semanticToken support, please set + `lsp-semantic-tokens-enable' to `t' to use it."))))) + +;;;###autoload +(defun lsp-semantic-tokens--enable () + "Enable semantic tokens mode." + (when (and lsp-semantic-tokens-enable + (lsp-feature? "textDocument/semanticTokensFull")) + (lsp-semantic-tokens--warn-about-deprecated-setting) + (lsp-semantic-tokens-mode 1))) + +(defun lsp-semantic-tokens--disable () + "Disable semantic tokens mode." + (lsp-semantic-tokens-mode -1)) + +;;;###autoload +(define-minor-mode lsp-semantic-tokens-mode + "Toggle semantic-tokens support." + :group 'lsp-semantic-tokens + :global nil + (cond + ((and lsp-semantic-tokens-mode (lsp-feature? "textDocument/semanticTokensFull")) + (add-hook 'lsp-configure-hook #'lsp-semantic-tokens--enable nil t) + (add-hook 'lsp-unconfigure-hook #'lsp-semantic-tokens--disable nil t) + (mapc #'lsp--semantic-tokens-initialize-workspace + (lsp--find-workspaces-for "textDocument/semanticTokensFull")) + (lsp--semantic-tokens-initialize-buffer)) + (t + (remove-hook 'lsp-configure-hook #'lsp-semantic-tokens--enable t) + (remove-hook 'lsp-unconfigure-hook #'lsp-semantic-tokens--disable t) + (when lsp--semantic-tokens-teardown + (funcall lsp--semantic-tokens-teardown)) + (lsp-semantic-tokens--request-update) + (setq lsp--semantic-tokens-cache nil + lsp--semantic-tokens-teardown nil)))) + +;; debugging helpers +(defun lsp--semantic-tokens-verify () + "Store current token set and compare with the response to a full token request." + (interactive) + (let ((old-tokens (--> lsp--semantic-tokens-cache (plist-get it :response) (lsp-get it :data))) + (old-version (--> lsp--semantic-tokens-cache (plist-get it :_documentVersion)))) + (if (not (equal lsp--cur-version old-version)) + (message "Stored documentVersion %d differs from current version %d" old-version lsp--cur-version) + (lsp-request-async + "textDocument/semanticTokens/full" `(:textDocument ,(lsp--text-document-identifier)) + (lambda (response) + (let ((new-tokens (lsp-get response :data))) + (if (equal old-tokens new-tokens) + (message "New tokens (total count %d) are identical to previously held token set" + (length new-tokens)) + (message "Newly returned tokens differ from old token set") + (print old-tokens) + (print new-tokens)))) + :mode 'tick + :cancel-token (format "semantic-tokens-%s" (lsp--buffer-uri)))))) + +(defvar-local lsp-semantic-tokens--log '()) + +(defvar-local lsp-semantic-tokens--prev-response nil) + +(defun lsp-semantic-tokens--log-buffer-contents (tag) + "Log buffer contents for TAG." + (save-restriction + (save-excursion + (widen) (push `(:tag ,tag + :buffer-contents ,(buffer-substring (point-min) (point-max)) + :prev-response ,lsp-semantic-tokens--prev-response) + lsp-semantic-tokens--log)))) + +(defun lsp-semantic-tokens-enable-log () + "Enable logging of intermediate fontification states. + +This is a debugging tool, and may incur significant performance penalties." + (setq lsp-semantic-tokens--log '()) + (defun lsp-advice-tokens-fontify (orig-func old-fontify-region beg-orig end-orig &optional loudly) + (lsp-semantic-tokens--log-buffer-contents 'before) + (let ((result (funcall orig-func old-fontify-region beg-orig end-orig loudly))) + (lsp-semantic-tokens--log-buffer-contents 'after) + result)) + (advice-add 'lsp-semantic-tokens--fontify :around 'lsp-advice-tokens-fontify) + + (defun lsp-log-delta-response (response) + (setq lsp-semantic-tokens--prev-response `(:request-type "delta" + :response ,response + :version ,lsp--cur-version))) + (advice-add 'lsp--semantic-tokens-ingest-full/delta-response :before 'lsp-log-delta-response) + + (defun lsp-log-full-response (response) + (setq lsp-semantic-tokens--prev-response `(:request-type "full" + :response ,response + :version ,lsp--cur-version))) + (advice-add 'lsp--semantic-tokens-ingest-full-response :before 'lsp-log-full-response) + + (defun lsp-log-range-response (response) + (setq lsp-semantic-tokens--prev-response `(:request-type "range" + :response ,response + :version ,lsp--cur-version))) + (advice-add 'lsp--semantic-tokens-ingest-range-response :before 'lsp-log-range-response)) + +(defun lsp-semantic-tokens-disable-log () + "Disable logging of intermediate fontification states." + (advice-remove 'lsp-semantic-tokens--fontify 'lsp-advice-tokens-fontify) + (advice-remove 'lsp--semantic-tokens-ingest-full/delta-response 'lsp-log-delta-response) + (advice-remove 'lsp--semantic-tokens-ingest-full-response 'lsp-log-full-response) + (advice-remove 'lsp--semantic-tokens-ingest-range-response 'lsp-log-range-response)) + +(declare-function htmlize-buffer "ext:htmlize") + +(defun lsp-semantic-tokens-export-log () + "Write HTML-formatted snapshots of previous fontification results to /tmp." + (require 'htmlize) + (let* ((outdir (f-join "/tmp" "semantic-token-snapshots")) + (progress-reporter + (make-progress-reporter + (format "Writing buffer snapshots to %s..." outdir) + 0 (length lsp-semantic-tokens--log)))) + (f-mkdir outdir) + (--each-indexed (reverse lsp-semantic-tokens--log) + (-let* (((&plist :tag tag + :buffer-contents buffer-contents + :prev-response prev-response) it) + (html-buffer)) + ;; FIXME: doesn't update properly; sit-for helps... somewhat, + ;; but unreliably + (when (= (% it-index 5) 0) + (progress-reporter-update progress-reporter it-index) + (sit-for 0.01)) + ;; we're emitting 2 snapshots (before & after) per update, so request + ;; parameters should only change on every 2nd invocation + (when (cl-evenp it-index) + (with-temp-buffer + (insert (prin1-to-string prev-response)) + (write-file (f-join outdir (format "parameters_%d.el" (/ it-index 2)))))) + (with-temp-buffer + (insert buffer-contents) + (setq html-buffer (htmlize-buffer)) + (with-current-buffer html-buffer + ;; some configs such as emacs-doom may autoformat on save; switch to + ;; fundamental-mode to avoid this + (fundamental-mode) + (write-file (f-join outdir (format "buffer_%d_%s.html" (/ it-index 2) tag))))) + (kill-buffer html-buffer))) + (progress-reporter-done progress-reporter))) + +(lsp-consistency-check lsp-semantic-tokens) + +(provide 'lsp-semantic-tokens) +;;; lsp-semantic-tokens.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-semgrep.el b/code/elpa/lsp-mode-20240319.1043/lsp-semgrep.el new file mode 100644 index 0000000..d23fc69 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-semgrep.el @@ -0,0 +1,234 @@ +;;; lsp-semgrep.el --- semgrep support -*- lexical-binding: t; -*- +;; +;; Copyright (C) 2023 Austin Theriault +;; +;; Author: Austin Theriault +;; Keywords: language tools sast +;; +;; 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 . +;; This file is not part of GNU Emacs. +;; +;;; Commentary: +;; +;; Semgrep support for lsp-mode +;; +;;; Code: + + + +(require 'lsp-mode) + +(defgroup lsp-semgrep nil + "LSP support for Semgrep." + :group 'lsp-mode + :link `(url-link "https://github.com/returntocorp/semgrep")) + +(defgroup lsp-semgrep-scan nil + "Semgrep LS scan options." + :group 'lsp-semgrep + ) + +(defgroup lsp-semgrep-metrics nil + "Semgrep LS metrics options." + :group 'lsp-semgrep) + +;; General options + +(defcustom lsp-semgrep-trace-server "off" + "Trace Semgrep LS server" + :group 'lsp-semgrep + :type '(choice (const "off") + (const "messages") + (const "verbose"))) + +(defcustom lsp-semgrep-server-command '("semgrep" "lsp") + "Semgrep LS server command." + :group 'lsp-semgrep + :type '(repeat string)) + +(defcustom lsp-semgrep-languages '("apex" + "bash" + "sh" + "c" + "cairo" + "clojure" + "cpp" + "c++" + "csharp" + "c#" + "dart" + "dockerfile" + "docker" + "ex" + "elixir" + "go" + "golang" + "hack" + "html" + "java" + "js" + "javascript" + "json" + "jsonnet" + "julia" + "kt" + "kotlin" + "lisp" + "lua" + "ocaml" + "php" + "python2" + "python3" + "py" + "python" + "r" + "regex" + "none" + "ruby" + "rust" + "scala" + "scheme" + "solidity" + "sol" + "swift" + "tf" + "hcl" + "terraform" + "ts" + "typescript" + "vue" + "xml" + "yaml") + "List of languages to enable Semgrep LS for." + :group 'lsp-semgrep + :type '(repeat string)) +;; Scan options + +(defcustom lsp-semgrep-scan-configuration [] + "Semgrep rule files, or registry rules to scan with, e.g. ['r/all','rules.yaml']." + :group 'lsp-semgrep-scan + :type '(repeat string)) + +(defcustom lsp-semgrep-scan-exclude [] + "List of files or directories to exclude from scan." + :group 'lsp-semgrep-scan + :type '(repeat string)) + +(defcustom lsp-semgrep-scan-include [] + "List of files or directories to include in scan." + :group 'lsp-semgrep-scan + :type '(repeat string)) + +(defcustom lsp-semgrep-scan-jobs 1 + "Number of parallel jobs to run." + :group 'lsp-semgrep-scan + :type 'integer) + +(defcustom lsp-semgrep-scan-max-memory 0 + "Maximum memory to use for scan, in MB." + :group 'lsp-semgrep-scan + :type 'integer) + +(defcustom lsp-semgrep-scan-max-target-bytes 1000000 + "Maximum size of target file to scan, in bytes." + :group 'lsp-semgrep-scan + :type 'integer) + +(defcustom lsp-semgrep-scan-timeout 30 + "Maximum time to wait for scan to complete, in seconds." + :group 'lsp-semgrep-scan + :type 'integer) + +(defcustom lsp-semgrep-scan-timeout-threshold 30 + "Maximum time to wait for scan to complete, in seconds." + :group 'lsp-semgrep-scan + :type 'integer) + +(defcustom lsp-semgrep-scan-only-git-dirty t + "Only scan files that are dirty in git." + :group 'lsp-semgrep-scan + :type 'boolean) + +;; Metrics options + +(defcustom lsp-semgrep-metrics-enabled t + "Enable metrics collection." + :group 'lsp-semgrep-metrics + :type 'boolean) + +(defcustom lsp-semgrep-metrics-extension-type "emacs" + "Extension host type." + :group 'lsp-semgrep-metrics + :type 'string) + +;; Custom commands + +(defun semgrep-scan-workspace (full) + "Scan workspace with Semgrep. +If FULL is non-nil, scan all files in workspace, regardless of git status." + (interactive (list (lsp--completing-read "Scan: " (list "Changed files in workspace" "All files in workspace") 'identity))) + (lsp-notify "semgrep/scanWorkspace" (list :full (if (string= full "All files in workspace") t :json-false)))) + +(defun semgrep-refresh-rules () + "Refresh Semgrep rules." + (interactive) + (lsp-notify "semgrep/refreshRules" lsp--empty-ht)) + + +(defun semgrep-login () + "Login to Semgrep." + (interactive) + (lsp-request-async "semgrep/login" lsp--empty-ht + (lambda (result) + (list + (browse-url (lsp-get result :url)) + (lsp-message "Please login to Semgrep and return to Emacs.") + (lsp-notify "semgrep/loginFinish" result))))) + +(defun semgrep-logout () + "Logout from Semgrep." + (interactive) + (lsp-notify "semgrep/logout" lsp--empty-ht)) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection (lambda () lsp-semgrep-server-command)) + :activation-fn (lambda (_file-name _mode) + (-contains? lsp-semgrep-languages (lsp-buffer-language))) + :server-id 'semgrep-ls + :priority -1 + :add-on? t + :initialization-options + (lambda () + (list + :scan (list + :configuration lsp-semgrep-scan-configuration + :exclude lsp-semgrep-scan-exclude + :include lsp-semgrep-scan-include + :jobs lsp-semgrep-scan-jobs + :maxMemory lsp-semgrep-scan-max-memory + :maxTargetBytes lsp-semgrep-scan-max-target-bytes + :timeout lsp-semgrep-scan-timeout + :timeoutThreshold lsp-semgrep-scan-timeout-threshold + :onlyGitDirty lsp-semgrep-scan-only-git-dirty) + :metrics (list + :enabled lsp-semgrep-metrics-enabled + :extensionType lsp-semgrep-metrics-extension-type) + :trace (list + :server lsp-semgrep-trace-server))))) + +(lsp-consistency-check lsp-semgrep) + +(provide 'lsp-semgrep) +;;; lsp-semgrep.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-sml.el b/code/elpa/lsp-mode-20240319.1043/lsp-sml.el new file mode 100644 index 0000000..19e8a38 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-sml.el @@ -0,0 +1,92 @@ +;;; lsp-sml.el --- Standard ML client settings -*- lexical-binding: t; -*- + +;; Copyright (c) 2023 Ariel Davis + +;; Author: Ariel Davis +;; Keywords: languages, lsp, sml, standard-ml, millet + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; lsp-sml client via Millet + +;;; Code: + +(require 'lsp-mode) +(require 'lsp-completion) + +(defgroup lsp-sml nil + "LSP support for Standard ML, using the Millet language server." + :link '(url-link "https://github.com/azdavis/millet") + :group 'lsp-mode) + +(defcustom lsp-sml-millet-format-engine "none" + "**WARNING: THE FORMATTER IS HIGHLY EXPERIMENTAL. +IT MAY IRREVOCABLY DESTROY SOME OR ALL OF YOUR CODE.** + +How to format open SML files on save." + :type '(choice (const :tag "No formatting." "none") + (const :tag "Naive formatting." "naive") + (const :tag "Formatting provided by https://github.com/shwestrick/smlfmt." "smlfmt")) + :group 'lsp-sml) + +(defcustom lsp-sml-millet-server-diagnostics-filter "syntax" + "What diagnostics to send per file." + :type '(choice (const :tag "No filter, i.e. all available diagnostics are sent." "none") + (const :tag "If there are syntax errors (lex, parse, etc), +send only those, and do not send e.g. statistics diagnostics." "syntax")) + :group 'lsp-sml) + +(defcustom lsp-sml-millet-server-diagnostics-moreInfoHint-enable t + "Show a hint on diagnostic messages about clicking the error code number for +more information." + :type 'boolean + :group 'lsp-sml) + +(defcustom lsp-sml-millet-server-diagnostics-onChange-enable nil + "Send diagnostics when file contents change before saving." + :type 'boolean + :group 'lsp-sml) + +(defcustom lsp-sml-millet-server-hover-token-enable t + "Show information about tokens on hover." + :type 'boolean + :group 'lsp-sml) + +(defcustom lsp-sml-millet-server-path "millet-ls" + "Path to the `millet-ls` executable." + :type 'string + :group 'lsp-sml) + +(lsp-register-custom-settings + '(("millet.format.engine" lsp-sml-millet-format-engine) + ("millet.server.diagnostics.filter" lsp-sml-millet-server-diagnostics-filter) + ("millet.server.diagnostics.moreInfoHint.enable" lsp-sml-millet-server-diagnostics-moreInfoHint-enable) + ("millet.server.diagnostics.onChange.enable" lsp-sml-millet-server-diagnostics-onChange-enable) + ("millet.server.hover.token.enable" lsp-sml-millet-server-hover-token-enable) + ("millet.server.path" lsp-sml-millet-server-path))) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection + (lambda () lsp-sml-millet-server-path)) + :activation-fn (lsp-activate-on "sml" "millet.toml") + :language-id "sml" + :priority -1 + :server-id 'millet)) + +(lsp-consistency-check lsp-sml) + +(provide 'lsp-sml) +;;; lsp-sml.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-solargraph.el b/code/elpa/lsp-mode-20240319.1043/lsp-solargraph.el new file mode 100644 index 0000000..706eecb --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-solargraph.el @@ -0,0 +1,171 @@ +;;; lsp-solargraph.el --- Solargraph server configuration -*- lexical-binding: t; -*- + +;; Copyright (C) 2019 Ivan Yonchovski + +;; Author: Ivan Yonchovski +;; Keywords: + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-solargraph nil + "LSP support for Ruby, using the Solargraph language server." + :group 'lsp-mode + :link '(url-link "https://github.com/castwide/solargraph") + :package-version '(lsp-mode . "6.1")) + +;; (defcustom lsp-solargraph-check-gem-version t +;; "Automatically check if a new version of the Solargraph gem is available." +;; :type 'boolean) + +(defcustom lsp-solargraph-completion t + "Enable completion" + :type 'boolean + :group 'lsp-solargraph + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-solargraph-hover t + "Enable hover" + :type 'boolean + :group 'lsp-solargraph + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-solargraph-diagnostics t + "Enable diagnostics" + :type 'boolean + :group 'lsp-solargraph + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-solargraph-autoformat nil + "Enable automatic formatting while typing (WARNING: experimental)" + :type 'boolean + :group 'lsp-solargraph + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-solargraph-formatting t + "Enable document formatting" + :type 'boolean + :group 'lsp-solargraph + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-solargraph-symbols t + "Enable symbols" + :type 'boolean + :group 'lsp-solargraph + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-solargraph-definitions t + "Enable definitions (go to, etc.)" + :type 'boolean + :group 'lsp-solargraph + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-solargraph-rename t + "Enable symbol renaming" + :type 'boolean + :group 'lsp-solargraph + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-solargraph-references t + "Enable finding references" + :type 'boolean + :group 'lsp-solargraph + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-solargraph-folding t + "Enable folding ranges" + :type 'boolean + :group 'lsp-solargraph + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-solargraph-log-level "warn" + "Level of debug info to log. `warn` is least and `debug` is most." + :type '(choice (const :tag "warn" "info" "debug")) + :group 'lsp-solargraph + :package-version '(lsp-mode . "6.1")) + +;; https://github.com/castwide/solargraph#solargraph-and-bundler +(defcustom lsp-solargraph-use-bundler nil + "Run solargraph under bundler" + :type 'boolean + :safe #'booleanp + :group 'lsp-solargraph + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-solargraph-multi-root t + "If non nil, `solargraph' will be started in multi-root mode." + :type 'boolean + :safe #'booleanp + :group 'lsp-solargraph + :package-version '(lsp-mode . "6.3")) + +(defcustom lsp-solargraph-library-directories + '("~/.rbenv/" "/usr/lib/ruby/" "~/.rvm/" "~/.gem/") + "List of directories which will be considered to be libraries." + :type '(repeat string) + :group 'lsp-solargraph + :package-version '(lsp-mode . "7.0.1")) + +(defcustom lsp-solargraph-server-command '("solargraph" "stdio") + "Command to start Solargraph Ruby language server." + :type '(repeat string) + :group 'lsp-solargraph + :package-version '(lsp-mode . "8.0.1")) + +(defun lsp-solargraph--build-command () + "Build solargraph command" + (if lsp-solargraph-use-bundler + (append '("bundle" "exec") lsp-solargraph-server-command) + lsp-solargraph-server-command)) + +(lsp-register-custom-settings + '(("solargraph.logLevel" lsp-solargraph-log-level) + ("solargraph.folding" lsp-solargraph-folding t) + ("solargraph.references" lsp-solargraph-references t) + ("solargraph.rename" lsp-solargraph-rename t) + ("solargraph.definitions" lsp-solargraph-definitions t) + ("solargraph.symbols" lsp-solargraph-symbols t) + ("solargraph.formatting" lsp-solargraph-formatting t) + ("solargraph.autoformat" lsp-solargraph-autoformat t) + ("solargraph.diagnostics" lsp-solargraph-diagnostics t) + ("solargraph.hover" lsp-solargraph-hover t) + ("solargraph.completion" lsp-solargraph-completion t) + ("solargraph.useBundler" lsp-solargraph-use-bundler t))) + +;; Ruby +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection + #'lsp-solargraph--build-command) + :activation-fn (lsp-activate-on "ruby") + :priority -1 + :multi-root lsp-solargraph-multi-root + :library-folders-fn (lambda (_workspace) lsp-solargraph-library-directories) + :server-id 'ruby-ls + :initialized-fn (lambda (workspace) + (with-lsp-workspace workspace + (lsp--set-configuration + (lsp-configuration-section "solargraph")))))) + +(lsp-consistency-check lsp-solargraph) + +(provide 'lsp-solargraph) +;;; lsp-solargraph.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-solidity.el b/code/elpa/lsp-mode-20240319.1043/lsp-solidity.el new file mode 100644 index 0000000..eefce73 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-solidity.el @@ -0,0 +1,61 @@ +;;; lsp-solidity.el --- solidity LSP -*- lexical-binding: t; -*- + +;; Copyright (C) 2023 konubinix + +;; Author: konubinix +;; Keywords: tools + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;;; Code: + +(require 'lsp-mode) + +(lsp-dependency 'solidity-language-server + '(:system "nomicfoundation-solidity-language-server") + '(:npm :package "@nomicfoundation/solidity-language-server" + :path "nomicfoundation-solidity-language-server")) + + +(defun lsp-client--solidity-ls-server-command () + "Startup command for Solidity language server." + (list (lsp-package-path 'solidity-language-server) "--stdio")) + + +(defgroup lsp-solidity nil + "LSP support for Solidity." + :group 'lsp-mode + :link '(url-link "https://github.com/NomicFoundation/hardhat-vscode/blob/development/server/README.md")) + + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection #'lsp-client--solidity-ls-server-command) + :activation-fn (lsp-activate-on "solidity" "sol") + :server-id 'solidity + :notification-handlers + (ht ("custom/validation-job-status" + #'lsp-client--solidity-validation-job-status)) + :download-server-fn (lambda (_client callback error-callback _update?) + (lsp-package-ensure 'solidity-language-server callback error-callback)))) + +(defun lsp-client--solidity-validation-job-status (_workspace _params) + ;; noop until I find out what to do with this + ) + +(lsp-consistency-check lsp-solidity) + +(provide 'lsp-solidity) +;;; lsp-solidity.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-sorbet.el b/code/elpa/lsp-mode-20240319.1043/lsp-sorbet.el new file mode 100644 index 0000000..dabf00c --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-sorbet.el @@ -0,0 +1,66 @@ +;;; lsp-sorbet.el --- Sorbet server configuration -*- lexical-binding: t; -*- + +;; Copyright (C) 2020 + +;; Author: Christopher Wilson +;; Keywords: + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; lsp-sorbet client + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-sorbet nil + "LSP support for Ruby, using the Sorbet language server." + :group 'lsp-mode + :link '(url-link "https://github.com/sorbet/sorbet") + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-sorbet-use-bundler nil + "Run sorbet under bundler" + :type 'boolean + :group 'lsp-sorbet + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-sorbet-as-add-on nil + "Run sorbet LSP server alongside other LSP server(s)" + :type 'boolean + :group 'lsp-sorbet + :package-version '(lsp-mode . "8.0.0")) + +(defun lsp-sorbet--build-command () + "Build sorbet command" + (let ((lsp-command '("srb" "typecheck" "--lsp" "--disable-watchman"))) + (if lsp-sorbet-use-bundler + (append '("bundle" "exec") lsp-command) + lsp-command))) + +(lsp-register-client + (make-lsp-client + :add-on? lsp-sorbet-as-add-on + :new-connection (lsp-stdio-connection + #'lsp-sorbet--build-command) + :priority -2 + :activation-fn (lsp-activate-on "ruby") + :server-id 'sorbet-ls)) + +(lsp-consistency-check lsp-sorbet) + +(provide 'lsp-sorbet) +;;; lsp-sorbet.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-sqls.el b/code/elpa/lsp-mode-20240319.1043/lsp-sqls.el new file mode 100644 index 0000000..754d9d8 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-sqls.el @@ -0,0 +1,192 @@ +;;; lsp-sqls.el --- SQL Client settings -*- lexical-binding: t; -*- + +;; Copyright (C) 2020 Shunya Ishii + +;; Author: Shunya Ishii +;; Keywords: sql lsp + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP client for SQL + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-sqls nil + "LSP support for SQL, using sqls." + :group 'lsp-mode + :link '(url-link "https://github.com/lighttiger2505/sqls") + :package-version `(lsp-mode . "7.0")) + +(defcustom lsp-sqls-server "sqls" + "Path to the `sqls` binary." + :group 'lsp-sqls + :risky t + :type 'file + :package-version `(lsp-mode . "7.0")) + +(defcustom lsp-sqls-workspace-config-path "workspace" + "If non-nil then setup workspace configuration with json file path." + :group 'lsp-sqls + :risky t + :type '(choice (const "workspace") + (const "root")) + :package-version `(lsp-mode . "7.0")) + +(defun lsp-sqls--make-launch-cmd () + (-let [base `(,lsp-sqls-server)] + ;; we can add some options to command. (e.g. "-config") + base)) + + +(defcustom lsp-sqls-timeout 0.5 + "Timeout to use for `sqls' requests." + :type 'number + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-sqls-connections nil + "The connections to the SQL server(s)." + :type '(repeat (alist :key-type (choice + (const :tag "Driver" driver) + (const :tag "Connection String" dataSourceName)) + :value-type string))) + +(defun lsp-sqls-setup-workspace-configuration () + "Setup workspace configuration using json file. +Depending on `lsp-sqls-workspace-config-path'." + + (if lsp-sqls-connections + (lsp--set-configuration `(:sqls (:connections ,(apply #'vector lsp-sqls-connections)))) + (when-let ((config-json-path (cond + ((equal lsp-sqls-workspace-config-path "workspace") + ".sqls/config.json") + ((equal lsp-sqls-workspace-config-path "root") + (-> (lsp-workspace-root) + (f-join ".sqls/config.json")))))) + (when (file-exists-p config-json-path) + (lsp--set-configuration (lsp--read-json-file config-json-path)))))) + +(defun lsp-sqls--show-results (result) + (with-current-buffer (get-buffer-create "*sqls results*") + (with-help-window (buffer-name) + (erase-buffer) + (insert result)))) + +(defun lsp-sql-execute-query (&optional command start end) + "Execute COMMAND on buffer text against current database. +Buffer text is between START and END. If START and END are nil, +use the current region if set, otherwise the entire buffer." + (interactive) + (lsp-sqls--show-results + (lsp-request + "workspace/executeCommand" + (list :command "executeQuery" + :arguments (or + (when command + (lsp:command-arguments? command)) + (vector (lsp--buffer-uri))) + :timeout lsp-sqls-timeout + :range (list + :start (lsp--point-to-position + (cond + (start start) + ((use-region-p) (region-beginning)) + (t (point-min)))) + :end (lsp--point-to-position + (cond + (end end) + ((use-region-p) (region-end)) + (t (point-max))))))))) + +(defun lsp-sql-execute-paragraph (&optional command) + "Execute COMMAND on paragraph against current database." + (interactive) + (let ((start (save-excursion (backward-paragraph) (point))) + (end (save-excursion (forward-paragraph) (point)))) + (lsp-sql-execute-query command start end))) + +(defun lsp-sql-show-databases (&optional _command) + "Show databases." + (interactive) + (lsp-sqls--show-results + (lsp-request + "workspace/executeCommand" + (list :command "showDatabases" :timeout lsp-sqls-timeout)))) + +(defun lsp-sql-show-schemas (&optional _command) + "Show schemas." + (interactive) + (lsp-sqls--show-results + (lsp-request + "workspace/executeCommand" + (list :command "showSchemas" :timeout lsp-sqls-timeout)))) + +(defun lsp-sql-show-connections (&optional _command) + "Show connections." + (interactive) + (lsp-sqls--show-results + (lsp-request + "workspace/executeCommand" + (list :command "showConnections" :timeout lsp-sqls-timeout)))) + +(defun lsp-sql-switch-database (&optional _command) + "Switch database." + (interactive) + (lsp-workspace-command-execute + "switchDatabase" + (vector (completing-read + "Select database: " + (s-lines (lsp-workspace-command-execute "showDatabases")) + nil + t)))) + +(defun lsp-sql-switch-connection (&optional _command) + "Switch connection." + (interactive) + (lsp-workspace-command-execute + "switchConnections" + (vector (cl-first + (s-match "\\([[:digit:]]*\\)" + (completing-read + "Select connection: " + (s-lines (lsp-workspace-command-execute "showConnections")) + nil + t)))))) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection #'lsp-sqls--make-launch-cmd) + :major-modes '(sql-mode) + :priority -1 + :action-handlers (ht ("executeParagraph" #'lsp-sql-execute-paragraph) + ("executeQuery" #'lsp-sql-execute-query) + ("showDatabases" #'lsp-sql-show-databases) + ("showSchemas" #'lsp-sql-show-schemas) + ("showConnections" #'lsp-sql-show-connections) + ("switchDatabase" #'lsp-sql-switch-database) + ("switchConnections" #'lsp-sql-switch-connection)) + :server-id 'sqls + :initialized-fn (lambda (workspace) + (-> workspace + (lsp--workspace-server-capabilities) + (lsp:set-server-capabilities-execute-command-provider? t)) + (with-lsp-workspace workspace + (lsp-sqls-setup-workspace-configuration))))) + +(lsp-consistency-check lsp-sqls) + +(provide 'lsp-sqls) +;;; lsp-sqls.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-steep.el b/code/elpa/lsp-mode-20240319.1043/lsp-steep.el new file mode 100644 index 0000000..e14490b --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-steep.el @@ -0,0 +1,73 @@ +;;; lsp-steep.el --- lsp-mode for Steep -*- lexical-binding: t; -*- + +;; Copyright (C) 2020 Masafumi Koba + +;; Author: Masafumi Koba +;; Keywords: languages + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP client for Steep which is a Ruby type checker. + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-steep nil + "LSP support for Steep, using the Steep language server." + :group 'lsp-mode + :link '(url-link "https://github.com/soutaro/steep")) + +(defcustom lsp-steep-log-level "warn" + "Log level of Steep." + :type '(choice + (const "fatal") + (const "error") + (const "warn") + (const "info") + (const "debug")) + :group 'lsp-steep) + +(defcustom lsp-steep-use-bundler nil + "Run Steep using Bundler." + :type 'boolean + :safe #'booleanp + :group 'lsp-steep) + +(defcustom lsp-steep-server-path nil + "Path of the Steep language server executable. +If specified, `lsp-steep-use-bundler' is ignored." + :type 'file + :group 'lsp-steep + :package-version '(lsp-mode . "8.0.0")) + +(defun lsp-steep--build-command () + "Build a command to start the Steep language server." + (append + (if (and lsp-steep-use-bundler (not lsp-steep-server-path)) '("bundle" "exec")) + (list (or lsp-steep-server-path "steep") "langserver" "--log-level" lsp-steep-log-level))) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection #'lsp-steep--build-command) + :activation-fn (lsp-activate-on "ruby") + :priority -3 + :server-id 'steep-ls)) + +(lsp-consistency-check lsp-steep) + +(provide 'lsp-steep) +;;; lsp-steep.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-svelte.el b/code/elpa/lsp-mode-20240319.1043/lsp-svelte.el new file mode 100644 index 0000000..91d2423 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-svelte.el @@ -0,0 +1,307 @@ +;;; lsp-svelte.el --- LSP Svelte integration -*- lexical-binding: t; -*- + +;; Copyright (C) 2020 Stepan Lusnikov + +;; Author: Stepan Lusnikov +;; Keywords: lsp svelte + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP client for Svelte + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-svelte nil + "LSP support for Svelte." + :group 'lsp-mode + :link '(url-link + "https://github.com/sveltejs/language-tools")) + +(lsp-dependency 'svelte-language-server + '(:system "svelteserver") + '(:npm :package "svelte-language-server" + :path "svelteserver")) + +(defcustom lsp-svelte-plugin-typescript-enable t + "Enable the TypeScript plugin" + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-svelte-plugin-typescript-diagnostics-enable t + "Enable diagnostic messages for TypeScript" + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-svelte-plugin-typescript-hover-enable t + "Enable hover info for TypeScript" + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-svelte-plugin-typescript-document-symbols-enable t + "Enable document symbols for TypeScript" + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-svelte-plugin-typescript-completions-enable t + "Enable completions for TypeScript" + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-svelte-plugin-typescript-find-references-enable t + "Enable find-references for TypeScript" + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-svelte-plugin-typescript-definitions-enable t + "Enable go to definition for TypeScript" + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-svelte-plugin-typescript-code-actions-enable t + "Enable code actions for TypeScript" + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-svelte-plugin-typescript-selection-range-enable t + "Enable selection range for TypeScript" + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-svelte-plugin-typescript-signature-help-enable t + "Enable signature help (parameter hints) for TypeScript" + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-svelte-plugin-typescript-rename-enable t + "Enable rename functionality for JS/TS variables inside Svelte files" + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-svelte-plugin-css-enable t + "Enable the CSS plugin" + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-svelte-plugin-css-globals "" + "Which css files should be checked for global variables +(`--global-var: value;`). + +These variables are added to the css completions. String of comma-separated +file paths or globs relative to workspace root." + :type 'string + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-svelte-plugin-css-diagnostics-enable t + "Enable diagnostic messages for CSS" + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-svelte-plugin-css-hover-enable t + "Enable hover info for CSS" + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-svelte-plugin-css-completions-enable t + "Enable auto completions for CSS" + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-svelte-plugin-css-completions-emmet t + "Enable emmet auto completions for CSS" + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-svelte-plugin-css-document-colors-enable t + "Enable document colors for CSS" + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-svelte-plugin-css-color-presentations-enable t + "Enable color picker for CSS" + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-svelte-plugin-css-document-symbols-enable t + "Enable document symbols for CSS" + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-svelte-plugin-css-selection-range-enable t + "Enable selection range for CSS" + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-svelte-plugin-html-enable t + "Enable the HTML plugin" + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-svelte-plugin-html-hover-enable t + "Enable hover info for HTML" + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-svelte-plugin-html-completions-enable t + "Enable auto completions for HTML" + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-svelte-plugin-html-completions-emmet t + "Enable emmet auto completions for HTML" + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-svelte-plugin-html-tag-complete-enable t + "Enable HTML tag auto closing" + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-svelte-plugin-html-document-symbols-enable t + "Enable document symbols for HTML" + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-svelte-plugin-svelte-enable t + "Enable the Svelte plugin" + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-svelte-plugin-svelte-diagnostics-enable t + "Enable diagnostic messages for Svelte" + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-svelte-plugin-svelte-compiler-warnings nil + "Svelte compiler warning codes to ignore or to treat as errors. +Example: `((css-unused-selector . ignore) (unused-export-let . error))" + :type '(alist :key-type (symbol :tag "Warning code") + :value-type (choice + (const :tag "Ignore" ignore) + (const :tag "Treat as error" error))) + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-svelte-plugin-svelte-format-enable t + "Enable formatting for Svelte (includes css & js)" + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-svelte-plugin-svelte-completions-enable t + "Enable auto completions for Svelte" + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-svelte-plugin-svelte-hover-enable t + "Enable hover information for Svelte" + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-svelte-plugin-svelte-code-actions-enable t + "Enable Code Actions for Svelte" + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-svelte-plugin-svelte-selection-range-enable t + "Enable selection range for Svelte" + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-svelte-plugin-svelte-rename-enable t + "Enable rename/move Svelte files functionality" + :type 'boolean + :package-version '(lsp-mode . "8.0.0")) + +(lsp-register-custom-settings + '(("svelte.plugin.svelte.rename.enable" lsp-svelte-plugin-svelte-rename-enable t) + ("svelte.plugin.svelte.selectionRange.enable" lsp-svelte-plugin-svelte-selection-range-enable t) + ("svelte.plugin.svelte.codeActions.enable" lsp-svelte-plugin-svelte-code-actions-enable t) + ("svelte.plugin.svelte.hover.enable" lsp-svelte-plugin-svelte-hover-enable t) + ("svelte.plugin.svelte.completions.enable" lsp-svelte-plugin-svelte-completions-enable t) + ("svelte.plugin.svelte.format.enable" lsp-svelte-plugin-svelte-format-enable t) + ("svelte.plugin.svelte.compilerWarnings" lsp-svelte-plugin-svelte-compiler-warnings) + ("svelte.plugin.svelte.diagnostics.enable" lsp-svelte-plugin-svelte-diagnostics-enable t) + ("svelte.plugin.svelte.enable" lsp-svelte-plugin-svelte-enable t) + ("svelte.plugin.html.documentSymbols.enable" lsp-svelte-plugin-html-document-symbols-enable t) + ("svelte.plugin.html.tagComplete.enable" lsp-svelte-plugin-html-tag-complete-enable t) + ("svelte.plugin.html.completions.emmet" lsp-svelte-plugin-html-completions-emmet t) + ("svelte.plugin.html.completions.enable" lsp-svelte-plugin-html-completions-enable t) + ("svelte.plugin.html.hover.enable" lsp-svelte-plugin-html-hover-enable t) + ("svelte.plugin.html.enable" lsp-svelte-plugin-html-enable t) + ("svelte.plugin.css.selectionRange.enable" lsp-svelte-plugin-css-selection-range-enable t) + ("svelte.plugin.css.documentSymbols.enable" lsp-svelte-plugin-css-document-symbols-enable t) + ("svelte.plugin.css.colorPresentations.enable" lsp-svelte-plugin-css-color-presentations-enable t) + ("svelte.plugin.css.documentColors.enable" lsp-svelte-plugin-css-document-colors-enable t) + ("svelte.plugin.css.completions.emmet" lsp-svelte-plugin-css-completions-emmet t) + ("svelte.plugin.css.completions.enable" lsp-svelte-plugin-css-completions-enable t) + ("svelte.plugin.css.hover.enable" lsp-svelte-plugin-css-hover-enable t) + ("svelte.plugin.css.diagnostics.enable" lsp-svelte-plugin-css-diagnostics-enable t) + ("svelte.plugin.css.globals" lsp-svelte-plugin-css-globals) + ("svelte.plugin.css.enable" lsp-svelte-plugin-css-enable t) + ("svelte.plugin.typescript.rename.enable" lsp-svelte-plugin-typescript-rename-enable t) + ("svelte.plugin.typescript.signatureHelp.enable" lsp-svelte-plugin-typescript-signature-help-enable t) + ("svelte.plugin.typescript.selectionRange.enable" lsp-svelte-plugin-typescript-selection-range-enable t) + ("svelte.plugin.typescript.codeActions.enable" lsp-svelte-plugin-typescript-code-actions-enable t) + ("svelte.plugin.typescript.definitions.enable" lsp-svelte-plugin-typescript-definitions-enable t) + ("svelte.plugin.typescript.findReferences.enable" lsp-svelte-plugin-typescript-find-references-enable t) + ("svelte.plugin.typescript.completions.enable" lsp-svelte-plugin-typescript-completions-enable t) + ("svelte.plugin.typescript.documentSymbols.enable" lsp-svelte-plugin-typescript-document-symbols-enable t) + ("svelte.plugin.typescript.hover.enable" lsp-svelte-plugin-typescript-hover-enable t) + ("svelte.plugin.typescript.diagnostics.enable" lsp-svelte-plugin-typescript-diagnostics-enable t) + ("svelte.plugin.typescript.enable" lsp-svelte-plugin-typescript-enable t))) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection + (lambda () + `(,(lsp-package-path 'svelte-language-server) + "--stdio"))) + :activation-fn (lambda (file-name _mode) + (string= (f-ext file-name) + "svelte")) + :initialization-options + (lambda () + (list :config (ht-get* (lsp-configuration-section "svelte.plugin") + "svelte" + "plugin") + :prettierConfig (lsp-configuration-section "prettier") + :emmetConfig (lsp-configuration-section "emmet") + :typescriptConfig: (list :typescript (lsp-configuration-section "typescript") + :javascript (lsp-configuration-section "javascript")) + :dontFilterIncompleteCompletions t)) + :server-id 'svelte-ls + :download-server-fn (lambda (_client callback error-callback _update?) + (lsp-package-ensure 'svelte-language-server callback error-callback)) + :initialized-fn + (lambda (workspace) + (with-lsp-workspace workspace + (lsp--set-configuration + (ht-merge (lsp-configuration-section "svelte") + (lsp-configuration-section "javascript") + (lsp-configuration-section "typescript"))) + (lsp--server-register-capability + (lsp-make-registration + :id "js/ts/id" + :method "workspace/didChangeWatchedFiles" + :register-options? (lsp-make-did-change-watched-files-registration-options + :watchers + (vector (lsp-make-file-system-watcher :glob-pattern "**/*.js") + (lsp-make-file-system-watcher :glob-pattern "**/*.ts"))))))))) + +(lsp-consistency-check lsp-svelte) + +(provide 'lsp-svelte) +;;; lsp-svelte.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-terraform.el b/code/elpa/lsp-mode-20240319.1043/lsp-terraform.el new file mode 100644 index 0000000..13dcfad --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-terraform.el @@ -0,0 +1,457 @@ +;;; lsp-terraform.el --- Terraform Client settings -*- lexical-binding: t; -*- + +;; Copyright (C) 2019 Ross Donaldson, Sibi Prabakaran + +;; Author: Ross Donaldson, Sibi Prabakaran +;; Keywords: terraform lsp + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP client for Terraform + +;;; Code: + +(require 'lsp-mode) +(require 'lsp-semantic-tokens) +(require 'lsp-protocol) +(require 'dash) + +;; terraform-lsp + +(defgroup lsp-terraform nil + "LSP support for Terraform, using terraform-lsp." + :group 'lsp-mode + :link '(url-link "https://github.com/juliosueiras/terraform-lsp") + :package-version `(lsp-mode . "6.2")) + +(defcustom lsp-terraform-server "terraform-lsp" + "Path to the `terraform-lsp' binary." + :group 'lsp-terraform + :risky t + :type '(choice + (file :tag "File") + (repeat string)) + :package-version `(lsp-mode . "6.2")) + +(defcustom lsp-terraform-enable-logging nil + "If non-nil, enable `terraform-ls''s native logging." + :group 'lsp-terraform + :risky t + :type 'boolean + :package-version `(lsp-mode . "6.2")) + + +(defun lsp-terraform--make-launch-cmd () + (-let [base (if (stringp lsp-terraform-server) + `(,lsp-terraform-server) + lsp-terraform-server)] + (when lsp-terraform-enable-logging + (push "-enable-log-file" base)) + base)) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection #'lsp-terraform--make-launch-cmd) + :major-modes '(terraform-mode) + :priority -1 + :server-id 'tfls)) + + +;; terraform-ls + +(defgroup lsp-terraform-ls nil + "LSP support for Terraform, using terraform-ls from Hashicorp." + :group 'lsp-mode + :link '(url-link "https://github.com/hashicorp/terraform-ls") + :package-version `(lsp-mode . "8.0.1")) + +(defcustom lsp-terraform-ls-server "terraform-ls" + "Path to the `terraform-ls' binary." + :group 'lsp-terraform-ls + :risky t + :type '(choice + (file :tag "File") + (repeat string)) + :package-version `(lsp-mode . "8.0.1")) + +(defcustom lsp-terraform-ls-enable-show-reference nil + "Enable reference counts. + +Display reference counts above top level blocks and +attributes. This is an experimental feature provided by the +language server." + :group 'lsp-terraform-ls + :type 'boolean + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-terraform-ls-validate-on-save nil + "Enable validating the current open file on save. + +This is an experimental feature provided by the language server." + :group 'lsp-terraform-ls + :type 'boolean + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-terraform-ls-prefill-required-fields nil + "Enable completion of required fields. + +Enable autocompletion for required fields when completing +Terraform blocks. This is an experimental feature provided by the +language server." + :group 'lsp-terraform-ls + :type 'boolean + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-terraform-ls-providers-position-params nil + "The optional providers tree position params. +Defaults to side following treemacs default." + :type 'alist + :group 'lsp-terraform-ls + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-terraform-ls-module-calls-position-params nil + "The optional module calls tree position params. +Defaults to side following treemacs default." + :type 'alist + :group 'lsp-terraform-ls + :package-version '(lsp-mode . "8.0.1")) + +(defun lsp-terraform-ls--make-launch-cmd () + `(,lsp-terraform-ls-server "serve")) + +(lsp-defun lsp-terraform-ls--show-references ((&Command :arguments?)) + "Show references for command with ARGS." + (lsp-show-xrefs + (lsp--locations-to-xref-items + (lsp-request "textDocument/references" + (lsp--make-reference-params + (lsp--text-document-position-params nil (elt arguments? 0))))) + t + t)) + +(defun lsp-terraform-ls--custom-capabilities () + "Construct custom capabilities for the language server." + (when lsp-terraform-ls-enable-show-reference + '((experimental . ((showReferencesCommandId . "client.showReferences")))))) + +(defun lsp-terraform-ls--init-options () + "Construct initialization options for the lanague server." + `((experimentalFeatures . ((validateOnSave . ,(lsp-json-bool lsp-terraform-ls-validate-on-save)) + (prefillRequiredFields . ,(lsp-json-bool lsp-terraform-ls-prefill-required-fields)))))) + +(defcustom lsp-terraform-semantic-token-faces + '(("namespace" . lsp-face-semhl-namespace) + ("type" . lsp-face-semhl-type) + ("class" . lsp-face-semhl-class) + ("enum" . lsp-face-semhl-enum) + ("interface" . lsp-face-semhl-interface) + ("struct" . lsp-face-semhl-struct) + ("typeParameter" . lsp-face-semhl-type-parameter) + ("parameter" . lsp-face-semhl-parameter) + ("variable" . lsp-face-semhl-variable) + ("property" . lsp-face-semhl-property) + ("enumMember" . lsp-face-semhl-constant) + ("event" . lsp-face-semhl-event) + ("function" . lsp-face-semhl-function) + ("method" . lsp-face-semhl-method) + ("macro" . lsp-face-semhl-macro) + ("keyword" . lsp-face-semhl-keyword) + ("modifier" . lsp-face-semhl-member) + ("comment" . lsp-face-semhl-comment) + ("string" . lsp-face-semhl-string) + ("number" . lsp-face-semhl-number) + ("regexp" . lsp-face-semhl-regexp) + ("operator" . lsp-face-semhl-operator) + ("hcl-attrName" . lsp-face-semhl-member) + ("hcl-blockType" . lsp-face-semhl-struct) + ("hcl-blockLabel" . lsp-face-semhl-member) + ("hcl-bool" . lsp-face-semhl-constant) + ("hcl-string" . lsp-face-semhl-string) + ("hcl-number" . lsp-face-semhl-number) + ("hcl-objectKey" . lsp-face-semhl-member) + ("hcl-mapKey" . lsp-face-semhl-member) + ("hcl-keyword" . lsp-face-semhl-keyword) + ("hcl-traversalStep" . lsp-face-semhl-member) + ("hcl-typeCapsule" . lsp-face-semhl-type) + ("hcl-typePrimitive" . lsp-face-semhl-type)) + "Mapping between terrafom-ls tokens and fonts to apply." + :group 'lsp-terraform + :type '(alist :key-type string :value-type face) + :package-version '(lsp-mode . "8.1")) + +(defcustom lsp-terraform-semantic-token-modifier-faces + '(("declaration" . lsp-face-semhl-class) + ("definition" . lsp-face-semhl-definition) + ("readonly" . lsp-face-semhl-constant) + ("static" . lsp-face-semhl-static) + ("deprecated" . lsp-face-semhl-deprecated) + ("abstract" . lsp-face-semhl-keyword) + ("async" . lsp-face-semhl-macro) + ("modification" . lsp-face-semhl-operator) + ("documentation" . lsp-face-semhl-comment) + ("defaultLibrary" . lsp-face-semhl-default-library) + ("hcl-dependent" . lsp-face-semhl-constant) + ("terraform-data" . lsp-face-semhl-constant) + ("terraform-locals" . lsp-face-semhl-variable) + ("terraform-module" . lsp-face-semhl-namespace) + ("terraform-output" . lsp-face-semhl-constant) + ("terraform-provider" . lsp-face-semhl-class) + ("terraform-resource" . lsp-face-semhl-interface) + ("terraform-provisioner" . lsp-face-semhl-default-library) + ("terraform-connection" . lsp-face-semhl-constant) + ("terraform-variable" . lsp-face-semhl-variable) + ("terraform-terraform" . lsp-face-semhl-constant) + ("terraform-backend" . lsp-face-semhl-definition) + ("terraform-name" . lsp-face-semhl-interface) + ("terraform-type" . lsp-face-semhl-type) + ("terraform-requiredProviders" . lsp-face-semhl-default-library)) + "Mapping between terraform-ls modifiers and fonts to apply." + :group 'lsp-terraform + :type '(alist :key-type string :value-type face) + :package-version '(lsp-mode . "8.1")) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection #'lsp-terraform-ls--make-launch-cmd) + :major-modes '(terraform-mode) + :priority 1 + :server-id 'tfmls + :action-handlers (ht ("client.showReferences" #'lsp-terraform-ls--show-references)) + :semantic-tokens-faces-overrides `(:discard-default-modifiers t + :discard-default-types t + :modifiers ,lsp-terraform-semantic-token-modifier-faces + :types ,lsp-terraform-semantic-token-faces) + :initialization-options (lsp-terraform-ls--init-options) + :custom-capabilities (lsp-terraform-ls--custom-capabilities))) + +(defun lsp-terraform-ls-validate () + "Execute terraform validate on project root." + (interactive) + (lsp-request + "workspace/executeCommand" + (list :command "terraform-ls.terraform.validate" + :arguments (vector (format "uri=%s" (lsp--path-to-uri (lsp-workspace-root)))) + ) + :no-wait t + :no-merge t)) + +(defun lsp-terraform-ls-init () + "Execute terraform init on project root. + +This is a synchronous action." + (interactive) + (lsp-request + "workspace/executeCommand" + (list :command "terraform-ls.terraform.init" + :arguments (vector (format "uri=%s" (lsp--path-to-uri (lsp-workspace-root))))) + :no-wait nil + :no-merge t)) + +(defun lsp-terraform-ls-version () + "Get information about the terraform binary version for the current module." + (interactive) + (let ((terraform-data (lsp-request + "workspace/executeCommand" + (list :command "terraform-ls.module.terraform" + :arguments (vector (format "uri=%s" (lsp--path-to-uri (lsp-workspace-root)))))))) + (lsp--info "Required: %s, Current: %s" + (lsp:terraform-ls-module-terraform-required-version terraform-data) + (lsp:terraform-ls-module-terraform-discovered-version terraform-data)))) + +(lsp-consistency-check lsp-terraform) + +(defvar treemacs-position) +(defvar treemacs-width) +(declare-function lsp-treemacs-render "ext:lsp-treemacs" (tree title expand-depth &optional buffer-name)) + +(defvar-local lsp-terraform-ls--providers-tree-data nil) +(defvar-local lsp-terraform-ls--modules-call-tree-data nil) +(defvar-local lsp-tf--modules-control-buffer nil) +(defconst lsp-terraform-ls--providers-buffer-name "*Terraform Providers*") +(defconst lsp-terraform-ls--modules-buffer-name "*Terraform Modules*") + +(defvar lsp-terraform-modules-mode-map + (let ((m (make-sparse-keymap))) + (define-key m (kbd "g") 'lsp-terraform-ls--modules-refresh) + m) + "Keymap for `lsp-terraform-modules-mode'.") + +(define-minor-mode lsp-terraform-modules-mode "LSP Treemacs mode for terraform modules." + :keymap lsp-terraform-modules-mode-map + :group 'lsp-terraform-ls) + +(cl-defstruct tf-package display-name doc-link installed-version version-constraint) + +(cl-defstruct tf-module name doc-link version source-type dependent-modules) + +(defun construct-tf-package (provider installed-version) + "Construct `TF-PACKAGE' using PROVIDER and INSTALLED-VERSION." + (make-tf-package :display-name (lsp-get provider :display_name) + :doc-link (lsp-get provider :docs_link) + :installed-version installed-version + :version-constraint (lsp-get provider :version_constraint))) + +(lsp-defun construct-tf-module ((&terraform-ls:Module :name :docs-link :version :source-type :dependent-modules)) + "Construct `TF-MODULE' using MODULE." + (make-tf-module :name name + :doc-link docs-link + :version version + :source-type source-type + :dependent-modules dependent-modules)) + +(lsp-defun lsp-terraform-ls--providers-to-tf-package ((&terraform-ls:Providers :provider-requirements :installed-providers)) + "Convert PROVIDERS-TREE-DATA to list of `tf-package'." + (let* ((provider-requirements-keys (hash-table-keys provider-requirements)) + (installed-versions (mapcar (lambda (x) (lsp-get installed-providers (make-symbol (format ":%s" x)))) provider-requirements-keys)) + (providers (mapcar (lambda (x) (lsp-get provider-requirements (make-symbol (format ":%s" x)))) provider-requirements-keys)) + (tf-packages (-zip-with (lambda (x y) (construct-tf-package x y)) providers installed-versions))) + tf-packages)) + +(lsp-defun lsp-terraform-ls--modules-to-tf-module ((&terraform-ls:ModuleCalls :module-calls)) + "Convert MODULES-TREE-DATA to list of `TF-MODULE'." + (let* ((modules (-map (lambda (x) (construct-tf-module x)) module-calls))) + modules)) + +(defun lsp-terraform-ls--fetch-modules-data (project-root) + "Fetch modules data and set it in `lsp-terraform-ls--modules-call-tree-data'." + (let* ((tree-data (lsp-request + "workspace/executeCommand" + (list :command "terraform-ls.module.calls" + :arguments (vector (format "uri=%s" (lsp--path-to-uri project-root)))) + :no-wait nil + :no-merge nil)) + (modules (lsp-terraform-ls--modules-to-tf-module tree-data))) + (setq-local lsp-terraform-ls--modules-call-tree-data modules))) + +(defun lsp-terraform-ls--fetch-providers () + "Fetch modules call data and set it in `lsp-terraform-ls--providers-tree-data'." + (let* ((tree-data (lsp-request + "workspace/executeCommand" + (list :command "terraform-ls.module.providers" + :arguments (vector (format "uri=%s" (lsp--path-to-uri (lsp-workspace-root))))) + :no-wait nil + :no-merge nil)) + (tf-packages (lsp-terraform-ls--providers-to-tf-package tree-data))) + (setq-local lsp-terraform-ls--providers-tree-data tf-packages))) + +(defun lsp-terraform-ls--tf-packages-to-treemacs (tf-packages) + "Convert list of `TF-PACKAGES' to treemacs compatible data." + (mapcar (lambda (package) (list :label (format "%s %s" (tf-package-display-name package) (tf-package-installed-version package)) + :icon 'package + :key (tf-package-display-name package) + :children (list (list + :icon 'library + :label (tf-package-version-constraint package))) + :ret-action (lambda (&rest _) (browse-url (tf-package-doc-link package))))) tf-packages)) + +(defun lsp-terraform-ls--tf-modules-to-treemacs (tf-modules) + "Convert list of `TF-MODULES' to treemacs compatible data." + (mapcar (lambda (module) (list :label (format "%s %s" (tf-module-name module) (tf-module-version module)) + :icon 'package + :key (tf-module-name module) + :ret-action (lambda (&rest _) (browse-url (tf-module-doc-link module))) + )) tf-modules)) + +(defun lsp-terraform-ls--show-providers (ignore-focus?) + "Show terraform providers and focus on it if IGNORE-FOCUS? is nil." + (unless lsp-terraform-ls--providers-tree-data + (lsp-terraform-ls--fetch-providers)) + (let* ((lsp-terraform-treemacs + (lsp-terraform-ls--tf-packages-to-treemacs lsp-terraform-ls--providers-tree-data)) + (buffer (lsp-treemacs-render lsp-terraform-treemacs + lsp-terraform-ls--providers-buffer-name + t + "Terraform Providers")) + (position-params (or lsp-terraform-ls-providers-position-params + `((side . ,treemacs-position) + (slot . 2) + (window-width . ,treemacs-width)))) + (window + (display-buffer-in-side-window buffer position-params))) + (unless ignore-focus? + (select-window window) + (set-window-dedicated-p window t)))) + +(defun lsp-terraform-ls--show-module-calls (ignore-focus? project-root) + "Show terraform modules and focus on it if IGNORE-FOCUS? is nil." + (unless lsp-terraform-ls--modules-call-tree-data + (lsp-terraform-ls--fetch-modules-data project-root)) + (unless lsp-terraform-ls--modules-call-tree-data + (error "Modules data is empty")) + (let* ((lsp-terraform-treemacs + (lsp-terraform-ls--tf-modules-to-treemacs lsp-terraform-ls--modules-call-tree-data)) + (buffer (lsp-treemacs-render lsp-terraform-treemacs + lsp-terraform-ls--modules-buffer-name + t + "Terraform Modules")) + (modules-buffer (current-buffer)) + (position-params (or lsp-terraform-ls-module-calls-position-params + `((side . ,treemacs-position) + (slot . 1) + (window-width . ,treemacs-width)))) + (window + (display-buffer-in-side-window buffer position-params))) + (select-window window) + (setq-local lsp-tf--modules-control-buffer modules-buffer) + (lsp-terraform-modules-mode t) + (set-window-dedicated-p window t) + (when ignore-focus? + (select-window (previous-window))))) + +(defun lsp-terraform-ls--refresh-module-calls () + "Refresh terraform modules." + (lsp-terraform-ls--fetch-modules-data (lsp-workspace-root)) + (unless lsp-terraform-ls--modules-call-tree-data + (error "Modules data is empty")) + (let* ((lsp-terraform-treemacs + (lsp-terraform-ls--tf-modules-to-treemacs lsp-terraform-ls--modules-call-tree-data)) + (buffer (lsp-treemacs-render lsp-terraform-treemacs + lsp-terraform-ls--modules-buffer-name + t + "Terraform Modules")) + (position-params (or lsp-terraform-ls-module-calls-position-params + `((side . ,treemacs-position) + (slot . 1) + (window-width . ,treemacs-width)))) + (window + (display-buffer-in-side-window buffer position-params))) + (select-window window) + (lsp-terraform-modules-mode t) + (set-window-dedicated-p window t) + (lsp--info "Refresh completed"))) + +(defun lsp-terraform-ls-providers (&optional ignore-focus?) + "Show terraform providers with focus on it if IGNORE-FOCUS? is nil." + (interactive) + (if (require 'lsp-treemacs nil t) + (lsp-terraform-ls--show-providers ignore-focus?) + (error "The package lsp-treemacs is not installed"))) + +(defun lsp-terraform-ls-module-calls (&optional ignore-focus?) + "Show terraform modules with focus on it if IGNORE-FOCUS? is nil." + (interactive) + (if (require 'lsp-treemacs nil t) + (lsp-terraform-ls--show-module-calls ignore-focus? (lsp-workspace-root)) + (error "The package lsp-treemacs is not installed"))) + +(defun lsp-terraform-ls--modules-refresh () + "Refresh terraform modules data." + (interactive) + (unless (buffer-live-p lsp-tf--modules-control-buffer) + (error "Original buffer not present. Do M-x lsp-terraform-ls-module-calls")) + (with-current-buffer lsp-tf--modules-control-buffer + (lsp-terraform-ls--refresh-module-calls))) + +(provide 'lsp-terraform) +;;; lsp-terraform.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-tex.el b/code/elpa/lsp-mode-20240319.1043/lsp-tex.el new file mode 100644 index 0000000..3cd6d08 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-tex.el @@ -0,0 +1,68 @@ +;;; lsp-tex.el --- description -*- lexical-binding: t; -*- + +;; Copyright (C) 2020 emacs-lsp maintainers + +;; Author: emacs-lsp maintainers +;; Keywords: lsp, tex + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP Clients for the Tex Typesetting Language. + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-tex nil + "LSP support for TeX and friends, using Digestif and texlab." + :group 'lsp-mode + :link '(url-link "https://github.com/astoff/digestif/") + :link '(url-link "https://github.com/latex-lsp/texlab")) + +(defcustom lsp-tex-server 'texlab + "Choose LSP tex server." + :type '(choice (const :tag "texlab" texlab) + (const :tag "digestif" digestif)) + :group 'lsp-tex) + +(defcustom lsp-clients-digestif-executable "digestif" + "Command to start the Digestif language server." + :group 'lsp-tex + :risky t + :type 'file) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection lsp-clients-digestif-executable) + :major-modes '(plain-tex-mode latex-mode context-mode texinfo-mode) + :priority (if (eq lsp-tex-server 'digestif) 1 -1) + :server-id 'digestif)) + +(defcustom lsp-clients-texlab-executable "texlab" + "Command to start the texlab language server." + :group 'lsp-tex + :risky t + :type 'file) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection lsp-clients-texlab-executable) + :major-modes '(plain-tex-mode latex-mode) + :priority (if (eq lsp-tex-server 'texlab) 1 -1) + :server-id 'texlab)) + +(lsp-consistency-check lsp-tex) + +(provide 'lsp-tex) +;;; lsp-tex.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-tilt.el b/code/elpa/lsp-mode-20240319.1043/lsp-tilt.el new file mode 100644 index 0000000..a76b563 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-tilt.el @@ -0,0 +1,35 @@ +;;; lsp-tilt.el --- tilt LSP -*- lexical-binding: t; -*- + +;; Copyright (C) 2023 konubinix + +;; Author: konubinix +;; Keywords: tools + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; Using tilt mode from https://github.com/Konubinix/tilt-mode + +;;; Code: + +(require 'lsp-mode) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection '("tilt" "lsp" "start")) + :activation-fn (lsp-activate-on "tiltfile") + :server-id 'tiltfile)) + +(provide 'lsp-tilt) +;;; lsp-tilt.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-toml.el b/code/elpa/lsp-mode-20240319.1043/lsp-toml.el new file mode 100644 index 0000000..2c889a0 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-toml.el @@ -0,0 +1,171 @@ +;;; lsp-toml.el --- lsp-mode TOML integration -*- lexical-binding: t; -*- + +;; Copyright (C) 2021 Taiki Sugawara + +;; Author: Taiki Sugawara +;; Keywords: lsp, toml + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; Client for taplo. + +;;; Code: + +(require 'lsp-mode) +(require 'ht) +(require 'f) + +(defgroup lsp-toml nil + "LSP support for TOML, using Taplo." + :group 'lsp-mode + :link '(url-link "https://github.com/tamasfe/taplo")) + +(defcustom lsp-toml-command "taplo" + "Path to taplo command." + :type 'string + :group 'lsp-toml + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-toml-cache-path (expand-file-name + (locate-user-emacs-file (f-join ".cache" "lsp-toml"))) + "Path to cache." + :type 'string + :group 'lsp-toml + :package-version '(lsp-mode . "8.0.1")) + +(lsp-defcustom lsp-toml-taplo-config-file-path nil + "An absolute, or workspace relative path to the Taplo configuration file." + :type 'string + :group 'lsp-toml + :package-version '(lsp-mode . "8.0.1") + :lsp-path "evenBetterToml.taplo.configFile.path") + +(lsp-defcustom lsp-toml-taplo-config-file-enabled t + "Whether to enable the usage of a Taplo configuration file." + :type 'boolean + :group 'lsp-toml + :package-version '(lsp-mode . "8.0.1") + :lsp-path "evenBetterToml.taplo.configFile.enabled") + +(lsp-defcustom lsp-toml-semantic-tokens nil + "Enable semantic tokens for inline table and array keys." + :type 'boolean + :group 'lsp-toml + :package-version '(lsp-mode . "8.0.1") + :lsp-path "evenBetterToml.semanticTokens") + +(lsp-defcustom lsp-toml-schema-enabled t + "Enable completion and validation based on JSON schemas." + :type 'boolean + :group 'lsp-toml + :package-version '(lsp-mode . "8.0.1") + :lsp-path "evenBetterToml.schema.enabled") + +(lsp-defcustom lsp-toml-schema-links nil + "Whether to show clickable links for keys in the editor." + :type 'boolean + :group 'lsp-toml + :package-version '(lsp-mode . "8.0.1") + :lsp-path "evenBetterToml.schema.links") + +(lsp-defcustom lsp-toml-schema-catalogs + ["https://www.schemastore.org/api/json/catalog.json"] + "A list of URLs to schema catalogs where schemas and associations +can be fetched from" + :type 'lsp-string-vector + :group 'lsp-toml + :package-version '(lsp-mode . "8.0.1") + :lsp-path "evenBetterToml.schema.catalogs") + +(lsp-defcustom lsp-toml-schema-associations nil + "Additional document and schema associations. + +The key must be a regular expression, this pattern is used to +associate schemas with absolute document URIs. + +The value must be an absolute URI to the JSON schema" + :type '(alist :key-type symbol :value-type string) + :group 'lsp-toml + :package-version '(lsp-mode . "8.0.1") + :lsp-path "evenBetterToml.schema.associations") + +(lsp-defcustom lsp-toml-schema-cache-memory-expiration 60 + "The amount of seconds after which schemas will be invalidated from memory." + :type 'number + :group 'lsp-toml + :package-version '(lsp-mode . "8.0.1") + :lsp-path "evenBetterToml.schema.cache.memoryExpiration") + +(lsp-defcustom lsp-toml-schema-cache-disk-expiration 600 + "The amount of seconds after which cached catalogs and schemas +expire and will be attempted to be fetched again." + :type 'number + :group 'lsp-toml + :package-version '(lsp-mode . "8.0.1") + :lsp-path "evenBetterToml.schema.cache.diskExpiration") + +(lsp-defcustom lsp-toml-completion-max-keys 5 + "The maximum amount of keys in a dotted key to display during +completion, 0 effectively disables key completions." + :type 'number + :group 'lsp-toml + :package-version '(lsp-mode . "8.0.1") + :lsp-path "evenBetterToml.completion.maxKeys") + +(lsp-defcustom lsp-toml-syntax-semantic-tokens t + "Whether to enable semantic tokens for tables and arrays." + :type 'boolean + :group 'lsp-toml + :package-version '(lsp-mode . "8.0.1") + :lsp-path "evenBetterToml.syntax.semanticTokens") + + +(defun lsp-toml--initialization-options () + "Initialization options for taplo." + (list :configurationSection "evenBetterToml" + :cachePath lsp-toml-cache-path)) + +(defun lsp-toml--handle-message-with-output (_workspace params) + "Handle taplo/messageWithOutput notification with PARAMS." + (funcall (pcase (ht-get params "kind") + ("error" 'lsp--error) + ("warn" 'lsp--warn) + ("info" 'lsp--info) + (_ 'lsp--info)) + "lsp-toml: %s" + (ht-get params "message"))) + +(defun lsp-toml--check-enabled (_file-name _mode) + "Check if the taplo language server should be enabled in this buffer." + (when (string= (lsp-buffer-language) "toml") + (make-directory lsp-toml-cache-path t) + t)) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection (lambda () (list lsp-toml-command "lsp" "stdio"))) + :activation-fn #'lsp-toml--check-enabled + :initialization-options #'lsp-toml--initialization-options + :notification-handlers (ht ("taplo/messageWithOutput" #'lsp-toml--handle-message-with-output) + ("taplo/didChangeSchemaAssociation" #'ignore)) + :multi-root t + :server-id 'taplo + :priority -1)) + +(lsp-consistency-check lsp-toml) + +(provide 'lsp-toml) +;;; lsp-toml.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-trunk.el b/code/elpa/lsp-mode-20240319.1043/lsp-trunk.el new file mode 100644 index 0000000..f72c3d0 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-trunk.el @@ -0,0 +1,88 @@ +;;; lsp-trunk.el --- trunk support -*- lexical-binding: t; -*- +;; +;; Copyright (C) 2024 Trunk Technologies, Inc. +;; +;; Author: Tyler Jang +;; Keywords: trunk, lsp, meta-linter +;; +;; 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 . +;; This file is not part of GNU Emacs. +;; +;;; Commentary: +;; +;; Trunk support for lsp-mode +;; +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-trunk nil + "LSP support for Trunk." + :group 'lsp-mode + :link `(url-link "https://docs.trunk.io")) + +(defcustom lsp-trunk-executable "trunk" + "Path to the trunk executable" + :group 'lsp-trunk + :type 'string) + +(defcustom lsp-trunk-args '("lsp-proxy") + "Additional arguments to pass to the trunk startup" + :group 'lsp-trunk + :type '(repeat string)) + +(defun lsp-trunk-check-for-init (filename &optional _) + "Check if the file exists in a workspace that has a .trunk/trunk.yaml" + (let ((dir (file-name-directory filename)) + (trunk-file ".trunk/trunk.yaml")) + (locate-dominating-file dir trunk-file))) + +(defun lsp-trunk-check-disable (command) + "Disable a linter in your repo." + (shell-command + (concat lsp-trunk-executable " check disable " + (mapconcat 'identity (gethash "arguments" command) " ")))) + +(defun lsp-trunk-check-enable (command) + "Enable a linter in your repo." + (shell-command + (concat lsp-trunk-executable " check enable " + (mapconcat 'identity (gethash "arguments" command) " ")))) + +(defun lsp-trunk-open-config (&optional _command) + "Open the trunk config file." + (find-file ".trunk/trunk.yaml")) + +(lsp-register-client + (make-lsp-client + :activation-fn #'lsp-trunk-check-for-init + :new-connection (lsp-stdio-connection + (lambda () (append (list lsp-trunk-executable) lsp-trunk-args))) + :server-id 'trunk-lsp + :initialization-options (lambda () + (list + :version "0.1.0" + :clientType "emacs" + :clientVersion (symbol-value 'emacs-version))) + :notification-handlers (ht ("$/progress" #'ignore)) + :action-handlers (ht ("trunk.checkDisable" #'lsp-trunk-check-disable) + ("trunk.checkEnable" #'lsp-trunk-check-enable) + ("trunk.openConfigFile" #'lsp-trunk-open-config)) + :priority -2 + :add-on? t)) + +(lsp-consistency-check lsp-trunk) + +(provide 'lsp-trunk) +;;; lsp-trunk.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-ttcn3.el b/code/elpa/lsp-mode-20240319.1043/lsp-ttcn3.el new file mode 100644 index 0000000..f7d2b66 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-ttcn3.el @@ -0,0 +1,51 @@ +;;; lsp-ttcn3.el --- description -*- lexical-binding: t; -*- + +;; Copyright (C) 2022 emacs-lsp maintainers + +;; Author: emacs-lsp maintainers +;; Keywords: lsp, ttcn3 + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP Clients for the TTCN3 Programming Language. + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-ttcn3 nil + "LSP support for TTCN3, using ntt-language-server." + :group 'lsp-mode + :link '(url-link "https://github.com/nokia/ntt")) + +(defcustom lsp-ttcn3-lsp-server-command + '("ntt" "langserver") + "Command to start ttcn3-language-server." + :group 'lsp-ttcn3 + :type '(choice + (string :tag "Single string value") + (repeat :tag "List of string values" + string))) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection lsp-ttcn3-lsp-server-command) + :activation-fn (lsp-activate-on "ttcn3") + :priority -1 + :server-id 'ntt)) + +(provide 'lsp-ttcn3) +;;; lsp-ttcn3.el ends here + diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-typeprof.el b/code/elpa/lsp-mode-20240319.1043/lsp-typeprof.el new file mode 100644 index 0000000..917605a --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-typeprof.el @@ -0,0 +1,60 @@ +;;; lsp-typeprof.el --- TypeProf server configuration -*- lexical-binding: t; -*- + +;; Copyright (C) 2022 Taiki Sugawara + +;; Author: Taiki Sugawara +;; Keywords: lsp, ruby + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; Client for TypeProf. + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-typeprof nil + "LSP support for Ruby, using the TypeProf language server." + :group 'lsp-mode + :link '(url-link "https://github.com/ruby/typeprof") + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-typeprof-use-bundler nil + "Run typeprof under bundler." + :type 'boolean + :safe #'booleanp + :group 'lsp-typeprof + :package-version '(lsp-mode . "8.0.1")) + +(defun lsp-typeprof--build-command () + "Build typeprof command." + (let ((lsp-command '("typeprof" "--lsp" "--stdio"))) + (if lsp-typeprof-use-bundler + (append '("bundle" "exec") lsp-command) + lsp-command))) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection + #'lsp-typeprof--build-command) + :priority -4 + :activation-fn (lsp-activate-on "ruby") + :server-id 'typeprof-ls)) + +(lsp-consistency-check lsp-typeprof) + +(provide 'lsp-typeprof) +;;; lsp-typeprof.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-v.el b/code/elpa/lsp-mode-20240319.1043/lsp-v.el new file mode 100644 index 0000000..a809a07 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-v.el @@ -0,0 +1,50 @@ +;;; lsp-v.el --- lsp-mode V integration -*- lexical-binding: t; -*- + +;; Copyright (C) 2021 remimimimi + +;; Author: remimimimi +;; Keywords: languages,tools + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; client for vls, the V language server + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-v nil + "LSP support for V via vls." + :group 'lsp-mode + :link '(url-link "https://github.com/vlang/vls/tree/master")) + +(defcustom lsp-v-vls-executable "vls" + "The vls executable to use. +Leave as just the executable name to use the default behavior of +finding the executable with variable `exec-path'." + :group 'lsp-v + :type 'string) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection (lambda () lsp-v-vls-executable)) + :activation-fn (lsp-activate-on "V") + :server-id 'v-ls)) + +(lsp-consistency-check lsp-v) + +(provide 'lsp-v) +;;; lsp-v.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-vala.el b/code/elpa/lsp-mode-20240319.1043/lsp-vala.el new file mode 100644 index 0000000..479743b --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-vala.el @@ -0,0 +1,51 @@ +;;; lsp-vala.el --- Vala Client settings -*- lexical-binding: t; -*- + +;; Copyright (C) 2020 Daniel Svensson + +;; Author: Daniel Svensson +;; Keywords: vala lsp + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP client for Vala + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-vala nil + "LSP support for Vala, using vala-language-server" + :group 'lsp-mode + :link '(url-link "https://github.com/benwaffle/vala-language-server") + :package-version `(lsp-mode . "8.0.0")) + +(defcustom lsp-clients-vala-ls-executable "vala-language-server" + "Path to the `vala-language-server' binary." + :group 'lsp-vala + :risky t + :type 'file + :package-version `(lsp-mode . "8.0.0")) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection (lambda () lsp-clients-vala-ls-executable)) + :major-modes '(vala-mode) + :priority -1 + :server-id 'valals)) + +(lsp-consistency-check lsp-vala) + +(provide 'lsp-vala) +;;; lsp-vala.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-verilog.el b/code/elpa/lsp-mode-20240319.1043/lsp-verilog.el new file mode 100644 index 0000000..2a8d7a5 --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-verilog.el @@ -0,0 +1,213 @@ +;;; lsp-verilog.el --- Verilog Client settings -*- lexical-binding: t; -*- + +;; Copyright (C) 2019 Patrick Grogan + +;; Author: Patrick Grogan +;; Created: 7 December 2019 +;; Keywords: languages, lsp, verilog + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: +;; LSP client support for Verilog/SystemVerilog. The following language +;; servers are available: +;; 1) HDL Checker. See https://github.com/suoto/hdl_checker +;; 2) SVLangserver. See https://github.com/imc-trading/svlangserver +;; 3) Verible. See https://github.com/chipsalliance/verible +;; +;; This file is based on the lsp-vhdl.el file. +;; + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-svlangserver nil + "Settings for the SystemVerilog language server client." + :group 'lsp-mode + :link '(url-link "https://github.com/imc-trading/svlangserver") + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-clients-svlangserver-includeIndexing '["**/*.{sv,svh}"] + "Files included for indexing (glob pattern)" + :group 'lsp-svlangserver + :type '(lsp-repeatable-vector string) + :safe (lambda (x) (seq-every-p #'stringp x))) + +(defcustom lsp-clients-svlangserver-excludeIndexing '["test/**/*.{sv,svh}"] + "Files excluded for indexing (glob pattern)" + :group 'lsp-svlangserver + :type '(lsp-repeatable-vector string) + :safe (lambda (x) (seq-every-p #'stringp x))) + +(defcustom lsp-clients-svlangserver-defines nil + "Defines needed for linting" + :group 'lsp-svlangserver + :type '(lsp-repeatable-vector string) + :safe (lambda (x) (seq-every-p #'stringp x))) + +(defcustom lsp-clients-svlangserver-launchConfiguration "verilator -sv --lint-only -Wall" + "Verilator command used for linting" + :group 'lsp-svlangserver + :type 'string + :safe (lambda (x) (stringp x))) + +(defcustom lsp-clients-svlangserver-lintOnUnsaved t + "Enable linting on unsaved files" + :group 'lsp-svlangserver + :type 'boolean + :safe (lambda (x) (booleanp x))) + +(defcustom lsp-clients-svlangserver-formatCommand "verible-verilog-format" + "Verible verilog format command" + :group 'lsp-svlangserver + :type 'string + :safe (lambda (x) (stringp x))) + +(defcustom lsp-clients-svlangserver-disableCompletionProvider nil + "Disable auto completion provided by the language server" + :group 'lsp-svlangserver + :type 'boolean + :safe (lambda (x) (booleanp x))) + +(defcustom lsp-clients-svlangserver-disableHoverProvider nil + "Disable hover over help provided by the language server" + :group 'lsp-svlangserver + :type 'boolean + :safe (lambda (x) (booleanp x))) + +(defcustom lsp-clients-svlangserver-disableSignatureHelpProvider nil + "Disable signature help provided by the language server" + :group 'lsp-svlangserver + :type 'boolean + :safe (lambda (x) (booleanp x))) + +(defcustom lsp-clients-svlangserver-disableLinting nil + "Disable verilator linting" + :group 'lsp-svlangserver + :type 'boolean + :safe (lambda (x) (booleanp x))) + +(defcustom lsp-clients-svlangserver-workspace-additional-dirs nil + "Additional directories to be managed by this instance of svlangserver" + :group 'lsp-svlangserver + :type '(lsp-repeatable-vector string) + :safe (lambda (x) (seq-every-p #'stringp x))) + +(defcustom lsp-clients-svlangserver-bin-path "svlangserver" + "svlangserver binary path" + :group 'lsp-svlangserver + :type 'string + :safe (lambda (x) (stringp x))) + +(defcustom lsp-clients-svlangserver-bin-args nil + "command line arguments for svlangserver binary" + :group 'lsp-svlangserver + :type '(lsp-repeatable-vector string) + :safe (lambda (x) (seq-every-p #'stringp x))) + +(defcustom lsp-clients-svlangserver-node-command "node" + "node binary path" + :group 'lsp-svlangserver + :type 'string + :safe (lambda (x) (stringp x))) + +(defcustom lsp-clients-svlangserver-module-path "svlangserver.js" + "svlangserver module path" + :group 'lsp-svlangserver + :type 'string + :safe (lambda (x) (stringp x))) + +(defun lsp-clients-svlangserver-build-index () + (interactive) + (lsp-send-execute-command "systemverilog.build_index")) + +(defun lsp-clients-svlangserver-report-hierarchy (container-name) + (interactive (list (read-string "Module/interface: " (cond ((use-region-p) (buffer-substring (region-beginning) (region-end))) (t ""))))) + (lsp-send-execute-command "systemverilog.report_hierarchy" (vector container-name))) + +(lsp-dependency 'svlangserver + '(:system "svlangserver")) + +(defun lsp-clients-svlangserver-get-workspace-additional-dirs (_workspace) + lsp-clients-svlangserver-workspace-additional-dirs) + +(defun lsp-clients-svlangserver-command () + (let ((svlangserver-bin-path (lsp-package-path 'svlangserver))) + (if svlangserver-bin-path + (cons svlangserver-bin-path lsp-clients-svlangserver-bin-args) + (if (file-exists-p lsp-clients-svlangserver-bin-path) + (cons lsp-clients-svlangserver-bin-path lsp-clients-svlangserver-bin-args) + (if (file-exists-p lsp-clients-svlangserver-module-path) + `(,lsp-clients-svlangserver-node-command ,lsp-clients-svlangserver-module-path ,"--stdio") + `(,"svlangserver")))))) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection 'lsp-clients-svlangserver-command) + :major-modes '(verilog-mode) + :priority -1 + :library-folders-fn 'lsp-clients-svlangserver-get-workspace-additional-dirs + :server-id 'svlangserver)) + +(lsp-register-custom-settings '(("systemverilog.includeIndexing" lsp-clients-svlangserver-includeIndexing) + ("systemverilog.excludeIndexing" lsp-clients-svlangserver-excludeIndexing) + ("systemverilog.defines" lsp-clients-svlangserver-defines) + ("systemverilog.launchConfiguration" lsp-clients-svlangserver-launchConfiguration) + ("systemverilog.lintOnUnsaved" lsp-clients-svlangserver-lintOnUnsaved) + ("systemverilog.formatCommand" lsp-clients-svlangserver-formatCommand) + ("systemverilog.disableCompletionProvider" lsp-clients-svlangserver-disableCompletionProvider) + ("systemverilog.disableHoverProvider" lsp-clients-svlangserver-disableHoverProvider) + ("systemverilog.disableSignatureHelpProvider" lsp-clients-svlangserver-disableSignatureHelpProvider) + ("systemverilog.disableLinting" lsp-clients-svlangserver-disableLinting))) + +(defgroup lsp-verilog nil + "LSP support for Verilog/SystemVerilog." + :group 'lsp-mode + :link '(url-link "https://github.com/suoto/hdl_checker")) + +(defcustom lsp-clients-verilog-executable '("hdl_checker" "--lsp") + "Command to start the hdl_checker language server." + :group 'lsp-verilog + :risky t + :type 'file) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection lsp-clients-verilog-executable) + :major-modes '(verilog-mode) + :language-id "verilog" + :priority -2 + :server-id 'lsp-verilog)) + +(lsp-consistency-check lsp-verilog) + +(defgroup lsp-verible nil + "LSP support for Verilog/SystemVerilog using the Verible suite." + :group 'lsp-mode + :link '(url-link "https://github.com/chipsalliance/verible")) + +(defcustom lsp-clients-verible-executable '("verible-verilog-ls") + "Command to start the Verible Verilog language server." + :group 'lsp-verible + :risky t + :type 'file) + +(lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection lsp-clients-verible-executable) + :major-modes '(verilog-mode) + :language-id "verilog" + :priority -2 + :server-id 'lsp-verilog-verible)) + +(provide 'lsp-verilog) +;;; lsp-verilog.el ends here diff --git a/code/elpa/lsp-mode-20240319.1043/lsp-vetur.el b/code/elpa/lsp-mode-20240319.1043/lsp-vetur.el new file mode 100644 index 0000000..f8d0afc --- /dev/null +++ b/code/elpa/lsp-mode-20240319.1043/lsp-vetur.el @@ -0,0 +1,353 @@ +;;; lsp-vetur.el --- vls configuration -*- lexical-binding: t; -*- + +;; Copyright (C) 2019 Ivan Yonchovski + +;; Author: Ivan Yonchovski +;; Keywords: + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; VLS configuration + +;;; Code: + +(require 'lsp-mode) +(require 'lsp-html) +;; vls shares the same format configurations with ts-ls. +(require 'lsp-javascript) + +(defgroup lsp-vetur nil + "LSP support for Vue, using the Vue Language Server." + :group 'lsp-mode + :link '(url-link "https://github.com/vuejs/vetur/tree/master/server") + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-vetur-ignore-project-warning nil + "Ignore projects without jsconfig.json or tsconfig.json warnings." + :type 'boolean + :group 'lsp-vetur + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-vetur-use-workspace-dependencies nil + "Use dependencies from workspace. Currently only for +TypeScript." + :type 'boolean + :group 'lsp-vetur + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-vetur-completion-auto-import t + "Include completion for module export and auto import them" + :type 'boolean + :group 'lsp-vetur + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-vetur-completion-scaffold-snippet-sources + '((workspace . "(W)") + (user . "(U)") + (vetur . "(V)")) + "Where Vetur source Scaffold Snippets from and how to indicate them. +- workspace: /.vscode/vetur/snippets. +- user: /User/snippets/vetur. +- vetur: Bundled in Vetur. +The source value can be a string \"(User)\" or an emoji \"✌\". +Set a source to \"\" to disable it. +" + :type 'alist + :group 'lsp-vetur + :link '(url-link "https://vuejs.github.io/vetur/guide/snippet.html") + :package-version '(lsp-mode. "8.0.1")) + +(defcustom lsp-vetur-completion-tag-casing "kebab" + "Casing conversion for tag completion" + :type '(choice + (const "initial") + (const "kebab")) + :group 'lsp-vetur + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-vetur-grammar-custom-blocks '((docs . "md") (i18n . "json")) + "Mapping from custom block tag name to language name. Used for + generating grammar to support syntax highlighting for custom + blocks." + :type 'alist + :group 'lsp-vetur + :package-version '(lsp-mode . "6.1")) + +(defcustom lsp-vetur-validation-template t + "Validate vue-html in